为什么即使 udp 67 被阻止,DHCP 仍然有效?

为什么即使 udp 67 被阻止,DHCP 仍然有效?

我的树莓派上有一个 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 套接字,这些套接字受防火墙的影响,可以绑定到特定接口的地址。)

相关内容