破解网络复杂性:Linux网桥管理的最佳实践

科技   2024-11-16 16:51   上海  
链接:https://www.cnblogs.com/heyongshen/p/16417712.html

网桥的概念

  • 在生活中,桥是一种结构,用于连接两个地方,允许行人、车辆等安全地跨越障碍物(如河流或高速公路)

  • 在计算机网络技术中,网桥是一种工作在数据链路层的物理或逻辑设备,可以用于连接两个或多个局域网段。它基于MAC地址来转发或过滤帧,从而有效地划分广播域。

  • 在Linux中,网桥是一个逻辑设备,用于链接两个或更多的网络接口(例如,eth0, eth1),使它们在逻辑上工作如同一个接口。在虚拟化技术中,就使用到了网桥技术,链接物理主机和虚拟机或不同的虚拟机。


网桥工作原理

1、网络接口的作用

  • 在Linux中,udev 是负责动态管理设备节点的守护进程。当硬件设备被插入或移除时,udev 会根据 /lib/udev/rules.d/ 目录中定义的规则来生成或移除对应的设备节点,并进行相应的命名和管理。

  • 网络接口名称(例如eth0、ens33)是由udev的规则指定的,这只是一个逻辑名称,用于在用户空间中引用特定的网络设备。这个名称本身并不直接指向物理设备,而是与内核中的网络设备数据结构关联。

  • 所以用户空间的相关工具(例如ifconfig、nmcli等)可以通过这个网络接口的名称作为标识符来与内核的网络协议栈交互,这个接口名称为工具和内核提供了一个明确的引用点,以便指定它们希望配置或查询哪个特定的网络设备


虚拟网卡是一个逻辑上的网络接口(vnetX),它在Linux内核中表示为网络设备,但没有与之对应的物理硬件。


2、网桥的成员接口

创建一个网桥设备时,这个网桥设备和虚拟网卡一样,没有对应的物理硬件,属于逻辑上的设备。将物理网卡和虚拟网卡进行桥接,都会成为了桥的成员接口,此时eth0和vnetX直接通信的不再是内核,而是桥br0。但vnetX和eth0仍然可以在数据链路层上发送和接收帧。(不能直接向内核网络协议栈发送消息,而是只能接收来自网络协议栈的消息),一旦进行了桥接,vnetX和eth0就会共享相同的网络段。从逻辑上讲,它们都连接到了同一个数据链路层子网。

可以简单理解为,进行桥接后,物理网卡变成了一根网线,连接外部硬件设备。

说明:两个网络接口(无论是物理的还是虚拟的)之间的桥接,通常需要一个桥接设备。不能直接将两个网络接口桥接在一起而不创建一个桥接设备。


桥接说明:

  • 桥接后的数据流: 当物理网卡(例如,eth0)被添加到桥(例如,br0)时,它不再直接与网络协议栈进行通信。所有的数据链路层通信都通过桥接口来管理和转发。此时,桥接口充当了一个虚拟交换机的角色,负责在其成员接口之间进行数据链路层的帧转发。

  • IP地址分配: 当桥接配置完毕后,桥接口(如br0)成为与网络协议栈交互的主要接口,因此应当为其分配IP地址。这就解释了为什么将eth0桥接后,其原来的IP地址会被移除。同时,桥接成员接口(如vnetX)通常不需要IP地址,因为它们不再直接与网络协议栈交互,而是通过桥接口br0来进行数据传输。

  • 物理网卡的作用: 在桥接配置中,物理网卡可以被看作是一段传输介质或“电缆”,连接计算机硬件与外部网络。它确保桥接口及其成员可以与外部设备进行数据链路层的通信。


Linux 网桥管理

通过工具管理网桥

1、通过 brctl 创建网桥

brctl 是由 bridge-utils 软件包提供的一个工具,可以通过这个工具来轻松创建网桥。但是随着iproute2 套件的发展和普及,ip 命令开始提供了类似的功能,使得对网桥的管理brctl不再是首选的工具。

