【问题标题】:connection between 2 namespaces2 个命名空间之间的连接
【发布时间】:2016-05-25 12:48:04
【问题描述】:

我编写了以下代码来创建两个命名空间 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

【问题讨论】:

    标签: linux networking linux-kernel kernel lxc


    【解决方案1】:

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

    # 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
    

    【讨论】:

    • 感谢您的回答和解释。请指导我在哪些情况下可以使用tap?
    • 我不能。我不知道您在做什么,也不知道您为什么认为使用水龙头设备是合适的。对于另一个清楚说明目标的问题,这听起来足够了。
    猜你喜欢
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    相关资源
    最近更新 更多