поддерживать соединение SSH живым и постоянным при переключении соединений сетевого интерфейса


13

Сценарий:

  1. На моем столе с ноутбуком подключен к Ethernet и подключен к удаленному серверу через SSH
  2. Хотите переехать в другую сторону офиса с ноутбуком и перейти на WiFi, не прерывая SSH-соединение

Я пробовал: сначала подключиться к WiFi, затем отключить Ethernet; а также сначала отключение Ethernet, затем подключение к WiFi. Ни один из подходов не работает. Также пробовал при использовании серверов Ubuntu и OS X вместе с обоими вариантами ОС, а также для клиента. Неудачно.

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

Я понимаю, что могу просто оставаться на Wi-Fi целый день, но я не хочу этого делать. Я также понимаю, что могу просто работать в рамках сеанса экрана на удаленном сервере и затем повторно подключаться к этому сеансу экрана после изменения интерфейсов, но я также не хочу этого делать. Например, я мог бы передать какую-то большую команду, такую ​​как дамп базы данных по SSH, или у меня могут быть файлы, открытые через SSHFS, или я просто хотел бы избежать неудобств повторного подключения


3
Если вы получаете один и тот же IP-адрес в обоих направлениях, то это должно работать. Если нет, то это практически невозможно.
Алан Карри

@AlanCurry Если и клиент, и сервер поддерживают MPTCP, то это возможно. Но поддержка MPTCP все еще очень ограничена, так что вряд ли это так.
Касперд

Ответы:


4

Я подозреваю, что это решение не будет работать для SSHFS и т. Д., Но вы можете взглянуть на Mosh, который обеспечивает поддержку роуминга по крайней мере для самой оболочки.


Это выглядит как очень хорошее решение, но, к сожалению, его нужно установить и на сервере, что не всегда возможно из-за разрешений.
user000001

4

Боюсь, вы не можете сделать это по определению. Сеанс SSH выполняется по TCP-соединению, которое определяется четырьмя кортежами (адрес источника, порт источника, адрес назначения, порт назначения). Вы не можете перенести существующее соединение на другой адрес на клиенте (кроме того факта, что ОС разорвет соединение, когда интерфейс выйдет из строя).

NAT может усложнить эту картину, но никак не поможет вам.


Да, но приложение может восстановить соединение, как только узнает, что сокет закрыт. Есть ли в протоколе SSH возможность возобновить старый сеанс?
Аджай Брахмакшатрия

@AjayBrahmakshatriya SSH не имеет инструментов для возобновления сеансов
Ferrybig

2

Старый поток, я знаю, но ради полноты, так как я искал то же самое ...

В Windows 7 или новее вы должны просто иметь возможность выбрать адаптер Wi-Fi и адаптер Ethernet и выбрать «Мостовое соединение». Это даст вам один IP-адрес для обоих, и теперь вы сможете отключить и повторно подключить Ethernet по желанию (при условии постоянного покрытия Wi-Fi).


Хорошая идея, мне придется попробовать это.
Даг

Если вы делаете это, не можете подключиться к обеим сетям одновременно, в зависимости от настроек, это пинает всех в области сети (источник: это случилось со мной)
Ferrybig

2

Я справляюсь с этим двумя способами:

Начните сеанс с сервера терминалов в вашем центре данных (RDP / Windows / и т. Д.)

ИЛИ

Установите GNU или и запустите их после входа в систему.

Я предпочитаю, tmuxпотому что screenэто довольно старая школа, но если вам разрешено устанавливать только поддерживаемые пакеты, screenэто в репозитории RHEL.

ИЛИ

Делай оба.


tmuxдействительно удобно. Запуск удаленных вещей внутри tmux- отличная привычка.
цыплята

Да, я согласен. Функция множественного окна великолепна.
Даг

1

Это не может быть сделано легко.

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

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

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


1

Проблема, вероятно, в том, что ваш IP-адрес источника изменяется при переключении между кабельным и Wi-Fi. Это предотвратит возврат сессий ssh.

Я справился с этим в linux, подключившись через vpn и убедившись, что соединение vpn всегда дает один и тот же ip вашей учетной записи (не сложно применить, но высока вероятность того, что вы все равно получите по умолчанию тот же ip через vpn, если он доступно, но лучше придерживаться этого, чтобы быть уверенным). Я в основном использую vtun, но openvpn тоже хорошо. Убедитесь, что ваши соединения проходят через vpn (правильная маршрутизация, заданные префиксы, ...)

Я был в состоянии быть в автономном режиме от кабеля даже в течение 5 минут, а затем подключиться к Wi-Fi и по-прежнему могу оставаться на связи со всеми моими сессиями SSH. Постоянный ping, mtr, htop, ... просто продолжайте, когда vpn восстанавливается, как будто ничего не произошло.


0

Попробуйте быть только на Wi-Fi при первом запуске сеанса SSH. Затем подключите Ethernet. Это должно позволить новым соединениям проходить через Ethernet, но установленное соединение останется на Wi-Fi. По крайней мере, я видел, как это работает с OSX, поэтому ОС / оборудование может отличаться.


0

Я почти уверен, что вы можете сделать это с каким-то глупым количеством хаков с виртуальными машинами и туннелированием.

Это не проверено, но дайте мне знать, если это действительно работает.

  1. Создайте гостевую виртуальную машину, которая имеет 2 интерфейса, 1 мостовой адаптер (для Wi-Fi) и 1 хост-сеть
  2. Допустим, у виртуальной машины есть 192.168.0.25 для мостового адаптера для жены и 192.168.56.5 только для хоста.
  3. Внутри vm создайте соединение ssh с туннелем к порту удаленной стороны 22 ssh -L 10022:remote.server.example.com:22
  4. Теперь подключитесь через туннель. ssh 192.168.56.3 -p 10022
  5. Если вы потеряете соединение Wi-Fi, замените адаптер на виртуальной машине на адаптер ethernet.
  6. Надеюсь, это не хуп или не испортить таблицу маршрутизации

дайте мне знать, если это работает.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.