Networking
IPv6 轉發在網路命名空間中不起作用
我有 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 的工作流程相同)
最初完成了兩個步驟,但在新的網路命名空間中沒有再次完成:
echo 1 > /proc/sys/net/ipv4/ip_forward echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
發生這種情況導致的行為在 IPv4 和 IPv6 之間是不同的,如允許更改此預設行為的相對較新的網路切換中所述
devconf_inherit_init_net
:$$ … $$
預設情況下,我們保持**目前行為:**對於 IPv4,我們從 init_net 繼承所有目前設置,對於 IPv6,我們將所有設置重置為預設值。
所以在新的網路命名空間中:
- 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
.ip netns exec net1 sysctl -w net.ipv6.conf.all.forwarding=1