溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

OpenWrt DNS問題排查的示例分析

發(fā)布時(shí)間:2021-12-18 11:28:58 來源:億速云 閱讀:1903 作者:小新 欄目:互聯(lián)網(wǎng)科技

這篇文章主要介紹了OpenWrt DNS問題排查的示例分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

我們的設(shè)備在測試時(shí)發(fā)現(xiàn)有個(gè)別的主機(jī),主程序DNS解釋服務(wù)器域名失敗。
最直接的表現(xiàn)就是 ping 126.com 顯示:
OpenWrt DNS問題排查的示例分析

對于這個(gè)問題,最直接的方式就是打開 /etc/resolv.conf 文件查看DNS服務(wù)器是否設(shè)置正確。結(jié)果該文件顯示:

search lan
nameserver 127.0.0.1

博主用 strace ping 126.com 命令,分別比較了好的有問題的設(shè)備與沒問題的設(shè)備。將輸出信息用 meld 進(jìn)行對比,結(jié)果看到在這里出現(xiàn)分歧: OpenWrt DNS問題排查的示例分析
可見,ping 命令在解釋 "126.com" 域名時(shí),是 connect 127.0.0.1:53 服務(wù)。而存在問題的一邊,connect這個(gè)服務(wù)被拒絕了。

于是,博主可以分析得到,好的設(shè)備一定有一個(gè)服務(wù)進(jìn)程bind了53端口,并提供了 DNS 服務(wù)。而有問題的設(shè)備一定是沒有該進(jìn)程。
博主在好的設(shè)備上運(yùn)行 netstat -nap 找到了該服務(wù):
OpenWrt DNS問題排查的示例分析 同時(shí)我們又在問題的設(shè)備,執(zhí)行 netstat -nap,證實(shí),有問題的設(shè)備上這個(gè) dnsmasq 服務(wù)沒有運(yùn)行起來。

由于OpenWrt本身就是一個(gè)路由器的系統(tǒng),其自帶 Dnsmasq 服務(wù)向其網(wǎng)絡(luò)下的子網(wǎng)設(shè)備提供 DNS 與 DHCP 服務(wù)。而我們OpenWrt自身的程序解析域名時(shí),也就向本地的 dnsmasq 請求解析。


那么,現(xiàn)在的問題是:為什么個(gè)別設(shè)備它的 dnsmasq 啟動不起來? 對比好的設(shè)備,執(zhí)行 ps 是能看到 dnsmasq 進(jìn)程存在的。執(zhí)行 /etc/init.d/dnsmasq stop 能停止它。這時(shí)候再 ping 126.com 它也是通的。為什么?博主查了一下 /etc/resolv.conf 文件,在停止 dnsmasq 之前,它的內(nèi)容是:

search lan
nameserver 127.0.0.1

查一旦停止后,它就會變成:

# Interface lan
nameserver 202.96.128.166
nameserver 202.96.134.133
search bad

這是OpenWrt為了防止 dnsmasq 被停后無法解析域名,所以在停止之前,將其已知的域名服務(wù)器寫入到 /etc/resolv.conf 文件中來。

相對于有問題的設(shè)備,其 /etc/resolv.conf 內(nèi)容為:

search lan
nameserver 127.0.0.1

而 dnsmasq 進(jìn)程并未被啟動過(執(zhí)行 ps 命令,列表中沒有 dnsmasq 進(jìn)程)。于是博主嘗試執(zhí)行:/etc/init.d/dnsmasq start,然后執(zhí)行:ps 查看進(jìn)程。結(jié)果,dnsmasq 進(jìn)程并沒有如愿啟動起來。 直接執(zhí)行 dnsmasq 命令就可以啟動服務(wù),然后 ping 126.com 也能拼通。

那么問題應(yīng)該是在 /etc/init.d/dnsmasq 文件中。博主打開 /etc/init.d/dnsmasq 看了一下,太多了,就不想全部貼出來了。相信大家也沒有賴心看。下面只是摘要。 /etc/init.d/dnsmasq start 時(shí)會執(zhí)行到:

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

    <略...>
}

