• 网桥工作在OSI模型的第二层(数据链路层)
  • 网桥负责在同一网段内转发数据帧, 减少冲突。

网桥的基本功能

转发数据帧
学习和记忆MAC地址: 网桥具有“学习”功能,它可以通过查看接收到的数据帧的源MAC地址来学到哪些设备(或接口)连接在其各个端口上,并将这些信息存储在MAC地址表中。

基于MAC地址转发数据帧: 当网桥接收到一个数据帧时,它会查看数据帧的目标MAC地址,然后在其MAC地址表中查询,如果找到了对应的端口,则将数据帧转发到该端口;如果没有找到,则会将数据帧泛洪(即发送到除接受端口外的所有端口)。

       +---------+
       |  网桥   |
       +---------+
       |   |   |
     eth0 eth1 eth2
       |   |   |
     +---+ +---+ +---+
     |A  | |B  | |C  |
     +---+ +---+ +---+

在上图中,有一个网桥和三个连接到网桥的设备A、B、C。如果A想要向B发送数据帧,那么:

  1. 网桥刚开始不知道B的MAC地址在哪个端口上,所以它会将数据帧泛洪到除A所在端口(eth0)之外的所有端口。
  2. B接收到数据帧,并返回回应。
  3. 网桥通过B的回应数据帧"学习"到了B的MAC地址,并将其与接口eth1关联起来。
  4. 以后A再向B发送数据帧时,网桥就能直接将数据帧转发到eth1,而无需泛洪。

在容器和虚拟机中的应用
在网络中的角色类似于物理交换机,它提供了一种虚拟的交换机功能。
在Docker等容器平台上,默认情况下,所有容器连接到一个名为 docker0 的网桥。如果有3个容器 container1、container2、container3,它们的网络接口连接到同一个 docker0 网桥上,那么这些容器间可以进行通信,类似于物理网络中的不同计算机连接到同一个交换机上。

# 启动两个容器并连接到docker0网桥
docker run -d --name container1 busybox sleep 1000
docker run -d --name container2 busybox sleep 1000

网桥的结构
网桥连接多个网络接口,每个网络接口在网桥中的角色被称为一个端口。网桥用于连接多个局域网(LAN)段,无需知道具体的网络协议,只需根据MAC地址转发数据帧。
在Linux内核中,可以创建多个网桥,每个网桥可以独立地管理和转发数据帧。以下是多网桥的概述:

       +------------------+                 +-----------------+
       |     Bridge 1     |                 |     Bridge 2    |
       |                  |                 |                 |
+------+--------+ +-------+-------+  +------+--------+ +------+--------+
| Port 0 (veth0)| | Port 1 (veth1)|  | Port 0 (veth2)| | Port 1 (veth3)|
+---------------+ +---------------+  +---------------+ +---------------+
       |                  |                 |                 |
+------------+     +------------+    +------------+    +------------+
| Device A   |     | Device B   |    | Device C   |    | Device D   |
| MAC: AA    |     | MAC: BB    |    | MAC: CC    |    | MAC: DD    |
+------------+     +------------+    +------------+    +------------+

网桥是否涉及不同网段
同一网段内的通信:网桥负责在同一网段内转发数据帧。同一网段的设备会有相同的IP子网掩码,网桥可以在这些设备之间透明地转发数据帧。

不同网段之间的通信:网桥通常不用于跨网段(子网)通信,因为不同网段的设备需要通过IP地址进行路由。跨网段通信需要三层设备(如路由器)来处理。

使用 brctl 命令

sudo apt-get install bridge-utils

# 创建网桥 br0
sudo brctl addbr br0

# 添加网络接口 eth0 和 eth1 到网桥 br0
sudo brctl addif br0 eth0
sudo brctl addif br0 eth1

# 启动网桥
sudo ip link set dev br0 up
# 检查网桥状态:
brctl show

#fdb:这是 bridge 工具的一个子命令,表示 "Forwarding Database"(转发表或MAC地址表)。它用于操作和显示网桥的 FDB 相关信息。
# 查看网桥的MAC地址表:
bridge fdb show br br0

# 手动添加一个MAC地址条目(通常不需要手动添加,网桥会自动学习):
bridge fdb add 00:11:22:33:44:55 dev eth0 master br0
# 删除一个MAC地址条目:
bridge fdb del 00:11:22:33:44:55 dev eth0 master br0

sudo bridge fdb show br br0 返回结果:

