2020年4月14日更新 - 已移除Python 2支持,代码已切换至Python3
现已支持轮询(round-robin)与改进的选项!
问题反馈: @crypt0s - Twitter
[email protected] - 邮箱
一个基于Python正则表达式的DNS服务器!
USAGE:
./fakedns.py [-h] -c Config path [-i interface IP address] [--rebind]
dns.conf应按以下方式进行配置:
[RECORD TYPE CODE] [python regular expression] [answer] [rebind answer]
应答可以是一个IP地址或字符串self,
self这个语法糖会被转换为你当前机器的本地IP地址,例如192.168.1.100。
如果未匹配到任何规则,DNS服务器将尝试使用你本地机器上配置的DNS服务器来解析该请求,并代表请求用户将请求代理转发至该服务器。
- A
- TXT
- AAAA
- PTR
- SOA
- MX
- CNAME
- Supports DNS Rebinding
- Supports round-robin
已实现轮询规则。每当客户端请求匹配的规则时,FakeDNS都会返回规则中IP列表里的下一个IP。
IP列表以逗号分隔。
例如:
A robin.net 1.2.3.4,1.1.1.1,2.2.2.2
这是robin.net的轮询规则,每当任何客户端请求robin.net条目时,将依次返回指向1.2.3.4、1.1.1.1和2.2.2.2的响应,并按该顺序循环。
注意:这些IP不会以列表形式包含在响应中返回给客户端——响应中仍然只包含一个IP(后续可能会改变这一点)
FakeDNS支持重绑定规则,即服务器接受某个客户端对某个域名的请求达到一定次数(默认阈值为1次请求)后,会将IP地址切换为另一个不同的地址。
例如:
A rebind.net 1.1.1.1 10%4.5.6.7
表示我们有一条rebind.net的A记录,在前10次尝试中解析为1.1.1.1。当某个已发起10次请求的客户端发起第11次请求时,FakeDNS开始返回第二个IP地址4.5.6.7。
你也可以在此处使用地址列表,FakeDNS会像"普通"规则一样为你进行轮询。
(仅限localhost,无需额外步骤)
我在Docker中测试/开发FakeDNS取得了很大成功,因为相比在现代Ubuntu系统上原生运行(其自带的DNS服务已经占用了53端口),Docker方式更为简便。
如果你想尝试,只需按照以下步骤操作,无需太多额外工作:
假设你位于FakeDns目录内:sudo docker run --interactive --tty --volume \pwd`:/opt/FakeDns -p 5353:53/udp python:3.8 /opt/FakeDns/fakedns.py -c /opt/FakeDns/dns.conf.example。要测试的话,可以运行 nslookup -port=5353 testrule.test 127.0.0.1,首次请求应返回 1.1.1.1`。
或者,如果你想使用docker-compose,只需运行 docker-compose up,并使用与上述相同的测试方法。