【iptables防火墙】-- URL过滤 (Hexstring、IP、DoT和DoH)
在路由器中使用iptables工具对URL地址进行过滤涉及到如下几个方面,hexstring、ip、DoT和DoH。
以过滤www.baidu.com为例
1、DNS阻断
m string --hex-string是iptables中一个以十六进制格式定义要匹配的二进制特征并且支持混合明文和二进制数据的模块。由于DNS协议使用二进制格式,所以无法使用明文(–string “www.baidu.com”)规则匹配。
#ipv4
iptables -w -I INPUT -i bridge -p udp --dport 53 -m string --hex-string "www|05|baidu|03|com" --algo bm -j DROP
iptables -w -I FORWARD-i bridge -p udp -o wan_iface --dport 53 -m string --hex-string "www|05|baidu|03|com" --algo bm -j DROP
iptables -w -I INPUT -i bridge -p tcp --dport 53 -m string --hex-string "www|05|baidu|03|com" --algo bm -j DROP
iptables -w -I FORWARD-i bridge -p tcp -o wan_iface --dport 53 -m string --hex-string "www|05|baidu|03|com" --algo bm -j DROP#ipv6
ip6tables -w -I INPUT -i bridge -p udp --dport 53 -m string --hex-string "www|05|baidu|03|com" --algo bm -j DROP
ip6tables -w -I FORWARD-i bridge -p udp -o wan_iface --dport 53 -m string --hex-string "www|05|baidu|03|com" --algo bm -j DROP
ip6tables -w -I INPUT -i bridge -p tcp --dport 53 -m string --hex-string "www|05|baidu|03|com" --algo bm -j DROP
ip6tables -w -I FORWARD-i bridge -p tcp -o wan_iface --dport 53 -m string --hex-string "www|05|baidu|03|com" --algo bm -j DROP
以ipv4部分,来解析一下规则。(ipv6同理)
因为DNS协议使用二进制格式,这里四条规则核心分别是在INPUT和FORWARD链中分别对tcp、udp协议的53端口进行过滤,将包含www.baidu.com负载的数据包拦截下来,从而做到阻断DNS解析的作用。
这里关于DNS,之前还遇到一个小问题,大部分dns解析都是通过udp协议,直到后面用户投诉url过滤功能不生效,才发现原来dns还会使用tcp协议(DNS over TCP,即DoT,用于大型DNS响应或加密DNS),上网搜了一下,把大概内容也贴在这里。
2、IP地址过滤
在阻断DNS解析之后,运气不好的你发现,还是可以访问目标www.baidu.com,这是缓存机制导致的,比如你之前访问过www.baidu.com,那么你的电脑、手机以及路由器等设备就都会对这个URL做一个缓存表,里面放着该URL对应的IP地址,下一次你访问的时候,就不需要去再次进行DNS解析了,直接通过ip进行访问,那就绕过了DNS阻断。
所以在进行了DNS阻断之后,还需要通过ip来进行过滤。
这里可以使用nslookup指令来查询URL对应的IP,然后通过iptables将对应IP过滤,如下所示
#不指定DNS服务器
nslookup www.baidu.com
Server: 221.5.88.88
Address 1: 221.5.88.88 d3-dns-gdlt-tycName: www.baidu.com
Address 1: 157.148.69.186
Address 2: 157.148.69.151
Address 3: 2408:8756:c52:1a18:0:ff:b030:7606
Address 4: 2408:8756:c52:15df:0:ff:b073:d207#指定DNS服务器
nslookup www.baidu.com 114.114.114.114
Server: 114.114.114.114
Address 1: 114.114.114.114 public1.114dns.comName: www.baidu.com
Address 1: 157.148.69.151
Address 2: 157.148.69.186
Address 3: 2408:8756:c52:1a18:0:ff:b030:7606
Address 4: 2408:8756:c52:15df:0:ff:b073:d207
在此获取到ip之后就可以根据ip来生成防火墙规则,如下所示
#ipv4
iptables -w -I FORWARD -s 157.148.69.186 -j DROP
iptables -w -I FORWARD -d 157.148.69.186 -j DROP
iptables -w -I FORWARD -s 157.148.69.151 -j DROP
iptables -w -I FORWARD -d 157.148.69.151 -j DROP#ipv6
ip6tables -w -I FORWARD -s 2408:8756:c52:15df:0:ff:b073:d207 -j DROP
ip6tables -w -I FORWARD -d 2408:8756:c52:15df:0:ff:b073:d207 -j DROP
ip6tables -w -I FORWARD -s 2408:8756:c52:1a18:0:ff:b030:7606 -j DROP
ip6tables -w -I FORWARD -d 2408:8756:c52:1a18:0:ff:b030:7606 -j DROP
插播一个小知识点,其实防火墙本身也带解析URL地址的功能,可以直接使用如下方法添加规则
#ipv4
iptables -A FORWARD -d baidu.com -j DROP
iptables -A FORWARD -s baidu.com -j DROP
#ipv6
ip6tables -A FORWARD -d www.baidu.com -j DROP
ip6tables -A FORWARD -s www.baidu.com -j DROP
不过这个方法需要注意,不是所有iptables版本都支持,并且如果某个URL不存在相应的ip地址,会导致指令报错!!!且使用用限制,截取man中的说明,这是一个糟糕的做法!因此不推荐使用这种方法哦~
基本做到这一步,URL过滤功能就算完成了!但是凡是都有例外!!!下面聊一下DoH
3、DoH(DNS over HTTP)阻断
这是一种通过 HTTPS 协议加密传输 DNS 查询的技术,旨在解决传统 DNS 的安全与隐私缺陷。DoH 将传统的 DNS 查询封装在 HTTPS 请求中,通过 TLS/SSL 加密传输,使用标准 443 端口。与传统 DNS(明文 UDP/TCP,端口 53)相比,它可防止窃听、篡改和劫持。
由于其内容加密的特性,因此主要阻断方法就是阻断访问DoH服务器,因为即使加密的https协议,其域名部分也是明文的。
iptables -A OUTPUT -p tcp -m tcp --dport 443 -m string --string "dns.alidns.com" --algo bm -j DROP
以下是部分的DoH服务器
#国内
"dns.alidns.com" # 阿里云
"doh.pub" # 腾讯 DNSPod
"dns.cfiec.net" # 中国互联网络信息中心
"dot.pub" # 腾讯备用
"doh.360.cn" # 360安全DNS
"dns.ipv6dns.com" # 下一代互联网工程中心#国外
"dns.google"
"cloudflare-dns.com"
"dns.opendns.com"
过去问题总结:
1、为什么不直接阻止ip,最后不都是通过ip访问吗?
这里涉及到一个ip获取是否完整的问题,通常一个URL会对应多个IP,但是部分情况下一个DNS服务器上不会包含此URL的全部ip,尤其是google.com这种地址,ip数量众多,所以要在阻断ip的情况下,同步阻断DNS,这样能保证设备换了DNS服务器的情况下也能阻断访问。