在网关/防火墙系统的硬件故障之后,在新硬件上安装了较新版本的 Fedora Core (17),并使用了 /etc/sysconfig 中的旧“iptables”和 system-config-firewall 文件(仅此而已)。旧版本的 FC 未知,但可能是 14 或 15,旧磁盘不再可读。(我把以前的 iptables 文件内容放在下面。)
该系统的工作专门用于:
- 接受来自任何网络源的端口 22 (ssh) 以进行本地传送 (sshd)。
- 将端口 222 转发到内部系统上的端口 22 (ssh),保留原始 IP 地址。
- 将端口 25(电子邮件)转发到内部系统,保留原始 IP 地址。
- 将所有(非端口 22)入站流量从内部网络转发到外部网络,沿途应用 NAT/Masquerading,并允许相关的外部生成的返回数据包酌情通过。
上面列出的步骤是这个盒子的唯一工作,它以前工作正常。
我从哪里开始:
当恢复服务时,到端口 22 (sshd) 的所有连接都工作正常,到所有其他端口的外部连接转发或适当丢弃,但内部系统看到的 IP 地址是网关的 IP 地址,而不是保留其源 IP地址。
当我将系统连接到网络时,关于电子邮件的所有问题都发生了变化;网关后面的邮件服务器系统正在拒绝基于 IP 地址/系统名称不匹配的邮件,取消检查会使垃圾邮件过滤系统变得疯狂。
MASQUERADING 是错误的界面但是......
眼尖的 serverfault 参与者 DavidSchwartz 注意到内部接口的伪装已打开(通过 -A POSTROUTING -o eth0 -j MASQUERADE),解释了看到网关 IP 地址的内部系统,但是当更改以反映外部接口时(例如: - POSTROUTING -o eth1 -j MASQUERADE),然后所有转发停止!是的,我的意思是端口转发,从外部到内部(内部系统上的端口 222 到端口 22)。
我真的不明白。
为清楚起见,似乎为 INTERNAL 接口打开伪装,虽然不是预期的,但确实具有允许端口转发实际发生从外部到内部的积极属性。切换为伪装(正确的)外部接口以某种方式禁用端口转发,因为没有其他更改。
SNAT 与伪装
由于有两个面向外部的“服务器系统”,它们也具有已配置为备用出站路径的内部接口,我查看了它们,发现它们具有非常不同的伪装技术;没有像上面引用的两段那样的行,而是这样:
-A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to-source <external.v4.ip.addr>
太好了-我明白了,有道理,我试试看!我注释掉了 MASQUERADE 行并包含(在同一位置)一条 SNAT 行,如此处所述,YAY!它做了两件事:
- 我根据需要获得出站网络地址转换,并且;
- 它现在将入站连接请求从外部端口转发到端口 222 到内部系统上的端口 22,并根据需要保留原始 IP 地址。
遗留问题
不起作用的是其他相同的转发端口 25(在内部系统上保留端口 25)。
目前这是我必须解决的问题!(而且越快越好!)为什么一个端口转发而不是另一个?它不是“tcp”类型的端口吗?如果不是,应该用什么来代替它?(没想到是UDP……)
不太重要; 很高兴知道为什么旧配置可以工作,但现在不行了!Fedora Core 的差异?更新 IP 表?我依赖错误吗?-微笑-
这是 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”。同样,外部端口 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
您要求它伪装流出内部接口的流量,这就是它正在做的事情。伪装意味着冒充连接的来源。删除此行,如果出现问题,请添加正确的规则。
我终于解决了这个问题。
好吧,实际上我放弃了它并在处理另一个问题时找到了答案。
答案是:内部接收系统必须使用相同的返回路由 - 相同的网关/防火墙系统 - 端口转发才能正常工作!至少对于 SMTP 是这样。对于某些服务(如 ssh)来说似乎并非如此,但行为证实,如果默认路由不是转发连接的系统,则 SMTP(在我的例子中是 Postfix)将无法正常工作。
这对我们这些想要冗余的人有影响——我希望邮件服务器能够从多个网关/防火墙接收转发端口。我还没有弄清楚如何为这个多网关/防火墙策略创建特殊路由,但我知道 iptables 可以做到。
祝你好运!