使用 brctl 创建的网桥在默认情况下是临时的,重启系统就失效了。

创建网桥:

# br0是创建的网桥接口名称

$ sudo brctl addbr br0

给网桥添加成员接口:

# ens33和37是物理网卡
$ brctl addif ens33
$ brctl addif ens37

启动网桥:默认网桥是down状态的

ifconfig br_name upip link set br_name up

删除网桥:

 brctl delbr br_name

移除子接口:

brctl delif br_name device_name

开启stp功能

brctl stp br_name on

2、通过NetworkManager 配置网桥

一般是通过 NetworkManager 提供的命令行工具nmcli来管理网桥。因为现在的Linux发行版系统中,大多数是使用NetworkManager来作为网络管理工具,当使用nmcli进行配置时,NetworkManager会将这些配置写入其配置文件,以便在系统重启后仍然有效。这些配置文件通常位于/etc/NetworkManager/system-connections/目录下。

创建网桥:

nmcli con add type bridge con-name br0 ifname br0

添加成员接口到网桥:

# con-name 物理网卡在桥接中的连接名称
nmcli con add type bridge-slave con-name br0-eth1 ifname eth1 master br0

# 删除成员接口
nmcli con delete 物理网卡的连接名称

启动或停止网桥:

nmcli con up br0
nmcli con down br0

删除网桥:

nmcli con delete br0

查看网桥的配置:

nmcli con show | grep bridge

说明:
连接名称是 NetworkManager 的一个核心概念,实现更方便地管理各种网络设置,而不仅仅是通过网络接口名称。在 NetworkManager 中,每一个网络配置(无论是有线、桥接等)都被视为一个“连接”(connection)。这个连接有一个名字,通常被称为“连接名称”(connection name),名称任意,用于后续识别和管理该特定的连接。

启动stp功能:

nmcli con modify br_name bridge.stp yes

3、通过ip命令管理网桥

ip命令是由iproute2 套件来提供的,提供了ip、ss等命令。使用ip命令来配置网桥也是临时生效的哦。要使这些配置在重启后依然生效,需要将这些命令添加到系统的启动脚本或使用专门的网络配置文件来持久化设置。

创建网桥;

ip link add name br0 type bridge

添加成员接口:

ip link set dev eth1 master br0

启动或停止网桥;

# up
ip link set dev br0 up

# down
ip link set dev br0 down

删除网桥:

ip link delete dev br0 type bridge

删除成员接口;

ip link set dev eth1 nomaster

查看网桥的配置:

ip link show type bridge

启动stp功能:

sudo ip link set br_name type bridge stp_state 1

网桥配置IP地址

创建一个网桥并将一个或多个网络接口添加为其成员时,成员接口上的IP地址配置通常会失效。此时,所以要为网桥接口本身配置IP地址,以便它可以参与网络通信。

这个时候直接将网桥设备当成一个普通的网络接口(例如eth0)进行配置就行了,记得还需要配置路由

例如;

# 网络接口配置
ip addr add 192.168.1.10/24 dev br0

# 路由配置
ip route add default via 192.168.1.1 dev br0

通过配置文件管理网桥

1、centos7:

前提:检查bridge模块是否加载,如果没有加载需要手动进行加载并设置持久生效

lsmod  | grep bridge
bridge 151336 0
stp 12976 1 bridge
llc 14552 2 stp,bridge

# 加载模块
modeprobe bridge

# 持久生效
vim /etc

1、创建网桥配置文件
配置文件位于:创建网桥配置文件 /etc/sysconfig/network-scripts/ifcfg-br_name

vim /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=static
IPADDR=10.0.0.20
NETMASK=255.255.255.0
GATEWAY=10.0.0.2
DNS1=180.76.76.76
DNS2=223.6.6.6
STP=on # 开启stp功能

2、修改物理网卡接口的配置文件
例如将eth0和eth1这两个物理接口作为网桥br0的子接口

vim /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE="Ethernet"
NAME="eth0"
DEVICE="eth0"
ONBOOT="yes"
BRIDGE=br0

