您好,登錄后才能下訂單哦!
這篇文章主要介紹了OpenWrt DNS問題排查的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
我們的設備在測試時發現有個別的主機,主程序DNS解釋服務器域名失敗。
最直接的表現就是 ping 126.com 顯示:
對于這個問題,最直接的方式就是打開 /etc/resolv.conf 文件查看DNS服務器是否設置正確。結果該文件顯示:
search lan nameserver 127.0.0.1
博主用 strace ping 126.com
命令,分別比較了好的有問題的設備與沒問題的設備。將輸出信息用 meld 進行對比,結果看到在這里出現分歧:
可見,ping
命令在解釋 "126.com" 域名時,是 connect 127.0.0.1:53 服務。而存在問題的一邊,connect這個服務被拒絕了。
于是,博主可以分析得到,好的設備一定有一個服務進程bind了53端口,并提供了 DNS 服務。而有問題的設備一定是沒有該進程。
博主在好的設備上運行 netstat -nap
找到了該服務:
同時我們又在問題的設備,執行 netstat -nap
,證實,有問題的設備上這個 dnsmasq 服務沒有運行起來。
由于OpenWrt本身就是一個路由器的系統,其自帶 Dnsmasq 服務向其網絡下的子網設備提供 DNS 與 DHCP 服務。而我們OpenWrt自身的程序解析域名時,也就向本地的 dnsmasq 請求解析。
那么,現在的問題是:為什么個別設備它的 dnsmasq 啟動不起來? 對比好的設備,執行 ps
是能看到 dnsmasq 進程存在的。執行 /etc/init.d/dnsmasq stop
能停止它。這時候再 ping 126.com
它也是通的。為什么?博主查了一下 /etc/resolv.conf 文件,在停止 dnsmasq 之前,它的內容是:
search lan nameserver 127.0.0.1
查一旦停止后,它就會變成:
# Interface lan nameserver 202.96.128.166 nameserver 202.96.134.133 search bad
這是OpenWrt為了防止 dnsmasq 被停后無法解析域名,所以在停止之前,將其已知的域名服務器寫入到 /etc/resolv.conf 文件中來。
相對于有問題的設備,其 /etc/resolv.conf 內容為:
search lan nameserver 127.0.0.1
而 dnsmasq 進程并未被啟動過(執行 ps
命令,列表中沒有 dnsmasq 進程)。于是博主嘗試執行:/etc/init.d/dnsmasq start
,然后執行:ps
查看進程。結果,dnsmasq 進程并沒有如愿啟動起來。 直接執行 dnsmasq 命令就可以啟動服務,然后 ping 126.com
也能拼通。
那么問題應該是在 /etc/init.d/dnsmasq 文件中。博主打開 /etc/init.d/dnsmasq 看了一下,太多了,就不想全部貼出來了。相信大家也沒有賴心看。下面只是摘要。 /etc/init.d/dnsmasq start
時會執行到:
PROG=/usr/sbin/dnsmasq CONFIGFILE="/var/etc/dnsmasq.conf" <略...> start_service() { include /lib/functions config_load dhcp procd_open_instance procd_set_param command $PROG -C $CONFIGFILE -k procd_set_param file $CONFIGFILE procd_set_param respawn procd_close_instance <略...> }
可以了解到,真正執行的啟動命令是:/usr/sbin/dnsmasq -C /var/etc/dnsmasq.conf -k
手動執行這個命令,看能否啟動 dnsmasq 服務:
如上,出錯了。/var/etc/dnsmasq.conf 文件的第11行有重復的關鍵字。
這是一個重要的線索!打開 /var/etc/dnsmasq.conf 文件:
如上,第11行的關鍵字為 dhcp-leasefile
。對比好的設備的該文件。經對比,完全一致。
那問題又在哪兒呢? 是不是把 /var/etc/dnsmasq.conf 文件中的11行刪除就可以了呢?嘗試如此操作,結果還真是可以啟動。 但這沒有從根本解決問題。
是不是有別的配置文件,也有 dhcp-leasefile
關鍵字?
打開 /etc/dnsmasq.conf,這個文件與 /var/etc/dnsmasq.conf 完全一樣。但是博主嘗試用 /etc/dnsmasq.conf 替代 /var/etc/dnsmasq.conf,如下執行:
/usr/sbin/dnsmasq -C /etc/dnsmasq.conf -k
結果沒有問題,而如果指定的配置文件為 /var/etc/dnsmasq.conf 就有問題。博主很不理解。為了確保這兩個文件是同一個,于是:
rm /var/etc/dnsmasq.conf cp /etc/dnsmasq.conf /var/etc/dnsmasq.conf /usr/sbin/dnsmasq -C /var/etc/dnsmasq.conf -k
結果:
同樣是配置文件,同樣的內容,只是路徑變了而已。為什么放 /var/etc/dnsmasq.conf 就會出錯?
是不是 dnsmasq 默認就加載了 /etc/dnsmasq.conf ?如果有指定其它的配置文件,它就會出錯?
于是:
rm /var/etc/dnsmasq.conf mv /etc/dnsmasq.conf /var/etc/dnsmasq.conf /usr/sbin/dnsmasq -C /var/etc/dnsmasq.conf -k
結果:
證實一點,dnsmasq 確實默認加載了 /etc/dnsmasq.conf,不然為什么在我們將文件移走了,會報找不到 /etc/dnsmasq.conf 文件。這也說明了為什么我們強制性指定配置文件為 /var/etc/dnsmasq.conf 時會報重復關鍵字了。因為 /etc/dnsmasq.conf 也被加載了的。
對比好的設備里的 /etc/dnsmasq.conf 內容,結果發現:
# Change the following lines if you want dnsmasq to serve SRV # records. # You may add multiple srv-host lines. # The fields are <name>,<target>,<port>,<priority>,<weight> # A SRV record sending LDAP for the example.com domain to # ldapserver.example.com port 289 #srv-host=_ldap._tcp.example.com,ldapserver.example.com,389 # Two SRV records for LDAP, each with different priorities #srv-host=_ldap._tcp.example.com,ldapserver.example.com,389,1 #srv-host=_ldap._tcp.example.com,ldapserver.example.com,389,2 # A SRV record indicating that there is no LDAP server for the domain # example.com #srv-host=_ldap._tcp.example.com # The following line shows how to make dnsmasq serve an arbitrary PTR # record. This is useful for DNS-SD. # The fields are <name>,<target> #ptr-record=_http._tcp.dns-sd-services,"New Employee Page._http._tcp.dns-sd-services" # Change the following lines to enable dnsmasq to serve TXT records. # These are used for things like SPF and zeroconf. # The fields are <name>,<text>,<text>... #Example SPF. #txt-record=example.com,"v=spf1 a -all" #Example zeroconf #txt-record=_http._tcp.example.com,name=value,paper=A4 # Provide an alias for a "local" DNS name. Note that this _only_ works # for targets which are names from DHCP or /etc/hosts. Give host # "bert" another name, bertrand # The fields are <cname>,<target> #cname=bertand,bert
里面沒有一個配置項,與其 /var/etc/dnsmasg.conf 完全不一樣。
OK,大致找到問題了。壞設備的 /etc/dnsmasg.conf 有了 /var/etc/dnsmasg.conf 一樣的內容。所以,當 dnsmasq 加載完了 /etc/dnsmasg.conf 后再來加載 /var/etc/dnsmasg.conf 就出錯了。
將 /etc/dnsmasg.conf 清空即可:
rm /etc/dnsmasg.conf touch /etc/dnsmasg.conf
然后,再 /etc/init.d/dnsmasg start
,就成功了。
那為什么壞的主機 /etc/dnsmasg.conf 有內容?而不是像好的設備那樣全是注釋? 我們去 OpenWrt工程中找答案。 dnsmasg 在工程的如下路徑上:package/network/services/dnsmasq/ 目錄為:
. ├── files │ ├── dhcp.conf │ ├── dnsmasq.conf │ ├── dnsmasq.hotplug │ └── dnsmasq.init ├── Makefile └── patches ├── 001-Build-config-add-DNO_GMP-for-use-with-nettle-mini-gm.patch ├── 002-fix-race-on-interface-flaps.patch ├── 100-fix-dhcp-no-address-warning.patch └── 110-ipset-remove-old-kernel-support.patch 2 directories, 9 files
目錄下的 files/dnsmasq.conf 文件在安裝后就是 /etc/dnsmasg.conf 文件。打開看,其內容就與好的設備上的 /etc/dnsmasq.conf 文件一致。
如果一個純凈的系統固件,是不會出這個問題的。
那么有兩種可能:
由于腳本出錯,致將 /var/etc/dnsmasg.conf 文件的內容寫入到了 /etc/dnsmasg.conf 中
是我們在進行 sysupgrade 過程中,出錯的 /etc/dnsmasg.conf 文件被遺留下來了
驗證的方法為:斷電重啟,看 /etc/dnsmasg.conf 是否會再次變成與 /var/etc/dnsmasg.conf 一致。 結果正常。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“OpenWrt DNS問題排查的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。