Пошта на неіснуючі адреси
Коли хтось надсилає листа на неіснуючого користувача твого домену, Postfix перевіряє, чи існує такий local_recipient
. Якщо ні — він повертає відправнику 550 5.1.1 User unknown in local recipient table
. Це нормально, бо так усі поштові сервери мають працювати: повідомляти, що адресат не існує.
Варіанти поведінки
Повертати помилку (рекомендовано)
Відправник одразу отримує bounce (повідомлення про помилку).
Спамери бачать, що адреса «мертва», і можуть перестати на неї слати.
Це стандартний і коректний варіант.
Мовчки відкидати (reject без повідомлення / drop)
Тоді твій сервер просто приймає з’єднання і «викидає» лист, не відповідаючи відправнику помилкою.
Плюс: спамери не знають, що адреса не існує (корисно, якщо тебе брутфорсять dictionary attack на адреси).
Мінус: легітимний відправник (наприклад, твій клієнт або сервіс із помилкою в email) ніколи не дізнається, що він пише на неправильну адресу. Листи просто зникають у чорну діру.
Приймати все (catch-all)
Всі листи на будь-які адреси
@твій_домен
приймаються й кладуться в одну поштову скриньку (часто —postmaster
абоcatchall
).Мінус: отримаєш гори спаму, бо спамери дуже люблять слати на випадкові імена.
Це рідко радять робити.
Чи варто робити?
Якщо хочеш коректну пошту → залишай стандарт:
550 User unknown
.Якщо боїшся брутфорсу на адреси → можна викидати мовчки, але це незручно для легітимних людей.
Catch-all краще не робити, якщо не готовий чистити спам.
Чому я за варіант 2?
Абсолютна більшість спам листів йдуть на неіснуючі адреси з неіснуючих адрес. І нащо воно треба - ще слати відповіді в нікуди? А якщо вони поставлять у поле відправника адресу жертви і пошлють мені на неіснуючу адресу - жертва буде отримувати від мене "відлупи" з їхнім спамом? Ті, з ким я веду переписку, відповідають на мої листи через кнопку "відповісти" або система висвітить їм вже використану раніше адресу. Якщо хтось перевіряє існуючі адреси і має мізки - подумає: а чому цей сервер приймає кожне придумане мною ім'я? Мабуть мої листи падають в прірву і я не ніколи не знатиму точно, чи існує те чи інше ім'я на пошті...
Ти мислиш абсолютно правильно 🙂 Власне, те що ти описав — це класичний аргумент проти backscatter (зворотного спаму).
Давай розберемо по пунктах:
Backscatter — це коли твій сервер отримує листа на неіснуючу адресу і відсилає повідомлення про помилку назад у «From:». Якщо там стоїть підроблена адреса (що буває у 99% випадків) → чужа невинна жертва починає отримувати сміття від твого сервера. Це дуже погано для репутації: твоє ім’я може потрапити в чорні списки як джерело спаму.
Сучасна практика — не відсилати bounce взагалі для листів, які не можуть бути доставлені через неіснуючого отримувача. Варіанти:
відхилити одразу на етапі SMTP (
550 5.1.1 User unknown
) — тоді відповідальність за bounce лежить на сервері відправника (якщо він нормальний).або прийняти і тихо викинути (варіант 2), якщо хочеш взагалі уникнути будь-яких «відлупів».
Щодо твоєї логіки з реальними контактами — абсолютно вірно: люди, з якими ти листуєшся, відповідають на існуючі адреси через Reply, вони не будуть випадково вигадувати «vasya123@…». А спамери так і роблять — шлють на все підряд.
Висновок:
Твоє рішення (варіант 2, тихо дропати) — це найчистіший спосіб уникнути backscatter і зберегти репутацію.
Якщо хочеш «правильно по стандарту» — краще відхиляти на етапі SMTP (варіант 1), але він іноді теж створює непотрібні log flood від ботів.
А catch-all — майже завжди пастка.
В мене реальні користувачі (створені через adduser в /home). Як налаштувати цей випадок?
Ага, тепер зрозуміло — в тебе не virtual_mailbox_maps
, а класичні системні акаунти (Linux users у /etc/passwd
, пошта лежить у їхніх ~/Maildir
).
У такій схемі Postfix треба налаштувати так, щоб він приймав листи тільки для існуючих системних користувачів, і відхиляв інші одразу на етапі SMTP (тобто не створюючи bounce).
Як це зробити:
Перевір, чи в тебе вже є опція в main.cf
local_recipient_maps = unix:passwd.byname $alias_maps
unix:passwd.byname
— це означає: всі системні акаунти (getent passwd
).$alias_maps
— враховуються поштові аліаси (/etc/aliases
).
Якщо
local_recipient_maps
порожній або закоментований (local_recipient_maps =
), Postfix буде приймати все, а відлупи формувати сам. Це якраз твій випадок.Правильне налаштування Впиши у
/etc/postfix/main.cf
:local_recipient_maps = unix:passwd.byname $alias_maps
Це гарантує, що Postfix одразу на
RCPT TO:
скаже:550 5.1.1 <user@domain> User unknown
і не створюватиме bounce від твого імені.
Перезавантаж Postfix
systemctl reload postfix
або
postfix reload
Перевір тестом Спробуй надіслати листа на вигадану адресу
abcd@slavaswim.com
. Якщо все правильно, в логах побачишstatus=bounced
ще на етапі SMTP, а твій сервер не буде формувати ніякого листа-відповіді.
⚖️ Чи варто відхиляти, а не «мовчки дропати»?
Якщо хочеш бути «по стандарту» — так, краще відхиляти одразу на етапі SMTP (
550
). Це чисто і прозоро.Якщо хочеш «як чорна діра» (спамер не дізнається, які користувачі існують) — можна зробити
local_recipient_maps =
(порожнє). Але тоді всі адреси вважатимуться валідними, і Postfix прийматиме сміття → ти сам мусиш дропати у фільтрі.
Хочеш, я складу для тебе готовий main.cf фрагмент для варіанту «реальні користувачі, відхиляти неіснуючих на етапі SMTP»?
Ось готовий шматок для твого main.cf
, щоб Postfix працював з реальними системними користувачами і відразу відхиляв листи на неіснуючих:
# Приймаємо пошту тільки для існуючих юзерів Linux + аліасів
local_recipient_maps = unix:passwd.byname $alias_maps
# Де шукати аліаси (можеш не чіпати, якщо стандартно)
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
# Забороняємо відправляти листи на "лівих" юзерів
unknown_local_recipient_reject_code = 550
# (на всяк випадок, щоб не було мовчазних bounce)
disable_vrfy_command = yes
Як застосувати:
Відкрий
nano /etc/postfix/main.cf
.Встав ці рядки (або заміни існуючі).
Збережи →
Ctrl+O
,Enter
,Ctrl+X
.Перезавантаж Postfix:
systemctl reload postfix
Перевір тестом:
swaks --server mail.slavaswim.com --to fakeuser@slavaswim.com
про swaks, або попроси будь-який клієнт спробувати надіслати листа на неіснуючу адресу. Має одразу повернути:
550 5.1.1 <fakeuser@slavaswim.com>: Recipient address rejected: User unknown in local recipient table
root@mail:~# swaks --server mail.slavaswim.com --to fakeuser@slavaswim.com
=== Trying mail.slavaswim.com:25...
=== Connected to mail.slavaswim.com.
<- 220 mail.slavaswim.com ESMTP Postfix (Ubuntu)
-> EHLO mail.slavaswim.com
<- 250-mail.slavaswim.com
<- 250-PIPELINING
<- 250-SIZE 10240000
<- 250-ETRN
<- 250-STARTTLS
<- 250-ENHANCEDSTATUSCODES
<- 250-8BITMIME
<- 250-DSN
<- 250-SMTPUTF8
<- 250 CHUNKING
-> MAIL FROM:<root@mail.slavaswim.com>
<- 250 2.1.0 Ok
-> RCPT TO:<fakeuser@slavaswim.com>
<** 550 5.1.1 <fakeuser@slavaswim.com>: Recipient address rejected: User unknown in local recipient table
-> QUIT
<- 221 2.0.0 Bye
=== Connection closed with remote host.
Лист з gmail на неіснюючу адресу:

