Linux本身只能通過/etc/resolv.conf設定全系統的DNS,這里有一種給特定行程單獨設定DNS的方法,通過免root的mount namespace達成,使用腳本只需要一條簡潔的命令就可以,
背景
例如,在各省各地布置了CDN,本地Linux系統用的DNS為114.114.114.114,這里想要使用某地某ISP的DNS5.5.5.5來測驗CDN設定狀況,卻不想更改全系統設定,雖然dig和nslookup可指定DNS,但大部分程式沒有這個功能,
方法
-
Bubblewrap是一個非特權(免root)容器工具,使用
bwrap命令以用它來創建一個mount namespace,使得在此namespace下的行程所看見的/etc/resolv.conf被覆寫為自己指定的內容, -
有些程式會使用系統統一提供的DNS快取(一般由nscd提供),因此mount namespace需要阻止DNS快取被訪問,阻止
/var/run/nscd/被訪問即可,
使用
移步Github倉庫,有我整理好的腳本
proxc -d 5.5.5.5 -c nslookup my-website-with-cdn.com
proxc -d 5.5.5.5 -c firefox http://my-website-with-cdn.com
proxc -d 5.5.5.5 -c curl -v http://my-website-with-cdn.com
使用此腳本只需要一條簡潔的命令就可以達到,將5.5.5.5分別替換成要測驗的各省各ISP的DNS即可,
限制
由于Bubblewrap的限制,若在使用程序中,mount namespace之外的行程洗掉、重建或更改了/etc/resolv.conf,也會使namespace內所看見的/etc/resolv.conf被修改,
因此,NetworkManager切換網路后,可能會使此方法設定的DNS失效,可以通過禁止NetworkManager更改/etc/resolv.conf來避免,
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/176772.html
標籤:Linux
上一篇:Linux系統編程—信號捕捉
