当垃圾邮件发送者使用由数千台僵尸 PC 组成的僵尸网络以极高的速度向随机不存在的地址 @example.com 发送垃圾邮件时,postfix 会耗尽我们的 VPS 提供商的资源限制来处理它。具体来说,它会耗尽非 TCP 套接字的数量,而 VPS 将其限制为 900 个。我在 Virtuozzo linux VPS 上的 CentOS 5 上运行 postfix 2.3.3-2.1.el5_2。
/var/log/maillog says:
Feb 23 06:26:22 postfix/smtpd[3938]: warning: connect #1 to subsystem private/proxymap: Cannot allocate memory
Feb 23 06:26:22 postfix/smtpd[3936]: fatal: socket: Cannot allocate memory
Feb 23 06:26:48 postfix/qmgr[17702]: fatal: socket: Cannot allocate memory
由于字典攻击涉及数千个 IP,因此防火墙的设置会比较困难。
VPS 提供商建议调整以下参数,但没有给出设置方法的建议:
max_idle = 100s (default)
max_use = 100 (default)
我发现另一个人也遇到了与后缀和垃圾邮件发送者字典攻击相同的问题:
http://forums.vpslink.com/linux/394-you-hitting-socket-resource-limits-2.html#post5241
他变了:
default_process_limit from 100 (default) to 10
...这解决了问题,但带来了性能损失。
即使浏览过 postfix.org/TUNING%5FREADME.html 后,我仍然不确定这里应该安全地调整哪个参数,有哪位 Postfix 专家可以帮忙吗?
答案1
遗憾的是,由于 Postfix 遵循进程驱动模型,因此负载下内存使用率高是其副作用之一。你可以试试这个
来自 /etc/postfix/master.cf
# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (yes) (never) (100)
# ==========================================================================
smtp inet n - n - 5 smtpd
在maxproc
列中,您可以-
用较小的数字替换来限制并发进程的数量smtpd
,这应该会对传入邮件的数量提供一些限制。
另一种选择是查看fail2ban
哪些可以配置为解析/var/log/maillog
和引发发送大量无法送达邮件的地址的 iptables 块。
答案2
您可能需要考虑添加类似以下内容:
smtpd_recipient_restrictions =
permit_auth_destination,
permit_mynetworks,
reject_unauth_destination,
reject_unlisted_recipient
...到您的main.cf
文件中,这将导致 postfix 在发现没有用户需要发送时立即转储一些连接。魔法在于reject_unlisted_recipient
,这将导致拒绝那些在你的系统上无效的用户local_recipient_maps
。这样做可以减少处理量,从而减轻一些压力,因为每次断开连接都会释放宝贵的资源来处理下一个连接。是的,垃圾邮件发送者将能够确定哪些地址无效,但最好是垃圾邮件发送者浪费时间发送(并被拒绝,浪费带宽),而不是浪费您的时间(抵御攻击)。