Iptables

Alpine linux veth 網路/網橋沒有網際網路

  • November 4, 2020

我一直在嘗試按照多個指南為 2 個可以在 alpine linux 上相互通信的命名空間設置 veth-pair。到目前為止,我在命名空間之間進行了通信,但兩個命名空間都不能連接/ping 到任何外部 ip/url。

這是我完全使用的指南配置:

 ip netns add namespace1
 ip netns add namespace2
 ip netns exec namespace1 ip address show
 ip link add veth1 type veth peer name br-veth1
 ip link add veth2 type veth peer name br-veth2
 ip link set veth1 netns namespace1
 ip link set veth2 netns namespace2
 ip netns exec namespace1 ip address show
 ip netns exec namespace1 ip addr add 192.168.1.11/24 dev veth1
 ip netns exec namespace1 ip address show
 ip netns exec namespace2 ip addr add 192.168.1.12/24 dev veth2
 
 # Create the bridge device naming it `br1`
 # and set it up:
 ip link add name br1 type bridge
 ip link set br1 up
 ip link | grep br1
 
 # Set the bridge veths from the default
 # namespace up.
 ip link set br-veth1 up
 ip link set br-veth2 up
 ip netns exec namespace1 ip link set veth1 up
 ip netns exec namespace2 ip link set veth2 up
 
 # Add the br-veth* interfaces to the bridge
 # by setting the bridge device as their master.
 ip link set br-veth1 master br1
 ip link set br-veth2 master br1
 bridge link show br1
 ip addr add 192.168.1.10/24 brd + dev br1
 ip -all netns exec ip route add default via 192.168.1.10
 iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE

我還驗證了 /etc/sysctl.conf 包含

net.ipv4.ip_forward = 1

我也執行了這個命令以防萬一

sysctl -w net.ipv4.ip_forward=1

我的 resolv.conf 包含:

nameserver 8.8.8.8

當我跑步時

ip netns exec namespace1 ip route

我得到結果:

192.168.1.0/24 dev veth1 proto kernel scope link src 192.168.1.11

如果我執行一個正常的 ip 路由列表,我會得到:

192.168.56.0 eth0 proto kernel scope link src 192.168.56.217
192.168.1.0/24 dev br1 proto kernel scope link src 192.168.1.10

我不知道為什麼上面的設置不起作用,因為大多數指南似乎建議主機和命名空間應該能夠在執行 MASQUERADE 並設置命名空間的預設路由之後進行通信,但是網路不是我的核心研究領域,所以任何建議都會非常有用。如果缺少任何資訊,請隨時發表評論,如果我錯過了什麼,我會盡力提供。

我逐字應用了您的設置,它正在工作。

您一定是在某處打錯了字,或者沒有完全按照您在問題中寫的內容進行操作。

兩個備註:

bridge link show br1

是無效的語法。man bridge在最近的版本中進行了修改可能是因為這是一個常見的錯誤:

bridge link show- 列出所有網橋的埠配置。此命令顯示所有網橋的埠配置和標誌。

要顯示特定網橋的埠配置和標誌,請使用“ ip link show master <bridge_device>”命令。

所以你應該改用:

ip link show master br1

或者你會在其他網橋上獲得額外的介面。當然沒關係。

重要的是:

  ip -all netns exec ip route add default via 192.168.1.10

應該在網路命名空間中設置預設路由(並且為我做了),但你稍後會寫:

當我跑步時

ip netns exec namespace1 ip route

我得到結果:

192.168.1.0/24 dev veth1 proto kernel scope link src 192.168.1.11

這裡缺少預設路由。在我的系統上做同樣的事情,我得到了,你應該有但沒有:

# ip netns exec namespace1 ip route
default via 192.168.1.10 dev veth1 
192.168.1.0/24 dev veth1 proto kernel scope link src 192.168.1.11 

因此,找出缺少的內容。在不更改任何順序的情況下,完全按照給定的方式手動重新測試您的命令,並驗證您是否獲得了預設路由。例如,如果介面關閉然後再次啟動,則此路由將失去(但在 OP 的腳本中未完成)。如果需要,不要使用-all但重複兩次命令一次namespace1一次 for namespace2


更新:從評論中的進一步討論看來,OP 也有iptables,其 FORWARD 策略設置為 DROP。

如果打算啟用命名空間間的流量(是否應該啟動br_netfilter,見最後)以及來自命名空間的任何傳出流量,可以簡單地使案例如:

iptables -I FORWARD -i br1 -j ACCEPT

同樣,如果需要,命名空間也可以到達主機:

iptables -I INPUT -i br1 -j ACCEPT

關於這一點的安全性確實值得深思,並將規則集成到現有的防火牆解決方案中。

如果像 Docker 這樣的其他工具正在執行,事情可能會變得更加複雜,因為它可能會啟用br_netfilter,正如我對這個 Q/A 的回答中所見。

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