Linux 网桥不能进行 DHCP 的广播

Keyword: Linux bridge dhcp broadcast

在 Linux 上,对两个端口(eth0, wlan0) 建立网桥 br-lan,eth0 侧有 DHCP Server,wlan0 是 AccessPoint 模式。

当设备连接 wlan0 后并不能自动获取 IP。

两侧抓包(67和68是DHCP协议使用的端口)

sudo tcpdump -i eth0 -n -e port 67 and port 68
sudo tcpdump -i wlan0 -n -e port 67 and port 68


能看到设备发往 wlan0 的包,但是另一端 eth0 没有出包。DHCP broadcast 样例如下

01:02:47.047690 94:87:e0:xx:xx:xx > ff:ff:ff:ff:ff:ff, ethertype IPv4 (0x0800), length 340: 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 94:87:e0:xx:xx:xx, length 298


按我的理解,这是一个普通的链路层广播,作为交换机的bridge应该正常广播才对。

尝试调整bridge的配置,关闭生成树协议,检查ebtables,均无效。


乱猜一下,这个过程是不是有可能过 iptables 了? 用 iptables trace 看一下

modprobe nf_log_ipv4
sysctl net.netfilter.nf_log.2=nf_log_ipv4
iptables  -I FORWARD_direct -p udp --dport 67:68 --sport 67:68 -j TRACE

然后 dmesg -T -w 看一眼,果然有包,走默认 firewalld 策略被丢掉了


解决:

iptables 写法

# 只允许 DHCP
iptables  -I FORWARD_direct -p udp --dport 67:68 --sport 67:68 -j ACCEPT
# 允许各种 FORWARD
iptables  -I FORWARD_direct -i br-lan -o br-lan -j ACCEPT

我用的是firewalld,写法:

sudo firewall-cmd --direct --add-passthrough ipv4 -I FORWARD -i br-lan -o br-lan -j ACCEPT


思考:bridge 不能简单的理解成链路层交换机,为什么一个简单的链路层广播会涉及三层我也没搞清楚,还需要学习。

猜想:

  1. 可能是这个广播不仅是链路层广播,还是三层广播(255.255.255.255) 可能就过三层了。
发布于 2019-01-09