通过创建两个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地址