我已拥有以下基础设施:
互联网 [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