Iptables

在 ubuntu 上使用第二個 WAN 介面和第二個網關啟用 NAT 轉發

  • March 13, 2011

我有3個介面:

eth0 192.168.0.50/24
eth1 10.0.0.200/24
eth2 225.228.123.211

預設網關是192.168.0.1我想要保留的,因為它是我想要進行的更改。

我想偽裝eth1 10.0.0.200/24並啟用 NAT 轉發到eth2. 所以我這樣做了:

ip route add 225.228.123.208/29 dev eth2 src 225.228.123.211 table t1
ip route add default via 225.228.123.209 dev eth2 table t1

ip rule add from 225.228.123.211 table t1
ip rule add to 225.228.123.211 table t1

現在我可以收到來自任何網際網路主機的 ping 回复,如果我這樣做了:

ping -I eth2 8.8.8.8

為了啟用 NAT 轉發,我這樣做了:

sudo iptables -A FORWARD -o eth2 -i eth1 -s 10.0.0.0/24 -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

但它不起作用。為了測試,我使用了一台客戶端電腦並將其放在10.0.0.0/24網路上,網關設置為10.0.0.200.

我想192.168.0.1作為預設網關。並且進來的流量eth1 10.0.0.200/24應該被轉發到eth2 225.228.123.211

我也在 ubuntu 上啟用了轉發。

我相信你想:

  • 將每個人從 eth1 10.0.0.0/24 路由​​到 eth2
  • 然而通過 eth0 維護 Linux 機器的路由

如果是這種情況,您的 iptables 和 iproute2 設置有幾個錯誤。這是我的建議:

-t nat -A POSTROUTING -o eth2 -j MASQUERADE
-A FORWARD -i eth1 -o eth2 -j ACCEPT
-A FORWARD -i eth2 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT

對於路由,您需要兩個自定義表。我將使用數字而不是名稱,因為我不知道您的/etc/iproute2/rt_tables. 現在,一個重要的注意事項:以我的方式修改 RPDB 和預設路由導致暫時的網路干擾。所以我建議不要在 CLI 上輸入這些,而是把它放在一個腳本中,這樣一切都會自動發生(除非你在 Linux 機器的物理控制台上輸入命令)。

ip route add default via 192.168.0.1     dev eth0 table 100
ip route add default via 225.228.123.209 dev eth2 table 102
ip route del default table main

ip rule add order 10 from all lookup main
ip rule add order 20 iif lo   lookup 100
ip rule add order 30 iif eth1 lookup 102

我們將這lookup main條規則作為第一條規則,以確保正確路由到直接連接到 Linux 機器的子網。但是我們刪除了該表中的預設路由,因為我們想根據數據包進入 Linux 機器的位置指定不同的預設路由。

現在,這是一個重要的問題:子網 10.0.0.0/24 是否代表所有直接或間接連接到 eth1 的網路?

**如果是,**則配置完成。

**如果否,**即有其他子網間接連接到 eth1(比如 10.0.1.0/24、10.0.2.0/24 等),您可以通過另一個路由器(比如 10.0.0.77/24)訪問這些子網您必須向main表中添加更多路線:

ip route add 10.0.1.0/24 via 10.0.0.77 dev eth1 table main
ip route add 10.0.2.0/24 via 10.0.0.77 dev eth1 table main
... and so on ...

注意: table main不是必須的,而是一個好習慣

引用自:https://serverfault.com/questions/245743