不同之处在于CDN友好,根据你的IP返回最优的解析结果.
原理
它支持edns_client_subnet,把你的IP作为参数提交,它会返回最优的解析结果,所以说它 是我见过的最完美的DNS解决方案。
测试
#本人北京联通,对比OPENDNS进行测试,证明PRCDNS是CDN友好的
#23.106.151.177:3535 是我搭建的测试地址,遇到攻击可能会关闭
#seaof-153-125-234-242.jp-tokyo-12.arukascloud.io:31910 部署在日本樱花docker
#208.67.222.222:443 OPENDNS
dig @23.106.151.177 +tcp -p 3535 google.com.hk
dig @208.67.222.222 +tcp -p 443 google.com.hk
dig @23.106.151.177 +tcp -p 3535 img.alicdn.com #123.125.18.108北京联通
dig @seaof-153-125-234-242.jp-tokyo-12.arukascloud.io +tcp -p 31910 img.alicdn.com #123.125.18.108北京联通
dig @208.67.222.222 +tcp -p 443 img.alicdn.com #69.192.12.15香港
注意事项:PRCDNS前面一定要放pdnsd或者unbound
- PRCDNS只支持TCP查询
- PRCDNS没有缓存
安装
sudo pip3 install PRCDNS
使用
PRCDNS
PRCDNS -r http://127.0.0.1:8123
参数
--debug 调试模式 选填 默认false
-l 监听IP 选填 默认0.0.0.0
-p 监听端口 选填 默认3535
-r http_proxy 如果PRCDNS可以访问https://developers.google.com就不用填写
更多文档
docker 方式运行
- build:
docker build -t prcdns:latest .
- run:
docker run -p 3535:3535 -d --name prcdns prcdns:latest
使用Asyncio实现的DNS Over Https
项目地址
为什么要重复造轮子?
- 学习AsyncIO,尤其是UDP Server,就这么简单。
- PRCDNS仅仅支持TCP,操蛋的是Dnsmasq不支持TCP Query Only,还得加一层PDNSD才行,这个太浪费了。虽然考虑到UDP DNS查询的严重劫持情况和UDP本身无连接的脆弱,其实TCP查询是合理的,不过我的想法更简单:只把这玩意部署在路由器上,出去的只有到Google Https的连接。至于怎么连接到Google Https,你路由器不可能没有SS吧,所以我没有做额外的Socks支持。至于什么样的路由器才能支持Python3和aiohttp,x86软路由当然是王道。
- PRCDNS没有考虑到一种情况:很多网站其实我们都是走代理的,基于本地IP去做edns client ip查询其实是不合理的。例如用中国IP去查Google的地址,返回的基本都是台湾的IP,可你的代理如果在日本甚至美国,这个就比较尴尬了,会增加50ms甚至100ms的延迟。
- DNS Over Https有一个鸡生蛋蛋生鸡的尴尬:如果DNS Over Https是唯一的解析器,现在你想解析域名就要去访问dns.google.com,可是你不知道dns.google.com的地址,于是你向自己查询,然后你自己又去问dns.google.com这个dns.google.com的地址是什么,于是。。。。
- PRCDNS只解析A记录,这个,如果只作为抗污染辅助手段还是可以的,如果要作为主DNS服务器,这个还是有点不能接受的,毕竟这是残缺的。
Help:
usage: AsyncHttpsDNS [-h] [-p [PORT]] [-i [IP]] [-f [FILE]] [-d [DEBUG]]
[-s [SOCKS]]
optional arguments:
-h, --help show this help message and exit
-p [PORT], --port [PORT]
Port for async dns server to listen
-i [IP], --ip [IP] IP of proxy server to bypass gfw
-f [FILE], --file [FILE]
file that contains blocked domains
-d [DEBUG], --debug [DEBUG]
enable debug logging
-s [SOCKS], --socks [SOCKS]
socks proxy IP:Port in format like: 127.0.0.1:1086
- AsyncHttpsDNS=>直接启动一个在5454端口的DNS服务器,无代理(如果你可以直连dns.google.com的话),无翻墙域名优化,
- AsyncHttpsDNS -s 127.0.0.1:1086,同上,但使用127.0.0.1:1086地址上的socks5代理(shadowsocks默认地址),
- AsyncHttpsDNS -s 127.0.0.1:1086 -i 45.32.15.77,同上,但请求被墙的域名是使用45.32.15.77作为client ip,对应域名解析的结果为此IP优化,
- AsyncHttpsDNS -s 127.0.0.1:1086 -i 45.32.15.77 -f mydomains.txt,同上,但使用当前目录的mydomains.txt文件作为被墙域名列表,
- sudo AsyncHttpsDNS -s 127.0.0.1:1086 -i 45.32.15.77 -f mydomains.txt -p 53,同上,但监听本地53端口。
使用注意:
- 默认监听5454端口,无缓存,配合dnsmasq使用已经足够了,如果要改成53端口,需要有sudo权限。
- 默认使用114和腾讯DNS解析dns.google.com地址,这个在国内用基本没啥问题,如果你本地的114和腾讯DNS都会被污染,自己改代码,为这个加参数挺无聊的。
- foreign_domains.txt保存的是国外域名的地址,其实这个就是gfwlist域名,原因不用解释。实际上这个列表不需要这么大,只需要被屏蔽的又有CDN服务器的域名即可。
- 重点!!使用-i参数指定你的代理服务器IP地址,默认的是日本Vultr地址,不一定合适你。
安装
pip3 install asynchttpsdns
from https://lifetyper.com/posts/async_dns_over_https.html
-------------------
对CDN友好的DNS服务器,区分国内外流量的必备工具。
pip install -U git+https://github.com/lbp0200/prc-dns.git
配置文件
使用免费的PHP空间解析
[program:prc-dns]
command=/home/data/pyenv/2.7.14/bin/prcdns
autostart=true
autorestart=true
user=data
走SS通道解析,推荐,租个搬瓦工、Vultr、 ChangeIP、PnzHost,其实也花不了多少钱。
[program:prc-dns]
command=/home/data/pyenv/2.7.14/bin/prcdns --proxy 127.0.0.1:1080
autostart=true
autorestart=true
user=data
曾经用过pdnsd,设置上游为OPENDNS的TCP:208.67.222.222:443,发现img.alicdn.com
解析到了
69.192.12.15
香港,所以才做这个东西,用https://dns.google.com/
查询DNS,根据edns_client_subnet
设置的公网IP参数,返回最近的IP。
copy some code from Simple DNS server (UDP and TCP) in Python using dnslib.py
from https://github.com/lbp0200/prc-dns
No comments:
Post a Comment