网络桥接
网桥是一种网络设备,它能够从多个通信网络创建一个单一的聚合网络,此功能被称为网络桥接。网络桥接不同于路由,路由允许多个独立网络互相通信,但各个网络仍然保持独立,而桥接是将多个独立网络连接成一个单一网络。
网桥工作于OSI模型的数据链路层,它基于以太网地址(而不是IP地址)转发数据包。交换机是一种常见的网络桥接设备,家用路由器内部一般也带有集成交换机。
Linux bridge
Linux bridge实现了802.1d标准的一个子集,Linux网桥比纯粹的硬件网桥更加强大,它不仅可以转发数据包,还可以进行过滤和流量调整等功能。
下面介绍一下Linux bridge的配置工具,然后利用树莓派上进行一个简单的桥接实验。
ip 和 bridge
iproute2程序包包含的 ip
和 bridge
命令可用于管理网桥。
基本命令
ip命令
创建bridge设备
br0
1
ip link add name br0 type bridge
将interface
eth0
添加到bridgebr0
1
ip link set eth0 master br0
上面是以物理网卡
eth0
为例,但网桥中的设备不仅限于物理设备,tun/tap/veth/vlan/macvlan/macvtap/ipvlan/ipvtap
等各种虚拟设备均可添加到 bridge。eth0
原本一端连接着外界物理网络,另一端连接着网络协议栈。一旦它接入了br0
,由外部传入eth0
的数据包将被直接传递到br0
,而不再是网络协议栈。这样一来,为eth0
配置IP就失去了意义,因为eth0
另一端连接的只是一个虚拟网桥br0
,这是一个2层设备,它工作于数据链路层,仅基于MAC地址进行数据包转发,形象地说,也就是eth0
现在只是相当于br0
的一个 Port,把br0
比作以太交换机,那么eth0
就是br0
的一个网口。原本的网络结构:
eth0
连接着网络协议栈与外界网络1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19+-------------------------------------------------+
| |
| +----------------------------------------+ |
| | Network Protocol Stack | |
| +----------------------------------------+ |
| ↑ ↑ |
|............|.....................|..............|
| | | |
| ↓ ↓ |
| +--------------+ +--------+ |
| | 192.168.2.10 | | | |
| +--------------+ | br0 | |
| | eth0 | | | |
| +--------------+ +--------+ |
| ↑ |
| | |
+------------|------------------------------------+
↓
Physical Network之后的网络结构:
eth0
收到的外界数据包不再发给网络协议栈,而是虚拟2层设备br0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19+-------------------------------------------------+
| |
| +----------------------------------------+ |
| | Network Protocol Stack | |
| +----------------------------------------+ |
| | ↑ |
|............|.....................|..............|
| | | |
| ↓ ↓ |
| +--------------+ +---------+ |
| | 192.168.2.10 | | | |
| +--------------+ | br0 | |
| | eth0 |<------->| | |
| +--------------+ +---------+ |
| ↑ |
| | |
+------------|------------------------------------+
↓
Physical Network开启bridge br0
1
set link br0 up
bridge命令
bridge link
:展示桥接到网桥的interface(相当于交换机的网口)bridge fdb
:展示网桥的转发表bridge vlan
:展示网桥的VLAN配置信息
由上面的分析,可以得知Linux虚拟网桥设备 bridge
可以将多个 interface 连接为一个网络,并且虚拟网桥设备有自己的MAC转发表,也可以在虚拟网桥中配置VLAN。
利用树莓派验证brdige的二层交换功能
实验设备
- 树莓派3b+:包含一个以太网卡
eth0
,一个无线网卡wlan0
- PC:有一个以太网口
- 手机:可以连接WiFI
实验思路
- 在树莓派上创建一个 bridge,称为
br0
- PC通过网线接入
eth0
,WiFi设备接入基于wlan0
构建的无线局域网 - 将
eth0
和wlan0
添加到br0
,利用br0
将无线局域网和PC桥接在一起
这样一来,网络结构如下图所示(略去了Network Protocol Stack -> eth0 的单向连接):1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 +-------------------------------------------------+
| +----------------------------------------+ |
| | Network Protocol Stack | |
| +----------------------------------------+ |
| ↑ |
|........................|........................|
| ↓ |
| +----------------------------------+ |
| | br0 | |
| +----------------------------------+ |
| ↑ ↑ |
| | | |
| ↓ ↓ |
| +--------------+ +--------------+ |
| | eth0 | | wlan0 |<---------> WiFi_Device
| +--------------+ +--------------+ |
| ↑ ↑ ↑ |
+------------|------------------|--------|--------+
↓ ↓ ↓
PC WiFi_Device WiFi_Device
```
根据其原理,只要合理地配置PC和无线设备的IP地址,它们理应可以借助虚拟网桥 `br0` 互相访问。
### 关键步骤
#### 树莓派配置AP
借助 `hostapd` 实现,大致步骤为:
1. 安装 `hostapd`
```shell
sudo apt install hostapd
- 配置
hostapd
,创建/etc/hostapd/hostapd.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14interface=wlan0
bridge=br0
hw_mode=g
channel=7
wmm_enabled=0
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
ssid=RaspberryPi
wpa_passphrase=password - 关闭
dhcpcd
,启用hostapd
1
2
3
4sudo disable dhcpcd
References: /usr/share/doc/hostapd/README.Debian
sudo systemctl unmask hostapd
sudo systemctl enable hostapd - 连接热点
RaspberryPi
配置好之后重启树莓派应该就能看到热点RaspberryPi
了,由于树莓派没有开启dhcpd,WiFI设备需要配置使用Static IP,比如192.168.31.100/24
桥接
- 创建虚拟网桥
br0
1
sudo ip link add name br0 type bridge
- 添加设备
eth0
,wlan0
至br0
1
2sudo ip link set dev eth0 master br0
sudo ip link set dev wlan0 master br0
连接网络
由于树莓派没有开启dhcpd,需要为各个连接到WiFI的设备配置静态IP,当然经网线连接的PC也需要配置,各个设备的IP需要处于同一网段才能互相访问,比如 192.168.31.0/24
故障排除
PC和无线设备都配置好了却无法互相连接
关掉Windows防火墙再试试,稍等一会儿再试试
在Networking: bridge - Linux Foundation DokuWiki中有这样一句话:The bridge will take a short amount of time when a device is added to learn the Ethernet addresses on the segment before starting to forward.
暂时没有2
测试结果
PC ping通了连接WiFI的手机,成功借助虚拟网桥连通了eth0
和wlan0
无线局域网。
树莓派配置信息
1 | Script started on 2021-07-30 20:07:21+08:00 [TERM="linux" TTY="/dev/tty1" COLUMNS="240" LINES="67"] |
设备IP配置
- PC:
192.168.100.100
- 手机:
192.168.100.102
tcpdump部分抓包结果
抓包命令:sudo tcpdump -i br0
可以看到两台设备之间的 ICMP echo request 和 ICMP echo reply,至于为什么没有互相询问ARP的消息,大概是因为在我截取消息的时候他们已经知道了对方的MAC。
1 | 19:56:53.340646 ARP, Request who-has 192.168.17.1 tell 192.168.17.100, length 28 |