DNS污染的解决方法

DNS污染的解决方法,第1张

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:UsersAdministrator.configencrypted_dnsconfig.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同理

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5719049.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存