我有 3 个 Linux 虚拟机像这样连接:
/ server1 \
| ens19 2001:1::2 |
\ /
|
/ \
| ens19 2001:1::1 |
| server2 |
| ens20 2001:2::1 |
\ /
|
/ \
| ens19 2001:2::2 |
\ server3 /
我在 server1 上运行这些命令:
ip link set dev ens19 up
ip -6 address add 2001:1::2/96 dev ens19
ip -6 route add default via 2001:1::1
然后这些在server3上:
ip link set dev ens19 up
ip -6 address add 2001:2::2/96 dev ens19
ip -6 route add default via 2001:2::1
然后这些在server2上:
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
ip link set dev ens19 up
ip link set dev ens20 up
ip -6 address add 2001:1::1/96 dev ens19
ip -6 address add 2001:2::1/96 dev ens20
如果我尝试从 server1 ping server3,它可以工作:
root@server1:~# ping6 2001:2::2
但是如果我将 server2 上的接口移动到网络命名空间内:
ip netns add net1
ip link set dev ens19 netns net1
ip link set dev ens20 netns net1
ip netns exec net1 ip link set dev ens19 up
ip netns exec net1 ip link set dev ens20 up
ip netns exec net1 ip -6 address add 2001:1::1/96 dev ens19
ip netns exec net1 ip -6 address add 2001:2::1/96 dev ens20
从 server1 到 server3 的 ping 不再有效。不再转发数据包。
为什么?(注意:IPv4 的工作流程相同)
最初完成了两个步骤,但在新的网络命名空间中没有再次完成:
发生这种情况导致的行为在 IPv4 和 IPv6 之间有所不同,如允许更改此默认行为的相对较新的网络切换中所述
devconf_inherit_init_net
:所以在新的网络命名空间中:
IPv4 转发继承自初始网络命名空间。由于它刚刚启用了
echo 1 > /proc/sys/net/ipv4/ip_forward
在初始网络命名空间中运行,因此新的网络命名空间也被设置为 IPv4 路由器。所以它适用于 IPv4。
IPv6 被重置为默认的主机而不是路由器,无论在初始网络命名空间中所做的是什么(除非例如在创建新的网络命名空间之前
sysctl -w net.core.devconf_inherit_init_net=1
运行它:)只需添加缺少的步骤,即可在新的网络命名空间中运行(
/proc/sys/net/
网络命名空间感知)。如果没有一些体操,使用标准输出重定向将无法正常工作,因此最好使用专用命令:sysctl
.