问题陈述
使用以下配置,在默认/主网络命名空间和名为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 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 任何东西,ns2
但不能 pingns1
默认 netns 之外的任何接口。
这是网络命名空间的限制吗?
故障排除
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
可能不是:当我使用问题开头给出的命令在我的系统上尝试此操作时,我也无法达到
veth3
:但是,当我启用转发时
ns1
有用:
所以很可能你也没有在
ns1
. (记住转发是每个命名空间的;你是否在主命名空间中启用了它,但不是在ns1
?)我通过
tcpdump
在每个接口上进行调试来调试它;ping 未到达veth2
表示未启用转发。如果您想知道“但是
veth2
如果未启用转发,为什么我可以 ping”:Linux 将所有本地地址视为相同,因此您可以从任何接口访问任何本地地址。这与转发完全无关。顺便说一句,它可以帮助很多人
xterm
在每个命名空间中运行一个;这使得调试更容易。我得出了与@dirkt 相同的完全有效的结论,每个命名空间本身就是一个网络主机,包括设置它是否像路由器一样(默认为关闭)。/proc/sys/net 设置对于每个命名空间都是独立的。解析是独立的,接口链接是独立的(但主机名不是,因为您必须创建 UTS 命名空间)。所以基本上这就是你的答案。
无论如何不要减损,但为了将来参考,我会添加一些东西并稍微重新排列和简化。您实际上不需要默认命名空间中的路由设置,除非您希望将外部流量路由到这些命名空间,反之亦然。
总结一下默认命名空间和 ns1 加上 ns2 的构造。
然后你可以做一些测试:
您还可以进行一些解析和主机文件更改