linux网桥的简单理解和配置


linux网桥的简单理解和配置

Linux网桥是linux虚拟网络设备之一。网上很多分析linux网桥的文章,例如代码层面的分析。这里不牵扯复杂的分析和配置,主要是面向虚拟机链接一个用途,小白我的备忘。

1.Linux的网桥是什么

最初的网桥就是一个两口的交换机,经过网桥的数据包会原封不动的转发。与hub不同的是网桥会检查mac地址,不在当前端口的mac地址就过滤掉了。而hub是工作在物理层的设备,一个口收到的信号原封不动的发送到所有的接口。早期的交换机,可以看成是很多网桥的集成。简单来说,桥接就是把一台机器上的若干个网络接口“连接”起来。其结果是,其中一个网口收到的报文会被复制给其他网口并发送出去。以使得网口之间的报文能够互相转发。


现在的Linux 网桥可以看做是(三层的)虚拟交换机,功能和物理交换机一样,最常用的功能是链接虚拟机和容器--为虚拟机和容器提供一个虚拟交换机。

创建一个bridge后(br0),可以把其他的网络设备(比如eth0attachbr0上,eth0称作br0的从设备。需要注意的是,eth0 attachbr0上,不是对应的将eth0插接到“交换机”br0上,而是eth0编程了br0的一个端口(网线插口)。那什么什么时候才是插入网线呢?

通常的网桥是二层设备,不需要有IP地址。但是linux网桥是虚拟网络设备,是有ipmac的(br设备的MAC地址是它所有从设备中最小的MAC地址)。从设备(eth0)被attachbr上之后,它的IPMAC都不再可用了(退化为一个端口了)且它们被设置为接收任何包(工作在链路层,且是混杂模式,不需要ip),最终由bridge设备来决定数据包的去向:接收到本机、转发、丢弃

2.生成树

一般在讲解交换机的文章里都会提到生成树协议。网桥“类似”交换机,也会有这个问题。简单来说,在复杂且有冗余的网络配置中,可能会形成网络风暴。生成树协议就是为了避免这个问题。简单的网桥或者交换机应用(例如只有一个交换机)没这个问题,但是启用生成树也没什么不好。

关于生成树的具体内容见:https://www.cnblogs.com/morphling/p/3458546.html

3.主要作用:连接虚拟机

目前,虚拟网桥最主要的作用是为虚拟机提供一种网络链接的方式。

如图所示,是最常用的链接方式。主机上创建tap设备(理解为虚拟网卡),bridge1设备attach eth0tap0tap1,此时bridge1可以视作交换机,eth0\tap0\tap1都是这个交换机的网口。虚拟机通过tap网口链接,虚拟机和主机、外部局域网主机是同一个局域网内的机器,可以设置成同一个网段的IP

这里比较别扭的就是主机的eth0,退化成网口,bridge1接替它成为主机的上网设备。

linux的网桥实际上是个新设备,和网桥、交换机、三层交换机都是有所不同的。

4.配置

配置网桥可用工具挺多的,可以看后面的引用文章。命令工具个人建议iproute2。命令配置的重启后就不起作用了。要保存修改,需要修改配置文件,最好是使用netplan

先安装bridge-utils,bridge-utils也是iproute2的一部分

apt-get install bridge-utils

以下操作都需要管理权限。

Create a new bridge and change its state to up:

# ip link add name br1 type bridge

# ip link set br1 up

brctl show命令查看当前桥设备的状态

To add an interface (e.g. eth0) into the bridge, its state must be up:

# ip link set eth0 up

Adding the interface into the bridge is done by setting its master to br1:

# ip link set eth0 master br1

这个时候就不能上网了。

To show the existing bridges and associated interfaces, use the bridge utility (also part of iproute2). See bridge(8) for details.

 通过bridge link命令可以看到br0上连接了哪些设备

# bridge link

如果查看br1mac,会发现就是eth0mac

然后给网桥设置ip

# ip addr add dev br1 192.168.31.66/24

设置ip可以ping网关了,但是不能ping 8.8.8.8这样的公网ip

# route -n  或者 ip route show 都会发现这个网桥的网关没设置。

添加一条默认路由:

#route add default gw 192.168.31.1 dev br1

注意 dev 参数是必须设置的。强制路由关联到指定的设备接口,否则的话内核会其自身的相应规则决定选用那个设备接口。

linux 路由等参考:

https://ivanzz1001.github.io/records/post/linuxops/2018/11/14/linux-route

route是老旧的net-tools的命令,iproute2的路由操作是ip route系列,这里还是用用的route

也可以让网桥自己获得ip

dhclient br1    #将br0的网络配置好

This is how to remove an interface from a bridge:

# ip link set eth0 nomaster

The interface will still be up, so you may also want to bring it down:

# ip link set eth0 down

To delete a bridge issue the following command:

# ip link delete br1 type bridge

This will automatically remove all interfaces from the bridge. The slave interfaces will still be up, though, so you may also want to bring them down after.

参考

https://segmentfault.com/a/1190000009491002

https://blog.csdn.net/CloudXli/article/details/78877253

https://www.tecmint.com/create-network-bridge-in-ubuntu/

https://www.ubuntupit.com/how-to-configure-and-use-network-bridge-in-ubuntu-linux/

https://blog.51cto.com/13465487/2374960

https://wiki.archlinux.org/index.php/Network_bridge