33:33:00:00:00:01 dev eth0 self permanent
02:42:c0:a8:00:02 dev eth1 master br0
66:5d:f6:43:cb:77 dev eth0 master br0
ff:ff:ff:ff:ff:ff dev eth2 master br0

解释:
dev:指定该 MAC 地址对应的网络接口,例如 eth0, eth1, eth2。
self:表示该条目是本网桥自身的MAC地址记录。
master br0:表示该条目归属于网桥 br0 的管理范围内。
permanent:表示该条目是永久性的,而非动态配置的。动态条目会有不同的标记,如 noarp 或 nud(邻居探测状态)。


使用 ip 命令:

# 创建网桥 br0
sudo ip link add name br0 type bridge

# 将网络接口 eth0 和 eth1 加入网桥 br0
sudo ip link set dev eth0 master br0
sudo ip link set dev eth1 master br0

# 启动网桥和所有相关接口
sudo ip link set dev br0 up
sudo ip link set dev eth0 up
sudo ip link set dev eth1 up

# 查看网桥状态:
ip link show br0

VLAN和网段的关系

VLAN(Virtual LAN):是一种通过逻辑划分在同一物理网络上的网络段。VLAN允许将交换机端口逻辑地分组,使得不同VLAN中的设备即使连接在同一物理交换机上,也无法直接通信,除非通过路由器或三层交换机。
相互独立但可以结合使用:VLAN和网段是两个不同层次的概念,但它们常常被结合使用。在一个VLAN中,通常会配置一个或多个网段。但一个网段不一定局限于一个VLAN,可以跨越多个VLAN。

VLAN 通常是在交换机上配置和操作的。交换机本身就提供对 VLAN 的强大支持,特别是支持 802.1Q 协议的交换机。不过,Linux 系统也可以配置和操作 VLAN,这对虚拟化环境、网络测试、实验等方面尤其有用。

跨VLAN通信
如果在Linux系统上配置了多个VLAN,并且希望这些VLAN之间能够通信,需要配置路由。可以使用路由器或三层交换机,如果是Linux系统本身充当路由器,可以配置iptables(网络地址转换)或者路由规则。

配置示例:跨VLAN通信(Router-on-a-Stick)
假设有两个VLAN(VLAN 10: 192.168.10.0/24 和 VLAN 20: 192.168.20.0/24)

//创建VLAN接口
# VLAN 10(财物部门, 敏感) 
sudo ip link add link eth0 name eth0.10 type vlan id 10
# VLAN 20 (技术部门)
sudo ip link add link eth0 name eth0.20 type vlan id 20

//分配IP地址并启动接口
# VLAN 10 IP地址
sudo ip addr add 192.168.10.1/24 dev eth0.10
sudo ip link set dev eth0.10 up
# VLAN 20 IP地址
sudo ip addr add 192.168.20.1/24 dev eth0.20
sudo ip link set dev eth0.20 up

//启用IP转发
sudo sysctl -w net.ipv4.ip_forward=1

//添加路由规则
# 查看路由表
ip route show
# 添加路由(如果必要)
sudo ip route add 192.168.10.0/24 dev eth0.10
sudo ip route add 192.168.20.0/24 dev eth0.20

一个设备上是否配置了多个 VLAN,可以通过查看网络配置和接口信息来实现。

ip link show
ip -d link show eth0.10
bridge vlan show

网桥和网关的关系:
网桥工作在OSI模型的第二层(数据链路层)桥用于连接多个网络段,使其成为一个逻辑网络,通过MAC地址来转发数据帧。它不关心数据帧的具体内容,只负责根据MAC地址进行帧的转发和过滤。
主要功能:分割冲突域、学习MAC地址、进行数据帧转发和过滤。

网关(Gateway):网关工作在OSI模型的第三层(网络层)。网关用于连接不同网络协议或不同网络段。它通过IP地址转发数据包,可以进行协议转换、路由选择等高级网络功能。

# macos查看网关
route get default
netstat -rn

ip route show
#添加网关
sudo ip route add default via 192.168.1.1 
#删除默认网关:
sudo ip route del default via 192.168.1.1

NAT 的工作机制 —— 端口地址转换(PAT/NAPT)

网关会维护一张映射表(NAT表),记录内部IP地址和端口与公共IP地址和端口之间的映射关系。
内部IP:端口 公共IP:端口 目标IP:端口
192.168.1.2:12345 203.0.113.1:40001 93.184.216.34:80
192.168.1.3:23456 203.0.113.1:40002 93.184.216.34:80


putao
8 声望3 粉丝

推动世界向前发展,改善民生。