Дивися, при цих налаштуваннях сервер все ж таки повідомляє, що "адресу не знайдено або на неї не приймається пошта". І спамер може підбирати акаунти, поки не знайде існуючий. А якби відлуп не приходив, то він би цього не знав. На відлуп витрачаються ресурси сервера? Чи вони мінімальні? Що якщо сервер би просто не реагував на таки листи: нема користувача - видалив лист і сидить мовчки.
Дуже влучне питання — воно стосується базової логіки роботи SMTP і безпеки.
Як працює зараз (стандартно):
Сервер одразу під час SMTP-сеансу перевіряє, чи існує адресат.
Якщо ні — повертає код помилки (
550 5.1.1 User unknown
).Відправник отримує відлуп (bounce) ще до завершення передачі листа.
Це економить ресурси, бо лист не зберігається і не обробляється далі.
Що було б, якби сервер "мовчав":
SMTP-протокол вимагає чіткої відповіді від сервера на кожну команду. Якщо не відповідати — сесія зависає. Відправник буде чекати, а твій сервер витрачатиме більше ресурсів (тримати відкриті з’єднання).
Якщо ж приймати листи, але мовчки видаляти — то це називається "blackhole". Формально воно виглядає "зручніше", але:
Легітимний відправник (наприклад, друкарня чи клієнт) не дізнається, що помилився в адресі.
Тобі буде складніше з’ясувати, що хтось намагається писати на неіснуючих користувачів.
Спамери все одно зможуть тестувати акаунти: вони побачать, що на неіснуючі адреси листи "йдуть у чорну діру", а на існуючі — доходять (бо користувач може відповісти).
Про ресурси:
Витрати на "відлуп" мінімальні: це кілька байтів у SMTP-діалозі.
Тримати мовчазне з’єднання набагато важче (TCP-сесія, таймаути, буфери).
Приймати й видаляти — ще гірше, бо треба записати на диск у mail-queue, а потім утиліта все одно його викине.
Як борються реально:
Postfix + Fail2Ban: блокує спамера ще до того, як він встигне "перебирати".
Ratelimit на
smtpd_client_connection_rate_limit
— обмежує кількість спроб від однієї IP.Recipient restrictions — наприклад,
reject_unknown_recipient_domain
, щоб відсікти непотрібні запити на рівні доменів.Greylisting — відтягує підозрілі запити (спам-боти зазвичай не повторюють).
Отже: повернення відлупу — правильний варіант. Воно майже не споживає ресурсів, а мовчазний "чорний отвір" зробить тільки гірше.
Last updated