我想自动处理 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
我必须设置匹配的输出规则:
iptables -t nat -A OUTPUT -p TCP -d $EXT.IP.ADD.RESS \
--dport 80 -j DNAT --to-destination $INT.IP.ADD.RESS:80
当记录这些数据包(通过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
我现在对每个端口到内部机器的映射使用以下宏/块:
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”),它允许容器到达其自身。
答案1
是的,这就是所谓的NAT Loopback
,它要求您将本地生成的数据包 SNAT 到您的外部 IP。这将导致您的数据包循环回来并通过您的 PREROUTING 链。
答案2
您打算将本地生成的数据包(而不是转发)重新注入 PREROUTING 来实现什么目的?如果您不喜欢那里的冗余,您可以创建一个新的用户定义链,将规则放入其中,然后从 PREROUTING 和 OUTPUT 调用此链。