Linux給特定進程單獨指定DNS


Linux本身只能通過/etc/resolv.conf設置全系統的DNS。這里有一種給特定進程單獨設置DNS的方法,通過免root的mount namespace達成。使用腳本只需要一條簡潔的命令就可以。

背景

例如,在各省各地布置了CDN,本地Linux系統用的DNS為114.114.114.114,這里想要使用某地某ISP的DNS5.5.5.5來測試CDN設置狀況,卻不想更改全系統設置。雖然dignslookup可指定DNS,但大部分程序沒有這個功能。

方法

  1. Bubblewrap是一個非特權(免root)容器工具,使用bwrap命令以用它來創建一個mount namespace,使得在此namespace下的進程所看見的/etc/resolv.conf被覆蓋為自己指定的內容。

  2. 有些程序會使用系統統一提供的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來避免。

  • 在bubblewrap這類容器之中,有些程序本身需要用到mount、namespace等功能的無法使用,如AppImage


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM