Как сохранить SSH у VPS при включенном VPN

Не получается получить доступ к vps при вклеченном на нем openvpn клиенте. Собственно, задача, чтобы vps был частью частной сети VPN и я мог к нему подключиться удаленно через ssh по его публичному адресу.

Как я настраивал окружение:

Создал vps и настроил на нем OpenVPN сервер.
Доступ:

[email protected]
b7pcJ*NRNnGS

Есть удаленный сервер, который я хочу подключить, как клиента Open VPN сети. Доступ:

[email protected]
b7pcJ*NRNnGS

Вот так я поднял openVPN сервер (использовал скрипт):

wget https://git.io/vpn -O openvpn-install.sh
sudo chmod +x openvpn-install.sh
sudo bash openvpn-install.sh

А вот код для поднятия клиента:

sudo apt install apt-transport-https
sudo wget https://swupdate.openvpn.net/repos/openvpn-repo-pkg-key.pub
sudo apt-key add openvpn-repo-pkg-key.pub
sudo wget -O /etc/apt/sources.list.d/openvpn3.list
sudo wget -O /etc/apt/sources.list.d/openvpn3.list https://swupdate.openvpn.net/community/openvpn3/repos/openvpn3-jammy.list
sudo apt update
sudo apt install openvpn3
openvpn3 session-start --config client1.ovpn

(Сертификаты можете взять по пути ~/certs)

Далее на сервере запущен openVPN:

systemctl start openvpn@server

Подключение проверил - все работает https://i.stack.imgur.com/uV29h.png

На клиенте при подключении к серверу я сразу теряю ssh. Задача, чтобы vps был в той же сети VPN, но я мог к нему подключиться по его публичному ip по ssh.


Ответы (1 шт):

Автор решения: Pak Uula

Короткий ответ

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

Развёрнутый ответ

Я буду демонстрировать на примере моего VPS сервера 146.71.77.201.

Для того, чтобы соединение с сервером-клиентом 45.141.79.89 (в моём случае 146.71.77.201) не разрывалось, нужно настроить на сервере-клиенте маршрут к вашему рабочему компьютеру

  1. ip route list match 0.0.0.0/1 напечатает информацию о дефолтной маршрутизации. У меня это default via 146.71.77.1 dev eth0 onlink - гейтвей 146.71.77.1, сетевая карта eth0

  2. Теперь узнаем, с какого адреса вы подключились. Это можно сделать несколькими способами, я воспользовался netstat:

    netstat -npt | grep :22
    tcp        0     36 146.71.77.201:22        118.128.28.53:64597     ESTABLISHED 3277529/sshd: root@
    

    Вывод команды означает, что к порту SSHD моего VPS сервера есть подключение с адреса 118.128.28.53 (это внешний адрес нашего офисного роутера)

  3. Теперь добавим фиксированный маршрут до офисного роутера

    ip route add 118.128.28.53 via 146.71.77.1
    

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

  4. Проверяем: openvpn start-session --config tmp/test.ovpn

    SSH подключение к серверу-клиенту на месте ;)

    ip route - смотрим таблицу маршрутизации после подключения VPN:

    0.0.0.0/1 via 10.8.0.1 dev tun0
    default via 146.71.77.1 dev eth0 onlink
    10.8.0.0/24 dev tun0 proto kernel scope link src 10.8.0.1
    10.8.0.0/16 dev tun1 proto kernel scope link src 10.8.0.5
    118.128.28.53 via 146.71.77.1 dev eth0
    128.0.0.0/1 via 10.8.0.1 dev tun0
    146.71.77.0/24 dev eth0 proto kernel scope link src 146.71.77.201
    185.159.130.117 via 146.71.77.1 dev eth0
    

    Что видим:

    • 0.0.0.0/1 via 10.8.0.1 dev tun0 Весь трафик по умолчанию идёт через виртуальный интерфейс tun0
    • 185.159.130.117 via 146.71.77.1 dev eth0 Трафик к VPN серверу 185.159.130.117 идёт через локальную сеть провайдера в обход tun0 (это логично, иначе трафик бы зациклился :) )
    • 118.128.28.53 via 146.71.77.1 dev eth0 Трафик к моему офисному компьютеру идёт через локальную сеть провайдера в обход tun0. Благодаря этой строке сохранилось ssh подключение к клиентской машине.

Доказательство - ssh сессия, в которой была запущена сессия VPN, активна после запуска VPN введите сюда описание изображения

→ Ссылка