第11章 Bridge与互联
学习目标
- 理解Linux Bridge的工作原理
- 掌握FDB(Forwarding Database)学习机制
- 了解容器间通信的实现
- 能够配置和排查Bridge网络问题
🔬 原理
Linux Bridge
Bridge特点:
- 类似二层交换机
- 学习MAC地址
- 基于MAC转发
- 支持VLAN
Bridge结构:
Bridge (br0)
/ | \
veth1 veth2 veth3
| | |
ns1 ns2 ns3
FDB学习机制
FDB表:
- 记录MAC地址与端口的映射
- 基于源MAC学习
- 基于目标MAC转发
学习过程:
- 收到包时学习源MAC
- 查找目标MAC
- 如果找到,直接转发
- 如果未找到,泛洪
️ 实现
Bridge实现
struct net_bridge {
struct list_head port_list; // 端口列表
struct hlist_head hash[BR_HASH_SIZE]; // FDB哈希表
struct net_device *dev; // Bridge设备
struct work_struct gc_work; // 垃圾回收
// ... 更多字段
};
struct net_bridge_port {
struct net_bridge *br; // 所属Bridge
struct net_device *dev; // 端口设备
struct hlist_head hash[BR_HASH_SIZE]; // 端口FDB
// ... 更多字段
};
FDB实现
struct net_bridge_fdb_entry {
struct hlist_node hlist; // 哈希链表
struct net_bridge_port *dst; // 目标端口
unsigned long updated; // 更新时间
unsigned long used; // 使用时间
u8 addr[ETH_ALEN]; // MAC地址
u8 is_local; // 本地地址
u8 is_static; // 静态条目
// ... 更多字段
};
🛠️ 命令
Bridge管理
# 创建Bridge
sudo ip link add br0 type bridge
# 启动Bridge
sudo ip link set br0 up
# 添加端口到Bridge
sudo ip link set veth1 master br0
# 查看Bridge状态
bridge link show
# 查看FDB
bridge fdb show br br0
网络配置
# 配置Bridge IP
sudo ip addr add 192.168.1.1/24 dev br0
# 配置端口IP
sudo ip addr add 192.168.1.2/24 dev veth1
# 配置路由
sudo ip route add 192.168.1.0/24 dev br0
代码
Bridge监控程序
// bridge_monitor.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <linux/if_bridge.h>
int main() {
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror("socket");
return 1;
}
// 获取Bridge信息
struct ifreq ifr;
strcpy(ifr.ifr_name, "br0");
if (ioctl(sock, SIOCGIFBR, &ifr) < 0) {
perror("ioctl");
close(sock);
return 1;
}
printf("Bridge: %s\n", ifr.ifr_name);
printf("Ports: %d\n", ifr.ifr_data);
close(sock);
return 0;
}
编译运行:
gcc bridge_monitor.c -o bridge_monitor
sudo ./bridge_monitor
🧪 实验
实验1:Bridge基础配置
目标:创建和配置Bridge
步骤:
# 1. 创建Bridge
sudo ip link add br0 type bridge
sudo ip link set br0 up
# 2. 创建veth pair
sudo ip link add veth1 type veth peer name veth1-br
sudo ip link add veth2 type veth peer name veth2-br
# 3. 连接veth到Bridge
sudo ip link set veth1-br master br0
sudo ip link set veth2-br master br0
sudo ip link set veth1-br up
sudo ip link set veth2-br up
# 4. 配置IP地址
sudo ip addr add 192.168.1.1/24 dev br0
sudo ip addr add 192.168.1.2/24 dev veth1
sudo ip addr add 192.168.1.3/24 dev veth2
# 5. 启动接口
sudo ip link set veth1 up
sudo ip link set veth2 up
# 6. 测试连通性
ping -c 3 192.168.1.3
预期结果:
- 理解Bridge工作原理
- 掌握Bridge配置
- 验证容器间通信
实验2:FDB学习观察
目标:观察FDB学习过程
步骤:
# 1. 查看初始FDB
bridge fdb show br br0
# 2. 发送数据包
ping -c 1 192.168.1.3
# 3. 查看学习后的FDB
bridge fdb show br br0
# 4. 观察MAC地址学习
tcpdump -i br0 -n
预期结果:
- 理解FDB学习机制
- 观察MAC地址学习
- 掌握Bridge转发
排错
常见问题排查
问题1:Bridge无法创建
# 检查内核支持
modprobe bridge
# 检查权限
sudo ip link add br0 type bridge
# 检查名称冲突
ip link show
问题2:端口无法加入Bridge
# 检查端口状态
ip link show veth1
# 检查Bridge状态
bridge link show
# 重新添加端口
sudo ip link set veth1 master br0
问题3:容器间无法通信
# 检查FDB
bridge fdb show br br0
# 检查IP配置
ip addr show
# 检查路由
ip route show
排错清单
- [ ] 检查Bridge状态(bridge link show)
- [ ] 验证FDB学习(bridge fdb show)
- [ ] 确认IP配置(ip addr show)
- [ ] 检查路由表(ip route show)
- [ ] 测试连通性(ping、telnet)
- [ ] 查看系统日志(dmesg、/var/log/syslog)
- [ ] 检查权限(sudo、用户组)