vim /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE="Ethernet"
NAME="eth1"
DEVICE="eth1"
ONBOOT="yes"
BRIDGE=br0 # 表示当前网络接口(如 eth0)应该被添加到名为 br0 的网桥作为一个成员接口

eth0:

eth1:

3、重启服务
centos7是默认使用NetworkManager作为网络管理服务。通过使用传统的 network 脚本配置的网络,你仍然可以利用 NetworkManager 来管理和应用这些配置。

systemctl restart NetworkManager

2、ubuntu1604:

前提:

需要加载bridge模块

sudo modeprobe bridge

sudo vim /etc/modules
bridges

需要安装bridge-utils这个工具包,比较旧的一些版本bridge-utils 包是必要的

sudo apt install bridge-utils

1、修改配置文件

sudo vim /etc/network/interfaces
auto lo
iface lo inet loopback

auto br0
iface br0 inet static
address 192.168.14.108
netmask 255.255.248.0
gateway 192.168.12.1
dns-nameserver 180.76.76.76
bridge_ports ens33 ens37
bridge_stp on

auto ens33
iface ens33 inet manual
up ip link set $IFACE up
down ip link set $IFACE down

auto ens37
iface ens37 inet manual
up ip link set $IFACE up
down ip link set $IFACE down

说明:

  1. 在配置文件中添加auto ens33和auto ens37目的是为了保证网络接口开机自启动

  2. 给ens33和ens37配置 up 和down的命令是为了确保接口能正确上下线(系统启动或重新启动网络服务时)

  3. 物理网络接口使用手动(manual)模式是为了确保系统知道这些接口存在,并且不会尝试自动为它们分配IP地址

  4. bridge_stp需要设置为on,特别是网桥的成员接口位于同一个交换机,不开启会发生环路的问题;

  5. $IFACE是一个特殊的变量,它自动引用当前被配置的网络接口的名称

2、重启服务

sudo systemctl restart networking

3、ubuntu2004

前提:需要加载bridge模块

# 检查模块是否加载
lsmod | grep bridge

# 加载模块
sudo modprobe bridge

# 持久化配置
sudo vim /etc/modules
bridge

1、编辑配置文件

network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: no
ens34:
dhcp4: no

bridges:
br0:
interfaces: [ens33, ens34]
dhcp4: yes
parameters:
stp: true
forward-delay: 4

2、配置生效

编辑了 netplan 的配置文件后,这些更改并不会立即生效。为了使这些更改生效,需要运行 sudo netplan apply。这样,netplan 会读取修改后的配置文件并调用底层的网络管理工具(例如 networkd 或 NetworkManager)来应用这些配置更改。

sudo netplan apply

3、检查是否生效

bridge link show br0

stp功能介绍

stp是Spanning Tree Protocol(生成树协议)的缩写,作用就是用来防止二层环路的,用在二层交换机上面。网桥就相当于是一个交换机,所以在网桥将成员接口(物理网卡)加入时,需要开启stp协议才行。不然如果两个物理网卡是连接在一个交换机上面,就会产生广播风暴。导致整个局域网出现网络不稳定的问题。

当配置一个网桥并启用STP协议后,为了避免可能的网络环路,每个加入到该网桥的端口(一个端口就是一个物理网卡)会经历几个状态变迁,以确定网络的拓扑结构,并确定哪些端口应该被放入转发状态,哪些端口应该被阻塞。首先进入阻塞状态。从阻塞状态转移到转发状态前,端口需要经历两个中间状态:

  • 监听 (Listening):在此状态中,端口会监听可能的冲突的桥接数据包,但不会学习MAC地址。此状态默认持续15秒(这是Forward Delay的一半)。

  • 学习 (Learning):在此状态中,端口开始学习MAC地址,从而构建其转发数据库,但仍然不转发桢。此状态同样持续15秒(这是Forward Delay的另一半)。


来自良许Linux公众号

Qt教程
致力于Qt教程,Qt技术交流,研发
 最新文章