termal.in

← Блог

SSH к серверу за NAT или CGNAT без проброса портов

· Termalin Team sshtunnelingnetworkinghomelab

Вы хотите подключиться по SSH к машине, которая не может принимать входящие подключения: домашнему серверу за роутером, Raspberry Pi в офисе, коробочке на мобильном или 5G-канале. Старый ответ — пробросить порт 22 на роутере — всё чаще недоступен, а там, где он есть, это плохая идея. В этой статье — четыре подхода, которые действительно работают, во что обходится каждый и рабочий пример к нему. Ни один из них не открывает входящий порт на машине, до которой вы тянетесь.

Почему порт больше нельзя просто пробросить

Мешают две вещи. Во-первых, carrier-grade NAT (CGNAT): большинство домашних оптических, кабельных, мобильных и Starlink-подключений сегодня делят один белый IP между множеством абонентов, поэтому на «вашем» адресе нет порта, который можно пробросить — роутер, которым вы управляете, не тот, что держит публичный IP. Во-вторых, даже с настоящим белым IP проброшенный SSH-порт находят сканеры за считаные минуты; логи заполняются брутфорсом с момента его появления. Решение во всех случаях ниже одной и той же формы: приватная машина устанавливает исходящее соединение к чему-то достижимому, а вы по нему заезжаете обратно. Исходящее работает даже через CGNAT и наглухо закрытые файрволы, потому что это просто ещё одно соединение, покидающее сеть.

Четыре варианта вкратце

ПодходЧто вы запускаетеДополнительная инфраструктураДолгоживущий ключ на машине?Для чего лучше
Обратный SSH-туннельssh -R + autossh на машинеVPS с белым IPда (к VPS)у вас уже арендован VPS
Mesh-VPN (Tailscale / WireGuard)VPN-клиент на обоих концахслужба координацииваш обычный SSH-ключдоступ к нескольким машинам
Cloudflare Tunnelcloudflared на машинеаккаунт Cloudflare + доменваш обычный SSH-ключвы уже пользуетесь Cloudflare
Исходящий Connectorнебольшой агент на машинеаккаунт Termalinнет — краткосрочный сертификатдоступ из браузера, без VPS и VPN

Первые три дают обычный ssh you@… с вашего ноутбука. Последний достаёт до машины из браузера или от ИИ-агента. Читайте дальше — какой подойдёт.

Вариант 1 — обратный SSH-туннель через VPS

Если у вас уже арендован дешёвый VPS с белым IP, приватная машина может дозвониться до него и пробросить обратно свой SSH-порт. На машине за NAT:

ssh -N -R 2222:localhost:22 tunnel@vps.example.com

Это открывает порт 2222 на VPS и переправляет каждое подключение к нему обратно на порт 22 домашней машины. Откуда угодно прыгаете через VPS и попадаете на машину:

ssh -J tunnel@vps.example.com -p 2222 you@localhost

Голый ssh -R умирает при первом же сбое сети, поэтому заверните его в autossh под systemd-юнитом, чтобы он переживал перезагрузки и обрывы, и добавьте -o ServerAliveInterval=30 -o ExitOnForwardFailure=yes. Вся механика — включая подвох с GatewayPorts и почему туннель по умолчанию привязывается к loopback VPS — в статье Обратные SSH-туннели, разбор. Компромисс: вы содержите VPS и долгоживущий ключ на машине, который до него достаёт, и этот VPS теперь часть вашей поверхности атаки.

Вариант 2 — mesh-VPN (Tailscale или WireGuard)

Вместо того чтобы выставлять один порт, поместите обе машины в приватную сеть, которую видят только они. Tailscale — вариант с минимумом усилий. На машине за NAT:

curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up

Поставьте Tailscale и на ноутбук — оба получат стабильный адрес 100.x.y.z (и имя в MagicDNS). Дальше всё просто:

ssh you@home-box

как будто вы в одной локальной сети — машина вообще ни разу не выставлена в публичный интернет. sudo tailscale up --ssh может даже взять на себя SSH-аутентификацию, так что ключами для неё вы не управляете. WireGuard — та же идея, собранная вручную: координацию вы ведёте сами и настраиваете пиров руками — больше работы, зато без стороннего координатора. Для домашней лаборатории с NAS и парой Pi mesh-VPN обычно и есть весь ответ — именно к нему я по умолчанию тянусь в гайде по домашнему NAS/серверу. Компромисс: каждое устройство, которому нужен доступ, должно войти в сеть — а это клиент, который надо поставить, и аккаунт, который надо вести.

Вариант 3 — Cloudflare Tunnel

Если ваш домен уже на Cloudflare, cloudflared даёт исходящий туннель без открытого порта. На машине:

cloudflared tunnel login
cloudflared tunnel create home

Привяжите в конфигурации туннеля имя хоста к туннелю и направьте его на локальный sshd (ssh://localhost:22), затем запустите cloudflared как службу. На стороне клиента SSH достаёт до него через ProxyCommand в вашем ~/.ssh/config (на английском):

Host ssh.example.com
    ProxyCommand cloudflared access ssh --hostname %h

Теперь ssh you@ssh.example.com течёт через edge-сеть Cloudflare к машине. Бесплатного тарифа для этого хватает. Компромисс: вы пускаете свой SSH через третью сторону и попадаете в зависимость от аккаунта Cloudflare и домена, который там размещён — отлично, если вы и так ими пользуетесь, и перебор, если нет.

Вариант 4 — исходящий Connector (без VPS, без VPN)

Каждый из трёх вариантов выше требует постоянной инфраструктуры — VPS, VPN или домена в Cloudflare. Connector от Termalin сводит это к одной команде и достаёт до машины из вашего браузера, приложения Termalin или ИИ-агента вместо локального ssh. На приватном сервере одна строка ставит небольшой статический агент (Linux x86_64 и arm64):

curl -fsSL https://termal.in/tunnel-install.sh | sudo TERMALIN_TOKEN=<token> sh

Агент дозванивается наружу до Termalin по одному WebSocket и держит его открытым; он никогда не слушает порт. Когда вы открываете терминал в веб-клиенте, запрос идёт вниз по этому каналу, и агент подключается к собственному sshd машины на localhost — он лишь переносит непрозрачные байты SSH, поэтому никогда не видит ни ваших учётных данных, ни открытого текста сессии. Подключение через Connector настраивает sshd машины на доверие к центру сертификации SSH от Termalin, так что вход идёт по краткосрочному сертификату, а не по долгоживущему приватному ключу, лежащему на сервере. Это та самая строка в таблице со значением «нет» в графе долгоживущий ключ на машине.

Подвох, честно: вы достаёте до машины через облачную сторону Termalin — веб-терминал, десктоп- и iOS-приложения Termalin (они подключаются через тот же шлюз) или ИИ-агент через MCP-сервер, — а не голой командой ssh со своей машины, и сам Connector входит в платный тариф (или в пробный период). Если вам нужен обычный терминал с ноутбука, лучше подойдут варианты 1–3. Если же нужен доступ из браузера с любого устройства — или чтобы агент работал на машине, у которой нет ни белого адреса, ни ключа, который можно украсть, — это вариант, созданный именно для этого. Тот же исходящий Connector заодно несёт лёгкий мониторинг и оповещения для машины без открытого порта.

Какой выбрать?

  • У вас уже арендован VPS: обратный туннель переиспользует его — один ssh -R под autossh, и готово.
  • Машин больше одной или хочется, чтобы они ощущались как одна локальная сеть: mesh-VPN вроде Tailscale масштабируется лучше всех и ничего не выставляет наружу.
  • Ваш домен живёт на Cloudflare: их туннель — естественный выбор без нового вендора.
  • Вам нужен нулевой постоянный след, доступ из браузера или контролируемый доступ агента: исходящий Connector, без долгоживущего ключа на сервере.

У всех четырёх один принцип, который стоит запомнить: никогда не открывайте входящий порт на машине, которую вы не можете позволить себе отдать на растерзание сканерам. Пусть она тянется наружу сама — именно этот разворот направления и делает SSH за NAT безопасным.


Termalin — бесплатный кроссплатформенный SSH-клиент с сохранёнными туннелями, веб-терминалом и Connector без ключей для приватных серверов — скачайте его или посмотрите, как он безопасно обращается с ключами.

Попробуйте на одном хосте.

Termalin — быстрый SSH-клиент для вас и ваших агентов.

Бесплатный тариф · 14 дней Pro бесплатно · цены