不能將多個網路命名空間連結在一起
問題陳述
使用以下配置,在預設/主網路命名空間和名為
ns1
.該配置還創建了第二個 veth 對: veth2 在 netns 中
ns1
, veth3 在 netns 中ns2
,這加入ns1
了ns2
創建鏈: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 in
ns2
和 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
在每個命名空間中執行一個;這使得調試更容易。