• 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

    如果本文帮到你,请点一下”推荐“,谢谢!
    版权所有 本博客文章皆属原创(除特别标明外)
    未联系作者获得同意前,不可转载
    转载必须附上源地址,并连我博客上的宣传内容一并转载

    打赏作者

    写作不易,感谢支持!
    打赏链接
    

  • 相关阅读:
    Filebeats input多个log文件,输出Kafka多个topic配置
    CentOS7 yum方式安装MySQL5.7
    day11笔记用户管理篇
    RT1021之LED小灯闪烁(EVK)
    TSN介绍
    vba获取文件夹下所有文件名
    Win7系统安装JDK后javac不是内部或外部命令解决办法
    nodejs&wsl&vscode&docker开发环境搭建
    Java应用层数据链路追踪(附优雅打印日志姿势)
    SpringBoot接入轻量级分布式日志框架(GrayLog)
  • 原文地址:https://www.cnblogs.com/garyw/p/13832029.html
Copyright © 2020-2023  润新知