Linux给特定进程单独指定DNS
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
来避免。 -
在bubblewrap这类容器之中,有些程序本身需要用到mount、namespace等功能的无法使用,如AppImage
关注一下
📺 Bilibili 收集有趣科技 和发布原创视频 | 🖥️ Github 有用的和没用的开源项目代码
玩而后赏
子曰,玩而予赏,善莫大焉?
又曰,玩而不赏,良心安焉?
写作不易,感谢支持!

虽然,小小玩意,不足挂齿;
亦是,卅年老刀,献丑于此。
其实,多赏非求,少许亦可。
进者,参观主页,玩物更多。
未联系作者获得同意前,不可转载
转载必须附上源地址,并连我博客上的宣传内容一并转载
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具