必须用iptables或firewalld在INPUT链匹配--dport 68并限制-s源IP,放行可信DHCP服务器、拒绝其余所有,因客户端监听68端口接收响应,且广播包使-s失效,故需确保信任网段覆盖直连服务器且禁用中继。

用 iptables 拦非信任网段的 DHCP 响应(UDP 67 入站)
Linux 主机作为 DHCP 客户端时,会监听 UDP 67 端口接收服务端响应;攻击者伪造的 DHCP 服务器若在非信任网段,其发来的 DHCPOFFER 就是非法入站流量。
- 必须针对
INPUT链操作(不是 OUTPUT 或 FORWARD),因为响应包是进本机的 - 匹配协议为
udp、目标端口为67,再限制源 IP 范围 - 先放行可信 DHCP 服务器(如
10.0.10.1),再拒绝其他所有udp --dport 67流量 - 规则顺序很重要:允许规则必须在拒绝规则之前插入(用
-I INPUT 1而非-A)
示例命令:
iptables -I INPUT -p udp --dport 67 -s 10.0.10.1 -j ACCEPT iptables -A INPUT -p udp --dport 67 -j DROP
⚠️ 注意:-s 是源地址,不是目标地址;若你有多个可信 DHCP 服务器,每条都要加一条 ACCEPT 规则。
firewalld 下如何等效实现
firewalld 不支持直接按源 IP + 端口写富规则来拦截 DHCP 响应,它默认的 service(如 dhcpv4)是双向开放的,不能做单向源控。必须用 direct rules 绕过 zone 逻辑:
- 先确认当前 default zone(如
public)没开dhcpv4服务:firewall-cmd --list-services - 用
--direct添加两条规则:一条放行可信源,一条丢弃其余 - firewalld 的 direct rule 默认插入到 filter 表最前,所以顺序天然可控
执行:
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p udp --dport 67 -s 10.0.10.1 -j ACCEPT firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 1 -p udp --dport 67 -j DROP firewall-cmd --reload
验证是否生效:firewall-cmd --direct --get-all-rules,检查规则序号和动作。
为什么不能只封 UDP 68 端口或依赖服务名
DHCP 客户端监听的是 68 端口,但响应包是发往该端口的——所以真正要拦的是“进来的、目标为 68 的包”?错。标准 DHCP 报文里,服务端响应使用源端口 67、目标端口 68;客户端请求才相反。但 Linux 内核协议栈在处理时,会把发给 68 的包送到用户态 DHCP 客户程序(如 dhclient)。所以实际过滤点有两个:
-
INPUT -p udp --dport 68:拦所有进来的 DHCP 响应(但无法区分来源) -
INPUT -p udp --sport 67:更精准,因为只有合法 DHCP 服务器才该用 67 当源端口
但注意:--sport 在某些内核版本或 NAT 场景下可能不可靠;--dport 67 是服务端监听端口,不适用于客户端主机。因此**唯一可靠且通用的做法,是匹配 --dport 68 + -s 限制源网段**——即上面 iptables/firewalld 示例中隐含的真实逻辑(虽然示例写了 --dport 67,那是误将服务端视角套用到了客户端上;正确应为 --dport 68)。
修正后的推荐规则(务必用这个):
iptables -I INPUT -p udp --dport 68 -s 10.0.10.0/24 -j ACCEPT iptables -A INPUT -p udp --dport 68 -j DROP
别忘了 dhclient 进程本身的风险
即使防火墙拦住了非法响应,dhclient 若未配置 timeout 或 retry 限制,仍可能持续接收并尝试处理恶意 OFFER。建议在 /etc/dhcp/dhclient.conf 中加固:
- 设置
timeout 30;防止无限等待 - 添加
require subnet-mask, routers;强制校验关键字段 - 禁用无意义选项:
ignore domain-name, domain-name-servers;(如果你不依赖 DHCP 分配 DNS)
这些配置不会让防火墙变强,但能降低客户端被诱导接受恶意配置的概率。
实际部署时最容易被忽略的一点:**DHCP 响应可能是广播(255.255.255.255)或单播,而-s 匹配对广播无效**。所以必须确保你的“信任网段”包含所有合法 DHCP 服务器的直连子网,并且网络中没有开启 DHCP 中继(relay)——否则中继会把远端服务器的响应改成自己 IP 作为源,导致规则失效。


















