Iptables

通過網路命名空間內的網路連接連接到網際網路,而不設置為預設路由

  • March 7, 2022

我需要進行這樣的設置(使用 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_leftbridge0網路介面。

圖2

我一定在某處做錯了什麼。


編輯:

指定什麼是“不起作用”。

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-hasARP 請求,但僅在網橋介面上。它似乎永遠不會“進入” weth0 界面。

啊。問題是,curl --interface不會神奇地繞過路由。

正如這裡所解釋的

https://superuser.com/questions/1223177/why-does-curl-not-work-with-non-default-network-interface-in-centos-6

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