为什么需要为同一子网中的两个网络命名空间指定默认网关?

为什么需要为同一子网中的两个网络命名空间指定默认网关?

我正在学习网络命名空间。我在系统上创建了两个网络命名空间 - 红色和蓝色 - 并附加了一个 veth 对以连接它们 - veth-red 和 veth-blue。我为每个接口分配 IP 地址 - 192.168.1.1 和 192.168.1.2。然后我启动接口。但是,除非我指定默认网关,否则它们无法相互 ping 通。我认为如果它们位于不同的网络上,则只需指定默认网关。代码在这里:

# Create network namespaces
ip netns add red
ip netns add blue

# Create veth pair
ip link add veth-red type veth peer name veth-blue

# Add veth to respective namespaces
ip link set veth-red netns red
ip link set veth-blue netns blue

# Set IP Addresses
ip -n red addr add 192.168.1.1 dev veth-red
ip -n blue addr add 192.168.1.2 dev veth-blue


# Bring up interfaces
ip -n red link set veth-red up
ip -n blue link set veth-blue up

# Bring up Loopback interfaces 
ip -n red link set lo up
ip -n blue link set lo up

然后我尝试从红色 ping 蓝色

# Ping test
ip netns exec red ping 192.168.1.2

但它失败并出现错误:

connect: Network is unreachable

然后我为两个命名空间添加默认网关:

# Add default gateway
ip netns exec red ip route add default via 192.168.1.1 dev veth-red
ip netns exec blue ip route add default via 192.168.1.2 dev veth-blue

然后 ping 就可以正常工作了。

我的问题是,如果它们在同一个网络上,为什么我必须添加默认网关?

答案1

我搞明白了。愚蠢的错误。添加 IP 地址时,我没有指定子网掩码。因此,系统假设它是 255.255.255.255。我将其更改为此,它就可以正常工作了。

# Set IP Addresses
ip -n red addr add 192.168.1.1/24 dev veth-red
ip -n blue addr add 192.168.1.2/24 dev veth-blue

相关内容