Защита от спама и вирусов#
Почтовый сервер без защиты - это открытые ворота для спама и вирусов. Сейчас настроим многоуровневую оборону, которая отсечет 90%+ мусора еще до попадания в ящики.
Четыре уровня защиты:
- Postgrey - отбрасывает спам-ботов на входе (greylisting)
- ClamAV - проверяет вложения на вирусы
- SpamAssassin - анализирует содержимое писем
- Fail2ban - блокирует IP при брутфорсе паролей
Перед началом#
У тебя должно быть:
- Рабочий Postfix + Dovecot из предыдущей части

- Минимум 2GB RAM (ClamAV прожорлив)
- Дисковое пространство для базы вирусов (~500MB)
Проверь что Postfix работает:
sudo systemctl status postfixУстановка компонентов#
Ставим все сразу#
sudo apt install -y \
amavisd-new \
clamav \
clamav-daemon \
clamav-freshclam \
spamassassin \
postgreyЧто установили:
amavisd-new- прослойка между Postfix и антивирусом/антиспамомclamav- антивирусный движокclamav-daemon- демон ClamAV для фоновой работыclamav-freshclam- автообновление вирусных базspamassassin- антиспам фильтрpostgrey- greylisting демон
Создание необходимых файлов и директорий#
Создаем mailname (используется Amavis)
echo "mail.example.com" | sudo tee /etc/mailnameСоздаем директорию для PID файла Amavis
sudo mkdir -p /var/run/amavis
sudo chown amavis:amavis /var/run/amavis
sudo chmod 755 /var/run/amavisСоздаем tmpfiles конфиг для автоматического создания директории
sudo nano /etc/tmpfiles.d/amavis.confДобавь:
d /run/amavis 0755 amavis amavis -Примени конфиг:
sudo systemd-tmpfiles --createЗамени mail.example.com на свое полное имя хоста.
Обновляем базу вирусов#
ClamAV нужна актуальная база вирусов:
sudo systemctl stop clamav-freshclam
sudo freshclam
sudo systemctl start clamav-freshclamЭто займет 2-5 минут. Freshclam скачает ~200-300MB данных.
Проверь статус:
sudo systemctl status clamav-freshclamДолжен быть active (running).
Настройка ClamAV#
Проверяем что демон запущен#
sudo systemctl status clamav-daemonЕсли не запущен(что скорее всего):
sudo systemctl enable clamav-daemon
sudo systemctl start clamav-daemonНастройка сокета#
ClamAV слушает через UNIX-сокет. Проверь:
ls -la /var/run/clamav/clamd.ctlДолжен быть сокет с правами для группы clamav.
Добавь пользователя amavis в группу clamav:
sudo adduser clamav amavis
sudo adduser amavis clamavПерезапусти ClamAV:
sudo systemctl restart clamav-daemonНастройка Amavis#
Amavis - это диспетчер, который принимает письма от Postfix, прогоняет через ClamAV и SpamAssassin, и возвращает обратно.
Основной конфиг#
Открой:
sudo nano /etc/amavis/conf.d/15-content_filter_modeРаскомментируй:
@bypass_virus_checks_maps = (
\%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);
@bypass_spam_checks_maps = (
\%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);Что сделали: Включили проверку на вирусы и спам.
Настройка интеграции#
Открой:
sudo nano /etc/amavis/conf.d/50-userДобавь в конец:
# Домен
$mydomain = 'example.com';
$myhostname = 'mail.example.com';
# Интерфейс
$inet_socket_bind = '127.0.0.1';
# Порты
$inet_socket_port = 10024;
# Политика для локальных доменов
$policy_bank{'MYNETS'} = {
originating => 1,
os_fingerprint_method => undef,
};
# Антиспам
$sa_tag_level_deflt = -999; # Всегда добавлять заголовки
$sa_tag2_level_deflt = 5.0; # Помечать как спам при 5+ баллах
$sa_kill_level_deflt = 10.0; # Отклонять при 10+ баллах
# Антивирус
$virus_admin = "postmaster\@$mydomain";
# Уведомления
$virus_quarantine_to = "virus-quarantine\@$mydomain";
$spam_quarantine_to = "spam-quarantine\@$mydomain";
# Обязательно в конце (по умолчанию уже присутствует)
1;Замени:
example.comна свой доменmail.example.comна свое имя хоста
Что настроили:
Основные параметры:
- Слушаем на localhost:10024
- Домен и hostname для заголовков
Антиспам:
-999- всегда добавлять X-Spam заголовки5.0- при 5+ баллах помечать как спам (X-Spam-Flag: YES)10.0- при 10+ баллах отклонять письмо
Антивирус:
- Всегда проверять через ClamAV
- Карантин для вирусов и спама
Права на директории#
sudo chown -R amavis:amavis /var/lib/amavis
sudo chmod 750 /var/lib/amavisЗапуск Amavis#
sudo systemctl enable amavis
sudo systemctl start amavis
sudo systemctl status amavisДолжен быть active (running).
Проверь порт:
sudo ss -tulnp | grep 10024Должно быть:
tcp LISTEN 0 4096 127.0.0.1:10024 0.0.0.0:* users:(("/usr/sbin/amavi",pid=43480,fd=5),("/usr/sbin/amavi",pid=43479,fd=5),("/usr/sbin/amavi",pid=43456,fd=5))Настройка SpamAssassin#
SpamAssassin работает через Amavis, но нужно настроить его правила.
Основной конфиг#
Открой:
sudo nano /etc/spamassassin/local.cfДобавь в самый конец:
# Требуемый балл для спама
required_score 5.0
# Использовать Bayesian фильтр
use_bayes 1
bayes_auto_learn 1
# DNSBL проверки
use_razor2 0
use_pyzor 0
# Сетевые проверки (SPF, DKIM)
use_dcc 0
# Автообучение
bayes_auto_learn_threshold_nonspam -0.1
bayes_auto_learn_threshold_spam 6.0
# Путь к базе Bayes
bayes_path /var/lib/amavis/.spamassassin/bayes
# Язык
ok_languages en ru
ok_locales en ru
# Размер письма для проверки (500KB)
report_safe 0Что настроили:
required_score 5.0:
- Порог для пометки спама
Bayesian фильтр:
- Обучаемая модель на основе примеров
- Автообучение включено
DNSBL:
- Razor/Pyzor/DCC отключены (используем встроенные DNSBL)
Автообучение:
- Письма с баллами < -0.1 учатся как не-спам
- Письма с баллами > 6.0 учатся как спам
Создаем директорию для Bayes#
sudo mkdir -p /var/lib/amavis/.spamassassin
sudo chown -R amavis:amavis /var/lib/amavis/.spamassassin
sudo chmod 700 /var/lib/amavis/.spamassassinЗапуск SpamAssassin#
sudo systemctl enable spamassassin
sudo systemctl start spamassassin
sudo systemctl status spamassassinДолжен быть active (running).
Перезапуск Amavis#
sudo systemctl restart amavisНастройка Postgrey#
Postgrey - это greylisting(“временная задержка”). Принцип: первое письмо от нового отправителя откладывается на 5 минут. Легальные серверы повторят попытку, спам-боты - нет.
Конфигурация#
Открой:
sudo nano /etc/default/postgreyНайди и измени:
POSTGREY_OPTS="--inet=127.0.0.1:10023 --delay=300"Что настроили:
--inet=127.0.0.1:10023- слушать на localhost:10023--delay=300- задержка 5 минут (300 секунд)
Белые списки#
Postgrey имеет встроенные белые списки для крупных отправителей (Google, Microsoft, и т.д.).
Посмотреть:
cat /etc/postgrey/whitelist_clientsДобавить свои (опционально):
sudo nano /etc/postgrey/whitelist_clients.localФормат:
/^.*\.trusted-domain\.com$/
192.168.1.0/24
specific-server.example.comНа примере Yandex:
/^.*\.yandex\.ru$/
/^.*\.ya\.ru$/Запуск#
sudo systemctl enable postgrey
sudo systemctl start postgrey
sudo systemctl status postgreyДолжен быть active (running).
Проверь порт:
sudo ss -tulnp | grep 10023Должно быть:
tcp LISTEN 0 5 127.0.0.1:10023 ...Интеграция с Postfix#
Сейчас настроим Postfix для прогона всех писем через Amavis и Postgrey.
Настройка content_filter#
Открой:
sudo nano /etc/postfix/main.cfВ конце секции smtpd_recipient_restrictions, созданную на предыдущих этапах, добавь строку:
# Postgrey для greylisting
check_policy_service inet:127.0.0.1:10023И добавь в конец файла:
# Content filter через Amavis
content_filter = smtp-amavis:[127.0.0.1]:10024Что добавили:
content_filter:
- Все письма идут через Amavis на порт 10024
- Amavis проверяет через ClamAV и SpamAssassin
- Возвращает обратно в Postfix на порт 10025
smtpd_recipient_restrictions:
- Добавили
check_policy_service inet:127.0.0.1:10023- проверка через Postgrey
Настройка master.cf#
Открой:
sudo nano /etc/postfix/master.cfДобавь в конец:
# Отправка в Amavis
smtp-amavis unix - - n - 2 smtp
-o smtp_data_done_timeout=1200
-o smtp_send_xforward_command=yes
-o disable_dns_lookups=yes
-o max_use=20
# Прием из Amavis обратно
127.0.0.1:10025 inet n - n - - smtpd
-o content_filter=
-o smtpd_delay_reject=no
-o smtpd_client_restrictions=permit_mynetworks,reject
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o smtpd_data_restrictions=reject_unauth_pipelining
-o smtpd_end_of_data_restrictions=
-o smtpd_restriction_classes=
-o mynetworks=127.0.0.0/8
-o smtpd_error_sleep_time=0
-o smtpd_soft_error_limit=1001
-o smtpd_hard_error_limit=1000
-o smtpd_client_connection_count_limit=0
-o smtpd_client_connection_rate_limit=0
-o receive_override_options=no_header_body_checks,no_unknown_recipient_checks,no_milters
-o local_header_rewrite_clients=Что настроили:
smtp-amavis:
- Транспорт для отправки в Amavis
- Таймаут 1200 секунд (для больших писем)
- Максимум 20 использований соединения
127.0.0.1:10025:
- Прием обратно из Amavis
- Отключаем повторные проверки (content_filter пустой)
- Пропускаем только с localhost
Перезапуск Postfix#
Проверь конфиг:
sudo postfix checkЕсли ошибок нет - перезапускай:
sudo postfix reloadПроверь статус:
sudo systemctl status postfixТестирование защиты#
Тест 1: Проверка антивируса#
Отправь тестовый вирус EICAR (безопасная тестовая сигнатура):
telnet localhost 25EHLO test.local
MAIL FROM:<[email protected]>
RCPT TO:<[email protected]>
DATA
Subject: Virus test
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
.
QUITПроверь логи:
sudo grep -i "eicar\|infected\|virus" /var/log/mail.log | tail -20Должно быть:
... mail amavis[44437]: (44437-01) Blocked INFECTED (Eicar-Signature) {DiscardedOutbound,Quarantined}, MYNETS LOCAL [127.0.0.1]:6674 <[email protected]> -> <[email protected]>, quarantine: [email protected], Queue-ID: 6B6C425808, Message-ID: <[email protected]>, mail_id: fqAsJO87JdbS, Hits: -, size: 375, 454 ms
... mail postfix/smtp[47529]: 6B6C425808: to=<[email protected]>, relay=127.0.0.1[127.0.0.1]:10024, delay=24, delays=24/0.02/0.09/0.39, dsn=2.7.0, status=sent (250 2.7.0 Ok, discarded, id=44437-01 - INFECTED: Eicar-Signature)
... mail postfix/lmtp[47533]: B34582580B: to=<[email protected]>, relay=mail.example.com[private/dovecot-lmtp], delay=0.12, delays=0.01/0.02/0.04/0.06, dsn=5.1.1, status=bounced (host mail.example.com[private/dovecot-lmtp] said: 550 5.1.1 <[email protected]> User doesn't exist: [email protected] (in reply to RCPT TO command))Письмо отклонено - антивирус работает.
Тест 2: Проверка антиспама#
Отправь письмо с внешнего почтового ящика (Gmail, Yandex) на свой сервер с текстом:
Subject: BUY CHEAP VIAGRA NOW!!!
Body:
CLICK HERE FOR AMAZING DEALS!!!
FREE MONEY! ACT NOW!
BUY VIAGRA CIALIS CHEAP!
100% GUARANTEED! NO PRESCRIPTION!
MAKE MONEY FAST! LIMITED TIME!Важно: Тест через telnet localhost 25 не покажет X-Spam заголовки, т.к. письмо будет считаться исходящим от своих (MYNETS).
Проверь логи:
sudo grep "amavis" /var/log/mail.log | tail -5Должна приблизительно быть строка:
... mail amavis[51765]: (51765-01) Passed SPAMMY {RelayedOutbound}, MYNETS LOCAL [127.0.0.1]:45220 <[email protected]> -> <[email protected]>, Queue-ID: 526902584D, Message-ID: <[email protected]>, mail_id: yUPoX6uzzm6f, Hits: 6.549, size: 375, queued_as: 9DA0D2584F, 1259 msPassed CLEAN— не спам (баллов < 5.0)Passed SPAMMY— спам (баллов >= 5.0)Hits: X.XX— количество баллов SpamAssassin
Если баллов >= 5.0, письмо помечено как спам и в заголовках будет:
X-Spam-Flag: YES
X-Spam-Score: 15.2
X-Spam-Status: Yes, score=15.2Проверь письмо:
sudo ls -t /var/mail/example.com/admin/new/ | head -1 | xargs -I {} sudo cat /var/mail/example.com/admin/new/{} | grep X-SpamЕсли баллов мало (< 5.0):
Это нормально — письмо от доверенного провайдера (Yandex, Gmail) с валидной DKIM подписью получает мало баллов. SpamAssassin работает правильно, отличая легитимную почту от спама.
Уточнение: В качестве спам рассылки я использовал почту Yandex.
Логи испытания:
... mail amavis[51765]: (51765-01) Passed SPAMMY {RelayedOutbound}, MYNETS LOCAL [127.0.0.1]:45220 <[email protected]> -> <[email protected]>, Queue-ID: 526902584D, Message-ID: <[email protected]>, mail_id: yUPoX6uzzm6f, Hits: 6.549, size: 375, queued_as: 9DA0D2584F, 1259 ms
... mail amavis[51766]: (51766-01) Passed CLEAN {RelayedOpenRelay}, [178.154.239.223]:36200 [2a02:6b8:c42:e720:0:640:3001:0] <[email protected]> -> <[email protected]>, Queue-ID: AA84721409, Message-ID: <[email protected]>, mail_id: V5iYivtYPpbe, Hits: 1.567, size: 1912, queued_as: 948F02584F, 853 msИз логов видно, что в начале письмо получает Passed SPAMMY, а затем Passed CLEAN, Hits: 1.567(колличество баллов, что < 5.0). Причины:
- Отправитель - Yandex (доверенный провайдер)
- Валидная DKIM подпись:
DKIM-Signature: v=1; a=rsa-sha256; d=ya.ru; s=mail;- IP не в блэклистах
Тест 3: Проверка Postgrey#
Отправь письмо с другого IP (запрос с внешнего сервера):
telnet mail.example.com 25 где, mail.example.com - полное доменное имя или IP твоего почтового сервера.
EHLO mail.google.com
MAIL FROM:<[email protected]>
RCPT TO:<[email protected]>
DATA
Subject: Greylisting test
.
QUITПри первой попытке должен получить:
450 4.2.0 <[email protected]>: Recipient address rejected: Greylisted, see http://postgrey.schweikert.ch/help/example.com.htmlПодожди 5 минут и повтори - письмо пройдет.
Проверь статус Postgrey:
sudo grep "postgrey" /var/log/mail.log | tail -10Должна быть запись о Greylisted.
Обучение SpamAssassin#
Чем больше примеров спама и не-спама покажешь SpamAssassin, тем точнее он работает.
Ручное обучение#
Пометить письмо как спам:
sudo sa-learn --spam /var/mail/example.com/admin/.Spam/cur/*Пометить как не-спам:
sudo sa-learn --ham /var/mail/example.com/admin/cur/*Проверить статистику обучения#
sudo sa-learn --dump magicВывод:
0.000 0 3 0 non-token data: bayes db version
0.000 0 150 0 non-token data: nspam
0.000 0 450 0 non-token data: nhamnspam - количество спам-писем в базе
nham - количество не-спам писем в базе
После обучения перезапусти Amavis:
sudo systemctl restart amavisАвтообучение#
SpamAssassin автоматически учится на письмах с четкими признаками (настроили в local.cf):
- Баллы < -0.1 → автоматически не-спам
- Баллы > 6.0 → автоматически спам
Через неделю-две база накопится, точность вырастет.
Fail2ban для почтовых сервисов#
Защита от брутфорса паролей SMTP/IMAP.
Проверка установки#
Fail2ban должен быть установлен из статьи по базовой настройке сервера:

Безопасный production-сервер на Debian 12: пошаговая настройка
Проверь:
sudo systemctl status fail2banНастройка jail для почты#
Открой:
sudo nano /etc/fail2ban/jail.localДобавь в конец:
[postfix-sasl]
enabled = true
port = smtp,submission,smtps
filter = postfix[mode=auth]
logpath = /var/log/mail.log
maxretry = 3
bantime = 600
[dovecot]
enabled = true
port = imap,imaps,pop3,pop3s
filter = dovecot
logpath = /var/log/mail.log
maxretry = 3
bantime = 600Что настроили:
postfix-sasl:
- Защита SMTP AUTH (порты 25, 587, 465)
- Максимум 3 неудачных попытки
- Бан на 10 минут
dovecot:
- Защита IMAP/POP3 (порты 143, 993, 110, 995)
- Максимум 3 неудачных попытки
- Бан на 10 минут
Перезапуск Fail2ban#
sudo systemctl reload fail2banПроверь тюрьмы:
sudo fail2ban-client statusДолжно быть:
Status
|- Number of jail: 3
`- Jail list: dovecot, postfix-sasl, sshdТест Fail2ban#
Попробуй подключиться с неправильным паролем 3 раза:
telnet localhost 587EHLO test.local
AUTH PLAIN dGVzdEBleGFtcGxlLmNvbQB3cm9uZ3Bhc3N3b3Jk
AUTH PLAIN dGVzdEBleGFtcGxlLmNvbQB3cm9uZ3Bhc3N3b3Jk
AUTH PLAIN dGVzdEBleGFtcGxlLmNvbQB3cm9uZ3Bhc3N3b3JkПосле 3-й попытки твой IP должен быть забанен.
Проверь:
sudo fail2ban-client status postfix-saslДолжен появиться IP в Banned IP list.
Мониторинг защиты#
Статистика Amavis#
sudo amavisd-nannyКоманда выводит состояние worker-процессов в реальном времени. Точки (.) — процесс idle, звездочки (*) — обрабатывает письмо.
Статистика ClamAV#
sudo clamdscan --version
sudo freshclam --versionПроверь обновление баз:
sudo cat /var/log/clamav/freshclam.log | tail -20Статистика SpamAssassin#
sudo sa-learn --dump magicВывод:
0.000 0 3 0 non-token data: bayes db version
0.000 0 234 0 non-token data: nspam
0.000 0 789 0 non-token data: nham
0.000 0 45123 0 non-token data: ntokens
0.000 0 1773745892 0 non-token data: oldest atime
0.000 0 1773831245 0 non-token data: newest atime
0.000 0 0 0 non-token data: last journal sync atime
0.000 0 0 0 non-token data: last expiry atime
0.000 0 0 0 non-token data: last expire atime delta
0.000 0 0 0 non-token data: last expire reduction countГде:
nspam: 234 — количество спам-писем в обучающей базе nham: 789 — количество не-спам писем в обучающей базе ntokens: 45123 — количество токенов (слов) в базе
Логи#
Все логи почты в одном месте:
sudo tail -f /var/log/mail.logФильтруй по ключевым словам:
# Вирусы
sudo grep "Blocked INFECTED" /var/log/mail.log
# Спам
sudo grep "Passed SPAM" /var/log/mail.log
# Greylisting
sudo grep "Greylisted" /var/log/mail.log
# Fail2ban баны
sudo grep "Ban" /var/log/fail2ban.logТонкая настройка#
Увеличить порог спама#
Если много ложных срабатываний, увеличь required_score:
sudo nano /etc/spamassassin/local.cfИзмени:
required_score 7.0Перезапусти:
sudo systemctl restart amavisДобавить домен в белый список Postgrey#
sudo nano /etc/postgrey/whitelist_clients.localДобавь:
/^.*\.important-partner\.com$/Перезапусти:
sudo systemctl restart postgreyОтключить greylisting для авторизованных#
Если не хочешь задержек для своих пользователей, в Postfix измени:
sudo nano /etc/postfix/main.cfВ smtpd_recipient_restrictions перед check_policy_service добавь:
permit_sasl_authenticated,Чтобы получилось:
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
check_policy_service inet:127.0.0.1:10023Перезагрузи:
sudo postfix reloadТипичные проблемы#
ClamAV жрет всю память#
ClamAV требует ~500-700MB RAM. Если сервер слабый:
Открой:
sudo nano /etc/clamav/clamd.confУменьши:
MaxThreads 10
MaxConnectionQueueLength 15Перезапусти:
sudo systemctl restart clamav-daemonПисьма застревают в очереди#
Проверь очередь:
sudo postqueue -pПричина может быть в медленной проверке. Увеличь таймаут:
sudo nano /etc/postfix/master.cfНайди smtp-amavis и увеличь:
smtp_data_done_timeout=1800Перезагрузи:
sudo postfix reloadSpamAssassin не учится#
Проверь права на базу Bayes:
ls -la /var/lib/amavis/.spamassassin/Должен быть владелец amavis:amavis.
Исправь:
sudo chown -R amavis:amavis /var/lib/amavis/.spamassassin
sudo chmod 700 /var/lib/amavis/.spamassassinPostgrey блокирует легальную почту#
Добавь отправителя в белый список:
sudo nano /etc/postgrey/whitelist_clients.localsender-domain.comПерезапусти:
sudo systemctl restart postgreyЧто получилось#
Сейчас у тебя:
Работает:
- Антивирусная проверка всех входящих писем (ClamAV)
- Антиспам с обучением (SpamAssassin + Bayes)
- Greylisting для новых отправителей (Postgrey)
- Защита от брутфорса SMTP/IMAP (Fail2ban)
Потребление ресурсов:
- ClamAV: ~500-700 MB RAM
- SpamAssassin: ~200-300 MB на процесс
- Amavis: ~50-100 MB
- Postgrey: ~10-20 MB
- Итого: +800MB-1.2GB RAM
Проблемы:
- Пароли все еще передаются открытым текстом (нет TLS)
- Нет DKIM подписей (письма могут улетать в спам)
- Нет веб-интерфейса
Это защищенный сервер, но еще не production-ready.
Следующий шаг#
В следующей части настроим шифрование и репутацию:
- TLS через Let’s Encrypt (шифрование соединений)
- DKIM подписи (доверие к твоим письмам)
- SPF и DMARC записи (защита от подделки домена)
После этого письма перестанут улетать в спам у Gmail/Outlook.






