|
ru.unix.bsd- RU.UNIX.BSD ------------------------------------------------------------------ From : Eugene Grosbein 2:5006/1 17 Jan 2008 19:05:07 To : All Subject : tcp & spam -------------------------------------------------------------------------------- Привет! Хост работает только как почтовый сервер, кроме SMTP/POP3 другого трафика TCP почти нет. Входящий поток спама - в количестве одновременных конненктов - значительно превышает способности сервера его обработать. В результате уж очень часто упираемся в максимальное количество одновременных SMTP-коннектов и TCP-режектим всю остальную почту в это время. Есть несколько признаков, по которым можно фильтровать посылателей на уровне файрвола, не допуская их до MTA (завсегдатаи блеклиста, попадатели в smaptrap, нарушители greet-pause etc.) Если конкретный IP попадает в файрвол после того, как коннект его был MTA отброшен, получается так: ipfw add deny tcp from 'table(1)' to me setup # блокировать новые коннекты ipfw add reset tcp from 'table(1)' to me # рвать текущие ipfw add reset tcp from me to 'table(1)' Hовые коннекты благополучно отсекаются. Hо получается, что текущие коннекты от этого IP (их может быть несколько) на довольно длительное время "подвисают" - sendmail ничего не посылает клиенту, когда ждет данных, а в ответ на входящие пакеты reset посылается, видимо, только клиенту. Глобально таймауты у MTA крутить не хочется, надо чтобы почта была устойчива к медленным нормальным клиентам. MTA включает SO_KEEPALIVE на сокетах. Hо дефолтные таймауты у FreeBSD имеют совершенно безобразные значения (для этой задачи) для установленных соединений: net.inet.tcp.keepidle: 7200000 net.inet.tcp.keepintvl: 75000 Если я правильно понимаю, это значит: при отсутствии входящих сегментов в течение первого таймаута (7200000/hz=72000 секунд=20 часов) начинать посылать keepalives один раз в 75000/hz=750 секунд=12.5 минут и рвать коннект после 8 (задаётся в сорцах) непрошедших подряд кипаливах, то есть через 100 минут. В результате эти keepalives что есть, что нет и заблокированные коннекты быстро пожирают лимит. Поставил так: # 60 секунд без входящих сегментов - начинается посылка keepalives net.inet.tcp.keepidle=6000 # посылается 8 штук (задано в исходниках) через 10 секунд net.inet.tcp.keepintvl=1000 Загрузка очень быстро упала до вполне приемлемых величин. Внимание, вопрос: на какие проблемы я нарываюсь? :-) Eugene -- Как лист увядший падает на душу... --- slrn/0.9.8.1 (FreeBSD) * Origin: Svyaz Service JSC (2:5006/1@fidonet) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/2609325966dbc.html, оценка из 5, голосов 10
|