Что такое reverse SSH tunnel и как подключиться к серверу за NAT
Довольно частая ситуация: есть сервер, рабочая машина или Raspberry Pi, которые находятся за NAT, CG-NAT у провайдера или просто без проброса портов. Подключиться к ним по SSH извне невозможно — входящие соединения не доходят.
Но что если у вас есть другой сервер с белым IP, к которому доступ есть всегда? Здесь на сцену выходит reverse SSH tunnel.
Что такое reverse SSH tunnel
Reverse SSH tunnel — это SSH-соединение, при котором:
- машина за NAT сама инициирует SSH-подключение;
- на удалённом сервере с белым IP открывается порт;
- подключения к этому порту автоматически пробрасываются обратно — к машине за NAT.
Проще:
мы не подключаемся к серверу за NAT — он сам создаёт тоннель, через который к нему можно попасть.
Как это работает на практике
Схема выглядит так:
[Ваш ноутбук]
|
v
[Сервер с белым IP] <-- SSH tunnel --> [Сервер за NAT]
- сервер за NAT подключается к публичному серверу;
- SSH открывает порт на публичном сервере;
- любой входящий запрос на этот порт уходит через тоннель обратно.
Базовый пример reverse SSH tunnel
Допустим:
- сервер за NAT:
local-server - публичный сервер:
public.example.com - пользователь на публичном сервере:
tunnel
На сервере за NAT выполняем:
ssh -R 2222:localhost:22 tunnel@public.example.com
Что происходит:
- на
public.example.comоткрывается порт2222; - все подключения к
public.example.com:2222проксируются наlocalhost:22сервера за NAT.
Теперь можно подключиться так:
ssh -p 2222 user@public.example.com
И вы окажетесь на машине за NAT.
Важные параметры SSH
Разбор ключа -R
Формат:
-R [порт_на_публичном_сервере]:[хост_назначения]:[порт]
Пример:
-R 8080:localhost:80
Пробрасывает веб-сервер за NAT на public.example.com:8080.
Разрешение reverse tunneling на сервере
На публичном сервере в /etc/ssh/sshd_config должно быть:
AllowTcpForwarding yes
GatewayPorts yes
После изменения:
systemctl restart sshd
Без GatewayPorts порт будет доступен только с localhost.
Автоматический reverse SSH tunnel
Чтобы тоннель не падал и автоматически восстанавливался, используют autossh.
Установка:
apt install autossh
Пример запуска:
autossh -M 0 -N \
-o "ServerAliveInterval 30" \
-o "ServerAliveCountMax 3" \
-R 2222:localhost:22 tunnel@public.example.com
autossh следит за соединением и поднимает его заново при обрыве.
Типичные сценарии использования
- доступ к серверу за NAT;
- администрирование домашних серверов;
- подключение к Raspberry Pi;
- проброс локального веб-сервиса наружу;
- временный доступ без VPN и проброса портов.
Безопасность
Рекомендации:
- используйте SSH-ключи, отключите парольную аутентификацию;
- создавайте отдельного пользователя под тоннели;
- ограничивайте доступ через
AllowUsers; - не открывайте чувствительные сервисы без firewall.
Когда reverse SSH tunnel — плохая идея
- нужен постоянный высоконагруженный трафик;
- требуется доступ для большого количества клиентов;
- есть возможность настроить VPN или прямой проброс портов.
В таких случаях лучше смотреть в сторону WireGuard, OpenVPN или Zero Trust-решений.
Итоги
Reverse SSH tunnel — простой и надёжный способ получить доступ к серверу за NAT через обычный SSH:
- не требует изменения сетевой инфраструктуры;
- работает почти везде;
- легко автоматизируется.
Это отличный инструмент для DevOps, администраторов и всех, кто работает с серверами без белого IP.
Настроить мониторинг за 30 секунд
Надежные оповещения о даунтаймах. Без ложных срабатываний