![为什么即使 udp 67 被阻止,DHCP 仍然有效?](https://linux22.com/image/1596734/%E4%B8%BA%E4%BB%80%E4%B9%88%E5%8D%B3%E4%BD%BF%20udp%2067%20%E8%A2%AB%E9%98%BB%E6%AD%A2%EF%BC%8CDHCP%20%E4%BB%8D%E7%84%B6%E6%9C%89%E6%95%88%EF%BC%9F.png)
我的树莓派上有一个 dhcp 服务器。我设置了一个防火墙,只允许 ssh、dns 和 samba 服务。但是,dhcp 服务器也运行正常,但为什么呢?
这是防火墙规则:
table ip filter {
chain input {
type filter hook input priority filter; policy drop;
tcp flags == 0x0 drop
tcp flags & (fin | psh | urg) == fin | psh | urg drop
tcp flags & (syn | ack) == syn | ack ct state new drop
tcp dport { 22, 139, 445 } accept
udp dport { 53, 137, 138 } accept
ct state { established, related } accept
iifname "lo" accept
}
chain forward {
type filter hook forward priority filter; policy accept;
ip daddr { 10.0.0.2, 10.0.0.3 } meta mark set 0x00000002
ct mark set meta mark
}
}
table ip nat {
chain postrouting {
type nat hook postrouting priority filter; policy accept;
masquerade
}
}
答案1
许多 DHCP(IPv4)客户端和服务器使用“原始”套接字,以绕过 IP 级防火墙。
在客户端,当 DHCP(IPv4)客户端启动时,它通常会不IP 地址。因此,它不能使用普通的 UDP 套接字,而必须使用“原始”套接字,它会制作自己的 UDP 甚至 IP 标头。出于各种原因,可能是因为原始模式绕过了常规 IP 堆栈,它也会绕过 IP 防火墙。(使用 tcpdump 时您会注意到同样的情况,它会在防火墙有机会拒绝所有数据包之前看到它们。)
在服务器端,情况可能类似。服务器将接收来自空地址的广播数据包,它需要知道这些数据包通过哪个接口到达(有些操作系统没有钩子让应用程序知道 UDP 的情况),开发人员只是想重用相同的代码,等等。
(这不适用于 DHCPv6,因为 IPv6 主机做始终有一个 IP 地址 – 链路本地fe80:...
地址 – 并且软件可以使用普通的 UDP 套接字,这些套接字受防火墙的影响,可以绑定到特定接口的地址。)