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

我遇到了iptables snat和isc dhcp这个问题。 情况是这样的:

我在我的网卡上configuration了2个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创build一个主要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表没有其他的规则,默认情况下,它允许everthing。

我已经尝试用root用户运行dhcpd没有运气。

我想了解正在发生的事情,并可以解决这个问题。

阅读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 dest:10.232.208.229:67创build连接,并且由于此连接已经存在,系统无法对匹配现有连接的数据包进行NAT转换。