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