Вы хотите подключиться по 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 Tunnel | cloudflared на машине | аккаунт 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 без ключей для приватных серверов — скачайте его или посмотрите, как он безопасно обращается с ключами.