Чтобы решить эту проблему, вам нужно настроить как iptables, так и правила маршрутизации. Конкретная проблема, с которой вы сталкиваетесь, заключается в том, что исходящие пакеты SSH маршрутизируются через ваш анонимный интерфейс VPN-туннеля, а не через интерфейс Ethernet. Это происходит потому, что ваше программное обеспечение VPN настроило правило маршрутизации для отправки любого и всего необработанного трафика через туннельный интерфейс. Хорошо подходит для анонимизации вашего сетевого трафика; плохо для установления SSH-соединений с вашим компьютером.
Есть несколько способов решить эту проблему, но я поделюсь с вами тем, который работал для меня в такой же ситуации. Вот что нам нужно сделать:
- Создайте новую таблицу правил IP для обработки трафика не VPN
- Добавьте правило IP, чтобы просмотреть нашу таблицу без VPN для любых пакетов, помеченных определенной маской сетевого фильтра.
- Добавьте IP-маршрут, который направляет весь трафик в нашей таблице без VPN на использование вашего интерфейса Ethernet вместо туннеля.
- Добавьте правило iptables, чтобы пометить весь трафик SSH с помощью нашей назначенной маски сетевого фильтра.
Примечание: я работал с 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
Если grep ничего не появляется, вы в чистоте. Если он печатает несколько строк, запишите шестнадцатеричное число справа от слова fwmark
в каждой строке. Вам нужно будет выбрать номер, который в данный момент не используется. Поскольку у меня не было существующих правил fwmark, я выбрал число 65.
ip rule add fwmark 65 table novpn
Это приводит к тому, что любые пакеты с маской сетевого фильтра 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 назначенной маской сетевого фильтра
iptables -t mangle -A OUTPUT -p tcp --sport 22 -j MARK --set-mark 65
Здесь слишком много вариантов, чтобы объяснить их с какой-либо глубины. Я настоятельно рекомендую вам прочитать страницу руководства для iptables, чтобы понять, что здесь происходит:
man iptables
В двух словах: мы добавляем правило вывода в таблицу искажения брандмауэра (для специализированной обработки пакетов), которое инструктирует его отмечать любые TCP-пакеты, исходящие из исходного порта 22, с помощью нашей назначенной маски 65 сетевого фильтра.
Что дальше?
На этом этапе вы должны быть готовы к тестированию SSH. Если все идет хорошо, вас встретит радостная подсказка «Войти как».
В целях безопасности я рекомендую поручить брандмауэру отбрасывать любые входящие запросы SSH из туннельного интерфейса:
iptables -A INPUT -i tun0 -p tcp -m tcp --dport 22 -j DROP
Обратите внимание, что все приведенные выше инструкции являются временными (за исключением создания идентификатора таблицы правил) - они будут очищены при следующей перезагрузке компьютера. Делать их постоянными - это упражнение, которое я оставляю вам.