![iptables dhcp 监听](https://linux22.com/image/107838/iptables%20dhcp%20%E7%9B%91%E5%90%AC.png)
我有 ubuntu 和 isc-dhcp-server (DHCPRFC2131)作为我本地 eth 中的“权威”,并且我本地网络的某些用户激活了另一个 dhcp(流氓),从而产生冲突
我没有任何带有“dhcp snooping”功能的 Cisco 或 HP 交换机,可以通过规则阻止 dhcp 流氓行为(例如“ip dhcp snooping”)。这些规则不起作用:
localeth=enp2s0
iptables -I INPUT -i $localeth -p udp -m multiport -sports 67,68 -j DROP
iptables -I FORWARD -i $localeth -p udp -m multiport -dports 67,68 -j DROP
iptables -t mangle -A PREROUTING -i $localeth -p udp -m multiport --dports 67,68 -j DROP
Ubuntu with
ISC-DHCP-Server
authoritative;
option wpad code 252
如何使用 iptables 规则阻止这个 dhcp 流氓行为?谢谢
更新:
正如所解释的这里, iptables 不是指定用于 DHCP 过滤的那个,但是ebtables,因为据说“用于在较低级别过滤以太网帧的 Linux 工具 (ebtables)“,因此这是我尝试过的规则
macserver=52:54:00:ee:00:11
ipserver=192.168.1.10
ethserver=enp2s0
ebtables=/sbin/ebtables
$ebtables -A INPUT -i $ethserver --protocol ipv4 --ip-proto udp -s ! $macserver --ip-src ! $ipserver --ip-dport 67:68 -j DROP
但不起作用。
PD:github上有一个与这个主题相关的项目叫做ebtables-dhcpsnooping但不确定这是否有效
答案1
这取决于您的主机的连接方式。
如果“权威”DHCP 服务器主机及其(假定的)客户端主机都连接到“物理”/“专用”/“独立”(希望您知道我的意思)交换机/“路由器” ,那么您实际上无法在 DHCP 服务器主机上执行任何操作,因为其他“恶意”DHCP 服务器不通过主机与客户端通信,而仅通过交换机与客户端通信。
但是,如果主机还通过桥接一堆连接到其客户端主机的以太网/L2(例如分接器)网络接口来充当交换机/“路由器”。你应该做的是过滤FORWARD
链ebtables
:
ebtables -A FORWARD --protocol ipv4 --ip-proto udp --ip-dport 67:68 -j DROP
(实际上,据我所知,68
单独应该做。)
您不需要 MAC/IP/接口匹配的原因是,FORWARD
链本身已经处理了这一点:它适用于从一个桥接端口到另一个桥接端口的流量,但不适用于源自或目标于桥接的流量主机本身。
你可能不知道真的需要在 L2 或 L3 上对“权威”服务器本身进行过滤 ( INPUT
),除非您还在其上运行 DHCP 客户端非特定于接口的方式。可能值得一提的是,如果您确实想使用ebtables
(您不必这样做;,而不是iptables
可以处理这种情况)-i
/ --in-interface
,您应该使用可能是--logical-in
,其值为桥接接口本身。
顺便说一句,来自 shorewall 页面的引用对我来说几乎没有任何意义,因为 ebtables 也是 Netfilter 的一部分。 (它甚至看起来不是一个语法正确的句子。)我想它想说的是,iptables 不会过滤在 L2 上转发的流量(即通过桥从一个端口到另一个端口的流量)。
编辑:显然我在一件事上错了。我刚刚意识到 iptables 既不能阻止入站也不能阻止出站 DHCP 消息。也许这就是海岸墙引文想要表达的意思。然而,您可以使用 ebtables 阻止它们的事实仍然存在。 (请注意,ebtables 规则仅适用于桥接接口,因此--logical-in
如果只有一个匹配,则匹配是可选的。)
PS"router"
上面提到的事实是,我们所说的路由器通常也由交换机组成(即具有分别在L2和L3上转发的组件。)