Стабильная переадресация портов в SSH и устаревшие сессии

5948
Vi.

Использование VPS для переадресации портов за NAT:

for((;;)) { ssh -R 2222:127.0.0.1:22 vi@vi-server.org; sleep 10; } 

Когда связь как-то нарушена и она восстанавливается.

Warning: remote port forwarding failed for listen port 2222 Linux vi-server.no-ip.org 2.6.18-92.1.13.el5.028stab059.3 #1 SMP Wed Oct 15 13:33:44 MSD 2008 i686 

Я печатаю:

vi@vi-server:~$ killall sshd Connection to vi-server.org closed by remote host. Connection to vi-server.org closed. Linux vi-server.no-ip.org 2.6.18-92.1.13.el5.028stab059.3 #1 SMP Wed Oct 15 13:33:44 MSD 2008 i686 vi@vi-server:~$  

Сейчас все хорошо.

Как проще сделать это автоматически?

6
Можете ли вы дать немного больше информации о том, что вы пытаетесь достичь с этим? Doug Harris 14 лет назад 0
Переадресация удаленного порта на локальный компьютер через SSH, даже если соединение не установлено. Старое SSH-соединение по-прежнему считается работоспособным сервером и не позволяет подключить удаленный порт для прослушивания, поэтому мне нужно явно прервать соединение в стойле («killall sshd»). Vi. 14 лет назад 0
Теперь добавил -t sh -c "kill \` pidof sshd -o $ PPID \ `2> / dev / null && echo" Повторная попытка "> & 2 && exit 0; exec bash -il" в команду, похоже, что хак работает , Есть ли более чистые способы сделать это? Vi. 14 лет назад 0
@Vi. Просто любопытно, если вы все-таки использовали хак или нашли чистую альтернативу. Я сталкиваюсь с той же проблемой, и хотел бы не убивать все открытые соединения SSH при каждом переподключении. Alan Christopher Thomas 12 лет назад 0
Я использую различные виды взлома (в том числе отправка keep-alives и повторное подключение, если они не были получены) в настоящее время. (Это не значит, что я советую использовать хаки вместо правильных решений). Vi. 12 лет назад 0

3 ответа на вопрос

8
vaab

Я думаю, что вы приняли неправильную сторону: в вашем случае sshd(на стороне сервера) , вероятно, не происходит сбой и нет устаревших сеансов, поэтому его уничтожение не должно помочь вам, кроме побочного эффекта грубой остановки любого подключенного sshклиентского соединения.

Это sshклиент, который не завершает соединение при сбое построения механизма перенаправления портов. И это поведение не ошибка.

Вам нужно посмотреть на ExitOnForwardFailureопцию в руководстве ssh.

Ваш сценарий будет:

 for ((;;)) 

Кроме того, вы можете захотеть затянуть ServerAliveIntervalи ServerAliveCountMaxдля клиента, чтобы обнаружить более быстрое разъединение. (И вы должны убедиться, что TCPKeepAliveэто onчто является значением по умолчанию). Обратите внимание, что autosshэто не поможет вам больше, если вы установили эти параметры.

ExitOnForwardFailure - хороший вариант, но он предотвратит мой сеанс, вместо того, чтобы пнуть устаревший сеанс. Вероятно, что-то вроде `ssh ... -o ExitOnForwardFailure = yes || ssh ... "убить устаревшую сессию" `можно использовать. Vi. 12 лет назад 0
Если для туннеля назначен отдельный пользователь, устаревший туннель можно удалить с помощью kill -HUP sshd, обработанного этим пользователем. Смотрите другие советы: http://serverfault.com/questions/566501/reverse-ssh-tunnel-failing-looking-for-debug-advice Кроме того, netstat --listen -lnp дает pid интересующего процесса sshd. Было бы еще интересно, как правильно это автоматизировать? Roman Susi 8 лет назад 0
2
Sunday

Я вижу, что уже есть хороший ответ, ссылающийся на существующее программное обеспечение (autossh), которое автоматически поддерживает переадресацию портов через ssh.

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

#!/bin/bash  while true do START=$(date +%s) ssh -NR rport:host:lport -o ServerAliveInterval=10 -o ExitOnForwardFailure=yes user@host END=$(date +%s) DIFF=$(( $END - $START )) if (( $DIFF < 3 )) then sleep 60 fi done 

Если переадресация повторяется неудачно, достаточно повторить попытку один раз в минуту, если после разрыва соединения какое-то время будет разорвано, попытка будет повторена немедленно.

Я использую его на archlinux с systemd (написал небольшой .service-файл), и он работает как шарм.

Может быть лучше, если также реализовать устаревшие сессии. Vi. 11 лет назад 0
1
Vi.

Похоже, AutoSSH - правильная вещь для этого.

Autossh - это программа, которая запускает копию SSH и отслеживает ее, перезапуская по мере необходимости, если она умирает или прекращает пропуск трафика. Оригинальная идея и механизм были вдохновлены RSTunnel (Reliable SSH Tunnel).

В версии 1.2 метод изменился: autossh начал использовать SSH для создания цикла пересылок SSH (один с локального компьютера на удаленный и один с удаленного на локальный), а затем отправлять тестовые данные, которые он ожидает получить обратно, (Идея была благодаря Терренсу Мартину.)

В версии 1.3 был добавлен новый метод (спасибо Рону Йорстону): для удаленной службы эха можно указать порт, который будет передавать тестовые данные. Это позволяет избежать перегрузки и ухудшения ситуации, когда все номера портов на удаленном компьютере не конфликтуют. Метод зацикливания пересылок остается доступным для ситуаций, когда использование эхо-службы может быть невозможно.

Характеристики

  • autossh - это программа, которая запускает копию ssh и отслеживает ее, при необходимости перезапуская, если она умирает или прекращает пропуск трафика. Идея взята из rstunnel (Reliable SSH Tunnel), но реализована на C.
  • По мнению автора, это не так сложно, как rstunnel, чтобы добраться до работы.
  • Мониторинг соединения с использованием петли переадресации портов или удаленного эхо-сервиса.
  • Отменяет частоту попыток подключения при возникновении быстрых сбоев, например, при отказе подключения.
  • Скомпилировано и протестировано на OpenBSD, Linux, Solaris, Mac OS X, Cygwin и AIX; должен работать на других BSD.
  • Freeware.
(Но я уже настроил схему для «призрачных» устаревших сессий ssh, так что я, вероятно, буду использовать autossh, когда мне понадобится что-то более надежное). Vi. 14 лет назад 0
Я все время читаю, что AutoSSH - правильный выбор для этого - но я все равно получаю предупреждение «Переадресация удаленного порта», когда соединение устанавливается снова. Не вижу, что здесь происходит не так .. con 9 лет назад 0

Похожие вопросы