DNS污染的解决方法

在一些企业机构当中,存在部分DNS请求会被网关直接修改。造成无法访问的情况。而传统的socks代理也只能针对IP层面进行代理,当需要访问的地址以域名的形式存在的时候,DNS解析都是系统自动完成的,并不会走之前设置的socks代理,造成解析出来的IP错误,根本就轮不到使用之前用的代理。

因为早期DNS协议设计的时候并没有考虑安全和加密,造成默认的UDP DNS请求全都是明文传输的,所以在传输过程中非常容易被篡改。

所以我们需要一个完全的方法来应对这种情况:

ISP会直接修改UDP DNS请求的数据包造成DNS污染。

我们可以尝试 DNS over HTTPS(DoH)和DNS over TLS (DoT)。

DoH采用的就是普通的https请求,比较推荐使用,通讯采用443端口。

DoT是有可能会被封锁的。因为其采用853端口,可能网络环境直接ban掉这种不常见端口(常见端口:80,443;8080)。在我的网络环境下,正好就无法outbound 853端口。

在最新版的Windows 10当中,可以看到DoT的身影,但是无法使用DoH。

以下的方案当中,我搭建了一个本地的UDP DNS Server,通过解析UDP DNS报文,将其转换成DoH的请求样式,通过Socks代理向提供DoH服务的提供商发送HTTPS请求,收到返回的请求之后再转换成UDP DNS报文模式返回响应。d

pip install encrypted-dns

第一次运行,直接运行该程序让其生成一个默认的配置文件。

encrypted-dns

生成的配置文件在"C:\Users\Administrator\.config\encrypted_dns\config.json"

下面的样式是我最终的配置,将【】标注的按照要求进行替换就可以进行使用。

建议在网络与共享中心当中设置固定ip地址

在我的网络环境下,https://8.8.8.8都被ban了。所以都要采用代理

{
    "version": "1.2.0",
    "ecs_ip_address": "128.97.0.0",
    "dnssec": false,
    "dns_cache": {
        "enable": true,
        "override_ttl": 3600
    },
    "firewall": {
        "refuse_ANY": true,
        "AAAA_disabled": false,
        "rate_limit": 30,
        "client_blacklist": [
            "128.97.0.0"
        ]
    },
    "rules": {
        "force_safe_search": false,
        "hosts": {
            "localhost": "127.0.0.1",
            "cloudflare-dns.com": "1.0.0.1",
            "dns.google": "8.8.8.8",
			"dns2.google": "8.8.4.4"
        }
    },
    "inbounds": [
        "【本机的IP地址,注意不要用127.0.0.1】:53",
        "tcp://【本机的IP地址,注意不要用127.0.0.1】:5301"
    ],
    "outbounds": [
        {
            "tag": "bootstrap",
            "dns": [
                "8.8.8.8"
            ],
            "domains": [
                "captive.apple.com",
                "connectivitycheck.gstatic.com",
                "detectportal.firefox.com",
                "msftconnecttest.com",
                "nmcheck.gnome.org",
                "pool.ntp.org",
                "time.apple.com",
                "time.asia.apple.com",
                "time.euro.apple.com",
                "time.nist.gov",
                "time.windows.com"
            ]
        },
        {
            "tag": "unencrypted",
            "dns": [
                "udp://114.114.114.114",
				"udp://114.114.115.115",
				"udp://223.5.5.5"
            ],
            "concurrent": false,
            "domains": [
                "sub:163.com",
                "include:baidu.com"
            ]
        },
        {
            "tag": "encrypted",
            "dns": [
				"https://dns.google",
                "https://dns2.google"
            ],
            "proxies": {
                "http": "http://【代理用户名】:【代理密码】@127.0.0.1:【端口】",
                "https": "http://【代理用户名】:【代理密码】@127.0.0.1:【端口】"
            },
            "concurrent": false,
            "domains": [
                "include:【要防止被污染的域名】",
            ]
        }
    ]
}

去掉IPv6,就是将这个勾去掉。因为测试过程中会发现很多应用默认采用的都是IPv6进行请求。其实也可以在IPv6地址的DNS当中进行设置,但是也会可能在后续的socks代理当中出现问题就干脆直接去掉了。

 如果要进行IPv6,首先需要确定你的socks代理支持ipv6,然后在上面的配置文件当中

"inbounds": [
        "【本机的IP地址,注意不要用127.0.0.1】:53",
        "【本机的IP地址,IPv6】:53",
        "tcp://【本机的IP地址,注意不要用127.0.0.1】:5301"
        "tcp://【本机的IP地址,IPv6】:5301"
    ],

设置两个bind的地址就可以同时也监听上ipv6地址。

在ipv4当中这样设置。ipv6同理

配置好之后,运行encrypted-dns运行起来挂着即可。


补充:

在长时间的运行过程中,会发现会有很多有问题的请求。

 

猜测应该是有很多没有shutdown RDWD的socket连接还在占用系统资源。这个需要对encrypted-dns进行更改,找到每个端口in/outbound的位置加上s.shutdown(2)即可 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值