Linux

將 NAT 與 iptables 和網橋一起使用

  • September 11, 2017

我在防火牆上使用 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 命令可以使它工作。

引用自:https://unix.stackexchange.com/questions/391236