Иногда нужно получить надёжный SSH-доступ к домашнему серверу (ноутбуку или мини-серверу на Ubuntu), который находится за NAT/CGNAT провайдера. Публичный IPv4 отсутствует, а использовать полноценный VPN или облачные туннели (ngrok, Cloudflare Tunnel и т.п.) не хочется. (Раньше пользовался Cloudflare Tunnel, но в последнее время с ним часто случались проблемы)
Способ reverse SSH tunnel с использованием autossh для поддержания постоянного соединения + ProxyCommand через существующий SOCKS-прокси: Xray socks inbound.
Сделаем reverse SSH tunnel через autossh с проксированием через Xray (VLESS + Reality) и пробросом нестандартного порта (2222)
Основная цель: Получить SSH-доступ с любого устройства (в данном случае с MacBook) к домашнему серверу на Ubuntu 22.04 (далее как homeLaptop)
Выбранный подход: Будем использовать односторонний reverse tunnel от homeLaptop к VPS: homeLaptop постоянно держит соединение к VPS и просит VPS слушать на порту 2222 и пересылать все подключения к этому порту на локальный порт homeLaptop (в моем случае sshd работает на 2222).
Требование для подключения по SSH через VPS:
Арендованный или личный VPS с белым IP
с MacBook должен быть доступен порт 2222 на VPS
с MacBook должен быть доступен порт 22 на VPS (чтобы autossh с homeLaptop мог установить reverse-туннель)
Схема получается кольцевая:

Настройка VPS
В файле /etc/ssh/sshd_config включаем нужные опции:
GatewayPorts clientspecified AllowTcpForwarding yes
Перезапускаем sshd:
systemctl restart ssh
Открываем порт 2222 в файрволе (пример для ufw):
ufw allow 2222/tcp ufw reload
Настройка homeLaptop (Ubuntu 22.04)
1. SOCKS5 inbound в Xray
Запустим Xray с socks inbound на 127.0.0.1:10808 (без авторизации, UDP отключен).
Для этого уже в настроенный Xray config.yaml, для настройки соединения с VPS, в массив inbounds добавляем следующий блок:
{ "listen": "127.0.0.1", "port": 10808, "protocol": "socks", "settings": { "auth": "noauth", "udp": false }, "tag": "socks-local-for-ssh" }
Выглядит так:
{ "dns": {...}, "fakedns": [...], "inbounds": [ { "listen": "127.0.0.1", "port": 10808, "protocol": "socks", "settings": { "auth": "noauth", "udp": false }, "tag": "socks-local-for-ssh" }, {...} ], "outbounds": [...], "routing": {...} }
2. Настраиваем sshd на нестандартный порт
В /etc/ssh/sshd_config:
Port 2222 ListenAddress 0.0.0.0
Перезапускаем:
systemctl restart sshd
Открываем порт:
ufw allow 2222/tcp
3. Установим autossh + netcat-openbsd
apt update apt install autossh netcat-openbsd
4. Запуск autossh (рабочая команда)
autossh -M 0 -f \ -o "ServerAliveInterval 30" \ -o "ServerAliveCountMax 3" \ -o "ProxyCommand=nc -x 127.0.0.1:10808 %h %p" \ -N -R *:2222:localhost:2222 \ <VPS_HOSTNAME>@<VPS_IP_ADDRESS> -p 22
Объяснение ключевых флагов:
-M 0— отключаем старый мониторинг портов, полагаемся на SSH keepalive-f— в фонеServerAliveInterval/ServerAliveCountMax— автоматический перезапуск при обрывеProxyCommand=nc -x …— весь SSH-трафик идёт через локальный socks5 от Xray-R *:2222:localhost:2222— просим VPS слушать 2222 на всех интерфейсах
Автозапуск через systemd
Создаём файл сервиса /etc/systemd/system/autossh-reverse.service:
[Unit] Description=AutoSSH reverse tunnel to VPS After=network-online.target xray.service Wants=network-online.target xray.service [Service] User=<HOME_USER> Environment="HOME=/home/<HOME_USER>" ExecStart=/usr/bin/autossh -M 0 \ -o "ServerAliveInterval 30" \ -o "ServerAliveCountMax 3" \ -o "ProxyCommand=nc -x 127.0.0.1:10808 %%h %%p" \ -N -R *:2222:localhost:2222 \ <VPS_USER>@<VPS_IP_ADDRESS> -p 22 Restart=always RestartSec=10 KillMode=process [Install] WantedBy=multi-user.target
Активируем:
systemctl daemon-reload systemctl enable autossh-reverse.service systemctl start autossh-reverse.service
Подключение с MacBook (или любого другого устройства)
Подключение осуществляется обычной командой:
ssh -p 2222 <HOME_USER>@<VPS_IP_ADDRESS>
Перед первым подключением необходимо настроить авторизацию по SSH-ключу :
Между homeLaptop и VPS
Между homeLaptop и MacBook
Итог
Получаем шифрованный и автоматически восстанавливающийся доступ к домашнему серверу без белого IP и без сторонних облачных сервисов. Всё управление — через уже работающий Xray, дополнительная нагрузка минимальна. (Мой VPSик на 1Gb RAM + 1 Cpu)
Если у вас уже есть Xray/V2Ray для обхода блокировок — этот способ добавляет reverse-доступ практически бесплатно.
