LINUX.ORG.RU

putty (plink) port forwarding timeout

 , , ,


0

1

Добрый день. На винде за NAT’ом в цикле запущен plink

:a
plink "STORED_NAME" -l user1 -v -R 1234:127.0.0.1:1234 -no-antispoof -4 -N
goto a

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

На сервере открывается порт 127.0.0.1:1234, который через SSH туннель перенаправлен на порт 1234 открытый на машине с виндой. К нему на сервере периодически подключается программа.

netstat -lnp | grep ssh

показывает наличие открытого порта 1234 за процессом [PID процесса]/sshd: user1 запущенным от имени user1. У user1 шелл установлен в /bin/true чтобы не было возможности исполнять никакие команды.

Проблема: соединение иногда обрывается, видимо из-за длительной неактивности, но при этом на сервере процесс с открытым портом запущен, на клиенте plink также запущен, но подключиться невозможно. Как сделать так чтобы при обрыве связи падал либо процесс на клиенте, либо процесс на сервере, чтобы инициировалось переподключение?

Откуда ты узнал что соединение обрывается?

А вообще у тебя тут три проблемы. Во-первых, даже если ты починишь реконнект, работать нормально при обрывах оно у тебя не будет. Вот клиент заметил что соединение оборвалось, перезапустил plink, подключился к серверу, а сервер ему отвечает что порт уже занят и в форварде отказано. Занят, потому что на сервере всё ещё залогинен старый коннект. Чтобы этого не случалось, «sshd: user1» на сервере должен выключиться раньше, чем клиент заметит потерю коннекта. Сделать это надёжно в твоей схеме по-моему почти невозможно, но можно следить за ошибками проброса портов и перезапускаться если они есть, в надежде что сервер все-таки заметит упавший коннект и даст порт новому.

Во-вторых, у тебя нат походу молча забывает старые коннект через себя, и начинает игнорировать все пакеты, которые к ним относятся (а должен отвечать RST, впрочем тебе бы это не помогло). Чтобы стороны соединения быстрее замечали его пропажу (если это действительно пропажа) - надо уменьшить какой-то из tcp таймаутов (как они называются - не помню, но по умолчанию система, когда замечает что коннект завис, очень очень долго ждёт а вдруг он починится, перед тем как его обраывать).

В-третьих, у тебя plink вообще никогда не заметит что коннект оборвался, потому что ничего не шлёт в него. Надо чтобы слал, и тут два варианта. 1) пробрось наружу ещё один порт через -L, чтобы комп изнутри мог куда-то якобы подключаться и время от времени трогай его телнетом. 2) возможно у plink есть аналог ServerAliveInterval ServerAliveCountMax из openssh-клиента, они будут ещё лучше т.к. они покроют и вторую проблему с tcp-таймаутами.

firkax ★★★★★
()
Ответ на: комментарий от firkax
  1. Откуда ты узнал что соединение обрывается? Сразу после установки соединения с сервера под Linux успешно устанавливается подключение к программе, работающей на ПК с виндой. Через несколько часов при попытке подключиться - подключение виснет надолго. Если порт на сервере закрыт (процесс sshd: user1 прибил вручную) - при попытке подключиться ошибка происходит сразу.

  2. Ошибку в форварде отказано я замечал. Причину так и не понял потому что Google по дословному тексту этой ошибки ничего по делу не выдает. Видимо, plink настолько редко используемая утилита.

  3. всё ещё залогинен старый коннект А как сделать так чтобы если клиент отвалился - сервер сразу закрывал сессию, а не через несколько часов?

  4. нат походу молча забывает старые коннект через себя Сомневаюсь, но может быть. У меня раньше Windows уходит в ждущий режим и после выхода из него подключение все еще подвешено вместо реконнекта. Хотя если я винду сам посылаю спать с запущенным putty - подключение прерывается с сообщением об ошибке. Отключить спящий режим умею, но сейчас он в качестве проверки ситуации.

  5. потому что ничего не шлёт в него Идея хорошая, попробую постоянно дергать этот порт netcat или чем-то еще. Как вариант, конечно, вернуть шелл и запустить в нем top чтобы постоянно что-то передавалось.

  6. не уверен что plink его поддерживает plink и putty на одной кодовой базе. Вопрос поддерживает ли putty. Один мобильный оператор имеет привычку рубить все подключения по которым ничего не передается через 3 минуты неактивности, ненавижу с него интернет раздавать: забыл в окне putty запустить top - вводишь пароль заново… Но у других провайдеров сессия сколь угодно долго может быть открыта и не рвется.

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

Через несколько часов при попытке подключиться - подключение виснет надолго

Виснет не значит обрывается.

Ошибку в форварде отказано я замечал. Причину так и не понял потому что Google по дословному тексту этой ошибки ничего по делу не выдает. Видимо, plink настолько редко используемая утилита.

plink тут ни при чём, это и с линуксовым ssh-клиентом будет происходить, я описал почему.

клиент отвалился - сервер сразу закрывал сессию, а не через несколько часов?

Сервер не может закрыть сессию если он не знает о том что клиент отвалился. И он никак об этом не узнает пока клиент ему сам об этом не скажет. Чтоб сказать - надо как минимум переподключиться, вобщем всё сложно. Сделать можно, но костылями, я их уже описал: клиент при ошибке форварда должен отключаться и пробовать ещё раз в надежде что сервер наконец сбросит к этому времени старую сессию, а на сервере уменьши таймауты (tcp попыток отправить пакет или ssh keepalive)

нат походу молча забывает старые коннект через себя Сомневаюсь, но может быть

Этот вопрос надо бы прояснить, тогда остальное станет проще. Запусти tcpdump на обоих концах (для винды есть на winpcap.org) и посмотри что там происходит когда коннект «завис».

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

Я не открывал пока второй порт для пинга отдельно, просто в цикле while [] на сервере через nc дергаю открытый порт раз в 5 минут (пока этого хватает). Если будут какие-то проблемы - попробую как-то по другому следуя вашим советам. Всем спасибо за подсказки.

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

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

firkax ★★★★★
()