Что такое reverse SSH tunnel и как подключиться к серверу за NAT

6 минут чтения
Средний рейтинг статьи — 4.9

Довольно частая ситуация: есть сервер, рабочая машина или 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.

6 минут чтения
Средний рейтинг статьи — 4.9

Настроить мониторинг за 30 секунд

Надежные оповещения о даунтаймах. Без ложных срабатываний