Пошта на неіснуючі адреси

Коли хтось надсилає листа на неіснуючого користувача твого домену, Postfix перевіряє, чи існує такий local_recipient. Якщо ні — він повертає відправнику 550 5.1.1 User unknown in local recipient table. Це нормально, бо так усі поштові сервери мають працювати: повідомляти, що адресат не існує.

Варіанти поведінки

  1. Повертати помилку (рекомендовано)

    • Відправник одразу отримує bounce (повідомлення про помилку).

    • Спамери бачать, що адреса «мертва», і можуть перестати на неї слати.

    • Це стандартний і коректний варіант.

  2. Мовчки відкидати (reject без повідомлення / drop)

    • Тоді твій сервер просто приймає з’єднання і «викидає» лист, не відповідаючи відправнику помилкою.

    • Плюс: спамери не знають, що адреса не існує (корисно, якщо тебе брутфорсять dictionary attack на адреси).

    • Мінус: легітимний відправник (наприклад, твій клієнт або сервіс із помилкою в email) ніколи не дізнається, що він пише на неправильну адресу. Листи просто зникають у чорну діру.

  3. Приймати все (catch-all)

    • Всі листи на будь-які адреси @твій_домен приймаються й кладуться в одну поштову скриньку (часто — postmaster або catchall).

    • Мінус: отримаєш гори спаму, бо спамери дуже люблять слати на випадкові імена.

    • Це рідко радять робити.


Чи варто робити?

  • Якщо хочеш коректну пошту → залишай стандарт: 550 User unknown.

  • Якщо боїшся брутфорсу на адреси → можна викидати мовчки, але це незручно для легітимних людей.

  • Catch-all краще не робити, якщо не готовий чистити спам.


Чому я за варіант 2?

Абсолютна більшість спам листів йдуть на неіснуючі адреси з неіснуючих адрес. І нащо воно треба - ще слати відповіді в нікуди? А якщо вони поставлять у поле відправника адресу жертви і пошлють мені на неіснуючу адресу - жертва буде отримувати від мене "відлупи" з їхнім спамом? Ті, з ким я веду переписку, відповідають на мої листи через кнопку "відповісти" або система висвітить їм вже використану раніше адресу. Якщо хтось перевіряє існуючі адреси і має мізки - подумає: а чому цей сервер приймає кожне придумане мною ім'я? Мабуть мої листи падають в прірву і я не ніколи не знатиму точно, чи існує те чи інше ім'я на пошті...

Ти мислиш абсолютно правильно 🙂 Власне, те що ти описав — це класичний аргумент проти backscatter (зворотного спаму).

Давай розберемо по пунктах:

  1. Backscatter — це коли твій сервер отримує листа на неіснуючу адресу і відсилає повідомлення про помилку назад у «From:». Якщо там стоїть підроблена адреса (що буває у 99% випадків) → чужа невинна жертва починає отримувати сміття від твого сервера. Це дуже погано для репутації: твоє ім’я може потрапити в чорні списки як джерело спаму.

  2. Сучасна практика — не відсилати bounce взагалі для листів, які не можуть бути доставлені через неіснуючого отримувача. Варіанти:

    • відхилити одразу на етапі SMTP (550 5.1.1 User unknown) — тоді відповідальність за bounce лежить на сервері відправника (якщо він нормальний).

    • або прийняти і тихо викинути (варіант 2), якщо хочеш взагалі уникнути будь-яких «відлупів».

  3. Щодо твоєї логіки з реальними контактами — абсолютно вірно: люди, з якими ти листуєшся, відповідають на існуючі адреси через Reply, вони не будуть випадково вигадувати «vasya123@…». А спамери так і роблять — шлють на все підряд.


Висновок:

  • Твоє рішення (варіант 2, тихо дропати) — це найчистіший спосіб уникнути backscatter і зберегти репутацію.

  • Якщо хочеш «правильно по стандарту» — краще відхиляти на етапі SMTP (варіант 1), але він іноді теж створює непотрібні log flood від ботів.

  • А catch-all — майже завжди пастка.

В мене реальні користувачі (створені через adduser в /home). Як налаштувати цей випадок?

Ага, тепер зрозуміло — в тебе не virtual_mailbox_maps, а класичні системні акаунти (Linux users у /etc/passwd, пошта лежить у їхніх ~/Maildir).

У такій схемі Postfix треба налаштувати так, щоб він приймав листи тільки для існуючих системних користувачів, і відхиляв інші одразу на етапі SMTP (тобто не створюючи bounce).

Як це зробити:

  1. Перевір, чи в тебе вже є опція в 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 буде приймати все, а відлупи формувати сам. Це якраз твій випадок.

  2. Правильне налаштування Впиши у /etc/postfix/main.cf:

    local_recipient_maps = unix:passwd.byname $alias_maps

    Це гарантує, що Postfix одразу на RCPT TO: скаже:

    550 5.1.1 <user@domain> User unknown

    і не створюватиме bounce від твого імені.

  3. Перезавантаж Postfix

    systemctl reload postfix

    або

    postfix reload
  4. Перевір тестом Спробуй надіслати листа на вигадану адресу 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

Як застосувати:

  1. Відкрий nano /etc/postfix/main.cf.

  2. Встав ці рядки (або заміни існуючі).

  3. Збережи → Ctrl+O, Enter, Ctrl+X.

  4. Перезавантаж Postfix:

    systemctl reload postfix
  5. Перевір тестом:

    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 і безпеки.

  1. Як працює зараз (стандартно):

    • Сервер одразу під час SMTP-сеансу перевіряє, чи існує адресат.

    • Якщо ні — повертає код помилки (550 5.1.1 User unknown).

    • Відправник отримує відлуп (bounce) ще до завершення передачі листа.

    • Це економить ресурси, бо лист не зберігається і не обробляється далі.

  2. Що було б, якби сервер "мовчав":

    • SMTP-протокол вимагає чіткої відповіді від сервера на кожну команду. Якщо не відповідати — сесія зависає. Відправник буде чекати, а твій сервер витрачатиме більше ресурсів (тримати відкриті з’єднання).

    • Якщо ж приймати листи, але мовчки видаляти — то це називається "blackhole". Формально воно виглядає "зручніше", але:

      • Легітимний відправник (наприклад, друкарня чи клієнт) не дізнається, що помилився в адресі.

      • Тобі буде складніше з’ясувати, що хтось намагається писати на неіснуючих користувачів.

      • Спамери все одно зможуть тестувати акаунти: вони побачать, що на неіснуючі адреси листи "йдуть у чорну діру", а на існуючі — доходять (бо користувач може відповісти).

  3. Про ресурси:

    • Витрати на "відлуп" мінімальні: це кілька байтів у SMTP-діалозі.

    • Тримати мовчазне з’єднання набагато важче (TCP-сесія, таймаути, буфери).

    • Приймати й видаляти — ще гірше, бо треба записати на диск у mail-queue, а потім утиліта все одно його викине.

  4. Як борються реально:

    • Postfix + Fail2Ban: блокує спамера ще до того, як він встигне "перебирати".

    • Ratelimit на smtpd_client_connection_rate_limit — обмежує кількість спроб від однієї IP.

    • Recipient restrictions — наприклад, reject_unknown_recipient_domain, щоб відсікти непотрібні запити на рівні доменів.

    • Greylisting — відтягує підозрілі запити (спам-боти зазвичай не повторюють).

Отже: повернення відлупу — правильний варіант. Воно майже не споживає ресурсів, а мовчазний "чорний отвір" зробить тільки гірше.

Last updated