Iptables - 仅允许单个 dhcp(中继)客户端

Iptables - 仅允许单个 dhcp(中继)客户端

我正在尝试在运行 isc-dhcpd 的 Ubuntu 10.04 服务器上创建防火墙规则。我只希望 dhcp 可由单个中继主机 (172.1.1.1) 访问。我已按如下方式设置 iptables:

# iptables -vnL
Chain INPUT (policy ACCEPT 5325 packets, 523K bytes)
pkts bytes target     prot opt in     out     source               destination         
0     0 ACCEPT     udp  --  *      *       172.1.1.1            0.0.0.0/0           udp dpt:67 
1497  533K DROP    udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:67 

我尝试丢弃所有发往端口 67 的 UDP 流量,除非它来自 172.1.1.1。

但是,有了这条规则,当我启动 dhcpd 时,我立即看到 DHCP 请求开始通过广播进入(日志显示通过 eth0)。

我是否需要另一条防火墙规则来捕获广播流量?我尝试添加一条规则,例如

iptables -A INPUT -p udp -d 255.255.255.255 -j DROP

这应该会丢弃所有 UDP 广播流量。但是当我再次启动 dhcpd 时,我看到大量通过广播发出的请求。

编辑:根据这一页

对于大多数操作,DHCP 软件在 Netfilter 之下的级别与 Linux IP 堆栈交互。因此,Netfilter(以及 Shorewall)无法有效地用于监管 DHCP。

那么有什么方法可以实现我想要的吗?

答案1

由于 netfilter ( ) 似乎iptables无法有效过滤 DHCP 广播,请尝试使用ebtablesLinux 工具,该工具用于在较低级别过滤以太网帧。我没有直接的实际使用经验ebtables,但简单浏览一下手册页,我发现下面这样的方法可能对您有用:

ebtables -A INPUT --protocol ipv4 --ip-proto udp --ip-src \! 172.1.1.1 --ip-dport 67 -j DROP

应该导致 Linux 内核丢弃所有包含不是来自 172.1.1.1 且目的地为端口 67 的 IPv4 UDP 数据包的以太网帧。

答案2

它不能在纯 IP 级别上工作,需要了解 DHCP 的工作原理:

  • 首先,DHCP 客户端确实会从 0.0.0.0 向 255.255.255.255(本地广播地址)发送一个数据包(DHCPDISCOVER)。

  • DHCP 服务器将提供一个 IP 地址 (DHCPOFFER);就 iptables 而言,这将是来自 DHCP 服务器地址的数据包,并且目标也是本地广播地址 255.255.255.255。以太网帧的寻址地址是 DHCP 客户端的 MAC 地址。

  • DHCP 客户端从其以太网 MAC 地址发送的所有提议中进行选择,并向 DHCP 服务器发送 DHCPREQUEST;对于 iptables 来说,这又是来自 0.0.0.0 的另一个数据包,目标仍然是本地广播地址 255.255.255.255。

  • DHCP 服务器确认 IP 地址分配 (DHCPACK)。生成的 IP 数据包来自 DHCP 服务器的 IP 地址,目标 IP 地址再次为 255.255.255.255,以太网帧地址将以 DHCP 客户端的 MAC 地址寻址。

  • 当 DHCP 客户端想要续订其 DHCP 租约时,它会发送另一个从 0.0.0.0 到 255.255.255.255 的 DHCPREQUEST 并请求当前 IP 地址。它会一直这样做,直到 DHCP 租约到期,然后它会再次从 DHCPDISCOVER 开始。

因此更有可能的是,您正在寻找类似这样的内容:

iptables -A 输入 -m mac --mac-source xx:xx:xx:xx:xx:xx -p udp --dport 67 -j 接受 iptables -A 输入 -p udp --dport 67 -j DROP

这将丢弃所有不是来自列出的 MAC 地址的、针对您的服务器的 dhcp 请求。

这个问题也可以从另一个层面解决:从 DHCP 服务器中删除 IP 地址池,只为各自的 MAC 地址分配静态映射。这样,DHCP 服务器就不会对列出的任何人做出回应,只会将 IP 分配给已知主机。

相关内容