Как подключиться к серверу за 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
Это говорит:
- порт вперед работает.
- Мош попробуй установить мош-сервер на порт 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
Что происходит, это:
- клиент mosh на вашем компьютере открывает ssh-соединение (предположительно, пересылаемое на ваш компьютер через маршрутизатор NAT) к вашему серверу, который выполняет
mosh-server
прослушивание в порту9807
, - Сервер mosh завершает работу, сообщая клиенту, подключенному через ssh, что порт UDP для подключения является
9807
- Клиент mosh закрывает соединение ssh и пытается подключиться к серверу через порт
9807
- NAT-роутер видит этот входящий трафик через порт
9807
и отправляет его на ваш сервер в порту60000
- Ваша машина получает пакеты через порт
60000
надUDP
, что соответствует правилу iptables и перенаправляется к месту назначения (в данном случае IP-адресу сервера), но через порт9807
- Порт 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-адрес и находится под нашим контролем.
Итак, мы делаем:
- На relay_host установите и запустите инструмент udprelay. Он повторяет все, что получает от одного порта к другому, и наоборот.
Указанные выше номера портов жестко запрограммированы в клиентском скрипте, но их можно легко изменить. Также обратите внимание, что udprelay на данный момент крайне небезопасен.relay_host> udprelay 0.0.0.0 34730 34731
- На server_host установите mosh-nat-server.sh, просто поместите его в любую папку, указанную в PATH. Убедитесь, что популярны
socat
там же установлен инструмент. - Наконец, на клиенте запустите mosh-nat-client.sh следующим образом
Этот скрипт вызывает server_host сclient_host> mosh-nat-client.sh SERVER_SSH_NAME RELAY_IP
ssh SERVER_SSH_NAME <mosh-nat-server.sh ARGS>
, записывает ключ и использует его для запуска mosh-client. Сложная часть этого - пробить брешь в NAT сервера и позволить обеим сторонам встретиться наudprelay
.
См. Также хороший пост в блоге, в котором описывается немного другая ситуация. В приведенных выше терминах показано, как подключиться от relay_host к server_host. Автор не использует реле udp, но ему все равно нужны громоздкиеLD_PRELOAD
машины. Удивительно, но он выполняет свою работу.