zdq0394.github.com

Tech study and research.

Follow me on GitHub

Bridge简单实践

基本概念

网桥bridge是一个虚拟网络设备,具有网络设备的特性:可以配置IP、MAC地址等; 而且,bridge还是一个虚拟交换机,和物理交换机设备功能类似。

网桥是一种在链路层实现中继,对帧进行转发的技术,根据MAC分区块,可隔离碰撞,将网络的多个网段在数据链路层连接起来的网络设备。

  • 对于普通的物理设备来说,只有两端,从一端进来的数据会从另一端出去。比如物理网卡,从外面网络中收到的数据会转发到内核协议栈中,而从协议栈过来的数据会转发到外面的物理网络中。
  • 而bridge不同,bridge有多个端口,数据可以从任何端口进来,进来之后从哪个口出去需要看mac地址,原理与物理交换机类似。

网桥bridge是建立在从设备上——所谓从设备,如物理设备、虚拟设备、vlan设备等,即attach一个从设备,类似于现实世界中的交换机和一个用户终端之间连接了一根网线。并且可以为bridge配置一个IP,这样该主机就可以通过这个bridge设备与网络中的其他主机进行通信了。

另外Bridge的从设备被虚拟化为端口port,它们的IP及MAC都不再可用,且它们被设置为接受任何包,最终由bridge设备来决定数据包的去向:接收到本机、转发、丢弃、广播。

环境说明

VirtualBox虚拟机,Centos 7.2。

uname -r
3.10.0-862.el7.x86_64

安装bridge-utils软件包,并加载bridge模块和开启内核转发。

apt-get install bridge-utils
modprobe bridge

echo "1">/proc/sys/net/ipv4/ip_forward

cat /proc/sys/net/ipv4/ip_forward
1

brctl命令说明

brctl 
Usage: brctl [commands]
commands:
	addbr     	<bridge>		add bridge
	delbr     	<bridge>		delete bridge
	addif     	<bridge> <device>	add interface to bridge
	delif     	<bridge> <device>	delete interface from bridge
	hairpin   	<bridge> <port> {on|off}	turn hairpin on/off
	setageing 	<bridge> <time>		set ageing time
	setbridgeprio	<bridge> <prio>		set bridge priority
	setfd     	<bridge> <time>		set bridge forward delay
	sethello  	<bridge> <time>		set hello time
	setmaxage 	<bridge> <time>		set max message age
	setpathcost	<bridge> <port> <cost>	set path cost
	setportprio	<bridge> <port> <prio>	set port priority
	show      	[ <bridge> ]		show a list of bridges
	showmacs  	<bridge>		show a list of mac addrs
	showstp   	<bridge>		show bridge stp info
	stp       	<bridge> {on|off}	turn stp on/off

实践

以下将按照下图构建网络

创建一个网桥

brctl addbr br0

也可以通过ip link命令创建网桥

ip link add br1 type bridge

查看刚刚创建的网桥

brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.000000000000	no		
br1		8000.000000000000	no		
docker0		8000.02423260ded2	no

创建两个veth pair

ip link add br0-veth1 type veth peer name br0-veth2
ip link add br0-veth3 type veth peer name br0-veth4

创建两个network namespace

ip netns add net1
ip netns add net2

分别将2个veth pair的奇数端加入网桥,偶数端加入net1和net2

ip link set br0-veth1 master br0
ip link set br0-veth3 master br0
ip link set br0-veth2 netns net1
ip link set br0-veth4 netns net2

将net1和net2中的veth配置ip并启用

ip netns exec net1 ip addr add 192.168.101.2/24 dev br0-veth2
ip netns exec net2 ip addr add 192.168.101.4/24 dev br0-veth4

ip netns exec net1 ip link set dev br0-veth2 up
ip netns exec net2 ip link set dev br0-veth4 up

将网桥br0和br0-veth1、bro-veth2启用

ip link set br0 up
ip link set br0-veth1 up
ip link set br0-veth3 up

测试连通性

从net1中ping net2中的ip

ip netns exec net1 ping -c 4 192.168.101.4 -I br0-veth2
PING 192.168.101.4 (192.168.101.4) from 192.168.101.2 br0-veth2: 56(84) bytes of data.
64 bytes from 192.168.101.4: icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from 192.168.101.4: icmp_seq=2 ttl=64 time=0.047 ms
64 bytes from 192.168.101.4: icmp_seq=3 ttl=64 time=0.065 ms
64 bytes from 192.168.101.4: icmp_seq=4 ttl=64 time=0.080 ms

从net2中ping net1中的ip

ip netns exec net2 ping -c 4 192.168.101.2 -I br0-veth4
PING 192.168.101.2 (192.168.101.2) from 192.168.101.4 br0-veth4: 56(84) bytes of data.
64 bytes from 192.168.101.2: icmp_seq=1 ttl=64 time=0.068 ms
64 bytes from 192.168.101.2: icmp_seq=2 ttl=64 time=0.049 ms
64 bytes from 192.168.101.2: icmp_seq=3 ttl=64 time=0.057 ms