Alpine linux veth 網路/網橋沒有網際網路
我一直在嘗試按照多個指南為 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
一次 fornamespace2
。更新:從評論中的進一步討論看來,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 的回答中所見。