![FedoraCore 升级后的困惑:NAT/端口转发问题,以及 POSTROUTING MASQUERADE 对转发端口产生意想不到的影响](https://linux22.com/image/798789/FedoraCore%20%E5%8D%87%E7%BA%A7%E5%90%8E%E7%9A%84%E5%9B%B0%E6%83%91%EF%BC%9ANAT%2F%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E9%97%AE%E9%A2%98%EF%BC%8C%E4%BB%A5%E5%8F%8A%20POSTROUTING%20MASQUERADE%20%E5%AF%B9%E8%BD%AC%E5%8F%91%E7%AB%AF%E5%8F%A3%E4%BA%A7%E7%94%9F%E6%84%8F%E6%83%B3%E4%B8%8D%E5%88%B0%E7%9A%84%E5%BD%B1%E5%93%8D.png)
在网关/防火墙系统的硬件发生故障后,在新硬件上安装了较新版本的 Fedora Core (17),并使用了 /etc/sysconfig 中的旧“iptables”和 system-config-firewall 文件(没有其他内容)。FC 的旧版本未知,但可能是 14 或 15,旧磁盘不再可读。(我已将以前的 iptables 文件内容放在下面。)
该系统的工作专门用于:
- 接受来自任何网络源的端口 22 (ssh) 以进行本地传送 (sshd)。
- 将端口 222 转发到内部系统上的端口 22 (ssh),保留原始 IP 地址。
- 将端口 25(电子邮件)转发到内部系统,保留原始 IP 地址。
- 将所有(非端口 22)入站流量从内部网络转发到外部网络,沿途应用 NAT / 伪装,并允许相关的外部生成的返回数据包通过(视情况而定)。
上面概述的步骤是这个盒子的唯一工作并且它以前运行良好。
我从哪里开始:
恢复服务时,所有到端口 22(sshd)的连接均能正常工作,并且到所有其他端口的外部连接均可转发或根据需要被丢弃,但内部系统看到的 IP 地址是网关的 IP 地址,而不是保留其源 IP 地址。
当我将系统连接到网络时,所有与电子邮件相关的问题都出现了;网关后面的邮件服务器系统会根据 IP 地址/系统名称不匹配的情况拒绝邮件,而取消检查会使垃圾邮件过滤系统变得疯狂。
伪装了错误的接口但是...
目光敏锐的 serverfault 参与者 DavidSchwartz 注意到,内部接口启用了伪装(通过 -A POSTROUTING -o eth0 -j MASQUERADE),说明内部系统可以看到网关 IP 地址,但是当更改为反映外部接口时(例如:-A POSTROUTING -o eth1 -j MASQUERADE),所有转发都会停止!是的,我的意思是端口转发,从外部到内部(内部系统上的端口 222 到端口 22)。
我实在不明白。
为了清楚起见,出现启用 INTERNAL 接口的伪装功能,虽然并非预期目的,但确实具有允许端口转发从外部到内部进行的优点。切换到伪装(正确的)EXTERNAL 接口会以某种方式禁用端口转发,因为没有其他更改。
SNAT 与伪装
由于有两个面向外部的“服务器系统”,它们也具有已配置为备用出站路径的内部接口,因此我查看了它们,发现它们采用了非常不同的伪装技术;没有像上面两段引用的那样的一行,而是这样的:
-A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to-source <external.v4.ip.addr>
太棒了 - 我理解了,很有道理,我试试!我注释掉了 MASQUERADE 行,并添加了(在相同位置)SNAT 行,如这里所述,太棒了!它做了两件事:
- 我获得了所需的出站网络地址转换,并且;
- 它现在将外部到端口 222 的入站连接请求转发到内部系统上的端口 22,并根据需要保留原始 IP 地址。
剩余问题
什么是不是工作是其他方面完全相同的转发端口 25(在内部系统上仍为端口 25)。
目前,这就是我必须解决的问题!(越快越好!)为什么一个端口转发而另一个不转发?它不是“tcp”类型的端口吗?如果不是,应该用什么来代替它?(我不认为它是 UDP...)
不太重要;如果能知道为什么旧配置可以工作但现在不行就好了!Fedora Core 有差异吗?IP 表有更新吗?我依赖的是 bug 吗?-微笑-
以下是 iptables 中的两条端口转发行:
-A PREROUTING -i eth0 -p tcp --dport 25 -j DNAT --to-destination 192.168.0.64:25
-A PREROUTING -i eth0 -p tcp --dport 222 -j DNAT --to-destination 192.168.0.64:22
我尝试了上面两个端口后面带“:25”和不带“:25”的情况。同样,外部端口 222 可以顺利转发到内部系统端口 22,而端口 25 则完全不转发。
请注意,从可以直接看到邮件服务器系统的系统(不通过网关/防火墙)对端口 25 进行 telnet 访问可以完美运行。此外,我尝试将端口 24 转发到端口 25 作为测试,并得到了相同的结果(无响应)。
这是 iptables 文件:
# eth0 is internal
# eth1 is external
*nat
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
# NO packets get through without this next line:
-A POSTROUTING -o eth0 -j MASQUERADE
# the above line was commented out and replaced with:
-A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to-source <external.v4.ip.addr>
-A PREROUTING -i eth1 -p tcp --dport 25 -j DNAT --to-destination 192.168.0.64:25
-A PREROUTING -i eth1 -p tcp --dport 222 -j DNAT --to-destination 192.168.0.64:2
2
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 222 -j ACCEPT
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -p icmp -j ACCEPT
-A FORWARD -i lo -j ACCEPT
-A FORWARD -i eth0 -j ACCEPT
-A FORWARD -o eth0 -j ACCEPT
-A FORWARD -i eth1 -m state --state NEW -m tcp -p tcp -d 192.168.0.64 --dport 25
-j ACCEPT
-A FORWARD -i eth1 -m state --state NEW -m tcp -p tcp -d 192.168.0.64 --dport 22
-j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
答案1
-A POSTROUTING -o eth0 -j MASQUERADE
您要求它伪装从内部接口发出的流量,所以它正在这样做。伪装意味着模仿连接的来源。删除此行,如果出现问题,请添加正确的规则。
答案2
我终于解决了这个问题。
嗯,实际上我放弃了它并在解决另一个问题时找到了答案。
答案是:内部接收系统必须使用相同的返回路由 - 相同的网关/防火墙系统 - 以使端口转发正常工作!至少对于 SMTP 来说是这样。对于某些服务(如 ssh)来说,这似乎并非如此,但通过行为证实,如果默认路由不是转发连接的系统,则 SMTP(在我的情况下是 Postfix)将无法正常工作。
这对于我们这些想要冗余的人来说意义重大 - 我希望邮件服务器能够从多个网关/防火墙接收转发的端口。我还没有弄清楚如何为这种多网关/防火墙策略创建特殊路由,但我知道 iptables 可以做到这一点。
祝你好运!