Iptables
通過網路命名空間內的網路連接連接到網際網路,而不設置為預設路由
我需要進行這樣的設置(使用 Linux):
- 我想要一個網路命名空間(假設
weth_ns
),其網路介面連接到網際網路(weth0
)- 我想在主機命名空間 ( )中使用不同的網路介面作為預設路由
eth0
- 我希望能夠以某種方式使用類似的東西
curl
,通過某種介面,透明地使用該命名空間內的網路連接到網際網路。所以,像這樣。
我似乎無法讓它工作。到目前為止我做了什麼:
ip netns add weth_ns ip link set weth0 netns weth_ns ip netns exec weth_ns ip link set dev weth0 up ip netns exec weth_ns ip a # to see list to make sure it's there ip netns exec weth_ns dhclient weth0 ip netns exec weth_ns curl website.com # works as expected
這將設置命名空間並將介面放在那裡。這使得 curl 在命名空間內工作。現在我想以某種方式使用來自主機的隔離命名空間連接。
我試圖做的是建立一個網橋,並在命名空間內設置 iptables。所以我執行的是:
ip link add veth0_left type veth peer veth0_right ip link add bridge0 type bridge ip link set bridge0 up ip addr add 10.9.0.0/24 dev bridge0 # 10.9.0.0 is address I came up with ip link set veth0_left master bridge0 up ip link set dev veth0_right netns weth_ns ip netns exec weth_ns ip link set dev veth0_right up ip netns exec mobile_ns ip addr add 10.9.0.1/24 dev veth0_right
這增加了一個橋;我現在可以成功地從命名空間 ping 到命名空間。所以橋本身可以工作。
ping 10.9.0.1 # works ip netns exec mobile_ns ping 10.9.0.0 # works
現在我需要設置 iptables 以使用命名空間內的連接。我懷疑這是我犯了某種錯誤的地方。這是我從各種線上資源中收集到的:
ip netns exec mobile_ns bash # all following inside the namespace bash: iptables -t nat -A POSTROUTING -s 10.9.0.0/255.255.255.0 -o weth0 -j MASQUERADE iptables -A FORWARD -i weth0 -o veth0_right -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -o weth0 -i veth0_right -m state --state ESTABLISHED,RELATED -j ACCEPT
(所有涉及的網路都
/proc/sys/net/ipv4/conf/<network>/forwarding
設置為 1。來自命名空間的內部和外部。)而且……它不起作用。我的網路現在應該是這樣的;但我無法通過 curl 連接。使用任一
veth0_left
或bridge0
網路介面。我一定在某處做錯了什麼。
編輯:
指定什麼是“不起作用”。
curl --interface bridge0 8.8.8.8 curl: (7) Failed to connect to 8.8.8.8 port 80: No route to host
curl --interface veth0_left 8.8.8.8 curl: (7) Failed to connect to 8.8.8.8 port 80: No route to host
當我嘗試查看命名空間內的 tcpdump 時,我看到了
who-has
ARP 請求,但僅在網橋介面上。它似乎永遠不會“進入” weth0 界面。
啊。問題是,
curl --interface
不會神奇地繞過路由。正如這裡所解釋的