Linux
將 NAT 與 iptables 和網橋一起使用
我在防火牆上使用 iptables 配置 NAT 時遇到困難。
我的防火牆設置如下:
- 它是第 2 層透明防火牆,位於我的網關和 ISP 的網關之間
- 我將兩個介面橋接為 br0。這兩個介面在我的 ISP 端是 eno0,在我的本地網路端是 eno1
- 除了 NAT 之外,我基本上沒有設置任何 iptables 規則
這是我的規則:
root@firewall:~# iptables -S -P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT root@firewall:~# iptables -t nat -S -P PREROUTING ACCEPT -P INPUT ACCEPT -P OUTPUT ACCEPT -P POSTROUTING ACCEPT -A POSTROUTING -s 10.50.1.0/24 -j SNAT --to-source xxx.195.142.205 root@firewall:~# iptables -t mangle -S -P PREROUTING ACCEPT -P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -P POSTROUTING ACCEPT
**簡而言之,問題在於地址轉換適用於傳出流量,但不適用於回复。**這是一個測試範例:
- 我在區域網路上連接了一台 IP 為 10.50.1.7 的筆記型電腦,並用它來 ping 8.8.8.8
- 在防火牆上
tcpdump -i eno1
,我看到從 10.50.1.7 到 8.8.8.8 的 ICMP 請求,但沒有回复- 在防火牆上
tcpdump -i eno0
,我看到從 xxx.195.142.205 到 8.8.8.8 的 ICMP 請求,以及從 8.8.8.8 到 xxx.195.142.205 的 ICMP 回复- 顯然,在筆記型電腦上,我沒有收到 ICMP 回复
所以回復不會被翻譯回本地IP。我錯過了什麼?
謝謝你的幫助!
(注意:當刪除 NAT 規則並在筆記型電腦上使用公共 IP xxx.195.142.205 時,我可以完全訪問網際網路)
正如@dirkt 所建議的那樣,看起來 conntrack 不適用於橋接。因此,不需要的 iptables 規則似乎適用於網橋,但不適用於 NAT。
一旦我將防火牆配置為第 3 層防火牆,問題就解決了。
如果其他人感興趣:我在網上廣泛搜尋是否可以使用帶有 NAT 的透明第 2 層防火牆,但從未得到直接答案。
ebtables 網站確實表明這是可能的:
bridge-nf 程式碼使 iptables 看到橋接的 IP 數據包並啟用透明 IP NAT。
我從來沒有發現哪個 ebtables 命令可以使它工作。