使用iptables过滤DNS污染/抢答

前言

DNS污染基于DNS抢答实现,那么只要过滤掉抢答的DNS就可以无污染.

DNS

支持的DNS

需要满足3个条件,只要过滤这个3个条件能百分百过滤掉抢答掉DNS

  1. IP ID = 0x0000
  2. IP Flags = 0x00
  3. DNS Authoritative = 0

全球DNS 推荐

8.8.4.4
8.8.8.8

台湾DNS

101.101.101.101
101.102.103.104
168.95.1.1
168.95.192.1

香港DNS

218.102.23.228
210.0.255.251
210.0.255.250

Linux NAT / Route 平台

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ ipset create dnsip hash:ip hashsize 64 maxelem 10 >/dev/null 2>&1
$ ipset add dnsip 8.8.4.4
$ ipset add dnsip 8.8.8.8
$ ipset add dnsip 168.95.1.1
$ ipset add dnsip 168.95.192.1
$ ipset add dnsip 101.101.101.101
$ ipset add dnsip 101.102.103.104
$ ipset add dnsip 218.102.23.228 # 網上行寬頻 Nevigator BroadBand DNS
$ ipset add dnsip 210.0.255.250 # 和記環球電訊 DNS
$ ipset add dnsip 210.0.255.251 # 和記環球電訊 DNS

$ iptables -N DNS_FILTER
$ iptables -F DNS_FILTER
$ iptables -A DNS_FILTER -m u32 --u32 "2&0xFFFF=0x0" -j DROP
$ iptables -A DNS_FILTER -m u32 --u32 "4&0xFFFF=0x4000" -j DROP
$ iptables -A DNS_FILTER -m u32 --u32 "27&0xFF=0x85" -j DROP
$ iptables -t filter -I FORWARD -i "入口" -p udp --sport 53 -m set --match-set dnsip src -j DNS_FILTER

$ # iptables -t nat -A PREROUTING -s 192.168.1.0/24 -p udp -m udp --dport 53 -m set ! --match-set dnsip dst -j DNAT --to-destination 192.168.1.1

Linux Local 平台

1
$ iptables -t filter -A INPUT -i "入口" -p udp --sport 53 -m set --match-set dnsip src -j DNS_FILTER