2个命名空间之间的连接

connection between 2 namespaces

我编写了以下代码来创建两个命名空间 ns1 和 ns2,并使用 bridge(br)、tap0 和 tap1 在它们之间建立连接。但是最后 "ping" 我的网络无法访问。你能指导我是什么问题吗?

ip netns add ns1
ip netns add ns2

ip link add name br type bridge 

ip tuntap add dev tap0 mode tap 
ip tuntap add dev tap1  mode tap

ip link set dev tap0 master br
ip link set tap0 up


ip link set dev tap1 master br
ip link set tap1 up

ip link set tap0 netns ns1
ip link set tap1 netns ns2


ip netns exec ns1 ip addr add 10.0.0.1/24 dev tap0 
ip netns exec ns2 ip addr add 10.0.0.2/24 dev tap1 

ip netns exec ns1 ip link set dev tap0 up
ip netns exec ns2 ip link set dev tap1 up

ip netns exec ns1 ip link set dev lo up
ip netns exec ns2 ip link set dev lo up


ip link set br up

ip netns exec ns1 ping 10.0.0.2

如果您在脚本中定期检查桥的状态,问题可能会变得更加明显。在您设置其中一个点击设备的命名空间之前,它看起来像这样:

# ip netns exec ip link show tap0
10: tap0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast master br state DOWN mode DEFAULT qlen 500
    link/ether b2:e6:85:8a:43:61 brd ff:ff:ff:ff:ff:ff

setns操作后,是这样的:

10: tap0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 500
    link/ether b2:e6:85:8a:43:61 brd ff:ff:ff:ff:ff:ff

请注意,在此输出中您不再看到 master br;当你 将接口移出它被删除的全局命名空间 桥(因为它不再可见)。

通常,要将名称空间连接到主机上的网桥,您需要 使用 veth 台设备,而不是 tap 台设备。 veth 设备是 连接的接口对(将其视为虚拟跳线)。 您将一对的一侧添加到您的桥中,另一端去 进入网络命名空间。像这样:

ip netns add ns1
ip netns add ns2

ip link add name br0 type bridge

for ns in ns1 ns2; do

        # create a veth pair named $ns-inside and $ns-outside
        # (e.g., ns1-inside and ns1-outside)
        ip link add $ns-inside type veth peer name $ns-outside

        # add the -outside half of the veth pair to the bridge
        ip link set dev $ns-outside master br0
        ip link set $ns-outside up

        # add the -inside half to the network namespace
        ip link set $ns-inside netns $ns

done

ip netns exec ns1 ip addr add 10.0.0.1/24 dev ns1-inside
ip netns exec ns2 ip addr add 10.0.0.2/24 dev ns2-inside

ip netns exec ns1 ip link set dev ns1-inside up
ip netns exec ns2 ip link set dev ns2-inside up

ip link set br0 up

在上面之后:

# ip netns exec ns1 ping -c2 10.0.0.2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.034 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.044 ms

--- 10.0.0.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.034/0.039/0.044/0.005 ms