Linux

不能將多個網路命名空間連結在一起

  • November 23, 2021

問題陳述

使用以下配置,在預設/主網路命名空間和名為ns1.

該配置還創建了第二個 veth 對: veth2 在 netns 中ns1, veth3 在 netns 中ns2,這加入ns1ns2創建鏈:default netns-veth0 <-> veth1-ns1-veth2 <-> veth3-ns2

sudo ip link add veth0 type veth peer name veth1
sudo ip -6 addr add CCFF::0/127 peer CCFF::1/127 dev veth0
sudo ip link set up dev veth0

sudo ip netns add ns1
sudo ip link set veth1 netns ns1
sudo ip -n ns1 -6 addr add CCFF::1/127 peer CCFF::0/127 dev veth1
sudo ip -n ns1 link set up dev veth1
sudo ip -n ns1 -6 route add default via CCFF::0

sudo ip link add veth2 type veth peer name veth3
sudo ip link set veth2 netns ns1
sudo ip -n ns1 -6 addr add CCFF::2/127 peer CCFF::3/127 dev veth2
sudo ip -n ns1 link set up dev veth2
sudo ip -n ns1 -6 route add CCFF::/64 via CCFF::3

sudo ip netns add ns2
sudo ip link set veth3 netns ns2
sudo ip -n ns2 -6 addr add CCFF::3/127 peer CCFF::2/127 dev veth3
sudo ip -n ns2 link set up dev veth3
sudo ip -n ns2 -6 route add default via CCFF::2

sudo ip -6 r add CCFF::/64 via CCFF::1

從預設的 netns 我可以 ping 同一個 netns 中的 veth0。從預設的 netns 我可以 ping veth1 和 veth2,它們都在ns1. 從預設的 netns 中,我無法辨識ns2.

如果我按如下方式擴展更改,通過添加 veth4 inns2和 veth5 inns3我有同樣的問題。我可以從任何介面 ping 到 中ns1的任何介面ns2,但無法到達 中的任何介面ns3

sudo ip link add veth4 type veth peer name veth5
sudo ip link set veth4 netns ns2
sudo ip netns exec ns2 ip -6 addr add CCFF::4/127 peer CCFF::5/127 dev veth4
sudo ip netns exec ns2 ip link set up dev veth4
sudo ip netns exec ns2 ip -6 route add CCFF::/64 via CCFF::5

sudo ip netns add ns3
sudo ip link set veth5 netns ns3
sudo ip netns exec ns3 ip -6 addr add CCFF::5/127 peer CCFF::4/127 dev veth5
sudo ip netns exec ns3 ip link set up dev veth5
sudo ip netns exec ns3 ip -6 route add default via CCFF::4

看來我只能在直接“相鄰”/“連接”的網路中 ping 一個介面到我正在 ping 的那個。我無法通過一系列網路名稱空間 ping 通。路由全部有效;預設 netns 可以 ping 任何介面,ns1但不能進一步,interfaces inns1可以 ping 預設 netns 中的任何介面,ns2但不能 ping 任何介面,ns3並且ns3可以ping 任何介面,但不能 ping 預設 netnsns2之外的任何介面ns1

這是網路命名空間的限制嗎?

故障排除

IPv6 轉發已啟用,ip6tables 只是設置為“全部允許”,我不確定還要檢查什麼。

$ip -6 r
ccff::1 dev veth0 proto kernel metric 256 pref medium
ccff::/127 dev veth0 proto kernel metric 256 pref medium
ccff::/64 via ccff::1 dev veth0 metric 1024 pref medium
fe80::/64 dev veth0 proto kernel metric 256 pref medium

$sudo ip -n ns1 -6 r
ccff:: dev veth1 proto kernel metric 256 pref medium
ccff::/127 dev veth1 proto kernel metric 256 pref medium
ccff::3 dev veth2 proto kernel metric 256 pref medium
ccff::2/127 dev veth2 proto kernel metric 256 pref medium
ccff::/64 via ccff::3 dev veth2 metric 1024 pref medium
fe80::/64 dev veth1 proto kernel metric 256 pref medium
fe80::/64 dev veth2 proto kernel metric 256 pref medium
default via ccff:: dev veth1 metric 1024 pref medium

$sudo ip -n ns2 -6 r
ccff::2 dev veth3 proto kernel metric 256 pref medium
ccff::2/127 dev veth3 proto kernel metric 256 pref medium
ccff::5 dev veth4 proto kernel metric 256 pref medium
ccff::4/127 dev veth4 proto kernel metric 256 pref medium
ccff::/64 via ccff::5 dev veth4 metric 1024 pref medium
fe80::/64 dev veth3 proto kernel metric 256 pref medium
fe80::/64 dev veth4 proto kernel metric 256 pref medium
default via ccff::2 dev veth3 metric 1024 pref medium

$sudo ip -n ns3 -6 r
ccff::4/127 dev veth5 proto kernel metric 256 linkdown pref medium
default via ccff::4 dev veth5 metric 1024 linkdown pref medium

$cat /proc/sys/net/ipv6/conf/all/forwarding 
1

$cat /proc/sys/net/ipv6/conf/default/forwarding 
1

$sudo ip6tables-save
# Generated by ip6tables-save v1.8.4 on Wed Nov 17 22:02:48 2021
*filter
:INPUT ACCEPT [76565:173401906]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [50440:6536664]
COMMIT
# Completed on Wed Nov 17 22:02:48 2021

$lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.3 LTS
Release:    20.04
Codename:   focal

$uname -a
Linux l13-ubuntu 5.11.0-40-generic #44~20.04.2-Ubuntu SMP Tue Oct 26 18:07:44 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

IPv6 轉發已啟用

可能不是:當我使用問題開頭給出的命令在我的系統上嘗試此操作時,我也無法達到veth3

$ ping -6 CCFF::3
PING CCFF::3(ccff::3) 56 data bytes
^C
--- CCFF::3 ping statistics ---
13 packets transmitted, 0 received, 100% packet loss, time 12290ms

但是,當我啟用轉發時ns1

echo 1 | sudo ip netns exec ns1 tee /proc/sys/net/ipv6/conf/all/forwarding

有用:

$ ping -6 CCFF::3
PING CCFF::3(ccff::3) 56 data bytes
64 bytes from ccff::3: icmp_seq=1 ttl=63 time=0.112 ms
64 bytes from ccff::3: icmp_seq=2 ttl=63 time=0.054 ms

所以很可能你也沒有在ns1. (記住轉發是每個命名空間的;你是否在主命名空間中啟用了它,但不是在ns1?)


我通過tcpdump在每個介面上進行調試來調試它;ping 未到達veth2表示未啟用轉發。

如果您想知道“但是veth2如果未啟用轉發,為什麼我可以 ping”:Linux 將所有本地地址視為相同,因此您可以從任何介面訪問任何本地地址。這與轉發完全無關。

順便說一句,它可以幫助很多人xterm在每個命名空間中執行一個;這使得調試更容易。

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