基本概念
bridge是一个虚拟网络设备,具有网络设备的特性(可以配置IP、MAC地址等);而且bridge还是一个虚拟交换机,和物理交换机设备功能类似。网桥是一种在链路层实现中继,对帧进行转发的技术,根据MAC分区块,可隔离碰撞,将网络的多个网段在数据链路层连接起来的网络设备。
对于普通的物理设备来说,只有两端,从一段进来的数据会从另一端出去,比如物理网卡从外面网络中收到的数据会转发到内核协议栈中,而从协议栈过来的数据会转发到外面的物理网络中。而bridge不同,bridge有多个端口,数据可以从任何端口进来,进来之后从哪个口出去原理与物理交换机类似,需要看mac地址。
bridge是建立在从设备上(物理设备、虚拟设备、vlan设备等,即attach一个从设备,类似于现实世界中的交换机和一个用户终端之间连接了一根网线),并且可以为bridge配置一个IP(参考LinuxBridge MAC地址行为),这样该主机就可以通过这个bridge设备与网络中的其他主机进行通信了。另外它的从设备被虚拟化为端口port,它们的IP及MAC都不在可用,且它们被设置为接受任何包,最终由bridge设备来决定数据包的去向:接收到本机、转发、丢弃、广播。
作用
bridge是用于连接两个不同网段的常见手段,不同网络段通过bridge连接后就如同在一个网段一样,工作原理很简单就是L2数据链路层进行数据包的转发。
工作原理
基本原理图如下(来源于网络):
数据流向(来源于网络):
bridge和route比较相似,都可以用来分发网络数据包,它们的本质不同在于:route在L3网络层,使用路由协议、bridge在L2数据链路层,通过学习和缓存在链路上传输的数据包中的源地址以及物理层的输入端口:
收到新数据包时,记录源MAC地址和输入端口
根据数据包中的目的MAC地址查找本地缓存,如果能找到对应的MAC地址记录
- 若发现记录不在本地网络,直接丢弃数据包
- 若发现记录存在对应的端口,则将数据包直接从该端口转发出去
- 如果本地缓存中不存在任何记录,则在本网段中进行广播。
因此,通过Linux bridge来实现打通容器网络是一个非常有效的方法,同步bridge,我们可以做到:
- 连接同宿主机内所有容器的虚拟网络
- 打通容器内网与外网,通过bridge将数据转发到真实的往里网卡eth0中。
常用命令
brctl
安装与配置
#安装bridge-utils软件包,并加载bridge模块和开启内核转发。
root@ubuntu:/home/sunld# apt-get install bridge-utils
root@ubuntu:/home/sunld# modprobe bridge
root@ubuntu:/home/sunld# echo "1">/proc/sys/net/ipv4/ip_forward
命令显示
root@ubuntu:/home/sunld# 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
创建bridge
#增加一个网桥
root@ubuntu:/home/sunld# brctl addbr br0
#将现有网卡连接到往前,由于该网卡开启了混杂模式,可以不需要配置IP,因为bridge工作在L2链路层
root@ubuntu:/home/sunld# ifconfig eth0 0.0.0.0 promisc
root@ubuntu:/home/sunld# ifconfig eth1 0.0.0.0 promisc
root@ubuntu:/home/sunld# brctl addif br0 eth0 eth1
#查看已有网桥
root@ubuntu:/home/sunld# brctl show
root@ubuntu:/home/sunld# bridge link
#给bridge配置IP
root@ubuntu:/home/sunld# ifconfig br0 10.10.1.1 netmask 255.255.0.0 up
删除bridge
root@ubuntu:/home/sunld# brctl delbr br0
关闭生成树
#关闭生成树协议,减少数据包污染
root@ubuntu:/home/sunld# brctl stp br0 off
配置bridge开机激活
root@ubuntu:/home/sunld# echo "modprobe bridge">>/etc/rc.local
#配置eth0 eth1 br0开机启动,eth0,eth1未设置IP信息,在启动br0网卡时,开启了eth0,eth1的混杂模式,并桥接了它们。
vim /etc/network/interfaces
auto lo eth0 eth1 br0
iface lo inet loopback
iface br0 inet static
address 10.10.10.1
netmask 255.255.0.0
gateway 10.10.10.254
pre-up ip link set eth0 promisc on
pre-up ip link set eth1 promisc on
pre-up echo "1">/proc/sys/net/ipv4/ip_forward
bridge_ports eth0 eth1
一步一步实现bridge
创建bridge
root