在 ubuntu 上使用第二個 WAN 介面和第二個網關啟用 NAT 轉發
我有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
不是必須的,而是一個好習慣