在一些企业机构当中,存在部分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同理