To create a personal anti-spoofing DNS server on Raspberry Pi

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的侦听端口



只要不是太小白的话,都应该明白上述配置和命令中,写中文的是需要注意换成真正值的,且本文介绍部分假设的参数,在配置和命令中也要替换成自己设备上实际内容的。

不能再说多了,有问题回复吧,回复的别露骨。