Назад | Перейти на главную страницу

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

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

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

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

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

  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 отодвинет некоторый маршрут, особенно если шлюз по умолчанию 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.

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

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

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

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

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

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

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

После ввода учетных данных сразу нажмите ctrl + a + d и вернитесь к сеансу.

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

ставить 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нет ''.

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

route add -host your-machine-public-ip gw Server-gatway-ip dev eth0

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

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