我的树莓派上有一个 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
}
}
许多 DHCP (IPv4) 客户端和服务器使用绕过 IP 级防火墙的“原始”套接字。
在客户端,当 DHCP (IPv4) 客户端启动时,它通常根本没有IP 地址。因此,它不能使用普通的 UDP 套接字,而必须使用“原始”套接字,在其中制作自己的 UDP 甚至 IP 标头。由于各种原因,也许是因为原始模式绕过了常规 IP 堆栈,它也绕过了 IP 防火墙。(您在使用 tcpdump 时会注意到同样的事情,它会在防火墙有机会拒绝之前查看所有数据包。)
在服务器端,情况可能类似。服务器将从空地址接收广播数据包,它需要知道这些数据包是通过哪个接口到达的(某些操作系统没有挂钩让应用程序知道当涉及到 UDP 时),开发人员只是想重用相同的代码,等等
(这不适用于 DHCPv6,因为 IPv6 主机总是有一个 IP 地址——链路本地
fe80:...
地址——并且该软件可以使用普通的 UDP 套接字,这些套接字受防火墙影响并且可以绑定到特定接口的地址。 )