UFW/IPTABLES 未阻止 DHCP UDP 端口 67?

UFW/IPTABLES 未阻止 DHCP UDP 端口 67?

我运行的是 ubuntu 16.04。我已经安装并启用了 ufw。我还安装了 isc-dhcp-server。我还没有打开 UDP 端口 67,但 DHCP 客户端似乎仍然能够从服务器获取 DHCP 租约。为什么是这样?我已经查看了 ufw 创建的 IPTABLES,它确实为 DHCP 客户端打开了 UDP 端口 68,但没有打开 UDP 端口 67(据我所知)。在我看来,ufw 也没有将 IPTABLES 配置为接受广播流量。 ufw 应该允许还是阻止广播流量?

IPTABLES 对于 UDP 端口 67 流量是否有某种特殊例外?

如果 DHCP 客户端没有首先从 UDP 端口 67 上的广播获得响应,它是否会回退到 UDP 端口 68 上的广播?如果是这样,则 DHCP 请求正在发送到服务器,因为允许传出 DHCP 客户端请求的 UFW 规则将允许传入 DHCP 客户端请求。

的状态ufw status verbose

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW IN    Anywhere                  

答案1

在开始测试闪亮的新 DHCP 服务器之前,我太沮丧了,无法在防火墙上打开适当的端口,过了一会儿我才意识到它还不能工作。我从未在服务器的防火墙上打开端口 67。

...

简单的答案是 DHCP 确实很特殊。引用一位陌生人的话,

isc.org 的马克·安德鲁斯 (Mark Andrews) 表示:

“DHCP 使用数据包过滤器,这些过滤器在防火墙之前连接到 IP 堆栈。”

http://thr3ads.net/netfilter-buglog/2011/07/1961358-Bug-730-New-DHCP-request-and-other-traffic-bypasses-iptables-netfilter

--https://www.centos.org/forums/viewtopic.php?t=8728


人们经常说这是因为 DHCP 服务器使用原始套接字。我认为这个措辞非常混乱。一些 DHCP 服务器的官方 ISC 文档使用“原始套接字”作为广义术语,因为它可以在许多不同的平台上运行,而在这些平台上它必须使用许多不同的接口。在 Linux 上,您可能听说过不止一种被称为原始套接字的类型。 有些受Linux iptables影响,有些不受Linux iptables影响

我确信 Linux 的 TCP/IP 堆栈在使用 PF_INET+SOCK_RAW 发送数据包时会施加一些限制。我模糊的记忆是 Linux 上的 DHCP 不一定适用于这种类型的套接字,可能需要使用“数据包套接字”。数据包套接字工作在较低级别。我确信数据包套接字不会受到 iptables 的影响。

PF_PACKET 套接字绕过 TCP/IP 堆栈。

PF_INET/SOCK_RAW 套接字仍然遍历 TCP/IP 堆栈。

--https://lists.netfilter.org/pipermail/netfilter-devel/2003-March/010845.html

这句话是在接收数据包的情况下写的。正如您所期望的,还有证据表明这适用于发送数据包。


看来 iptables 是适用于 TCP/IP 堆栈的限制之一,包括使用 PF_INET+SOCK_RAW 发送。

如果我在用户空间中有一个 IP 数据报,并且我使用 send() 系统调用通过使用套接字(PF_INET、SOCK_RAW、IPPROTO_RAW)创建的原始套接字发送它,那么该数据包是否会遍历 netfilter 链?

...

看起来是个好消息:

ipt_hook: happy cracking.
ipt_hook: happy cracking.
ipt_hook: happy cracking.
ipt_tcpmss_target: bad length (10 bytes)

所以你的数据包将遍历 iptables。

https://lists.netfilter.org/pipermail/netfilter-devel/2003-March/010829.html

以及接收方向的证据:

事实证明,使用原始套接字为我提供了 NAT 后的数据包,因此 IP 地址又回到了私有范围内(在我的示例中为 10.xxx)。也许这是常识,但我很难找到它的记录。如果我使用 libpcap/tcpdump 我会收到 NAT 前的数据包

[NAT由iptables执行]

--https://lists.gt.net/iptables/user/62529#62529


奖金抱怨:我思考我最初引用的术语“数据包过滤器”是一种直接的滥用,尽管这种滥用是长期存在的。 Berkeley Packet Filter 是一种用于在原始套接字上安装过滤器的机制,例如,以便它仅接收 DHCP 端口上的数据包。我认为 ISC 有时会提到“Linux 数据包过滤器”,就好像它本身就是一种原始套接字。事实并非如此,您实际上可以在普通 UDP 或 TCP 套接字上使用 BPF。

相关内容