Відкритий, закритий, фільтрується — три відповіді, а не дві
TCP-з'єднання починається з одного пакета — SYN. Те, що прийде у відповідь, вирішує все, і розрізняти тут варто рівно три результати.
- Відкритий
- На SYN відповіли SYN-ACK. Хтось слухає й готовий говорити. Це єдиний результат, який доводить, що служба доступна з інтернету.
- Закритий
- У відповідь прийшов RST — відмова. Це значно інформативніше, ніж здається: пакет дійшов. Вузол живий, він досяжний, маршрутизація й NAT справні. Просто на цьому порту ніхто не слухає, і все.
- Фільтрується
- Не прийшло нічого. Пакет проковтнули десь дорогою — фаєрвол, налаштований відкидати замість відмовляти, провайдер, що блокує порт, або роутер, у якому для нього немає правила проброса.
«Закритий» і «фільтрується» — протилежні діагнози. Закритий каже: «пакет дійшов до машини, лікуй службу». Фільтрується каже: «пакет туди не дійшов, лікуй шлях». Перевіряч, який зводить обидва до «не відкритий», відповів на половину питання — і саме на ту половину, яку ви й так знали.
Чому перевірка з власної машини не доводить нічого
Найпоширеніший спосіб переконати себе, що порт відкритий, — перевірити локально:
telnet localhost 8080 або браузер, спрямований на власну машину. Така перевірка
вдається незалежно від того, наскільки ретельно порт закрито ззовні, бо вона взагалі не
залишає комп'ютера. Пропущено кожен шар, який міг бути проблемою: вхідні правила фаєрвола,
проброс портів на роутері, фільтрація провайдера і питання, чи є у вас публічна адреса
взагалі.
Відповідь на справжнє питання дає лише перевірка ззовні — бо вона проходить той самий шлях, яким ішов би справжній відвідувач.
Ланцюг, який має пройти пакет
Коли порт фільтрується, винен один із п'яти шарів. Перебирайте їх у цьому порядку — список відсортовано за тим, як часто кожен виявляється винним:
- Служба слухає не ту адресу. Найчастіша причина і найдратівливіша в пошуку. Процес, що слухає
127.0.0.1:8080, для мережі невидимий — хоча всі локальні перевірки проходять, а лог виглядає бездоганно. Дивітьсяss -tlnp: якщо в стовпчику адреси стоїть127.0.0.1, а не0.0.0.0чи[::], жодні інші зміни не допоможуть. - Фаєрвол на самому вузлі. Сучасні дистрибутиви привозять його ввімкненим. Зазвичай він саме відкидає, а не відхиляє, — тобто дає рівно той результат «фільтрується».
- Роутер. Пробросу потрібні правило, правильна внутрішня адреса й правильний протокол. Внутрішні адреси від DHCP змінюються: правило, написане пів року тому, може вказувати на пристрій, якого вже немає.
- Провайдер. Вхідний порт 25 закритий практично на кожному домашньому підключенні, а 80, 443 і 445 закривають теж досить часто. Це політика, а не поломка, і жодне налаштування з вашого боку її не змінює.
- У вас немає публічної адреси. Якщо WAN-адреса роутера відрізняється від адреси, яку бачить цей сайт, між вами й інтернетом є ще один шар NAT, і вхідні з'єднання не можуть дійти взагалі. Про це нижче.
Коли проброс портів не запрацює в принципі
Вільні адреси IPv4 скінчилися багато років тому, і провайдери почали ділити те, що
мали. За NAT рівня оператора ваш роутер публічної адреси не отримує зовсім: йому дають
адресу з діапазону, зарезервованого саме для цього в RFC 6598 — 100.64.0.0/10, —
а оператор перетворює її ще раз на виході. За однією публічною адресою можуть стояти сотні
абонентів.
Вхідного шляху в такій схемі немає. Публічна адреса вам не належить, тож пробросити на
вас нічого не можна: власний хостинг, ігрові сервери, вхідний VPN і віддалений доступ до
домашнього сховища перестають працювати, і жодне налаштування роутера цього не змінить.
Перевірка займає десять секунд: порівняйте WAN-адресу на сторінці стану роутера з адресою
на головній сторінці. Якщо вони різні — а надто якщо роутер показує щось,
що починається з 100., — це і є відповідь. Ліки: попросити в провайдера
публічну адресу (часто платна послуга), скористатися IPv6, якщо він є, або взяти тунель,
який дасть вам досяжну точку входу деінде.
Порти, які варто двічі подумати відкривати
Відкритий порт сам по собі не проблема — вебсерверу потрібні 80 і 443. Але частину служб проєктували для довірених мереж, і поводяться вони відповідно, коли стають доступними всьому інтернету:
| Порт | Служба | Чому це важливо |
|---|---|---|
| 22 | SSH | Доступність — нормально, автентифікація паролем — ні. Автоматичні спроби входу починаються за хвилини після відкриття порту. Лише ключі й без входу під root. |
| 3389 | RDP | Відкритий назовні RDP — один із найнадійніших шляхів, якими шифрувальники потрапляють у мережу. Йому місце за VPN, а не у відкритому інтернеті. |
| 445 | SMB | Спільний доступ до файлів ніколи не проєктували для інтернету. Ззовні він не має бути досяжним узагалі, і більшість провайдерів закривають його за вас. |
| 3306 · 5432 | MySQL · PostgreSQL | База має бути доступна вашому застосунку, а не всім. Прив'яжіть її до локальної адреси або приватної мережі. |
| 6379 · 27017 · 9200 | Redis · MongoDB · Elasticsearch | Усі три історично постачалися без автентифікації й слухали всі інтерфейси. Масові зломи відкритих екземплярів — подія, що повторюється, а не теоретичний ризик. |
| 23 | Telnet | Без шифрування, разом із паролем. Головне його застосування, що лишилося, — точка входу для ботнетів, які сканують побутові пристрої. |
| 21 | FTP | Теж без шифрування і незручний крізь NAT через друге з'єднання для даних. Ту саму роботу робить SFTP поверх SSH. |
Чому ми не скануємо діапазони
Перевірити кілька портів вузла — діагностика. Пройтися по діапазону — сканування, і ця різниця не теоретична: саме зі сканувань складаються скарги на зловживання, а сервіс, який їх пропонує, отримує блокування власної адреси рівно в тих мережах, куди його користувачі й хочуть достукатися. Тому цей інструмент приймає короткий перелік окремих портів, не приймає діапазонів, ненадовго зберігає результат і записує в журнал кожну ціль, про яку його спитали.
З тих самих міркувань поле від початку заповнене вашою власною адресою. Перевірка власних портів покриває фактично всі законні причини тут опинитися: «чи спрацював мій проброс», «чи відкритий 25-й на моєму сервері», «чи робить нове правило фаєрвола те, що я задумав». Перевірка чужих іноді законна, а частіше ні — і значення за замовчуванням мають робити легким саме звичайний чесний випадок.
Після перевірки
Відкритий порт каже, що служба досяжна; він не каже, що вона справна. Якщо порт відкритий, а сайт не відкривається, проблема перемістилася на шар вище — до TLS, до віртуального хоста або до самого застосунку. Саме туди дивиться наша перевірка сайту. Якщо порт фільтрується і треба зрозуміти, чи вузол досяжний узагалі, швидку відповідь на вужче питання дасть ping — з поправкою на те, що чимало вузлів навмисно відкидають ICMP.