在路由器中使用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服務器的情況下也能阻斷訪問。