Щоб вирішити цю проблему, вам потрібно буде встановити як 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
Зауважте, що всі вищезазначені інструкції є тимчасовими (за винятком створення ідентифікатора таблиці правил) - вони очистяться наступного разу при перезавантаженні комп'ютера. Робити їх постійними - це вправа, яку я залишаю вам.