To create a personal anti-spoofing DNS server on Raspberry Pi
AZ啥是自动化?
一方面,本方法使用普通DNS软件bind和unbound就达到了你懂得,没有任何人为参与的清单的维护。
另一方面,本方法的好处是:某些国内网站的DNS服务器,根据source IP of DNS query (protocol: UDP)为国内则response服务器的国内IP地址,使用户可以访问最近的CDN节点,达到用户访问快速的目标。
综合以上,谓之自动化。
这种方式,搜索(G/B)了一下中英文帖子中都还没有文章专门提到。所以写在这里,进行你懂得牌搜索引擎优化。
主要原理就是利用了recursive dns的原理——它代替电脑,从ROOT DNS开始一直查到目标网站的权威DNS,最后从权威DNS拿到目标主机的IP。对于国内的网站,其权威DNS服务器基本是在国内,那么通过国内直接访问,它会给回来国内的IP。
方法主要是两个要点:
1、在路由器上有分流的TCP方法,这个相信很多人已经有了,各种斐讯改刷,都可以实现。然后在路由器上加工一个UDP透明通道,并用iptables实现内网DNS的UDP查询分流。
2、树莓派设置个内网固定地址,然后用bind实现recursive dns服务器,并侦听非53端口,再用unbound实现一个cache dns服务器,forward到bind,用于实现缓存。
有了这两个前置条件,在路由器上的DHCP服务设置里,将DNS设置为树莓派的地址,就可以了。下面具体说说上面2条如何实现。
1、UDP通道,路由器上登录进shell来做。登录方法有telnet或ssh。
0)前置条件:路由器上已经设置了ipset的TCP分流(小白只要知道路由器上已经可以自动那啥就可以了),且:
find /lib/modules/$(uname -r) -type f -name '*.ko*' | grep 'xt_TPROXY' # 能够输出 /lib/modules/你的路由器uname/kernel/net/netfilter/xt_TPROXY.ko.xz
1)另建立透明通道,用REDIR。不要用TUNNEL。假设端口为UDP_PORT。怎么做自己去搜索。
2)设置iptables的mangle表。由于路由器上已经有根据ipset做的tcp分流,这里也利用同样的ipset。先用ipset list看看哪个set name是关于国内网段的和私有网段的,假设分别为chinanet和privatenet,接下来开始设置:
#!/bin/bash UDP_PORT=具体数值(1~65535,不要和俩DNS的端口冲突了) ip rule add fwmark 0x01/0x01 table 100 ip route add local 0.0.0.0/0 dev lo table 100 iptables -t mangle -N FANUDP # ignore udp redirection to server iptables -t mangle -I PREROUTING -d REDIRE服务器具体IP -j RETURN # ignore private network UDP redirection iptables -t mangle -I PREROUTING -m set --match-set privatenet dst -j RETURN # ignore redirection of China IP blocks iptables -t mangle -I PREROUTING -m set --match-set chinanet dst -j RETURN # Rest of UDP traffice from local net would be redirect to $UDP_PORT iptables -t mangle -A SSUDP -p udp -j TPROXY --on-port $UDP_PORT --tproxy-mark 0x01/0x01 # Enable UDP redirction iptables -t mangle -A PREROUTING -p udp -j FANUDP
2、搭建DNS服务
安装bind,unbound。
在bind配置文件里,主要增加以下:
recursion yes;
allow-query { any; };
listen-on port BIND侦听的非53端口 { 树莓派的IP; };
unbound配置文件:
server:
verbosity: 1
num-threads: 1
interface: 0.0.0.0
#interface: ::0
logfile: "/var/log/unbound.log"
so-rcvbuf: 4m
so-sndbuf: 4m
msg-cache-size: 32m
rrset-cache-size: 64m
cache-max-ttl: 86400
cache-min-ttl: 3600
outgoing-num-tcp: 64
incoming-num-tcp: 64
do-ip4: yes
do-ip6: no
do-udp: yes
do-tcp: yes
tcp-upstream: no
access-control: 0.0.0.0/0 allow
# 下面这条,要搜索一下怎么实现
root-hints: "/etc/unbound/root.hints"
hide-identity: yes
hide-version: yes
harden-glue: yes
do-not-query-localhost: yes
prefetch: yes
minimal-responses: no
forward-zone:
name: "."
forward-addr: 树莓派的IP@BIND的侦听端口
只要不是太小白的话,都应该明白上述配置和命令中,写中文的是需要注意换成真正值的,且本文介绍部分假设的参数,在配置和命令中也要替换成自己设备上实际内容的。
不能再说多了,有问题回复吧,回复的别露骨。