Разрешение SSH на сервере с активным клиентом OpenVPN

15

У меня есть VPS под управлением CentOS 7, к которому я подключаюсь по SSH. Я хотел бы запустить клиент OpenVPN на VPS, чтобы интернет-трафик направлялся через VPN, но все же позволял мне подключаться к серверу через SSH. Когда я запускаю OpenVPN, мой сеанс SSH отключается, и я больше не могу подключиться к своему VPS. Как я могу настроить VPS так, чтобы входящие соединения SSH (порт 22) были открыты на фактическом IP-адресе VPS (104.167.102.77), но по-прежнему маршрутизировать исходящий трафик (например, из веб-браузера на VPS) через VPN?

Служба OpenVPN, которую я использую, - PrivateInternetAccess, и пример файла config.ovpn:

клиент
Dev Tun
прото удп
удаленный nl.privateinternetaccess.com 1194
разрешить-повторить бесконечный
nobind
упорствовать-ключ
упорствовать-чан
ca ca.crt
TLS-клиент
удаленный сервер cert-tls
аутентификации пользователей проход
Comp-LZO
глагол 1
ренег-сек 0
crl-verify crl.pem

IP-адрес VPS:

1: lo: mtu 65536 qdisc noqueue state НЕИЗВЕСТНО
    ссылка / петля 00: 00: 00: 00: 00: 00 brd 00: 00: 00: 00: 00: 00
    инет 127.0.0.1/8 хост хоста lo
       valid_lft forever предпочитаемый_lft forever
    inet6 :: хозяин области видимости 1/128
       valid_lft forever предпочитаемый_lft forever
2: ens33: mtu 1500 qdisc pfifo_fast состояние UP qlen 1000
    ссылка / эфир 00: 50: 56: быть: 16: f7 brd ff: ff: ff: ff: ff: ff
    inet 104.167.102.77/24 brd 104.167.102.255 scope global ens33
       valid_lft forever предпочитаемый_lft forever
    inet6 fe80 :: 250: 56ff: febe: 16f7 / 64 область видимости ссылка
       valid_lft forever предпочитаемый_lft forever
4: tun0: mtu 1500 qdisc pfifo_fast состояние НЕИЗВЕСТНО qlen 100
    не ссылка / нет
    inet 10.172.1.6 peer 10.172.1.5/32 scope global tun0
       valid_lft forever предпочитаемый_lft forever

IP-маршрут VPS:

0.0.0.0/1 через 10.172.1.5 dev tun0
по умолчанию через 104.167.102.1 dev ens33 простатическая метрика 1024
10.172.1.1 через 10.172.1.5 dev tun0
10.172.1.5 dev tun0 Proto ядро ​​область ссылка src 10.172.1.6
104.167.102.0/24 dev ens33 область видимости ядра протока src 104.167.102.77
109.201.154.177 через 104.167.102.1 dev ens33
128.0.0.0/1 через 10.172.1.5 dev tun0
odie5533
источник

Ответы:

15

У меня проблема, похожая на эту, и я пытался исправить проблему, описанную в этом сообщении на форуме .

Идея состоит в том, что в настоящее время, когда вы подключаетесь к общедоступному IP-адресу, возвращаемые пакеты маршрутизируются через VPN. Вы должны заставить эти пакеты маршрутизироваться через ваш общедоступный интерфейс.

Надеемся, что эти команды маршрута сделают свое дело:

IP-правило добавить из таблицы хххх 128

ip route добавить таблицу 128 в гггг / у dev ethX

ip route добавить таблицу 128 по умолчанию через zzzz

Если xxxx - ваш общедоступный IP-адрес, yyyy / y - это подсеть вашего общедоступного IP-адреса, ethX - ваш общедоступный интерфейс Ethernet, а zzzz - шлюз по умолчанию.

Обратите внимание, что это не сработало для меня (с использованием Debian и PrivateInternetAccess), но может помочь вам.

