Передача TCP-соединения с одного Linux-сервера на другой за NAT?

Вопрос или проблема

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

В моем представлении я бы хотел запустить команду, которая перехватывает соединение с определенного IP и порта, позволяя передавать все входящие данные через него в файл, не давая первоначальному владельцу соединения его закрыть.

Существуют ли уже для этого какие-либо инструменты?

Это не имеет смысла в большинстве случаев. Прервите загрузку, скопируйте уже загруженные данные на сервер и используйте wget для возобновления загрузки.

Я не думаю, что это возможно, учитывая основы того, как работает TCP/IP-соединение, в дополнение к NAT-маршрутизатору, который позволяет вам делить внешний IP-адрес между несколькими компьютерами в вашей локальной сети. Тем не менее, есть некоторые советы/трюки, которые могут помочь, как только вы поймете, как это работает.

Совет #1 – screen/tmux

Обычно, если у меня есть большой файл для загрузки, я ssh на другой компьютер в моей сети и запускаю там screen/tmux. При помощи screen/tmux сессии я могу запускать долгосрочные программы (такие как загрузка) в терминале, не останавливая их при отключении ssh соединения с этой второй машиной.

Паттерн выглядит так:

laptop$ ssh remotemachine

...вход...

remote$ screen -S mydownload

...теперь у вас есть screen-сессия под названием "mydownload"...

remote$ wget http://www.bigfiles.com/somebigfile

...Ctrl+A Ctrl+D.... <--- (отключение от screen-сессии)

...немного позже...

laptop$ ssh remotemachine
remote$ screen -r mydownload

...wget все еще работает здесь...

Совет #2 – xdg-open

Эта программа позволяет запускать файлы и/или URL через предпочитаемое приложение. Например, я настроил Firefox на удаленной машине в моей локальной сети так, чтобы он ассоциировался с обработчиком ‘magnet://’. С помощью этого на удаленной машине я могу запускать такие команды:

ssh remotemachine "DISPLAY=:0.0; xdg-open magnet://url_of_magnet_link...."

На моем ноутбуке, и это “запускает” мою удаленную машину на загрузку этой magnet-ссылки через Firefox, который затем передаст этот URL приложению, ассоциированному с обработкой magnet:// ссылок. В данном случае я использую Vuze для обработки.

Если вам интересно, как настроить Firefox для этого, я писал об этом в своем блоге некоторое время назад. Статья называется: [one-liner]: Howto get Firefox 10.x to Launch a BitTorrent Client via a Magnet Link on Linux.

С точки зрения IP, TCP и NAT, это определенно возможно. Я могу представить, что сервер берет на себя IP-адрес ПК. Я также могу представить, что ядро Linux на сервере подготавливает передачу соединения, инициализируя необходимые структуры данных сокета и блок управления протоколом. Фактическая передача соединения потребует некоторой координации между двумя ядрами Linux.

И действительно, существует один многообещающий подход: TCP Connection Passing. Это включает в себя патч ядра, который расширяет API сокетов для передачи соединения и набор инструментов для инициации передачи. Этот подход учитывает роль приложения.

Дело в том, что TCP-соединение также включает в себя состояние приложения, разделенное между двумя концами. Оба конца ожидают, что другой будет действовать в соответствии с этим состоянием. Поэтому, если вы замените один конец на какое-то общее устройство, которое просто забирает данные, не отвечая ничем, вы можете нарушить состояние (и таким образом соединение), просто не действуя правильно. Это может не быть проблемой для описанного вами сценария, но это ограничивает применимость общей схемы передачи соединения, которую вы задумали. Итак, нет, я не думаю, что такое что-то существует, но TCP Connection Passing – это хороший старт. Вы можете настроить его под ваши нужды.

Ответ или решение

Перенос TCP-соединения с одного Linux-сервера на другой, находящийся за NAT, представляет собой нетривиальную задачу, учитывая сложность работы с TCP и особенности NAT. Данная задача особенно интересует, когда пользователю необходимо перенести соединение с десктопа на сервер с более высокоэнергоэффективной архитектурой.

Теория

TCP-соединение тесно связано с состоянием, которое поддерживается на обоих концах связи. Это состояние включает последовательность номеров пакетов, а также состояние буферов отправки и приема. NAT (Network Address Translation) добавляет дополнительный уровень сложности, так как он обеспечивает возможность разделения одного внешнего IP-адреса между несколькими устройствами внутри локальной сети.

Когда соединение устанавливается, информация о нем фиксируется в таблицах NAT и трансфер пакетов осуществляется на основании этих записей. Таким образом, при смене устройства, принимающего соединение внутри сети, NAT-таблицы не будут автоматически обновлены, что приводит к прерыванию связи.

Пример

Существуют инструменты и подходы, которые могут помочь в решении данной задачи, хотя полноценной готовой реализации может не существовать. Например, TCP Connection Passing предлагает возможность переноса TCP-соединений путем расширения API сокетов и применения патчей ядра для поддержания передачи соединений. Это может стать отправной точкой для настройки под специфические нужды.

Также, существуют стратегии обхода проблемы, такие как использование утилиты wget с поддержкой продолжения загрузки. Это позволяет начать загрузку на одном устройстве и продолжить ее на другом, без попыток прямого переноса соединения.

Применение

  1. Патчирование и настройка TCP Connection Passing: Это потребует углубленного изучения и модификации ядра Linux, что подойдет опытным разработчикам для кастомных сетевых решений.

  2. Альтернативные решения: Разорвать текущее соединение и использовать инструменты для возобновления, как было предложено для wget, что на практике может быть проще и надежнее.

  3. Использование screen/tmux: Для долговременных загрузок рекомендуется использовать screen или tmux, чтобы управлять параллельными сессиями на сервере, к которому подключаетесь.

Резюмируя, с учетом сложности и ограниченной области применения, велика вероятность, что прямого и универсального инструмента не существует, однако вышеописанные методы могут послужить выходом из ситуации или отправной точкой для дальнейших разработок.

Оцените материал
Добавить комментарий

Капча загружается...