Предотвращение потери соединения SSH после входа в VPN на сервере

14

Я столкнулся с проблемой, с которой я не могу справиться. Когда я захожу на VPS через SSH и пытаюсь установить VPN-соединение на этом VPS, SSH-соединение между VPS и моей машиной теряется. Я предполагаю, что это потому, что маршрутизация изменилась настройками VPN. Как это предотвратить?

mic22
источник
Как насчет подключения к SSH после создания VP? : p Вы правы, что это вызвано тем, что VPN перезаписывает пути маршрутизации. То, что вы можете сделать, это сохранить исходные пути без изменений и просто добавить дополнительный путь VPN (если вы не хотите использовать свой VPS в качестве прокси-сервера. Это другая история). Какой клиент вы используете?
Николайдис Фотис
Что вы имеете в виду под «попытаться установить VPN-соединение на этом VPS»? Вы подключаетесь с вашего компьютера к серверу Openvpn на VPS? Ваш VPS подключается к серверу Openvpn, работающему на третьем хосте? В этом последнем случае такое VPN-соединение отталкивает некоторые маршруты? Также, пожалуйста, подтвердите, что нет трансляций NAT для достижения вашего VPS (IP-адрес, настроенный на его интерфейсе, является тем же, что вы указываете в соединении SSH?
Дамиано Верзулли
@NikolaidisFotis Я не могу подключиться, так как VPN работает. Я пользуюсь openvpn клиентом. Существует --route-noexecвозможность игнорировать маршруты, выдвигаемые сервером, но, как вы упомянули, это не помогает, когда я хочу использовать VPN в качестве прокси ...
mic22
@DamianoVerzulli второй вариант, да маршруты проталкиваются (но я думаю, что это нужно сделать, поскольку мне нужно, чтобы VPN действовал как прокси-сервер для синхронизации исходного IP-адреса машины), и нет, там нет NAT
mic22

Ответы:

6

Вам нужно добавить route-nopullопцию (и удалить, redirect-gatewayесли она существует) в файл конфигурации вашего клиента OpenVPN на вашем VPS.

Таким образом, подключение к VPN-серверу не изменит никаких маршрутов на вашем VPS, поэтому вы сможете сами установить те маршруты, которые вам нужны.

Anubioz
источник
Привет, спасибо за этот совет, но теперь я не могу подключиться к интернету через tun0. Я полагаю, что мне не хватает шлюза. Есть идеи как добавить шлюз для tun0? Соответствующая часть ifconfig:inet addr:10.56.10.6 P-t-P:10.56.10.5 Mask:255.255.255.255
Housemd
Вам нужно вручную добавить маршрут к самому VPN-серверу через шлюз вашего провайдера по умолчанию, а затем добавить шлюз по умолчанию через 10.56.10.5 для всего остального трафика
Anubioz
Извините, что? Я понятия не имею, что вы только что сказали. Не могли бы вы привести пример?
Housemd
Позвольте мне просто уточнить - я не хочу, чтобы маршрут по умолчанию был через tun0, но мне нужен tun0 для доступа в Интернет.
Housemd
@Housemd хм, вам нужен доступ в Интернет через tun0 самостоятельно, или вам нужны клиенты, подключенные через tun0 из других мест, чтобы иметь доступ в интернет?
Анубиоз
4

Давайте рассмотрим следующий сценарий:

  1. ваш VPS имеет единый интерфейс Ethernet, настроенный с IP-адресом 4.3.2.1/24;
  2. ваш VPS может получить доступ к Интернету через шлюз по умолчанию 4.3.2.254
  3. ваш VPS еще не активировал какое-либо соединение OpenVPN; следовательно, нет активного интерфейса Tun

В таком случае на вашей машине (предположим, что ваша машина работает с 9.8.7.6/24 с def-gw 9.8.7.254), вы можете успешно установить SSH-соединение с 4.3.2.1. Следовательно, оба хоста 4.3.2.1 и 9.8.7.6 могут успешно достигать друг друга.

Теперь, когда установлено такое соединение SSH, предположим:

  1. вы запускаете соединение OpenVPN с вашего VPS 4.3.2.1;
  2. таким образом, новый интерфейс tun0 будет динамически сконфигурирован (предположим, ему будет назначен IP-адрес 10.10.10.2 с PTP 10.10.10.1).

На этом этапе:

  • Если ни один маршрут не будет перенаправлен с удаленного сервера OpenVPN на ваш локальный VPS, то с точки зрения маршрутизации ничего не изменится, и ваше SSH-соединение будет работать без проблем вообще. В этом случае единственный трафик, проходящий через VPN, - это трафик, направленный на удаленный сервер OpenVPN (10.10.10.1);

  • Если удаленный сервер OpenVPN будет отодвигать некоторый маршрут и EXPECIALLY если VPS по умолчанию шлюз будет заменен на 10.10.10.1 (удаленной OpenVPN конечной точки), ТОГДА у вас возникли проблемы. В этом случае вы туннелируете ВСЕ исходящий IP-трафик (за исключением самого OpenVPN) внутри VPN.

Во втором случае (замена def-gw сразу после установки VPN-соединения) ваше предыдущее SSH-соединение будет «зависать» из-за асимметричной маршрутизации:

  • Трафик с вашей машины (9.8.7.6) на VPS (4.3.2.1) будет проходить по предыдущему, никогда не меняющемуся пути;
  • Трафик с VPS (4.3.2.1) на ваш компьютер (9.8.7.6):
    • без VPN (следовательно, изначально) был маршрутизирован через шлюз 4.3.2.254;
    • после установления VPN-канала с соответствующей заменой def-gw маршрутизируется через VPN (10.10.10.1).

Другими словами: как только VPN-соединение будет установлено, ваш обратный маршрут от VPS к вашему компьютеру изменится и ... это нехорошо (несколько сетевых устройств вдоль обратного пути могут распознавать такие асимметричные путь и просто отбросить пакеты).

Кроме того, высока вероятность того, что ваш удаленный сервер OpenVPN действует как NAT-блок: весь трафик, поступающий из VPN, будет NAT с публичным IP-адресом удаленного сервера OpenVPN. Если это так, то ничего не более ... «не хорошо», но определенно «плохо», как для вашего SSH-соединения: обратный трафик, в дополнение к тому, чтобы вернуться по другому маршруту, возвращается на ваш компьютер с другой IP-адрес источника (один из открытого интерфейса VPN-сервера).

Как решить эту проблему?

Довольно легко, действительно.

Просто дайте указание вашему VPS-серверу не направлять трафик на ваш компьютер по VPN, а вместо этого полагаться на предыдущий маршрут . Это должно быть так же просто, как добавить, перед запуском OpenVPN:

     route add -host 9.8.7.6 gw 4.3.2.254

где:

  • 9.8.7.6 - публичный IP-адрес вашей машины
  • 4.3.2.254 - это исходный шлюз по умолчанию вашего VPS.

PS: предоставив гораздо более подробный вопрос, вы бы получили гораздо более быстрый ответ :-)

