# ip netns add bluelinux
# ip netns listdocker
blue网络
先建立vethide
# ip link add veth0 type veth peer name veth1oop
在当前namespace能够看到veth0和veth1this
# ip link listurl
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWNspa
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00code
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000blog
link/ether 00:0c:29:b2:cf:72 brd ff:ff:ff:ff:ff:ff
3: veth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether ae:0d:00:e1:11:38 brd ff:ff:ff:ff:ff:ff
4: veth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 42:e7:50:d4:bb:c5 brd ff:ff:ff:ff:ff:ff
将veth1加到namespace “blue”
# ip link set veth1 netns blue
此时,当前namepapce只能看到veth0。
经过以下命令能够查看blue namespace的网口
# ip netns exec blue ip link list
经过ip netns exec能够配置namespace的网口
# ip netns exec blue ifconfig veth1 172.17.42.2/16 up
经过bridge来实现。参见veth pair一节。
主要参考
[0]Introducing Linux Network Namespaces
veth pair是用于不一样network namespace间进行通讯的方式,veth pair将一个network namespace数据发往另外一个network namespace的veth。以下:
# add the namespaces
ip netns add ns1
ip netns add ns2
# create the veth pair
ip link add tap1 type veth peer name tap2
# move the interfaces to the namespaces
ip link set tap1 netns ns1
ip link set tap2 netns ns2
# bring up the links
ip netns exec ns1 ip link set dev tap1 up
ip netns exec ns2 ip link set dev tap2 up
若是多个network namespace须要进行通讯,则须要借助bridge:
# add the namespaces
ip netns add ns1
ip netns add ns2
# create the switch
BRIDGE=br-test
brctl addbr $BRIDGE
brctl stp $BRIDGE off
ip link set dev $BRIDGE up
#
#### PORT 1
# create a port pair
ip link add tap1 type veth peer name br-tap1
# attach one side to linuxbridge
brctl addif br-test br-tap1
# attach the other side to namespace
ip link set tap1 netns ns1
# set the ports to up
ip netns exec ns1 ip link set dev tap1 up
ip link set dev br-tap1 up
#
#### PORT 2
# create a port pair
ip link add tap2 type veth peer name br-tap2
# attach one side to linuxbridge
brctl addif br-test br-tap2
# attach the other side to namespace
ip link set tap2 netns ns2
# set the ports to up
ip netns exec ns2 ip link set dev tap2 up
ip link set dev br-tap2 up
#
内核实现
veth的实现与loopback interface相似,比较简单:
//drivers/net/veth.c
static netdev_tx_t veth_xmit(struct sk_buff *skb, struct net_device *dev)
{
struct net_device *rcv = NULL;
struct veth_priv *priv, *rcv_priv;
priv = netdev_priv(dev);
rcv = priv->peer;
rcv_priv = netdev_priv(rcv);
stats = this_cpu_ptr(priv->stats);
length = skb->len;
//转发给peer
if (dev_forward_skb(rcv, skb) != NET_RX_SUCCESS)
goto rx_drop;
NETIF_F_NETNS_LOCAL是网络设备的一个特性,设置该特性的网络设备,不容许在不一样network namespace间移动。这类设备也叫作本地设备(local devices)。
Loopback,VXLAN,PPP,bridge都是这类设备。能够经过ethtool -k,或者ethtool –show- features查看该值:
# ethtool -k br0
netns-local: on [fixed]
若是对这类设备network namespace,会报下面的错误:
# ip link set br0 netns ns1
RTNETLINK answers: Invalid argument
参考《Resource management:Linux kernel Namespaces and cgroups》
主要参考
[0]Linux Switching – Interconnecting Namespaces
做者:YY哥
出处:http://www.cnblogs.com/hustcat/ 本文版权归做者和博客园共有,欢迎转载,但未经做者赞成必须保留此段声明,且在文章页面明显位置给出原文链接,不然保留追究法律责任的权利。