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

постоянное SSH-соединение при подключении к VPN

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

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

есть ли способ сохранить соединение SSH при подключении к VPN? Спасибо.


openconnect требует аргумент --script, который принимает сценарий для настройки маршрутизации, без него соединение будет успешным, но имена не будут разрешены, а IP-адрес интрасети останется действительным.

В настоящее время я использую Ubuntu по умолчанию / etc / vpnc / vpnc-script (вставлен сюдаЯ хорошо разбираюсь в сценариях оболочки, но я очень мало знаю о сети, и если мне придется что-то изменить, мне понадобится справка о том, что и как это изменить.

есть ли способ сохранить соединение SSH при подключении к VPN?

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

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

Общий ответ

Вы должны использовать --script и --script-tun варианты openconnect и предоставить обычай vpnc-скрипт. Хорошей отправной точкой является vpnc-script распространяется уже с вашим openconnect, Например, на OSX (HomeBrewed openconnect) он расположен по адресу /usr/local/etc/vpnc-script.

Обратите внимание, что согласно официальной документации openconnect:

OpenConnect просто обрабатывает связь с сервером VPN; Это не знать, как настроить сетевую маршрутизацию и службу имен во всех различных операционных системах, в которых она работает.

Чтобы настроить службу маршрутизации и имен, он использует внешний сценарий, который обычно называется vpnc-script.


Лучшее решение

Уже есть хороший проект под названием ocproxy который действует как прокси-сервер для openconnect, отсюда и название ocproxy (ОручкаConnectПрокси).

ocproxy - это SOCKS уровня пользователя и прокси-сервер переадресации портов для OpenConnect на основе lwIP. При использовании ocproxy OpenConnect обрабатывает только сетевую активность, которую пользователь специально запрашивает у прокси, поэтому интерфейс VPN больше не «захватывает» весь сетевой трафик на хосте.

Пример команды OpenConnect:

echo $1 | sudo openconnect -u $2 -d --timestamp -v --passwd-on-stdin --script-tun --script "ocproxy -D $3 -v" $4

Заменить:

  • $1 с: Пароль OpenConnect
  • $2 с: Имя пользователя OpenConnect
  • $3 с: Требуемый порт прокси Socks5
  • $4 с: Адрес сервера OpenConnect

Вы можете посмотреть, что находится в iptables, который обрабатывает фильтрацию пакетов в ядре. я использую openconnect с другого направления, и настройка по умолчанию - удалить доступ к стандартным интерфейсам в пользу вновь созданного интерфейса VPN. Первое, что нужно сделать, это выяснить, какие маршруты создает VPN-соединение. Затем вы можете написать сценарий для обработки шлюза и маршрутов, а затем, наконец, сбросить iptables и очистить "цепочку" VPN (термин, используемый в iptables). У меня есть сценарий, который выглядит примерно так:

IPADDR=NN.NN.NN.N
DESIREDNET1=MM.MM.MM.MM
GATEWAY_LINE=$(netstat -rn | grep ${IPADDR})
GATEWAY=$(echo "$GATEWAY_LINE" | awk '{print $2}')
GATEWAY_DEV=gw
if [ "$GATEWAY" = "*" ]; then
    GATEWAY=$(echo "$GATEWAY_LINE" | awk '{print $8}')
    GATEWAY_DEV=''
fi
# add custom routes
route add -net $DESIREDNET1 netmask 255.255.0.0 dev cscotun0
...
# reset the default route
route del default
route add default $GATEWAY_DEV $GATEWAY

# flush iptables to clear the ciscovpn chain
iptables --flush
iptables --delete-chain
# Add out own nameservers back
if [ -f /etc/resolv.conf.vpnbackup ]
then
   cat /etc/resolf.conf /etc/resolv.conf.vpnbackup > /etc/resolv.conf
   echo "nameserver $GATEWAY" >> /etc/resolv.conf
fi

Вам нужно будет скопировать /etc/resolv.conf к /etc/resolf.conf при отключенном VPN, чтобы иметь возможность вернуть «нормальные» настройки.

Удачи.

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

Я не использую openconnect, но в openvpn можно поставить галочку use this connection only for resources on its network в конфигурации VPN.

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

Меня устраивает.

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

Для удаленного подключения по SSH:

  • подключить внутренний (LAN IP) целевого VPS (тот, который подключается к VPN)
  • используя в качестве туннеля мини-VPS - поэтому подключитесь к внешний IP мини-VPS

Итак, предпосылки для этого:

  1. чтобы иметь возможность создать дополнительный VPS в той же сети
  2. назначить обеим машинам локальный дополнительный IP

Это легко и возможно в популярных облаках, таких как DigitalOcean, Linode и т. Д.