Linux 网桥
{Back to Index}
Table of Contents
1 简介
物理的网桥本质上就是只有两个端口的交换机。
Figure 1: 网桥示意图
2 Linux 网桥 1
Linux 中的网桥设备实际上是模拟了一个二层交换机。
2.1 创建网桥
ip link add name br0 type bridge # 等效于:brctl addbr br0 ip link set dev br0 up ## 优化: brctl stp br0 off ## disable the STP protocol and prevent the switch from disabling ports brctl setfd br0 2 ## reduce the time taken by the br1 interface to go from blocking to forwarding state brctl setmaxage br0 30
刚创建一个网桥设备时,它可以看作是一个独立的网络设备,一端连着协议栈,这样的网桥没有实际作用:
Figure 2: 网桥刚创建时的拓扑
2.2 为网桥添加接口
ip link set dev eth0 promisc on # 先将该端口设置为混杂模式并启动该端口 ip addr flush dev eth0 # 把物理网卡 eth0 桥接在网桥上,意味着 eth0 将工作在链路层,理论上可以不需要 IP ip link set dev eth0 up ip link set dev eth0 master br0 # 等效于:brctl addif br0 eth0
Figure 3: 添加物理接口后的拓扑
注意,br0 和 eth0 相连之后,发生了几个变化:
- br0 和 eth0 之间连接起来了,并且是双向的通道
- 协议栈和 eth0 之间变成了单通道,协议栈能发数据给 eth0 ,但 eth0 从外面收到的数据不会转发给协议栈
- br0 的 mac 地址变成了 eth0 的 mac 地址
此时,配置好正确的路由之后,网关就可以正常工作了:
Figure 4: 网关工作拓扑
3 思考
3.1 网关是否可以指向物理网卡
Figure 5: 网关指向物理网卡
Figure 6: Client ping Server
问题出在 IP 包从物理网卡发出前需要通过 ARP 请求获取 MAC 地址,而此时物理网卡作为网桥的 Slave ,已不能处理 ARP Reply 消息了,
只能转发给网桥进行处理,因此物理网卡的邻居表一直得不到更新 (10.74.68.10 dev eth2 FAILED
),IP 包就无法发送出去。
3.2 网桥是否可以不配 IP
理论上网桥作为二层设备可以不配 IP 地址。实验拓扑如下:
Figure 7: 网桥不配置 IP
此时 client ping server 可以 ping 通,反之则不行。原因在于从 server ping 时,出口设备没有 IP 地址, 因此 ICMP 请求中的源地址由系统随机选择,当选择不合适时,造成网络不通,此例中操作系统选择了 eth0 的 IP 地址作为 ICMP 源地址, 这样当 client 响应 ICMP 请求时,回复数据自然无法回到 server 。
server 上抓包:
12:48:54.478915 IP (tos 0x0, ttl 64, id 33907, offset 0, flags [DF], proto ICMP (1), length 84) 10.0.2.15 > 10.74.68.10: ICMP echo request, id 9081, seq 3, length 64
解决方案有两种:1) ping 的时候指定源 IP ,比如: ping -I 10.74.68.100 10.74.68.10
。
或者设置网关时指定 src IP
: ip route add 10.74.68.0/24 dev br0 src 10.74.68.100
。