Туннелирование трафика сервера через SSH, когда переадресация портов в сети недоступна?
Настроить
Дома у меня есть маленькая Raspberry Pi 3, которая запускает сервисы, которые доступны в интернете. Например, это работает HTTP-сервер. Я назову этот сервер raspberry
, я могу управлять raspberry
удаленно через SSH: я открыл порт 22
на моем маршрутизаторе дома и, следовательно, трафик на мой общедоступный IP-адрес для этого порта направляется raspberry
, Все идет нормально.
raspberry
Русская архитектура arm64
и это работает FreeBSD
что делает невозможным (по-видимому, я пытался взломать, но не играли в кости) для меня, чтобы запустить игровой сервер (UrbanTerror 4.3) на нем.
У меня также есть другая машина, которая является ThinkPad (позже: thinkpad
) Бег OpenBSD
и у него есть amd64
архитектура, которая фактически позволяет мне запускать нужный сервер. От thinkpad
Я могу получить доступ raspberry
с помощью SSH.
Вопрос
Я в настоящее время не дома, но в другой сети, фактически за границей. У меня есть непреодолимое желание разместить свой сервер сейчас, но я не смог сделать это на raspberry
, как я сказал.
Будет ли каким-то образом возможно запустить сервер на thinkpad
и туннель весь трафик через raspberry
(так как я могу выставить это в Интернете, тогда как здесь, за границей, у меня нет прав администратора на маршрутизатор)?
По сути, я хочу запустить сервер на thinkpad
как будто я на нем raspberry
с точки зрения сетей. То есть сервер появится в браузерах серверов, и игроки смогут подключиться: трафик будет raspberry
например, через порт 27900
и он будет отправлен через Интернет через SSH thinkpad
,
PS Я понимаю, что это может привести к снижению производительности из-за ретрансляции трафика через SSH, но я все еще хотел бы попробовать.
Заранее спасибо и простите за длинный пост!
РЕДАКТИРОВАТЬ 2018-12-14: вот что я уже пробовал
Так что для этого мне нужен обратный SSH-туннель. Я создал туннель из thinkpad
вот так
ssh -N -R :27960:localhost:27960 <raspberry's public IP>
Туннель создан успешно. Я проверил с netstat
на raspberry
и он действительно слушает *:27960
(но TCP; это проблема? UrbanTerror, как и другие игры, использует UDP). Теперь я запустил сервер на thinkpad
и снова с netstat
Я видел, что он слушает *:27960
(UDP).
Я попытался открыть клиент UrbanTerror на thinkpad
и подключение к <raspberry's IP>
, но это не сработало. Для отладки я попробовал то же самое во время работы
tcpdump -n -e -ttt -i ue0 | grep 27960
на raspberry
, Когда я попытался присоединиться к своему серверу через raspberry
из UrbanTerror в дампе появилось следующее:
188.112.111.89.27961 > 192.168.0.33.27960: UDP, length 16
192.168.0.33 > 188.112.111.89: ICMP 192.168.0.33 udp port 27960 unreachable
(Я сократил вывод для краткости)
188.112.111.89
текущий публичный IP thinkpad
а также 192.168.0.33
конечно raspberry
, Почему порт 27960
недостижим? Очевидно, согласно netstat
, thinkpad
слушает на этом порту.
Просто для проверки подключения я попробовал запустить nc -l 27960
на thinkpad
а также nc localhost 27960
на raspberry
Я мог общаться в обоих направлениях без проблем.
Я думаю также стоит упомянуть, что у меня есть OpenBSD
"s pf
фильтр пакетов работает на обеих машинах, но я отключил его для устранения неполадок.
2 ответа
Есть несколько способов сделать это. Проще всего временно создать туннель SSH к веб-интерфейсу маршрутизатора через raspberry
, Откройте UDP на маршрутизаторе, чтобы thinkpad
(Сервер UrbanTerror использует только UDP, а порт по умолчанию - 27960). После этого игроки смогут подключаться к вашему общедоступному IP.
Если вы не хотите открывать другой порт на маршрутизаторе. Каждый игрок должен иметь доступ к SSH к вашему raspberry
и сделать туннель переадресации порта SSH через порт TCP 22 и выполнить ретрансляцию UDP на TCP на своей машине. Вы можете сделать это с помощью socat:
Raspberry side: socat tcp4-listen:27900,reuseaddr,fork UDP:`thinkpad`:27960
Players side: socat -T15 udp4-recvfrom:27960,reuseaddr,fork tcp:localhost:27900
Если я правильно тебя понял, ты и твой thinkpad
находятся за границей, raspberry
дома, и вы можете удаленно настроить свой маршрутизатор дома, чтобы открыть новые порты на raspberry
,
TCP против UDP имеет большое значение, потому что ssh
Можно только туннелировать TCP. Таким образом, вы также должны конвертировать между ними.
Задержка в полной настройке будет очень заметна.
Вам нужно
1) Настройте маршрутизатор дома для переадресации UDP-порта 27960 на raspberry
,
2) На raspberry
, конвертировать с socat
между UDP и TCP, последний говорит на порт 27900.
3) Создайте ssh-туннель из thinkpad
к raspberry
; направление будет зависеть от socat
команды. Скажем, порт 27900 с обеих сторон.
4) На thinkpad
использовать socat
снова конвертировать между TCP 27900 и UDP 27960.
IIRC Вы должны быть немного осторожны, какой из вариантов UDP использовать с socat
так что работает в обоих направлениях. Мне нужно проверить это, но у меня сейчас нет времени, поэтому я не могу дать вам конкретные команды прямо сейчас. Вы также должны настроить его в правильном порядке, чтобы службы "прослушивания" запускались первыми, прежде чем они получат соединение от других шагов.