可以了解到,真正執(zhí)行的啟動命令是:/usr/sbin/dnsmasq -C /var/etc/dnsmasq.conf -k
手動執(zhí)行這個(gè)命令,看能否啟動 dnsmasq 服務(wù):
OpenWrt DNS問題排查的示例分析
如上,出錯(cuò)了。/var/etc/dnsmasq.conf 文件的第11行有重復(fù)的關(guān)鍵字。
這是一個(gè)重要的線索!打開 /var/etc/dnsmasq.conf 文件:
OpenWrt DNS問題排查的示例分析
如上,第11行的關(guān)鍵字為 dhcp-leasefile。對比好的設(shè)備的該文件。經(jīng)對比,完全一致。

那問題又在哪兒呢? 是不是把 /var/etc/dnsmasq.conf 文件中的11行刪除就可以了呢?嘗試如此操作,結(jié)果還真是可以啟動。 但這沒有從根本解決問題。

是不是有別的配置文件,也有 dhcp-leasefile 關(guān)鍵字?
打開 /etc/dnsmasq.conf,這個(gè)文件與 /var/etc/dnsmasq.conf 完全一樣。但是博主嘗試用 /etc/dnsmasq.conf 替代 /var/etc/dnsmasq.conf,如下執(zhí)行:

/usr/sbin/dnsmasq -C /etc/dnsmasq.conf -k

結(jié)果沒有問題,而如果指定的配置文件為 /var/etc/dnsmasq.conf 就有問題。博主很不理解。為了確保這兩個(gè)文件是同一個(gè),于是:

rm /var/etc/dnsmasq.conf
cp /etc/dnsmasq.conf /var/etc/dnsmasq.conf
/usr/sbin/dnsmasq -C /var/etc/dnsmasq.conf -k

結(jié)果:
OpenWrt DNS問題排查的示例分析

同樣是配置文件,同樣的內(nèi)容,只是路徑變了而已。為什么放 /var/etc/dnsmasq.conf 就會出錯(cuò)?
是不是 dnsmasq 默認(rèn)就加載了 /etc/dnsmasq.conf ?如果有指定其它的配置文件,它就會出錯(cuò)?
于是:

rm /var/etc/dnsmasq.conf
mv /etc/dnsmasq.conf /var/etc/dnsmasq.conf
/usr/sbin/dnsmasq -C /var/etc/dnsmasq.conf -k

結(jié)果:
OpenWrt DNS問題排查的示例分析
證實(shí)一點(diǎn),dnsmasq 確實(shí)默認(rèn)加載了 /etc/dnsmasq.conf,不然為什么在我們將文件移走了,會報(bào)找不到 /etc/dnsmasq.conf 文件。這也說明了為什么我們強(qiáng)制性指定配置文件為 /var/etc/dnsmasq.conf 時(shí)會報(bào)重復(fù)關(guān)鍵字了。因?yàn)?/etc/dnsmasq.conf 也被加載了的。

對比好的設(shè)備里的 /etc/dnsmasq.conf 內(nèi)容,結(jié)果發(fā)現(xiàn):

# 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

里面沒有一個(gè)配置項(xiàng),與其 /var/etc/dnsmasg.conf 完全不一樣。

OK,大致找到問題了。壞設(shè)備的 /etc/dnsmasg.conf 有了 /var/etc/dnsmasg.conf 一樣的內(nèi)容。所以,當(dāng) dnsmasq 加載完了 /etc/dnsmasg.conf 后再來加載 /var/etc/dnsmasg.conf 就出錯(cuò)了。
將 /etc/dnsmasg.conf 清空即可:

rm /etc/dnsmasg.conf
touch /etc/dnsmasg.conf

然后,再 /etc/init.d/dnsmasg start,就成功了。


那為什么壞的主機(jī) /etc/dnsmasg.conf 有內(nèi)容?而不是像好的設(shè)備那樣全是注釋? 我們?nèi)?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 文件。打開看,其內(nèi)容就與好的設(shè)備上的 /etc/dnsmasq.conf 文件一致。
如果一個(gè)純凈的系統(tǒng)固件,是不會出這個(gè)問題的。

那么有兩種可能:

  • 由于腳本出錯(cuò),致將 /var/etc/dnsmasg.conf 文件的內(nèi)容寫入到了 /etc/dnsmasg.conf 中

  • 是我們在進(jìn)行 sysupgrade 過程中,出錯(cuò)的 /etc/dnsmasg.conf 文件被遺留下來了

驗(yàn)證的方法為:斷電重啟,看 /etc/dnsmasg.conf 是否會再次變成與 /var/etc/dnsmasg.conf 一致。 結(jié)果正常。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“OpenWrt DNS問題排查的示例分析”這篇文章對大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI