У меня ненадежное сетевое соединение между двумя машинами: иногда активные TCP-соединения прерываются по независящим от меня причинам. Я хочу создать надежное TCP-соединение между двумя машинами.
Если бы сеть была надежной, я бы просто запустил ssh -L 1234:localhost:1234 remotehost
, когда сервер прослушивает порт 1234 на remotehost
, и укажите клиенту на localhost:1234
. Но если ssh-соединение разорвется, переадресация прекратится. Как я могу организовать автоматическое восстановление соединения между клиентом и сервером?
Не решения:
Я плохо помню программу под названием rocks
это и произошло, но, похоже, это упало с лица сети. Меня больше всего интересует Linux с обеих сторон (хотя я бы ожидал, что программа на этом уровне будет переносима для других юниксов), но если вы знаете программу, которая работает между QNX и VMS, тем лучше.
Старые и неподдерживаемые надежные сокеты (Горные породы) что вы ищете?
Единственный известный мне стандартный протокол с такой возможностью - это MPTCP. Он прозрачен для прикладного уровня, поэтому SSH поверх MPTCP должен работать. Он может запускать базовые TCP-соединения по разным путям с разными IP-адресами, поэтому в принципе его можно использовать для миграции вашего SSH-соединения в VPN-соединение и из него в зависимости от того, работает ли VPN-соединение.
Я мало знаю о зрелости реализаций MPTCP, но дизайн протокола выглядит довольно надежным.
Это должно защитить ваши SSH-соединения от потери из-за нестабильного сетевого подключения. Это не защитит вас от митма, который хочет разорвать ваше SSH-соединение. Mitm все еще может вводить поврежденные данные, которые SSH обнаружит и разорвет соединение.
MPTCP, такой как метод повторного подключения, встроенный в протокол SSH, был бы методом, который я мог бы представить, поддерживая соединение в течение максимально длительного времени. Но я не думаю, что такая функция была разработана для протокола SSH.
Вы могли бы использовать daemontools
держать порт ssh впереди; он не обязательно будет поддерживать программы, зависящие от соединения, пока оно не работает (предположительно, когда ssh отключается, локальный порт начнет отказываться от своих соединений), но это начало.
Я подозреваю, что есть некоторые iptables
уловки, например, заставить этот порт отбрасывать пакеты, как только пересылка ssh уходит, поэтому подключающиеся программы просто знают, что пакеты исчезают, а не отклоняются. Я только учусь daemontools
я (снова), поэтому я не уверен, что вы можете запустить собственный сценарий, когда служба умирает, но я подозреваю, что вы можете.
TCP делает это автоматически. Вам нужно только отключить или ослабить типичные практические приемы очистки, используемые для уничтожения умирающих TCP-соединений. Отключите поддержку активности TCP для вашего соединения и значительно увеличьте предел чрезмерных повторных передач. В Linux, например, напишите большое число в /proc/sys/net/ipv4/tcp_retries2
.
Однако в современной сети межсетевой экран с проверкой пакетов с отслеживанием состояния, вероятно, забудет о TCP-соединении, которое не может регулярно обмениваться пакетами, поэтому на вашем параде может пойти дождь.