Назад | Перейти на главную страницу

Не дать postfix пожирать ресурсы во время атак по словарю спамеров?

Когда спамер использует свой ботнет, состоящий из тысяч компьютеров-зомби, для рассылки спама по случайным несуществующим адресам @ example.com с очень высокой скоростью, postfix исчерпывает ограничения ресурсов нашего VPS-провайдера, пытаясь справиться с этим. В частности, он исчерпывает количество сокетов без TCP, которое VPS ограничивает 900. Я использую postfix 2.3.3-2.1.el5_2 на CentOS 5 на виртуальном сервере Virtuozzo linux.

/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 следует модели, управляемой процессами, высокое использование памяти под нагрузкой является одним из ее побочных эффектов. Вы можете попробовать это

Из /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 для адресов, которые отправляют большое количество недоставленной почты.

Возможно, вы захотите добавить что-то похожее на:

smtpd_recipient_restrictions =
        permit_auth_destination,
        permit_mynetworks,
        reject_unauth_destination,
        reject_unlisted_recipient

...на ваш main.cf файл, который должен заставить postfix сбрасывать некоторые из соединений, как только он обнаруживает, что нет пользователя, которому нужно доставить. Магия в reject_unlisted_recipient, что приведет к отказу от пользователей, которые недопустимы в вашей системе при использовании с local_recipient_maps. Поступая таким образом, он должен снять некоторую нагрузку, уменьшив объем выполняемой обработки, поскольку каждое разорванное соединение освобождает драгоценные ресурсы для работы со следующим соединением. Да, спамер сможет определить, какие адреса недействительны, но лучше, чтобы спамер тратил свое время на отправку (и был отклонен, тратя впустую свою полосу пропускания), чем ваш (отражая атаку).