MRK
источник
1
Вместо того, чтобы просто ссылаться на решение, укажите или хотя бы суммируйте решение здесь. Таким образом, ваш пост все еще может быть полезен в будущем, если пост, на который вы ссылаетесь, исчезнет.
Андрей Шульман
Я запустил эти команды безрезультатно ... Как бы я затем перечислил эту таблицу (я не вижу новые правила, которые я добавил с routeили ip route show) и удалил ее?
Хуссейн Халил
Я потерял свой SSH на моем публичном IP, когда я встал openvpn на моем домашнем сервере. Запуск первой из перечисленных выше команд позволил мне получить доступ по ssh обратно на сервер, когда он не находится в домашней сети. Использование PIA + OpenVPN + Ubuntu 16.04.
скучно
Это действительно только маршрутизирует порт SSH к моему общедоступному IP? Можете ли вы объяснить больше о том, что именно это делать? Я нигде не вижу, чтобы вы устанавливали определенный порт или протокол
Freedo
Он вообще не маршрутизирует на основе портов (128 - это номер таблицы, а не порт). В основном это говорит о том, что если пакеты приходят через ваш общедоступный IP-адрес, то ответ должен быть отправлен на тот же интерфейс (без использования VPN).
MrK
17

Это может быть немного поздно, но ...

Проблема заключается в том, что шлюз по умолчанию изменяется OpenVPN, и это нарушает ваше текущее соединение SSH, если вы не настроили соответствующие маршруты перед запуском OpenVPN.

То, что следует, работает для меня. Он использует iptables и ip (iproute2). Ниже предполагается, что интерфейсом шлюза по умолчанию перед запуском OpenVPN является «eth0». Идея состоит в том, чтобы при установлении соединения с eth0, даже если eth0 больше не является интерфейсом шлюза по умолчанию, ответные пакеты для соединения снова возвращаются на eth0.

Вы можете использовать один и тот же номер для метки соединения, метки межсетевого экрана и таблицы маршрутизации. Я использовал разные числа, чтобы сделать различия между ними более очевидными.

# set "connection" mark of connection from eth0 when first packet of connection arrives
sudo iptables -t mangle -A PREROUTING -i eth0 -m conntrack --ctstate NEW -j CONNMARK --set-mark 1234

# set "firewall" mark for response packets in connection with our connection mark
sudo iptables -t mangle -A OUTPUT -m connmark --mark 1234 -j MARK --set-mark 4321

# our routing table with eth0 as gateway interface
sudo ip route add default dev eth0 table 3412

# route packets with our firewall mark using our routing table
sudo ip rule add fwmark 4321 table 3412

===

ОБНОВИТЬ:

Вышесказанное прекрасно работает для меня в Debian Jessie. Но в более старой системе Wheezy я только что обнаружил, что мне нужно добавить «через» к записи таблицы маршрутизации:

# our routing table with eth0 as gateway interface
sudo ip route add default dev eth0 via 12.345.67.89 table 3412

Там "12.345.67.89" должен быть оригинальный шлюз не VPN.

Джон Доу
источник
1
СПАСИБО! Я искал решение этой проблемы в течение нескольких дней, и ваш ответ решил ее для меня. Это должен быть принятый ответ.
Майк Терли
Это решение также сработало для меня. Большое спасибо за то, что поделились этим.
alecov
Может ли быть два маршрута в таблице маршрутизации с одним и тем же получателем ( ip route add default)? Я получаю «Ответы RTNETLINK: Файл существует». Я использую Ubuntu Xenial. "через" не помогает. Я только что попробовал это на Arch Linux, сначала ip route add defaultкажется, что это успешно, но ip routeвывод не меняется. Любые последующие запуски приводят к сообщению «файл существует».
x-yuri
Я вижу, маршрут добавлен в таблицу 3412 маршрутизации. А чтобы добраться до него , вы должны: ip route show table all | grep 3412. А без "через" неустановленные (если я не ошибаюсь) соединения перестают работать (Ubuntu Xenial). По крайней мере, я могу исправить таблицу маршрутизации. Но, тем не менее, я не могу получить доступ к серверу после запуска openvpn.
x-yuri
По какой-то причине у меня не получилось, в отличие от этого , или того , или этого . Которые в основном одинаковы.
x-yuri
14

Основываясь на ответе @MrK, я написал здесь простой код, чтобы сделать работу быстрее, чтобы вам не приходилось проверять интерфейсы / IP:

ip rule add from $(ip route get 1 | grep -Po '(?<=src )(\S+)') table 128
ip route add table 128 to $(ip route get 1 | grep -Po '(?<=src )(\S+)')/32 dev $(ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)')
ip route add table 128 default via $(ip -4 route ls | grep default | grep -Po '(?<=via )(\S+)')

