Docker實踐(4)—network namespace與veth pair

network namespace

建立network namespace

# ip netns add bluelinux

# ip netns listdocker

blue網絡

 

添加網口到namespace

先建立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。

NewImage

經過以下命令能夠查看blue namespace的網口

# ip netns exec blue ip link list

NewImage

 

配置network namespace的網口

經過ip netns exec能夠配置namespace的網口

# ip netns exec blue ifconfig veth1 172.17.42.2/16 up

NewImage

network namespace的網口與物理網卡的通訊

經過bridge來實現。參見veth pair一節。

 

主要參考

[0]Introducing Linux Network Namespaces

 

veth pair

veth pair是用於不一樣network namespace間進行通訊的方式,veth pair將一個network namespace數據發往另外一個network namespace的veth。以下:

NewImage

 

# 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:

NewImage

# 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

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/ 本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。

相關文章
相關標籤/搜索