IPtables NAT 难题:为什么来自防火墙主机的流量会被 NAT,即使它不是来自规定的源地址之一?

IPtables NAT 难题:为什么来自防火墙主机的流量会被 NAT,即使它不是来自规定的源地址之一?

我运行一个小型网络,其中 Linux Web/邮件服务器还为一组 Windows 机器提供 NAT。其中一台 Windows 机器显然行为不当(ZeroAccess 僵尸网络,尽管我使用 Norton PowerEraser 找不到任何问题,并且在数周的日志记录中只能在 /var/syslog 中找到 3 个传出端口 16465 数据包)。出于某种原因,设置防火墙规则以丢弃所有传出的 16465 数据包也无法解决问题,但这是一个不相关的问题。

此问题导致邮件服务器被列入黑名单,例如 spamhaus.org。由于我找不到受感染的 Windows 主机,所以我想到使用 IP 别名通过不同的 IP 地址发送 NAT 流量。

外部接口:

eth0:   216.82.212.230
eth0:1  72.48.103.182

内部接口:

eth1:   172.18.90.1

在我的防火墙规则中我更改了

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 216.82.212.230

iptables -t nat -A POSTROUTING -s 172.18.90.0/24 -o eth0 -j SNAT --to 72.48.103.182

问题是现在所有流量都以 72.48.103.182 发出,包括来自邮件服务器的流量。如果我从防火墙主机 ssh 到另一台外部机器,连接被识别为来自 72.48.103.182。

这对我来说毫无意义,因为我专门指定了应该进行 NAT 的源 IP。最初,我尝试了上面的行,但没有使用“-s 172.18.90.0/24”,结果完全相同。

对正在发生的事情有什么想法吗?我并不是一个 iptables 专家,但在发布到 serverfault 之前,我努力尝试研究这个问题。

=======================

root@www:etc# ip ro
216.82.212.0/24 dev eth0  proto kernel  scope link  src 216.82.212.230
72.48.103.0/24 dev eth0  proto kernel  scope link  src 72.48.103.182
172.18.90.0/24 dev eth1  proto kernel  scope link  src 172.18.90.1
default via 216.82.212.254 dev eth0  src 72.48.103.182  metric 100
default via 216.82.212.254 dev eth0  metric 100

答案1

“神奇”的部分不是 SNAT 规则或 NAT 表,而是这个路由表条目:

default via 216.82.212.254 dev eth0  src 72.48.103.182  metric 100

它告诉您的内核使用 72.48.103.182 进行本地启动的出站连接(只要套接字在创建时未明确绑定到特定地址),前提是目标可以通过此路由到达 - 对于所有“外部”目标都是如此,因为这是您的默认路由。您应该将其重新定义为

default via 216.82.212.254 dev eth0  src 216.82.212.230  metric 100

以获得预期的行为。

答案2

好的,所以我认为— 您的服务器只是将此 IP 用作传出 IP。实际上您根本不需要 2 个默认路由,这甚至会产生误导。您只需使用一个:

ip ro add default via 216.82.212.254

您使用的别名不需要有特殊的默认路由条目,因为很可能您的 ISP 使用您接口的主链路(地址)将其路由回来。

相关内容