Linux,两个网络命名空间之间的对等地址和路由

Linux,两个网络命名空间之间的对等地址和路由

我正在尝试了解有关 Linux 中的路由的一些信息。我有以下设备(veth 对):

veth pair: [ns1-1] <10.8.0.1 peer 10.8.0.2> [ns1-2]
veth pair: [ns2-1] <10.8.0.5 peer 10.8.0.6> [ns2-2]

我将 IP 添加到 ns*-1 设备,如下所示:

[ns1-1] <10.8.0.3 peer 10.8.0.4> [ns2-1]

每个 ns*-2 设备都位于单独的网络命名空间中。我尝试从每个命名空间 ping 所有 6 个 IP。我使用附加的简单脚本执行所有操作。此脚本的输出为:

# failed to ping 10.8.0.6 from ns1
# failed to ping 10.8.0.2 from ns2

请注意,我也做过

echo 0 > /proc/sys/net/ipv4/ip_forward

写 1 可以让所有 IP 都可 ping 通,但我不只是在寻找问题的解决方案。我想了解路由的工作原理。

为什么上述两种情况都 ping 不通?

当我从命名空间 ns1 ping 10.8.0.5 (ns2-1)时,为什么我看不到任何数据包tcpdump -i ns2-1当我从命名空间 ns1 ping 10.8.0.5(ns2-1)时,为什么即使 ping 成功,

为什么即使转发被禁用,我也可以从命名空间 ns1 ping 10.8.0.5?

如果不启用转发,我是否可以从所涉及的任何命名空间访问所有所涉及的 IP?

谢谢。

脚本如下:

#!/bin/sh

#path=(/sbin $path)
PATH=/sbin:$PATH

_ns() { ip netns exec "$@"; }

create_ns()
{
    ns=$1
    a1=$2 a2=$3
    l1=$ns-1 l2=$ns-2
    ip netns add $ns
    ip link add name $l1 type veth peer name $l2
    ip link set dev $l2 netns $ns
    _ns $ns ip link set dev lo up
    ip addr add $a1 peer $a2 dev $l1
    _ns $ns ip addr add $a2 peer $a1 dev $l2
    ip link set dev $l1 up
    _ns $ns ip link set dev $l2 up
    _ns $ns ip route add default via $a1
}

close_ns()
{
    ip link del $1-1
    ip netns del $1
}

test_ping()
{
    if ! _ns $1 ping -W 1 -c 1 $2 >/dev/null 2>&1; then
        echo "failed to ping $2 from $1"
    fi
}

close_ns ns1
close_ns ns2

create_ns ns1 10.8.0.1 10.8.0.2
create_ns ns2 10.8.0.5 10.8.0.6
ip addr add 10.8.0.3 peer 10.8.0.4 dev ns1-1
ip addr add 10.8.0.4 peer 10.8.0.3 dev ns2-1

test_ping ns1 10.8.0.1
test_ping ns1 10.8.0.2
test_ping ns1 10.8.0.3
test_ping ns1 10.8.0.4
test_ping ns1 10.8.0.5
test_ping ns1 10.8.0.6

test_ping ns2 10.8.0.1
test_ping ns2 10.8.0.2
test_ping ns2 10.8.0.3
test_ping ns2 10.8.0.4
test_ping ns2 10.8.0.5
test_ping ns2 10.8.0.6

# failed to ping 10.8.0.6 from ns1
# failed to ping 10.8.0.2 from ns2

相关内容