Как подключиться к серверу за NAT с помощью mosh

Я хотел бы подключиться к моему серверу, который находится за NAT через mosh. Я не могу дотронуться до маршрутизатора, чтобы установить его как поддержку upnp, но я подаю заявку на UDP-порт вперед 9807->60000 и ssh-порт впереди причины.

Итак, есть ли способ указать порт сервера через аргументы командной строки или файл conf на стороне клиента и / или сервера?

Примечание: следующее не работает!!

mosh -p 9807 user@my_server

Редактировать:

Сначала я пытаюсь подключиться к моему серверу по ssh и запустить mosh-server -p 60000 вручную, а затем mosh -p 9807 my_server с другого терминала. Это вызывает ошибку:

Error binding to IP my_server_ip: bind: Address already in use

Это говорит:

  1. порт вперед работает.
  2. Мош попробуй установить мош-сервер на порт 60000.

Благодарю.

1 ответ

Решение

Проблема у вас заключается в перенаправлении портов. Ваш NAT forward на маршрутизаторе отправляет входящий трафик, отправленный на <domain>:9807 на <internal-ip>:60000, Когда вы начинаете mosh с -p В этом случае клиент подключается к серверу через ssh и сообщает серверу о запуске, прослушивая указанный порт. Затем mosh-сервер сообщает номер открытого порта (в данном случае тот, который вы указали) обратно клиенту, который закрывает соединение ssh и пытается подключиться к <domain>:<port>, Клиент пытается установить связь с тем же портом, который прослушивает сервер. Проблема в том, что ваш маршрутизатор NAT перенаправляет трафик с одного порта на стороне WAN на другой порт на машине NAT. Это не будет работать.

Лучше всего получить прямой перевод, например, запросить прямой порт 9807 маршрутизатора на стороне WAN к компьютеру mosh-server на порту 9807.

Если это не вариант, следующая лучшая вещь, о которой я могу подумать, это манипулировать трафиком на сервере с помощью iptables.

iptables -t nat -A PREROUTING -p udp --dport 60000 -j REDIRECT --to-port 9807

Выполните ваш клиент, как вы описываете

mosh -p 9807 user@my_server

Что происходит, это:

  1. клиент mosh на вашем компьютере открывает ssh-соединение (предположительно, пересылаемое на ваш компьютер через маршрутизатор NAT) к вашему серверу, который выполняет mosh-server прослушивание в порту 9807,
  2. Сервер mosh завершает работу, сообщая клиенту, подключенному через ssh, что порт UDP для подключения является 9807
  3. Клиент mosh закрывает соединение ssh и пытается подключиться к серверу через порт 9807
  4. NAT-роутер видит этот входящий трафик через порт 9807 и отправляет его на ваш сервер в порту 60000
  5. Ваша машина получает пакеты через порт 60000 над UDP, что соответствует правилу iptables и перенаправляется к месту назначения (в данном случае IP-адресу сервера), но через порт 9807
  6. Порт SRC клиентского трафика не изменяется вашим NAT-маршрутизатором, поэтому mosh-server отправляет пакеты обратно вашему клиенту через порт, который прослушивает клиент, которые принимаются правильно.

Позвольте мне предложить следующий метод проверки концепции подключения к mosh-серверу за NAT. Допустим, у нас есть следующие компьютеры:

  • client_host за NAT, с которого мы хотим подключиться к mosh-серверу
  • server_host за другим NAT, где работает mosh- сервер. Обратите внимание, что в этом методе client_host по-прежнему нужен прямой SSH-доступ к server_host для запуска mosh-сервера.ssh -R ... relay_host на сервере может помочь.
  • relay_host, который имеет общедоступный IP-адрес и находится под нашим контролем.

Итак, мы делаем:

  1. На relay_host установите и запустите инструмент udprelay. Он повторяет все, что получает от одного порта к другому, и наоборот.
    relay_host> udprelay 0.0.0.0 34730 34731
    
    Указанные выше номера портов жестко запрограммированы в клиентском скрипте, но их можно легко изменить. Также обратите внимание, что udprelay на данный момент крайне небезопасен.
  2. На server_host установите mosh-nat-server.sh, просто поместите его в любую папку, указанную в PATH. Убедитесь, что популярныsocat там же установлен инструмент.
  3. Наконец, на клиенте запустите mosh-nat-client.sh следующим образом
    client_host> mosh-nat-client.sh SERVER_SSH_NAME RELAY_IP
    
    Этот скрипт вызывает server_host сssh SERVER_SSH_NAME <mosh-nat-server.sh ARGS>, записывает ключ и использует его для запуска mosh-client. Сложная часть этого - пробить брешь в NAT сервера и позволить обеим сторонам встретиться наudprelay.

См. Также хороший пост в блоге, в котором описывается немного другая ситуация. В приведенных выше терминах показано, как подключиться от relay_host к server_host. Автор не использует реле udp, но ему все равно нужны громоздкиеLD_PRELOADмашины. Удивительно, но он выполняет свою работу.

Другие вопросы по тегам