Linux Bridge

南楼画角 提交于 2019-12-12 14:25:15

转载连接: http://www.fmttr.com/network/linuxbridge/

Linux Bridge简介
  Linux中有多种网络设备,其中Bridge是比较简单的一种。
  Bridge译为中文是桥的意思,专业的意译是网桥,其功能与物理的交换机功能相似,都是工作在二层协议(数据链路层)的交换设备。网桥可以理解为Linux中虚拟出来的交换机。多个网络设备可以连接(attach)到网桥上,之后这些网络设备就可以通过Brige进行通信了。详细的通信过程参考下面的内容。
  Linux Bridge通过软件包bridge-utils进行安装,可以通过命令来判断是否安装了Linux Bridge:rpm -qa | grep bridge-utils。
网桥的功能
  网桥主要功能与实际的物理交换机是相同的:
  1.MAC地址学习:对于物理交换机,网络设备是通过网线连接到交换端口上进行连接的。而对于Linux 网桥是通过命令进行虚拟连接的。网桥刚开始工作时,接收到数据包后,会从数据包中解析出源MAC地址,并记录源MAC与端口的对应关系,以此建立MAC-端口对应表。
  2.转发:当要发送一个数据包时,网桥就会在MAC-端口对应表中查找对应的端口,将数据从找到的端口发送出去。
网桥的工作流程
  网桥上有端口,网络设备有其唯一的MAC地址,可以通过命令将网络设备与网桥上的端口连接,这样网络设备就连接到网桥上了。
  网桥刚开始工作时,MAC-端口对应表是空的,会按照以下原则处理数据包:
  1.接收一个数据包之后,会解析出其源MAC地址,并将MAC地址和端口添加(或更新)到MAC-端口对应表中,这一步称为MAC地址学习。
  2.经过MAC地址学习后,会解析出数据包中的目的MAC地址,在MAC-端口对应表中查找此MAC地址。如果找到,则将此数据包从此端口发送出去;如果未找到,则将此数据包发送给除了接收端口之外的所有端口,即广播。
  3.无论如何,网桥都不会将从一个端口接收到的数据包再从此接收端口中发送出去,因为这样做没有任何意义。
网桥的基本命令
  显示当前所有网桥:brctl show
  显示指定网桥的详细信息:brctl show
  添加一个网桥:brctl addbr
  删除一个网桥:brctl delbr
  向网桥添加一个连接:brctl addif
网桥上配置IP地址
  Linux网桥有一个有趣的特性:可以给网桥配置一个IP地址。通常情况下经过以下步骤:
  1.创建一个Linux网桥:brctl addbr br0
  2.将一个常规的网络设备例如eth0连接到网桥:brctl addif br0 eth0
  3.经过上面的步骤之后,eth0上原来的IP地址失效了,可以将eth0上原来的IP地址配置到网桥br0上。
  给一个网桥配置IP地址并不是必须的,换句话说即使网桥没有IP地址也是能正常工作。在以下场景下可能需要给网桥配置IP地址:
  1.希望使用网桥的虚拟机VM可以和主机host进行通信。常见的VM需要和host上的服务程序进行通信的是DHCP、DNS和NTP。
  2.希望为所有的虚拟机提供统一的防火墙firewall。
  3.在一台只有一个网卡的物理主机host上,希望使用网桥的同时可以继续远程sssh连接。

给网桥设置ip地址

网桥IP
  这里是一个给网桥设置IP地址的实验。
  实验环境:
  Linux版本:
# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)

  bridge-utils的版本:
# rpm -qa | grep bridge-utils
bridge-utils-1.5-9.el7.x86_64

机器上只有一个网卡enp0s3,lo为回环接口:

# ifconfig
enp0s3: flags=4163 mtu 1500
        inet 192.168.1.11 netmask 255.255.255.0 broadcast 192.168.1.255
        inet6 fe80::a00:27ff:fe2b:86c prefixlen 64 scopeid 0x20
        ether 08:00:27:2b:08:6c txqueuelen 1000 (Ethernet)
        RX packets 161 bytes 12052 (11.7 KiB)
        RX errors 0 dropped 0 overruns 0 frame 0
        TX packets 38 bytes 6957 (6.7 KiB)
        TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73 mtu 65536
        inet 127.0.0.1 netmask 255.0.0.0
        inet6 ::1 prefixlen 128 scopeid 0x10
        loop txqueuelen 0 (Local Loopback)
        RX packets 0 bytes 0 (0.0 B)
        RX errors 0 dropped 0 overruns 0 frame 0
        TX packets 0 bytes 0 (0.0 B)
        TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

# brctl show
bridge name bridge id STP enabled interfaces

  首先,我们创建一个网桥br0:

# brctl addbr br0

  查看网桥:

# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000000000000 no

  说明网桥br已经创建成功了。
  然后,我们将enp0s3加入网桥br0

# brctl addif br0 enp0s3

  将enp0s3加入网桥br0后,则enp0s3上的IP地址会失效,意味着如果我们是通过ssh远程连接到系统,则执行完命令后网络就断开。
  本地登录系统,给网桥br0设置原enp0s3上的IP地址:

# ifconfig br0 192.168.1.11/24 up

  使用ssh重新连接系统,发送已经可以连通了。
  查看网桥:

# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.0800272b086c no enp0s3

  查看网络接口:

# ifconfig
br0: flags=4163 mtu 1500
        inet 192.168.1.11 netmask 255.255.255.0 broadcast 192.168.1.255
        inet6 fe80::a00:27ff:fe2b:86c prefixlen 64 scopeid 0x20
        ether 08:00:27:2b:08:6c txqueuelen 0 (Ethernet)
        RX packets 228 bytes 28196 (27.5 KiB)
        RX errors 0 dropped 0 overruns 0 frame 0
        TX packets 108 bytes 16379 (15.9 KiB)
        TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

enp0s3: flags=4163 mtu 1500
        inet 192.168.1.11 netmask 255.255.255.0 broadcast 192.168.1.255
        inet6 fe80::a00:27ff:fe2b:86c prefixlen 64 scopeid 0x20
        ether 08:00:27:2b:08:6c txqueuelen 1000 (Ethernet)
        RX packets 8269 bytes 1091747 (1.0 MiB)
        RX errors 0 dropped 0 overruns 0 frame 0
        TX packets 199 bytes 31576 (30.8 KiB)
        TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73 mtu 65536
        inet 127.0.0.1 netmask 255.0.0.0
        inet6 ::1 prefixlen 128 scopeid 0x10
        loop txqueuelen 0 (Local Loopback)
        RX packets 5 bytes 492 (492.0 B)
        RX errors 0 dropped 0 overruns 0 frame 0
        TX packets 5 bytes 492 (492.0 B)
        TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

  可以发现br0已经成功设置了IP地址:192.168.1.11。

虚拟网卡操作

显示网桥信息
 brctl show    
添加网桥
brctl addbr virbr0
激活网桥
ip link set virbr0 up
添加虚拟网卡tap
tunctl -b
tap0 -------> 执行上面使命就会生成一个tap,后缀从0,1,2依次递增  
激活创建的tap
ip link set tap0 up
将tap0虚拟网卡添加到指定网桥上。
brctl addif br0 tap0
--------------------------------------
给网桥配制ip地址
ifconfig virbr1 169.254.251.4 up 
将virbr1网桥上绑定的网卡eth5解除
brctl delif virb1 eth5                                                          
给virbr1网桥添加网卡eth6
brctl addif virbr1 eth6     

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!