iptables nat:通过PREROUTING链处理OUTPUT链/从OUTPUT转发到PREROUTING

我想自动处理NAT表(在本地生成)的OUTPUT链中的数据包,就像它们来自外部(通过PREROUTING)一样。

是否可以使用一个“转发所有PREROUTING”作为后备/最后一条规则在OUTPUT链?

例如,给定以下NAT转发:

iptables -t nat -A PREROUTING -p TCP -d $EXT.IP.ADD.RESS \ --dport 80 -j DNAT --to-destination $INT.IP.ADD.RESS:80 

我必须设置一个匹配的OUTPUT规则:

 iptables -t nat -A OUTPUT -p TCP -d $EXT.IP.ADD.RESS \ --dport 80 -j DNAT --to-destination $INT.IP.ADD.RESS:80 

当logging这些数据包时(通过iptables -t nat -A OUTPUT -p TCP -d $EXT.IP.ADD.RESS -j LOG ),它们看起来像:

 IN= OUT=lo SRC=$EXT.IP.ADD.RESS DST=$EXT.IP.ADD.RESS LEN=60 \ TOS=0x00 PREC=0x00 TTL=64 ID=22348 DF PROTO=TCP SPT=59425 \ DPT=25 WINDOW=32792 RES=0x00 SYN URGP=0 

我已经尝试了类似下面的内容,但是它不起作用:

 iptables -t nat -A OUTPUT -p TCP -d $EXT.IP.ADD.RESS -j DNAT \ --to $EXT.IP.ADD.RESS 

我正在使用下面的macros/块现在每个端口映射到内部机器:

 iptables -t nat -A PREROUTING -p TCP -d $EXT.IP.ADD.RESS --dport 25 \ -j DNAT --to-destination 10.122.1.25:25 iptables -t nat -A OUTPUT -p TCP -d $EXT.IP.ADD.RESS --dport 25 \ -j DNAT --to-destination 10.122.1.25:25 iptables -t nat -A POSTROUTING -p TCP -s 10.122.1.25 -d 10.122.1.25 --dport 25 \ -j SNAT --to 10.122.1.1 

10.122.1.1是防火墙,而10.122.1.25是容器(邮件服务器)。

我最近只添加了最后一个规则(“POSTROUTING”),允许容器到达自己。

是的,这就是所谓的NAT Loopback ,它需要你SNAT你本地生成的数据包到你的外部IP。 这将导致你的数据包环回,并通过您的PREROUTING链。

您打算如何将本地生成的数据包(不转发)重新注册到PREROUTING中来完成? 如果你不喜欢你在那里的冗余,你可以创build一个新的用户定义链,把规则放在那里,并从PREROUTING和OUTPUT调用这个链。