我运行一个小型网络,其中 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 使用您接口的主链路(地址)将其路由回来。