使用 iptables snat 时不允许 isc-dhcp 发送数据包

使用 iptables snat 时不允许 isc-dhcp 发送数据包

我在使用 iptables snat 和 isc dhcp 时遇到了这个问题。情况如下:

我在网卡中配置了 2 个 IP。主 IP 和辅 IP

操作系统:Ubuntu 16.04

2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:40:7a:08 brd ff:ff:ff:ff:ff:ff
    inet **10.232.208.228**/29 brd 10.232.208.231 scope global ens32
       valid_lft forever preferred_lft forever
    inet **10.232.208.229**/29 brd 10.232.208.231 scope global secondary ens32

当 DHCP 请求到达辅助 IP(10.232.208.229)时,ISC DHCP 会创建一个以主 IP(10.232.208.228)为源的 DHCP Offer。我使用以下 iptable snat 规则来解决问题:

iptables -t nat -A POSTROUTING -p udp -o ens32 -s 10.232.208.228 --sport 67:68 -j SNAT --to-source 10.232.208.229:67

问题是,当我转换到 10.232.208.229:67 时,DHCPOffer 数据包未发送。如果我将端口更改为 67 以外的任何端口,它都可以正常工作。

以下是系统日志中显示的操作不允许的日志:

Jul 28 11:46:31 dhcp777rsv2 dhcpd[32364]: DHCPDISCOVER from d0:67:e5:30:18:90 (MXXXX) via 172.16.199.1
Jul 28 11:46:32 dhcp777rsv2 dhcpd[32364]: DHCPOFFER on 172.16.199.4 to d0:67:e5:30:18:90 (MXXXX) via 172.16.199.1
Jul 28 11:46:32 dhcp777rsv2 dhcpd[32364]: **send_packet: Operation not permitted**
Jul 28 11:46:32 dhcp777rsv2 dhcpd[32364]: dhcp.c:3693: **Failed to send 301 byte long packet over fallback interface.**

我的 iptable 表没有其他规则,默认情况下它允许一切。

我曾尝试以 root 用户身份运行 dhcpd,但没有成功。

我想了解发生了什么并且能够解决这个问题。

答案1

通过阅读 netfilter.org,我发现了我的问题并解决了它。

我必须添加 PREROUTING DNAT 规则才能使其正常工作:

iptables -t nat -A PREROUTING -p udp -d 10.232.208.229 --dport 67:68 -j DNAT --to-destination 10.232.208.228

原因是传入的数据包使用源 xxxx:67 目标:10.232.208.229:67 创建了连接,并且由于该连接已经存在,因此系统无法对与现有连接匹配的数据包进行 NAT。

相关内容