Иногда нужно получить надёжный 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-доступ практически бесплатно.

Комментарии (16)


  1. Bankir_ka
    15.03.2026 02:20

    По заголовку думал что-то новое увижу, а тут классическая схема с VPN на VPS с белым ipv4.


  1. idle0
    15.03.2026 02:20

    Ещё есть tailscale и sshd как tor hidden service. Оба дают возможность подключения без белого IP адреса


    1. zabmix
      15.03.2026 02:20

      Tailscale это wireguard. А он не в списках чебуpнетa


    1. dbond
      15.03.2026 02:20

      Tailscale в РФ большую часть времени не работает.


  1. aik
    15.03.2026 02:20

    Доступ у вас всё равно с белым IP - просто он не дома находится.


  1. Mephistofx
    15.03.2026 02:20

    Зачем так усложнять? Можно же сервисы проброса использовать, тот же fxtun.ru - fxtun tcp 2222 даёт fxtun.ru:port запустить можно в фоне или как демон


    1. WeeAmigo
      15.03.2026 02:20

      Продвигаете свой стартап?


    1. qustust
      15.03.2026 02:20

      Крутой сайт. Заряженный


  1. leshakk
    15.03.2026 02:20

    Слишком всё переусложнено.
    Для реверсного ssh-туннеля Xray не нужен, ssh это умеет из коробки:

    ssh -R [remote-port]:[local-host]:[local-port] [user]@[remote-server-ip]

    -R: Specifies remote port forwarding.
    [remote-port]: The port on the public [remote-server-ip] that you will connect to later.
    [local-host]:[local-port]: The destination within the local network (e.g., localhost:22 to access the local machine's SSH server).
    [user]@[remote-server-ip]: remote server

    Связки ssh + autossh вполне достаточно.
    Вот мой stunnel@.service:

    Скрытый текст
    [Unit]
    Description=Setup a secure tunnel to %I
    After=network.target
    
    [Service]
    Environment="LOCAL_ADDR=localhost"
    #Environment="REMOTE_ADDR=0.0.0.0"
    Environment="SSH_TARGET_PORT=22" 
    EnvironmentFile=/etc/ssh/stunnel/%i
    Environment="AUTOSSH_GATETIME=0"
    ExecStart=/usr/bin/autossh -M 0 -o "ExitOnForwardFailure=yes" -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" \
     -NR ${REMOTE_ADDR}:${REMOTE_PORT}:${LOCAL_ADDR}:${LOCAL_PORT} -p ${SSH_TARGET_PORT} ${USERNAME}@${TARGET}
    
    RestartSec=5
    Restart=always
    
    [Install]
    WantedBy=multi-user.target

    Не забудьте только на сервере в конфиге sshd прописать:
    GatewayPorts clientspecified

    Кстати, ssh из коробки умеет и в SOCS-proxy:
    ssh -D 8080 -C -N user@remote_server_ip


  1. digrobot
    15.03.2026 02:20

    Проще поднять виртуальную частную сеть (которые для этого и были придуманы, а не для обхода блокировок), и будет полноценный доступ для любого траффика, а не только ssh.


  1. kujoro
    15.03.2026 02:20

    >как подключиться по ssh без белого айпи

    >для этого нам потребуется белый айпи

    я то думал будет какой нибудь р2р или на худой конец ygg


  1. jidckii
    15.03.2026 02:20

    Для чего тут Xray ваще не понятно..

    Ну и конечно же есть https://tuna.am , с sshd туннелями.


  1. newt76
    15.03.2026 02:20

    Что-то никто в комментах не понимает кажется для чего xray. Сам раньше просто прокидывал порты по ssh. Последнее время такой способ был не стабильный. Было ощущение что ssh разрывает провайдер. Тоже думал через xray гонять, но показалось слишком грамоздко. В итоге сдался и купил белый айпи за 100 рублей.


    1. leshakk
      15.03.2026 02:20

      Возможно потому, что автор даже не попытался объяснить, зачем в классической схеме с пробросом туннеля по ssh нужен X-ray. И судя по отсутствию его комментариев, возможно он сам это не понимает.


    1. Frew
      15.03.2026 02:20

      Если через Xray, то нужно добавить на сервер конфиг sshd, чтобы не было дисконнектов

      ClientAliveInterval 60
      ClientAliveCountMax 3


  1. xam2002
    15.03.2026 02:20

    Уже несколько лет использую zerotier, собрал все свои сервера в сеть. Шифрование конечно не такое сильное, но скорость одна из самых высоких.