iptables – 只允许一个dhcp(中继)客户端

我正在尝试在运行isc-dhcpd的Ubuntu 10.04服务器上创build防火墙规则。 我只希望dhcp可以被一个中继主机访问(172.1.1.1)。 我有iptablesbuild立像这样:

# 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 

这是我的尝试,以删除所有的UDP通信目的地端口67,除非它来自172.1.1.1。

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

我需要另一个防火墙规则来捕捉广播stream量吗? 我试过添加一个规则

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

应该放弃所有的UDP广播stream量。 但是当我启动dhcpd的时候,我通过广播看到了大量的请求。

编辑:根据这个页面 :

对于大多数操作,DHCP软件在Netfilter下的级别连接到Linux IP堆栈。 因此,Netfilter(因此Shorewall)不能有效地用于监控DHCP。

那么有什么办法可以完成我想要的吗?

由于看来netfilter( iptables )对于过滤DHCP广播是无效的,所以请尝试使用ebtables (用于在较低级别进行过滤的Linux工具)以太网帧。 我没有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的IPv4 UDP数据包的所有以太网帧,其目的地是端口67。

它不能在纯粹的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地址发送的任何报价中进行select,并向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 INPUT -m mac -mac-source xx:xx:xx:xx:xx:xx -p udp -dport 67 -j ACCEPT iptables -A INPUT -p udp -dport 67 -j DROP

这将删除任何不是源于列出的MAC的服务器的DHCP请求。

这个问题也可能在不同的层次上解决:从DHCP服务器中删除IP地址池,并且只为你的MAC地址分配静态映射。 这样,DHCP服务器将不会回答列出的任何人,只会将IP分配给已知的主机。