我的 VPS 上的防火墙似乎阻止了我的网站发送电子邮件。上个月底之前它一直运行良好。我的托管服务提供商 (Webfusion) 几乎毫无用处。
如果我打开 INPUT 端口 32768-65535,我可以发送电子邮件,但如果这些端口关闭,则无法发送电子邮件。为什么会这样?
我的防火墙中有以下规则(注意:我已经排除了仅限于我的 IP 的规则,例如 ssh 等):
# sudo iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
VZ_INPUT all -- anywhere anywhere
Chain FORWARD (policy DROP)
target prot opt source destination
VZ_FORWARD all -- anywhere anywhere
Chain OUTPUT (policy DROP)
target prot opt source destination
VZ_OUTPUT all -- anywhere anywhere
Chain VZ_FORWARD (1 references)
target prot opt source destination
Chain VZ_INPUT (1 references)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:www
ACCEPT tcp -- anywhere anywhere tcp dpt:https
ACCEPT tcp -- anywhere anywhere tcp dpt:smtp
ACCEPT tcp -- anywhere anywhere tcp dpt:ssmtp
ACCEPT tcp -- anywhere anywhere tcp dpt:pop3
ACCEPT tcp -- anywhere anywhere tcp dpt:domain
ACCEPT udp -- anywhere anywhere udp dpt:domain
ACCEPT tcp -- anywhere anywhere tcp dpts:32768:65535
ACCEPT udp -- anywhere anywhere udp dpts:32768:65535
ACCEPT tcp -- localhost.localdomain localhost.localdomain
ACCEPT udp -- localhost.localdomain localhost.localdomain
Chain VZ_OUTPUT (1 references)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere
ACCEPT udp -- anywhere anywhere
VPS 运行的是 Plesk 10.4.4
编辑:邮件服务器是qmail
编辑:这些规则是由“Virtuozzo Power Panel”的防火墙模块创建的
(如果您需要进一步的技术信息来帮助我,请询问)
答案1
我觉得你正在漏掉输入答案。尝试添加
-m state --state RELATED,ESTABLISHED -j ACCEPT
到VZ_INPUT
答案2
我认为你需要阅读临时端口这样您就可以进一步了解您的机器如何建立出站连接。
当您的服务器建立出站 SMTP 连接(目标端口 25,由您非常宽松的 OUTPUT 规则允许)时,响应将返回到您的服务器从其获取连接的临时端口。默认情况下,Linux 临时端口范围是 32768 到 61000。当您禁止端口 32768 到 65535 上的 INPUT 流量时,您将阻止来自远程 SMTP 服务器的响应。
这些防火墙规则对我来说似乎相当不合常规。至少根据我的经验,防火墙规则不利用 ip_conntrack 和状态过滤的情况相当罕见。搜索名称“VZ_FORWARD”、“VZ_INPUT”等后,我发现这些是一些虚拟服务器管理程序正在创建的非常典型的规则集。我个人会使用状态过滤,但对于 VPS 提供商来说,这样做可能存在性能方面的顾虑。
编辑:
如果你有兴趣了解更多关于 netfilter 的信息,官方文档虽然有些文档有点过时,但这是一个不错的起点。您没有提到您使用的是哪个发行版,但您可以在那里找到一些特定于发行版的文档。您在另一条评论中提到,您希望将修改限制在您使用的 GUI 管理器上。这可能会限制您对配置进行重大更改的能力。即使您不打算手动修改配置,通过阅读一些有关 netfilter 的内容,您也可能获得有用的知识。
关于您的 OUTPUT 链 - 有安全意识的管理员会希望锁定 OUTPUT 流量,这样,如果恶意攻击者以非超级用户身份控制了服务器计算机,他们从计算机流向 Internet 的流量类型就会受到限制。例如,某些蠕虫希望能够向 Internet 发出 HTTP(或 FTP 或 TFTP)请求以下载其“第二阶段”组件。当您删除服务器向 Internet 发出任意请求的能力时,您可以限制恶意攻击者可以对您的计算机执行的操作。(显然,如果他们获得超级用户级别的访问权限,那么“游戏结束”——他们只需修改防火墙规则即可。)
答案3
查看 VZ_INPUT:
接受 tcp -- 任何地方 任何地方 tcp dpt:smtp
这允许传入连接到您的 SMTP 服务器。
您的输出规则允许任何事情。
但是当您发送电子邮件时,您的机器充当客户端而不是服务器。
因此,当您尝试发送电子邮件时,SYN 数据包会从端口 32768 发出到端口 25,然后 ack 会从端口 25 返回到端口 32768 - 这仅与最后添加的愚蠢规则相匹配。
因此,向 VZ_INPUT 添加反向规则将允许流量:
ACCEPT tcp -- anywhere anywhere tcp spt:smtp
或者,正如 Mose 所建议的,允许 VZ_INPUT 上的相关流量。后者实际上是更好的解决方案,因为上面的无状态版本不会阻止攻击者将其客户端端口强制为 25 来访问您的服务器端口。
您确实应该在您的服务器上实施适当的出口过滤 - 因此您应该(正如 Dennis 所说)允许在 vz_output 上建立相关协议,以及有效的客户端协议,例如 DNS、SMTP 和 NTP 以及默认的 DENY 策略。
顺便问一下:当系统不允许 ssh/rsh/telnet 时,如何在系统上获取 shell?