Чому домашній NAT не захищає ваш інтерфейс VPN
Домашній маршрутизатор пересилає тунель, але хост оцінює розшифрований пакет. Читайте слухача, внутрішній шлях і політику входу окремо.
Ноутбуки за домашнім маршрутизатором без переспрямування портів і далі приймають SSH-з'єднання, що надходять через VPN. Це не суперечність, бо два різні пристрої оцінюють два різні пакети. Маршрутизатор пересилає зашифрований транспорт, а хост вирішує, що робити з розшифрованим пакетом, який доходить до його тунельного інтерфейсу. Тримати ці два рішення окремо — і є вся вправа.
Маршрутизатор пересилає тунель, хост оцінює пакет
Намалюйте шлях від віддаленого джерела до сервісу, перш ніж дивитися на єдине правило. Зовнішня ділянка — це транспорт VPN, яким займаються маршрутизатор і шлюз. Внутрішня ділянка починається, коли кінцева точка знімає тунельний шар і хост отримує пакет, адресований його адресі VPN.
Об'єднайте ці дві ділянки, і маршрутизатор отримає заслугу за рішення, яке ухвалює хост. Сторінка переспрямування портів або журнал маршрутизатора описують лише зовнішні розмови, і жоден не каже, який розшифрований трафік хост прийме. Хост застосовує власну політику входу до внутрішнього пакета так само, як до будь-якого пакета, що надходить на інтерфейс. Саме в цій політиці питання експозиції й вирішується.
Слухач із символом заміни — не публічний сервіс
У Linux прив'язка до INADDR_ANY означає кожну локальну адресу, тож сервіс може відповідати на тунельному інтерфейсі, який він ніколи не називав. Довідник із IP-сокетів описує цю прив'язку, і його варто прочитати, перш ніж робити висновки зі списку слухачів. Запис із символом заміни — це факт про сокет, а не твердження про доступність.
Два рядки нижче — це той самий сервіс у двох різних прив'язках, і різниця — вся відповідь на питання, чи має значення інтерфейс. Спершу прочитайте, на якій адресі сидить сокет.
ss -lntp "sport = :22"
LISTEN 0 4096 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=812,fd=3))
LISTEN 0 4096 10.8.0.6:22 0.0.0.0:* users:(("sshd",pid=812,fd=4))
Назвіть розклад, який міг би досягти порту
Три розклади ставлять пакет на цей інтерфейс, і в них різні власники. Назвати правильний — означає вирішити, хто має змінити політику.
| Arrangement | What reaches the port | Where the decision lives |
|---|---|---|
| Another permitted VPN peer | A packet from the same tunnel subnet | Gateway forwarding policy and host input rules |
| A deliberate public forward | Traffic the gateway publishes on purpose | Gateway service definition |
| A subnet routed behind the gateway | Client traffic from the far side | Gateway route and host input rules |
Результат браузера з публічною адресою виходу нічого не каже ні про один із трьох, бо описує, як виходить вихідний трафік, а не що дозволено вхідному. Працюйте у зворотному напрямку від слухача й адреси джерела в журналі сервісу. Якщо джерело — інший вузол тунелю, політика шлюзу — цікавий документ. Якщо це трансльована адреса, знайдіть трансляцію, перш ніж змінити правило.
Обмежте сервіс тим шляхом, який ви мали на увазі
Якщо SSH потрібен лише зі шляху керування, запишіть цей шлях як діапазон джерела плюс інтерфейс. Потім обмежте правила входу хоста за інтерфейсом, призначенням і джерелом, а не за назвою мережі, оскільки назва, що виглядає приватною, може означати будь-яку адресу. Залиште маршрут для людини, яка вирішить наступну проблему.
nft add rule inet filter input iifname "tun0" ip saddr 10.8.0.0/24 tcp dport 22 accept
nft list chain inet filter input
Правило, що називає тунельний інтерфейс і діапазон керування, виражає намір в одному місці. Порівняйте його з правилом, написаним для мережі Wi-Fi, яке нічого не каже про розшифрований тунельний трафік. Коли два шари не погоджуються, політика хоста — та, яку зустрічає пакет.
Залиште входи й латки точно там, де вони є; досягти порту ніколи не було тим самим, що дозвіл користуватися ним. Запишіть родину адрес і час для будь-якого незнайомого джерела й дослідіть, перш ніж звинувачувати функцію або вразливість. Правило, що пропускає кожен вузол тунелю, — інший дизайн, ніж те, що пропускає підмережу керування, і жоден рядок журналу не скаже, яке малося на увазі.
Прийміть виправлення з одним успіхом і однією відмовою
Доведіть обидві половини: одне дозволене з'єднання успішне, а один виключений шлях відхиляється. Відмова — це та половина, яку люди пропускають, і саме вона показує, що правило працює, а не стоїть поруч із дозвільним значенням за замовчуванням. Тестуйте з виключеного боку, а не міркуйте про це.
Повторіть пару після перепідключення, бо тунель, що повертається з іншою назвою інтерфейсу, може тихо обійти правило, обмежене старим. Межа, що має значення, — та, яку хост застосовує до пакетів, які він справді отримує.