Я пробовал этот скрипт на 4 из моих VPS, и он работает отлично.

SandPox
источник
Спасибо огромное!
Джорди Гоянес
0

хм звучит как перекрытие подсети ip .... не зная больше о вашей схеме ip, кроме общедоступного ip для вашего завершения vpn как nl.privateinternetaccess.com, точно сказать не могу.

например, если удаленная подсеть на другой стороне nl.privateinternetaccess.com - 10.32.43.0/24, а ваш экземпляр находится в виртуальной частной сети aws, чья подсеть - 10.32.44.0/24. но ваш исходный ssh-клиент живет 10.32.43.0/24 (ваша сторона aws vpc), он не будет работать, так как обратный ssh-трафик будет ошибочно передаваться через vpn в Нидерланды.

предоставьте полную информацию ip / подсети для получения дополнительной помощи в этом.

...

хорошо, так ... похоже, ваш маршрут по умолчанию находится в туннеле, после подключения к nl:

0.0.0.0/1 через 10.172.1.5 dev tun0

так что вы можете изменить это после подключения. Много раз серверы vpn дают вам фиктивные маршруты. особенно на небрежном корпусе. в этом случае они отправляют вам маршрут по умолчанию, поэтому весь трафик с vps-ящика идет на nl. измените маршрут по умолчанию на 104.167.102.x или любой другой шлюз подсети ur у провайдера ur vps.

nandoP
источник
Каких выходов команд хватит?
odie5533
1
вывод «ip addr» и «ip route» на ssh-клиенте, ssh-сервере / vpn-клиенте и nl vpn-сервере. убедитесь, что vpn работает при получении вывода.
nandoP
Я хочу, чтобы трафик по умолчанию проходил через VPN; однако я хочу, чтобы входящий трафик на 104.167.102.77:22 был разрешен, чтобы я мог SSH к VPS.
odie5533
вы проверяете это с помощью tcpdump, но похоже, что после подключения, и маршрут по умолчанию становится туннельным, новый входящий трафик ssh из других мест в Интернете разрешен, но он не возвращается, так как маршрут по умолчанию отправляет ответ ssh через туннель, вместо того, чтобы вернуться к вам. Вы можете исправить это с помощью «ip route add [your-ip-addr] / 32 через [ваш шлюз vps]». чтобы найти свой шлюз vps, просто отключитесь от туннеля и посмотрите маршрут по умолчанию
nandoP
0

Когда вы включаете VPN, ваш шлюз по умолчанию заменяется. Это означает, что любой трафик, генерируемый или маршрутизируемый через ваш ящик, будет перенаправлен на шлюз VPN.

Простое решение - отфильтровать весь трафик, который вы не хотите направлять через VPN, и сделать с ним что-то еще. Одной из возможностей является получение трафика, генерируемого из вашего ящика, с вашим локальным адресом источника и маршрутизация его через ваш локальный шлюз. Это позволяет таким службам, как SSH, работать правильно.

Мы сделаем это здесь. Сначала создайте новую таблицу маршрутизации и добавьте маршрут по умолчанию, который маршрутизирует все через ваш локальный шлюз:

# <table> is any number between 2 and 252.
# Check /etc/iproute2/rt_tables for more info.
ip route add default via <gateway> table <table>
ip route add <lan-addr> dev <device> table <table>

Затем создайте новое правило фильтрации пакетов, которое маркирует весь трафик, выходящий из вашего ящика, с заданного исходного адреса с некоторым идентификатором.

# <mark> is any number.
iptables -tmangle -AOUTPUT -s<local-addr> -jMARK --set-mark <mark>

Наконец, создайте политику маршрутизации, которая выбирает весь вышеупомянутый отмеченный трафик и маршрутизирует его, используя сгенерированную таблицу выше.

ip rule add fwmark <mark> table <table>

Еще раз, значения <mark>и <table>являются произвольными идентификаторами по вашему выбору.

alecov
источник
0

Для меня с запуском сервера OpenVPN в pfSense я должен был снять флажок «Принудительно генерировать весь клиентский трафик IPv4 через туннель».

user3820047
источник