LINUX.ORG.RU
ФорумAdmin

Перенаправление портов через SSH + нестабильное соединение

 


1

1

Имеется роутер в жопе мира (с выходом в сеть через 3G-модем, со всеми вытекающими из этого свойствами соединения в виде «ни единого разрыва»). Чтобы этот роутер по-разному админить, я запускаю оттуда обратный SSH-туннель до машинки с globally routable адресом: ssh -N -R 12200:localhost:22 host. При завершении ssh он перезапускается.

Проблема в том, что после потери соединения может получиться так, что клиент уже завершился и перезапустился, а сессия на сервере всё ещё висит. Следовательно, повторное перенаправление того же порта фейлится и туннель умирает, поскольку клиент не считает это ошибкой и «пустая» сессия преспокойно висит неограниченное количество времени.

В openssh есть клиентская опция ExitOnForwardFailure, которая гипотетически может помочь (соединение будет циклически подниматься и отваливаться, пока старая сессия на сервере не умрёт), но на роутере dropbear, в котором аналогичной опции нет.

Следовательно, вопрос: как сэмулировать это поведение server-side? Или, ещё лучше, как заставить сервер при появлении нового соединения немедленно терминировать старое, чтобы оно не мешалось?

★★★★★

Последнее исправление: intelfx (всего исправлений: 2)

Насщет опций не подскажу - гуглить нужно. Но я бы задачу решал либо через скрипты (чтоб роутер вначале заходил на сервер и сам чистил сессии) Либо (что более вероятно) завел отдельного пользователя на сервере и назначил бы ему ограничение в 1 сессию на сервере череза PAM, либо назначил ему специальный shell который бы кикал все старые сесси при запуске если такие есть.

zaz ★★★★
()
Последнее исправление: zaz (всего исправлений: 1)
Ответ на: комментарий от zaz

Специальный юзер, в принципе, уже есть и используется. Но он используется для кучи устройств в похожей конфигурации; заводить по юзеру на устройство не хочу.

Можно ли как-нибудь кикнуть не все сессии юзера, а только соединения, открытые с конкретного адреса?

intelfx ★★★★★
() автор топика
Ответ на: комментарий от intelfx

в принципе можно темже netstat найти sshd который обслуживает соединение с этого же IP но на другом терминала и завершить его, но это уже возня будет с настройками ... Может вам проще в сесси которая делает тунел запускать процесс который будет постоянно чтото писать в терминал, тогда сесси на сервере не должны залипать на долго. А в качестве процесса можно запускать скрипт который скажем 1 раз в сукунду будет проверять жив ли портфорвардинг (через тотже netstat) - если жив писать сообщение на экран, если нет - завершать текущую сессию (это на случай если всеже запустится вторая сессия с тогоже устройства до тога как первая отвалится, в этом случае скрипт дождется завершения первой и закроет свою сессия - канал переустоновится)

zaz ★★★★
()
Ответ на: комментарий от axelroot

Ты ОП читал? У меня нет проблемы с тем, чтобы переподнять соединение. У меня проблема с тем, что сессия на сервере ещё некоторое время после разрыва висит и мешается.

intelfx ★★★★★
() автор топика
Ответ на: комментарий от intelfx

Ты ОП читал?

Periodically (by default every 10 minutes), autossh attempts to pass traffic on the monitor forwarded port. If this fails, autossh will kill the child ssh process (if it is still running) and start a new one;

axelroot
()
Последнее исправление: axelroot (всего исправлений: 1)
Ответ на: комментарий от axelroot

Ещё раз повторяю: клиент умеет перезапускаться после разрыва соединения. Сессия остаётся висеть на сервере.

intelfx ★★★★★
() автор топика
Ответ на: комментарий от i-rinat

Есть (сервер — обычный openssh), включена. Интервал между переподключениями иногда небольшой, меньше TCP-таймаута.

intelfx ★★★★★
() автор топика
Ответ на: комментарий от intelfx

OpenVPN туда вгородить не проще? У меня всякое говно с приватными адресами и прочими 3г так работает - как раз роутеры на OpenWRT.

blind_oracle ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.