
我一直在努力增強我的 iptable 規則。以下是我迄今為止所做的事情、計劃完成的事情以及我的問題的一些背景:
我有一個 RPi 和一個 WiFi 模組,並已將 3G 數據機連接到它。我希望將 WiFi 中的所有流量轉送到我的 3G 介面。我創建了這些規則,它們運作良好,當我配對時,我可以在平板電腦上完全存取網路:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -F
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
iptables -F
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
iptables -A FORWARD -i ppp0 -o wlan1 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i wlan1 -o ppp0 -j ACCEPT
現在我想阻止這一切,只允許流向兩個 IP 位址的流量通過。我創建了一條鏈,但事情並沒有像我希望的那樣順利:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -F
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
iptables -F
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
iptables -N TEST
iptables -A TEST -d 34.215.23.64 -j RETURN
iptables -A TEST -d 52.37.29.39 -j RETURN
iptables -A TEST -j ACCEPT
iptables -A FORWARD -i wlan1 -o ppp0 -j TEST
iptables -A FORWARD -i wlan1 -o ppp0 -j DROP
當我執行此操作時,包括這兩個 IP 位址在內的所有 Internet 存取都會被封鎖。我試過 !具有相同的結果。
有人可以幫我弄清楚我在這方面缺少什麼嗎?
謝謝
答案1
iptables -A TEST -d 34.215.23.64 -j RETURN
iptables -A TEST -d 52.37.29.39 -j RETURN
您的主要問題是這些規則不會是有狀態的,並且您僅在一個方向上處理這些規則。如果我們假裝沒有其他問題,那麼這些規則只會處理一個方向的流量。但是,由於您可能需要雙向通信,您將如何獲得對您發送的目的地為“34.215.23.64”的任何內容的回复?回復將是一個資料包,來源位址為“34.215.23.64”,目標位址為您的 IP。
所以你應該考慮至少要加回 ( iptables ... --state RELATED,ESTABLISHED ...
) 規則。
iptables -N TEST
iptables -A TEST -d -j RETURN
iptables -A TEST -d 34.215.23.64 -j RETURN
iptables -A TEST -d 52.37.29.39 -j RETURN
iptables -A TEST -j ACCEPT
iptables -A FORWARD -i wlan1 -o ppp0 -j TEST
iptables -A FORWARD -i wlan1 -o ppp0 -j DROP
但這並不是唯一的問題。你的鏈條的邏輯被打破了。
因此,目的地為的資料包34.215.23.64
將首先在轉送上處理。它首先會匹配-j TEST
規則。在 TEST 鏈上,該封包只是被傳送回鏈(-j RETURN),然後下一個符合規則是 DROP。
無論如何,嘗試這樣的事情。
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -F
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
iptables -F
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
# permit all established connections
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
# chain for wlan -> ppp0 traffic
iptables -N WLAN2PPP
iptables -A WLAN2PPP -d 34.215.23.64 --state NEW -j ACCEPT
iptables -A WLAN2PPP -d 52.37.29.39 --state NEW -j ACCEPT
# everything else from wlan to ppp0 is dropped
iptables -A WLAN2PPP -j DROP
# send wlan1 -> ppp0 traffic to the chain.
iptables -A FORWARD -i wlan1 -o ppp0 -j WLAN2PPP