Щоб вирішити цю проблему, вам потрібно буде встановити як iptables, так і правила маршрутизації. Конкретна проблема, з якою ви стикаєтесь, полягає в тому, що вихідні пакети SSH передаються через анонімний інтерфейс тунелю VPN замість інтерфейсу Ethernet. Це відбувається тому, що ваше програмне забезпечення VPN встановило правило маршрутизації для надсилання будь-якого і всього необробленого трафіку через інтерфейс тунелю. Добре підходить для анонімізації мережевого трафіку; погано для встановлення SSH-з'єднань з комп'ютером.
Є кілька способів виправити цю проблему, але я поділюся з вами тим, який працював на мене в ідентичній ситуації. Ось що нам потрібно зробити:
- Створіть нову таблицю правил IP для обробки не-VPN-трафіку
- Додайте правило IP для пошуку нашої таблиці без VPN для будь-яких пакетів, позначених певною маскою netfilter
- Додайте маршрут IP, який спрямовуватиме весь трафік у нашій таблиці без VPN, щоб використовувати ваш інтерфейс Ethernet замість тунелю
- Додайте правило iptables, щоб позначити весь трафік SSH нашою призначеною маскою netfilter
Примітка. Я працював з Raspbian, виконуючи наступні дії, тому вам може знадобитися трохи відкоригувати команди, щоб відповідати вашому дистрибутиву.
Створення нової таблиці правил IP-адреси
Почніть з огляду файлу визначення таблиці iproute2. Ми хочемо переконатися, що ми не використовуємо ім’я чи номер будь-яких існуючих таблиць правил.
cat /etc/iproute2/rt_tables
Ви, ймовірно, побачите щось у цьому напрямку:
# reserved values
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
Виберіть довільне число та назву для своєї нової таблиці правил - все, що не використовується вище. Я використаю номер 201 та ім’я novpnдля залишку цієї відповіді.
Додайте визначення безпосередньо до файлу визначення або відредагуйте його в текстовому редакторі на ваш вибір:
echo "201 novpn" >> /etc/iproute2/rt_tables
Додайте нове правило IP для пошуку таблиці без VPN
Перевірте наявність існуючих правил ip, які стосуються масок netfilter:
ip rule show | grep fwmark
Якщо греп нічого не виявиться, ви в чистоті. Якщо він друкує деякі рядки, врахуйте шістнадцятковий номер праворуч від слова fwmarkу кожному рядку. Вам потрібно буде вибрати номер, який наразі не використовується. Оскільки у мене не було існуючих правил fwmark, я вибрав число 65.
ip rule add fwmark 65 table novpn
Це означає, що будь-які пакети з netfilter mask 65 шукають у нашій новій novpnтаблиці інструкції щодо маршрутизації пакетів.
Спрямуйте весь трафік у нашій новій таблиці, щоб використовувати інтерфейс Ethernet
ip route add default via YOUR.GATEWAY.IP.HERE dev eth0 table novpn
Тут важливо зауважити dev eth0. Це змушує весь трафік, який проходить через novpnтаблицю, використовувати лише апаратний інтерфейс Ethernet, а не інтерфейс віртуального тунелю, який створює ваш VPN.
Зараз би вдалий час, щоб очистити кеш iproute, щоб переконатися, що ваші нові правила та маршрути негайно діють:
ip route flush cache
Інструктуйте правило брандмауера, щоб позначити весь трафік SSH за допомогою призначеної маски netfilter
iptables -t mangle -A OUTPUT -p tcp --sport 22 -j MARK --set-mark 65
Тут є занадто багато варіантів для мене, щоб пояснити в будь-якій великій глибині. Я настійно рекомендую прочитати сторінку керівництва для iptables, щоб зрозуміти, що тут відбувається:
man iptables
Коротше кажучи: ми додаємо правило виводу до таблиці манжела брандмауера (для спеціалізованої обробки пакетів), яка дає йому вказівку позначити будь-які пакети TCP, що походять з вихідного порту 22, за допомогою нашої призначеної мережі Netfilter 65.
Що далі?
У цей момент ви повинні бути готові до тестування SSH. Якщо все піде добре, вам слід зустріти радісне підказку "Логін як".
З метою безпеки я рекомендую вам доручити брандмауеру відмовитись від вхідних запитів SSH з інтерфейсу тунелю:
iptables -A INPUT -i tun0 -p tcp -m tcp --dport 22 -j DROP
Зауважте, що всі вищезазначені інструкції є тимчасовими (за винятком створення ідентифікатора таблиці правил) - вони очистяться наступного разу при перезавантаженні комп'ютера. Робити їх постійними - це вправа, яку я залишаю вам.