Linux给特定进程单独指定DNS
2024-09-05 05:51:31
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 http://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
来避免。
最新文章
- java8-3 多态的好处和弊端以及多态的理解
- CentOS 下安装配置mongodb
- mysql 连接数的最大数
- Center OS mongodb安装
- 也用 Log4Net 之将日志记录到数据库的配置 (一)
- CCR源码分析-CCR架构
- Quartz 有状态的JobDataMap
- 必胜宅急送Web app设计背后的思考
- SQL Server存储过程和游标有关实例以及相关网址
- https原理及tomcat配置https方法
- C primer plus 第五版十二章习题
- Topshelf便捷创建Windows服务
- 重温MFC
- 深入浅出Git教程(转载)
- sqlplus导入数据
- Struts2.5学习笔记----org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter报错
- Visible Trees HDU - 2841(容斥)
- DSO windowed optimization 公式
- sublime断点调试
- 装饰器-wrapper