Поддерживать соединение пока происходит разрыв
Я даже для винды такое решение нашёл - KomodiaRelay, весит килобайт 20.
UPD: С первого раза невнимательно прочитал сообщение.
Чтобы автоматически переподключать упавшее соединение я использую утилиту autossh, которая сразу же при разрыве SSH соединения производит его переподключение.Ты чего-то нехорошего хочешь. Соединение с реальным сервером (домашним) по каким-то причинам прекратилось, он недоступен - что при этом должно отдаваться клиентам? У клиента тоже может стоять таймаут, он отправил запрос твоей прокладке, а ответа всё нету - и что делать?
Но при этом естественно получается, что все входящие соединения к VPS-серверу на пробрасываемые порты (80xx) рвутся и _клиентам_ приходится производить подключение заново.
Программа, про которую я сказал, не устанавливает соединение с реальным сервером при своём включении, она устанавливает соединение когда кто-то устанавливает соединение с ней; то есть, для клиента всё получается совершенно прозрачно. Удалённый сервер недоступен - для клиента всё будет выглядеть так, как будто он недоступен. Как ещё-то?
Соединение с реальным сервером (домашним) по каким-то причинам прекратилось, он недоступен - что при этом должно отдаваться клиентам? У клиента тоже может стоять таймаут, он отправил запрос твоей прокладке, а ответа всё нету - и что делать?В вопросе сразу и ответ. Если от моей прокладки нету слишком долго ответа клиенту, то он должен обрабатывать своё событие, вызванное таймаутом. Без этого никуда.
Но сейчас я имею в случае если клиентом выступаем ssh-соединение, то в тот самый момент, когда происходит отваливание моего ssh-туннеля из дома до VPS, т.е. на VPS пропадает программа, слушающая порт 8022 мой клиент отваливается вовсе не по таймауту, а из-за того, что "Server unexpectedly closed network connection".
На сколько я могу судить, в OpenVPN это всё уже автоматом утроено. Т.е. если происходит обрыв канала и требуется пересоздание контрольного подключения, для клиентов это происходит очень прозрачно, и в худшем случае имеется только некая задержка во времени, и никаких видимых разрывов.
Т.е. если происходит обрыв канала и требуется пересоздание контрольного подключения, для клиентов это происходит очень прозрачно, и в худшем случае имеется только некая задержка во времени, и никаких видимых разрывов.Разрыва соединения нет, но пакеты, отправленные во время отсутствия связи, теряются.
При использовании тупого форвардера будет так же. Клиент отправляет пакет прослойке, она отправляет его серверу, сервер недоступен - пакет потерялся. Клиент подождал, увидел, что таймаут вышел, отправил пакет прослойке ещё раз, она опять отправила его серверу, сервер уже доступен и ответил.
Насколько я понял, это у тебя, наоборот, ssh ведёт себя слишком умно.
Клиент отправляет пакет прослойке, она отправляет его серверу, сервер недоступен - пакет потерялся. Клиент подождал, увидел, что таймаут вышел, отправил пакет прослойке ещё раз, она опять отправила его серверу, сервер уже доступен и ответил.Да. Именно этого я и хочу.
Но имею обратную ситуацию, в которой клиент понимает, что на сервере по указанному порту его перестали слушать ни с того ни с сего. И он вместо того, чтобы слать пакеты (и ждать таймаута) сразу же мне сообщает, что мол "всё. всязь прервалась, работать больше не буду". И ему уже нет дела, что через очень короткое время сервер уже снова готов с ним общаться.
Вот я и говорю - твой ssh слишком умён, погугли что-нибудь более примитивное. Или, думаю, имея необходимые навыки, такое можно и самому написать в десять строчек.
В гугле по первой же ссылке перечисляются ещё несколько программ для тупого порт-форвардинга. Наверняка среди них есть работающие не через iptables и не по схеме SSH.
Пробуй такую хрень
Пробуй такую хреньПопробовал. Очень похоже на то, что я хочу. Единственная проблема в том, что это perl-овый скрипт и работает достаточно медленно. При этом вместо максимально возможных 1MB/s при ssh-туннеле у меня получается только 100KB/s по UDP. И загрузка процессора этим процессом на "домашнем сервере" доходит до 50-60%.
Так что к сожалению, это не помогает пока.
Нет проблема и именно у провайдера. За совет про KeepAlive - спасибо. Действительно полезная вещь, но не в ней всё-таки дело. У меня ssh-туннель запускается через утилиту autossh, которая пробрасывает ещё один порт для себя, чтобы по нему раз в минуту посылать echo-запрос и тем самым понимать состояние соединения, и в случае чего, пересоздавать его. Пока мной замечено, что обрыв происходит более вероятно под большой нагрузкой на туннель. Но списывать это не нехватку VPS-ки и домашней VIA EPIA я не склонен, т.к. процессор загружается ssh-туннелем (с nice -1) не более чем на 15%.
Оставить комментарий
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.
Я это вижу в следующем виде:
P.S. Разумное предложение сменить домашнего провайдера, у которого будет сразу белый IP или более стабильная связь (если это именно по его вине происходят разрывы к сожалению, не подходят.