Назад | Перейти на главную страницу

Автоматическое переподключение TCP-туннеля

У меня ненадежное сетевое соединение между двумя машинами: иногда активные 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-соединении, которое не может регулярно обмениваться пакетами, поэтому на вашем параде может пойти дождь.