Поддерживать соединение пока происходит разрыв

Plok2008

Предыстория такая: есть домашний linux-сервер, который находится за NAT-ом провайдера и это никак не изменить. Для того, чтобы получить к нему доступ из внешнего мира (например для работы по SSH и HTTP) был _куплен_ дешевый VPS-сервер. К сожалению, в настройке его ядра отсутствует поддержка TUN-интерфейса и PPP. Таким образом использование OpenVPN и PPTP для организации туннеля не подходит. Чтобы решить стоящую передо мной задачу, я использовал SSH и port-forwarding. Т.е. пока установлено SSH-соединение ОТ моего домашнего сервера до VPSки, происходить пробрасывание трафика с портов 8022 и 8080 VPS сервера через SSH соединение до соответственно портов 22 и 80 домашнего компа.
Далее мы имеем, что иногда (достаточно часто) SSH соединение разрывается. Скорее всего это проблема (свойство) моего провайдера. Чтобы автоматически переподключать упавшее соединение я использую утилиту autossh, которая сразу же при разрыве SSH соединения производит его переподключение.
Но при этом естественно получается, что все входящие соединения к VPS-серверу на пробрасываемые порты (80xx) рвутся и _клиентам_ приходится производить подключение заново.
Вопрос: существует ли какой-то метод или программа, устанавливаемая на VPS-сервере, которая будет выполнять роль 'прокладки' между _клиентом_ (входящими соединениями) и _сервером_ работающем на нестабильном соединении. Т.е. я хочу, чтобы когда падает мое SSH соединение и пропадает (на оч. короткое время) связь по портам 80xx, эта самая программа бы не рвала соединение с _клиентами_, а ждала бы пока опять появится _сервер_ на портах 80xx.
Я это вижу в следующем виде:

90xx (искомая программа)
|--> 80xx (SSH соединение на VPSку которое слушает и туннелирует этот порт)
|--> xx (конечный сервер дома и в него приходит соединение через ssh туннель)

P.S. Разумное предложение сменить домашнего провайдера, у которого будет сразу белый IP или более стабильная связь (если это именно по его вине происходят разрывы к сожалению, не подходят.

kruzer25

Попробуй погуглить.
Я даже для винды такое решение нашёл - KomodiaRelay, весит килобайт 20.
UPD: С первого раза невнимательно прочитал сообщение.
Чтобы автоматически переподключать упавшее соединение я использую утилиту autossh, которая сразу же при разрыве SSH соединения производит его переподключение.
Но при этом естественно получается, что все входящие соединения к VPS-серверу на пробрасываемые порты (80xx) рвутся и _клиентам_ приходится производить подключение заново.
Ты чего-то нехорошего хочешь. Соединение с реальным сервером (домашним) по каким-то причинам прекратилось, он недоступен - что при этом должно отдаваться клиентам? У клиента тоже может стоять таймаут, он отправил запрос твоей прокладке, а ответа всё нету - и что делать?
Программа, про которую я сказал, не устанавливает соединение с реальным сервером при своём включении, она устанавливает соединение когда кто-то устанавливает соединение с ней; то есть, для клиента всё получается совершенно прозрачно. Удалённый сервер недоступен - для клиента всё будет выглядеть так, как будто он недоступен. Как ещё-то?

Plok2008

Соединение с реальным сервером (домашним) по каким-то причинам прекратилось, он недоступен - что при этом должно отдаваться клиентам? У клиента тоже может стоять таймаут, он отправил запрос твоей прокладке, а ответа всё нету - и что делать?
В вопросе сразу и ответ. Если от моей прокладки нету слишком долго ответа клиенту, то он должен обрабатывать своё событие, вызванное таймаутом. Без этого никуда.
Но сейчас я имею в случае если клиентом выступаем ssh-соединение, то в тот самый момент, когда происходит отваливание моего ssh-туннеля из дома до VPS, т.е. на VPS пропадает программа, слушающая порт 8022 мой клиент отваливается вовсе не по таймауту, а из-за того, что "Server unexpectedly closed network connection".
На сколько я могу судить, в OpenVPN это всё уже автоматом утроено. Т.е. если происходит обрыв канала и требуется пересоздание контрольного подключения, для клиентов это происходит очень прозрачно, и в худшем случае имеется только некая задержка во времени, и никаких видимых разрывов.

kruzer25

Т.е. если происходит обрыв канала и требуется пересоздание контрольного подключения, для клиентов это происходит очень прозрачно, и в худшем случае имеется только некая задержка во времени, и никаких видимых разрывов.
Разрыва соединения нет, но пакеты, отправленные во время отсутствия связи, теряются.
При использовании тупого форвардера будет так же. Клиент отправляет пакет прослойке, она отправляет его серверу, сервер недоступен - пакет потерялся. Клиент подождал, увидел, что таймаут вышел, отправил пакет прослойке ещё раз, она опять отправила его серверу, сервер уже доступен и ответил.
Насколько я понял, это у тебя, наоборот, ssh ведёт себя слишком умно.

Plok2008

Клиент отправляет пакет прослойке, она отправляет его серверу, сервер недоступен - пакет потерялся. Клиент подождал, увидел, что таймаут вышел, отправил пакет прослойке ещё раз, она опять отправила его серверу, сервер уже доступен и ответил.
Да. Именно этого я и хочу.
Но имею обратную ситуацию, в которой клиент понимает, что на сервере по указанному порту его перестали слушать ни с того ни с сего. И он вместо того, чтобы слать пакеты (и ждать таймаута) сразу же мне сообщает, что мол "всё. всязь прервалась, работать больше не буду". И ему уже нет дела, что через очень короткое время сервер уже снова готов с ним общаться.

kruzer25

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

kruzer25

В гугле по первой же ссылке перечисляются ещё несколько программ для тупого порт-форвардинга. Наверняка среди них есть работающие не через iptables и не по схеме SSH. http://www.google.ru/search?hl=ru&source=hp&ie=windo...

dgaf

Пробуй такую хрень
http://www.jankratochvil.net/project/tcpoverudp/
:grin:

Plok2008

Пробуй такую хрень
Попробовал. Очень похоже на то, что я хочу. Единственная проблема в том, что это perl-овый скрипт и работает достаточно медленно. При этом вместо максимально возможных 1MB/s при ssh-туннеле у меня получается только 100KB/s по UDP. И загрузка процессора этим процессом на "домашнем сервере" доходит до 50-60%.
Так что к сожалению, это не помогает пока.

Sharp

А может у тебя проблема не в провайдере, а в сервере?
http://tech.forumone.com/archives/57-Quick-Tip-SSH-Keepalive...

Plok2008

Нет проблема и именно у провайдера. За совет про KeepAlive - спасибо. Действительно полезная вещь, но не в ней всё-таки дело. У меня ssh-туннель запускается через утилиту autossh, которая пробрасывает ещё один порт для себя, чтобы по нему раз в минуту посылать echo-запрос и тем самым понимать состояние соединения, и в случае чего, пересоздавать его. Пока мной замечено, что обрыв происходит более вероятно под большой нагрузкой на туннель. Но списывать это не нехватку VPS-ки и домашней VIA EPIA я не склонен, т.к. процессор загружается ssh-туннелем (с nice -1) не более чем на 15%.
Оставить комментарий
Имя или ник:
Комментарий: