為什麼 iptables 在使用 Chrome/Chromium 時無法阻止 Google 網站?
我使用了以下命令,取自這裡:
# Allow loopback device (internal communication) sudo iptables -A INPUT -i lo -j ACCEPT sudo iptables -A OUTPUT -o lo -j ACCEPT # Allow all local traffic. sudo iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT sudo iptables -A OUTPUT -d 192.168.1.0/24 -j ACCEPT # Set default policies to drop all communication unless specifically allowed sudo iptables -P INPUT DROP sudo iptables -P OUTPUT DROP sudo iptables -P FORWARD DROP
這似乎成功地阻止了幾乎所有來源的網際網路流量,但不知何故,通過 Chromium 訪問的 Google 服務(在 Pi 4 Model B 上的 Raspbian Buster 上)被允許通過(例如,youtube.com 載入暢通無阻)。搜尋並沒有真正幫助我理解這個問題。我找到的最接近的結果是this question,但據我了解,答案是指定域的規則過濾器無法成功應用於數據包,而我使用的規則沒有指定域全部。他們應該丟棄除本地和環回之外的所有數據包,無論域或瀏覽器如何,對吧?
作為背景,這是在我對暴露在網際網路上的偏執的 NAS 上。我對通過 OpenVPN 訪問網際網路的 Pi 有類似的規則,當 VPN 連接斷開時,會觀察到類似的行為:除了通過 Chromium 訪問的 Google 服務之外,不允許任何流量。主要問題是關於 NAS 以消除 VPN 的擔憂。
編輯:在評論中添加每個請求,
sudo iptables-save
在瀏覽器中載入 YouTube 時的輸出並且規則生效:# Generated by xtables-save v1.8.2 on Mon Apr 27 13:24:52 2020 *filter :INPUT DROP [7:2304] :FORWARD DROP [0:0] :OUTPUT DROP [482:36138] -A INPUT -i lo -j ACCEPT -A INPUT -s 192.168.1.0/24 -j ACCEPT -A OUTPUT -o lo -j ACCEPT -A OUTPUT -d 192.168.1.0/24 -j ACCEPT COMMIT # Completed on Mon Apr 27 13:24:52 2020
我不相信有代理,儘管我不熟悉網路中該術語的確切定義。Google向我表明,我將路由器從調製解調器連接到我的 ISP 是相關的,而不是中間伺服器?
此外,作為對已刪除評論的回應,我的 ISP 似乎支持 IPv6。
編輯2:輸出
ping -c6 2001:67c:2564:a119::77
:PING 2001:67c:2564:a119::77(2001:67c:2564:a119::77) 56 data bytes 64 bytes from 2001:67c:2564:a119::77: icmp_seq=1 ttl=49 time=132 ms 64 bytes from 2001:67c:2564:a119::77: icmp_seq=2 ttl=49 time=130 ms 64 bytes from 2001:67c:2564:a119::77: icmp_seq=3 ttl=49 time=127 ms 64 bytes from 2001:67c:2564:a119::77: icmp_seq=4 ttl=49 time=147 ms 64 bytes from 2001:67c:2564:a119::77: icmp_seq=5 ttl=49 time=129 ms 64 bytes from 2001:67c:2564:a119::77: icmp_seq=6 ttl=49 time=128 ms --- 2001:67c:2564:a119::77 ping statistics --- 6 packets transmitted, 6 received, 0% packet loss, time 12ms rtt min/avg/max/mdev = 126.981/132.157/147.250/6.932 ms
編輯 3:現在的最終編輯。只是想附加我按照解決方案中的建議得到的工作規則:
# Allow loopback device (internal communication) sudo iptables -A INPUT -i lo -j ACCEPT sudo iptables -A OUTPUT -o lo -j ACCEPT sudo ip6tables -A INPUT -i lo -j ACCEPT sudo ip6tables -A OUTPUT -o lo -j ACCEPT # Allow all local traffic. sudo iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT sudo iptables -A OUTPUT -d 192.168.1.0/24 -j ACCEPT # Allow VPN establishment # Only 2 ports open, 1 for DNS and 1 for VPN # If establishing through an IP and not a name, the ones with port 53 can be removed # Port 1198 may be different depending on the VPN sudo iptables -A OUTPUT -p udp --dport 53 -j ACCEPT sudo iptables -A INPUT -p udp --sport 53 -j ACCEPT sudo iptables -A OUTPUT -p udp --dport 1198 -j ACCEPT sudo iptables -A INPUT -p udp --sport 1198 -j ACCEPT # Accept all TUN connections (tun = VPN tunnel) sudo iptables -A OUTPUT -o tun+ -j ACCEPT sudo iptables -A INPUT -i tun+ -j ACCEPT # Set default policies to drop all communication unless specifically allowed sudo iptables -P INPUT DROP sudo iptables -P OUTPUT DROP sudo iptables -P FORWARD DROP sudo ip6tables -P INPUT DROP sudo ip6tables -P OUTPUT DROP sudo ip6tables -P FORWARD DROP
請注意,此處沒有針對 ip6tables 的本地流量規則,但如果您的本地網路執行的是 IPv6 而不是 IPv4,則可能需要它。在這種情況下,更改
iptables
並ip6tables
替換本地流量規則中的 IP 地址即可。
ping 顯示的結果是您的電腦能夠利用 IPv6 與外界通信。因此,當 Chromium 無法獲得 IPv4 連接時,它將使用 IPv6。如果你想防止這種情況,你必須研究使用
ip6tables
.