Linux bridge

通过创建两个network namespace来进行数据交换来摸索下Linux bridge
创建namespace

root@2015-vm1:/home/lihui# ip netns add ns0
root@2015-vm1:/home/lihui# ip netns add ns1

创建两对虚拟网卡对,每一对就像pipe一样

root@2015-vm1:/home/lihui# ip link add name veth0 type veth peer name breth0
root@2015-vm1:/home/lihui# ip link add name veth1 type veth peer name breth1

这里veth0和breth0连通,veth1和breth1连通,将veth pair的一端veth0和veth1分别分给ns0和ns1这两个network namespace

root@2015-vm1:/home/lihui# ip link set veth0 netns ns0
root@2015-vm1:/home/lihui# ip link set veth1 netns ns1

给两个namespace里的设备配置IP地址

root@2015-vm1:/home/lihui# ip netns exec ns0 ifconfig veth0 10.1.1.100/24 up
root@2015-vm1:/home/lihui# ip netns exec ns1 ifconfig veth1 10.1.1.101/24 up

那么目前两个namespace里的设备情况如下

root@2015-vm1:/home/lihui# ip netns exec ns0 ifconfig
veth0     Link encap:Ethernet  HWaddr 0e:dc:a7:51:c0:93  
          inet addr:10.1.1.100  Bcast:10.1.1.255  Mask:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)


root@2015-vm1:/home/lihui# ip netns exec ns1 ifconfig
veth1     Link encap:Ethernet  HWaddr 7e:51:df:7f:71:12  
          inet addr:10.1.1.101  Bcast:10.1.1.255  Mask:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

由于是两个独立网络环境的namespace,这里它们之间是无法进行数据交换的

root@2015-vm1:/home/lihui# ip netns exec ns0 ping 10.1.1.101
PING 10.1.1.101 (10.1.1.101) 56(84) bytes of data.

但是重要的一点,和veth0相连的breth0以及和veth1相连的breth1都还闲置着,因此,只要能让闲置的两个口进行数据交换,就可以达到目的,这里可以通过配置一个网桥来实现
Linux内核已经实现了网桥,当然这里是一个虚拟的网桥设备,但是它可以绑定网口,将它们桥接起来,但是配置需要用到用户层的工具brctl
首先创建一个网桥,同时,在Linux里它也是一个虚拟设备

root@2015-vm1:/home/lihui# brctl addbr br-lihui

将那两个闲置的口都绑定在br-lihui这个bridge上,作为其端口

root@2015-vm1:/home/lihui# brctl addif br-lihui breth0
root@2015-vm1:/home/lihui# brctl addif br-lihui breth1

但是要使用br-lihui,必须给他分配IP地址

root@2015-vm1:/home/lihui# ifconfig br-lihui 10.1.1.1
root@2015-vm1:/home/lihui# ifconfig br-lihui
br-lihui  Link encap:Ethernet  HWaddr a2:6a:34:1e:4f:2d  
          inet addr:10.1.1.1  Bcast:10.255.255.255  Mask:255.0.0.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

但是奇怪的是,居然还是没法交换

root@2015-vm1:/home/lihui# ip netns exec ns0 ping 10.1.1.101
PING 10.1.1.101 (10.1.1.101) 56(84) bytes of data.
^C

查看了下两个绑定在bridge上得网卡,原来没up

15: breth0: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master br-lihui state DOWN group default qlen 1000
    link/ether d2:80:16:0f:59:ae brd ff:ff:ff:ff:ff:ff


17: breth1: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master br-lihui state DOWN group default qlen 1000
    link/ether a2:6a:34:1e:4f:2d brd ff:ff:ff:ff:ff:ff

将它们都UP,然后就能ping通了

root@2015-vm1:/home/lihui# ifconfig breth0 up
root@2015-vm1:/home/lihui# ifconfig breth1 up
root@2015-vm1:/home/lihui# ip netns exec ns0 ping 10.1.1.101

PING 10.1.1.101 (10.1.1.101) 56(84) bytes of data.
64 bytes from 10.1.1.101: icmp_seq=1 ttl=64 time=0.174 ms
64 bytes from 10.1.1.101: icmp_seq=2 ttl=64 time=0.064 ms
64 bytes from 10.1.1.101: icmp_seq=3 ttl=64 time=0.079 ms
64 bytes from 10.1.1.101: icmp_seq=4 ttl=64 time=0.070 ms
需要注意的一点就是bridge一定要配置IP地址

发表评论