使用 iptables 进行 NAT 会重写日志中的源 IP

使用 iptables 进行 NAT 会重写日志中的源 IP

我已拥有以下基础设施:

互联网 [81.xxx 外部] 路由器 [192.168.1.1 内部]
                                    | [网络 192.168.1.0/24]
                                    |
                                   邮件服务器[192.168.1.2]

在装有 iptables 的路由器 (DD-WRT) 上。我启用了 NAT,因为我希望我的邮件服务器响应外部 IP。我有以下设置:

iptables -t nat -I PREROUTING -d 81.x.x.x -j DNAT --to 192.168.1.2 
iptables -t nat -I POSTROUTING -s 192.168.1.2 -j SNAT --to 81.x.x.x 
iptables -I FORWARD -d 192.168.1.2 -p tcp --dport 25 -j ACCEPT

还有一些其他开放端口。

但是,当邮件到达邮件服务器时,postfix 显示以下消息:

postfix/smtpd[6964]: connect from unknown[192.168.1.1]

所有来自外部的邮件似乎都是通过路由器内部 IP 地址发送的。我遗漏了什么,为什么显示的是原始 IP 地址,而不是路由器内部 IP?

答案1

您似乎已经使用前两个 iptables 规则设置了一对一 NAT,但是随后您又添加了第三个相当奇怪的规则:

iptables -I FORWARD -d 192.168.1.2 -p tcp --dport 25 -j ACCEPT

进行 1 对 1 NAT 时,此类规则不是必需的,而且实际上没有任何用处。根据您提供的信息,这似乎是导致问题的最可能原因。只需将其删除即可。

iptables -D FORWARD -d 192.168.1.2 -p tcp --dport 25 -j ACCEPT

答案2

ISTR 以前也出现过类似情况,但正如您所说,有些东西缺失了。路由器中的以下信息可能会有用:

iptables -t nat -L -n
iptables -L -n
ip route

这是来自邮件服务器的内容:

iptables -t nat -L -n
ip route
grep . /proc/sys/net/ipv4/conf/*/rp_filter

如果没有这些信息,我想我会清除现有的防火墙并做一些更具体的事情:

iptables -t nat -F  # also on server
iptables -t nat -I PREROUTING -p tcp -d 81.x.x.x --dport 25 \
    -j DNAT --to 192.168.1.2:25

并查看邮件日志中发生的情况。如果您需要 SNAT 来发送 SMTP,则类似以下内容:

iptables -t nat -I POSTROUTING -p tcp -s 192.168.1.2 --dport 25 \
    -m multiport --sports 1024:65535 -j SNAT --to 81.x.x.x:25

如果本地 DNS 解析器不够用:

iptables -t nat -I POSTROUTING -p udp -s 192.168.1.2 --dport 53 \
    -j SNAT --to 81.x.x.x

相关内容