Дамиано Верзулли
источник
Спасибо за ваш ответ @DamianoVerzulli! Шлюз по умолчанию не указан. route addкоманда с такими 0.0.0.0 gw возвращаетSIOCADDRT: Invalid argument
mic22
Вот что я получаю сразу после подключения openvpn[server] Peer Connection Initiated with [AF_INET]64.251.27.139:443; TUN/TAP device tun0 opened; do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0; /sbin/ip link set dev tun0 up mtu 1500; /sbin/ip addr add dev tun0 10.200.1.251/22 broadcast 10.200.3.255; ERROR: Linux route add command failed: external program exited with error status: 2
mic22
@ mic22: Интересно, как def-gw вашего VPS может быть не указан, так как в этом случае такой VPS не может достичь чего-либо за пределами локальной подсети (а это означает, что ваша машина может подключаться через SSH - и сервер OpenVpn) - быть способным установить VPN - должен быть "локальным" и, как таковой, совершенно бесполезным!). Кстати, когда вы подключены через SSH, вы можете легко получить def-gw с помощью «netstat -rn» (строка, начинающаяся с 0.0.0.0, второй столбец)
Дамиано Верзулли
netstat -rnрезультат 0.0.0.0 0.0.0.0 0.0.0.0 U 0 0 0 venet0VPS, который я использую, является базовым вариантом OVH с Ubuntu 14.04 Server на борту
mic22
ifconfigи netstat -rnвывод: goo.gl/TEZ61q
mic22
0

Это может помочь:

положить TCPKeepAlive=yesв свой/etc/ssh/sshd_config

Из

man sshd_config | less +/'^ *TCPKeepAlive'

TCPKeepAlive

Указывает, должна ли система отправлять сообщения поддержки активности TCP другой стороне. Если они отправлены, смерть соединения или сбой одной из машин будут правильно замечены. Однако это означает, что соединения прервутся, если маршрут временно не работает, и некоторые люди считают это раздражающим. С другой стороны, если сообщения поддержки активности TCP не отправляются, сеансы могут зависать на сервере неограниченное время, оставляя «призрачных» пользователей и потребляя ресурсы сервера.

По умолчанию yes'' (to send TCP keepalive messages), and the server will notice if the network goes down or the client host crashes. This avoids infinitely hanging sessions. To disable TCP keepalive messages, the value should be set toнет ''.

Жиль Квено
источник
У меня уже была TCPKeepAliveопция, yesтак что это неправильное решение
mic22
0

У меня была эта проблема, и я попробовал все рекомендуемые решения, и все же моя проблема не была решена!

После многих попыток решения я использовал screenкоманду. (мой VPN-клиент cisco-any-connect).

$ screen -R VPN
$ openconnect -b "your server"

После предоставления ваших учетных данных, немедленно нажмите Ctrl + A + D и вернитесь к сеансу.

Нима Горбоуби
источник
0

Лично я предпочитаю, чтобы все подключения к SSH маршрутизировались через VPN. В случае активного ssh-соединения перед установкой VPN, он должен переподключиться из-за изменения маршрута.

Я рекомендую использовать autossh Под вашей конфигурацией клиента ssh просто добавьте.ssh/config

Host *
   ServerAliveInterval 300
   ServerAliveCountMax 2
   BatchMode yes
  • BatchMode означает автоматическое переподключение
  • ServerAlive расшифровывается как Keeping Alive
Лукаш Виктора
источник
-1

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

добавление маршрута -host your-machine-public-ip gw Сервер-gatway-ip dev eth0

your-machine-public-ip: IP вашего компьютера, с которого вы делаете SSH. Server-gatway-ip: IP-адрес Gatway / router этого сервера

Приведенная выше команда перенаправит трафик через данный шлюз, а не через VPN-сервер.

Мохамед Сабиль
источник
Это сбивает с толку, и язык, кажется, имеет его задом наперед. Не хотите ли добавить маршрут с IP-адресом цели SSH и шлюзом по умолчанию на локальной рабочей станции?
rmalayter