Для решения задач безопасной передачи данных, удаленного администрирования серверов и обхода локальных сетевых ограничений сетевые инженеры и разработчики зачастую прибегают к развертыванию тяжеловесных VPN-сервисов (WireGuard, OpenVPN). Однако настройка полноценного VPN это не самое простое мероприятие, здесь требуется права суперпользователя (root), создания виртуальных сетевых интерфейсов TUN/TAP и изменения таблицы маршрутизации операционной системы.
Но существует более эффективный и легковесный инструмент, не требующий установки стороннего ПО на сервер — SSH-прокси. Обычный демон OpenSSH (sshd), установленный на любом Linux-сервере, из коробки умеет работать как полноценный зашифрованный SOCKS5-прокси.
Давайте разберемся, что такое SSH, как запустить и автоматизировать SSH SOCKS5 прокси на любой операционной системе, а также как устранить проблемы с задержками и утечками DNS.
- Что такое SSH-прокси и протокол SSH
- Зачем нужен SSH: консоль, аутентификация по ключам и шифрование
- Принцип работы SSH-прокси: SOCKS5 и динамический проброс портов (-D)
- Сравнение SSH-прокси, VPN и обычных HTTP/SOCKS5 серверов
- Настройка SSH-прокси на Linux и macOS: от разовой команды до службы systemd
- Быстрый запуск SOCKS5-сервера через утилитуssh(флаг-D)
- Автоматизация и устойчивость соединения:autosshи юнитsystemd
- Оптимизация конфига~/.ssh/configдля удобного управления
- Поднятие SSH SOCKS5 прокси на Windows: PowerShell, PuTTY и MobaXterm
- Командная строка PowerShell и встроенный OpenSSH
- Пошаговая настройка динамических туннелей в PuTTY
- Использование MobaXterm для быстрой организации прокси-канала
- Направление трафика приложений через SSH-прокси и защита от утечек
- Настройка браузеров: Chrome, Firefox и расширения ZeroOmega / FoxyProxy
- Конфигурация в ZeroOmega:
- Проксирование консольных утилит:proxychains-ng,ALL_PROXYиcURL
- Использование системных переменных
- Решение проблемы утечки по DNS при SOCKS5-проксировании
- Продвинутые сценарии: Jump Host, ProxyCommand и обход жестких фаерволов
- Многозвенные цепочки серверов через ProxyJump (-J)
- Пробой корпоративных HTTP-прокси с помощьюcorkscrew
- Производительность, тюнинг и диагностика ошибок SSH-прокси
- Борьба с эффектом TCP over TCP и оптимизация TCP BBR
- Методы оптимизации:
- Настройка безопасностиsshd_config:AllowTcpForwardingи ключи Ed25519
- Устранение обрывов связи: параметрыServerAliveIntervalиTCPKeepAlive
- Разбор ошибки «channel 2: open failed: administratively prohibited»
- Итоги: когда SSH-прокси незаменим, а когда стоит выбрать VPN
Что такое SSH-прокси и протокол SSH
Сетевой протокол SSH был разработан для замены незащищенных протоколов Telnet и RSH. Он работает на прикладном уровне модели OSI (порт по умолчанию — 22/TCP) и описан в спецификации RFC 4253.
SSH-прокси — это архитектурный режим работы OpenSSH-клиента, при котором на локальной машине поднимается сокет SOCKS5-сервера. Этот сокет принимает TCP-подключения от локальных приложений, зашифровывает их внутри SSH-сессии и передает на удаленный VPS, откуда они отправляются в глобальную сеть.

Зачем нужен SSH: консоль, аутентификация по ключам и шифрование
Первостепенная задача SSH — обеспечение защищенного канала для управления удаленным сервером через командную строку. Протокол гарантирует:
- Конфиденциальность: весь трафик шифруется симметричными алгоритмами (AES-256-GCM, ChaCha20-Poly1305).
- Аутентификацию: проверка подлинности сторон с помощью криптографических пар ключей (Ed25519, RSA).
- Целостность: защита от подмены данных и MitM-атак с помощью кодов аутентификации сообщений.
Помимо выполнения интерактивных команд, SSH поддерживает протокол передач файлов SFTP и механизм проброса сетевых сокетов.
Принцип работы SSH-прокси: SOCKS5 и динамический проброс портов (-D)
В клиенте OpenSSH предустановлены три ключевых режима туннелирования:
- Local Forwarding (-L): перенаправление локального порта на конкретный IP-адрес и порт назначения через удаленный SSH-сервер.
- Remote Forwarding (-R): перенаправление порта удаленного сервера на локальный компьютер.
- Dynamic Forwarding (-D): превращение SSH-клиента в полноценный SOCKS5-прокси (RFC 1928).
В режиме Dynamic Forwarding SSH-клиент не привязывается к фиксированному целевому хосту. Он слушает локальный порт (например, 1080), принимает стандартные SOCKS5-запросы, извлекает из них домен или IP-адрес назначения и динамически запрашивает установление TCP-соединения у удаленного демона sshd.
Сравнение SSH-прокси, VPN и обычных HTTP/SOCKS5 серверов
| Критерий | SSH-прокси (SOCKS5 via SSH) | VPN (WireGuard / OpenVPN) | Обычный SOCKS5/HTTP прокси |
| Уровень OSI | Сеансовый / Прикладной (L5/L7) | Сетевой / Канальный (L2/L3) | Сеансовый / Прикладной (L5/L7) |
| Права root на клиенте | Не требуются | Требуются (для TUN/TAP) | Не требуются |
| ПО на сервере | Стандартный sshd | Демон VPN (WireGuard, OpenVPN) | Dante, 3proxy, Squid |
| Перехват трафика | Точечно (выбранные программы) | Весь системный трафик | Точечно (выбранные программы) |
| Поддержка UDP | Нет (только TCP)* | Полная (Native UDP) | Зависит от сервера |
| Шифрование | Высокое (AES-256-GCM, ChaCha20) | Высокое (ChaCha20, AES) | Отсутствует / Минимальное |
* Примечание: Протокол SOCKS5 формально поддерживает UDP-ассоциации, однако штатная имплементация динамическая переадресация портов в OpenSSH туннелирует исключительно TCP-соединения.
Настройка SSH-прокси на Linux и macOS: от разовой команды до службы systemd
В UNIX-подобных операционных системах все необходимые компоненты присутствуют по умолчанию.
Быстрый запуск SOCKS5-сервера через утилиту ssh (флаг -D)
Для открытия зашифрованного SOCKS5-сокета выполните в консоли команду:
ssh -f -N -D 127.0.0.1:1080 user@vps_ip_address -p 22
Разбор ключей запуска:
- -D 127.0.0.1:1080 — включает динамическое проксирование и связывает SOCKS5-сервер с локальным IP 127.0.0.1 на порту 1080. Важно явно указывать 127.0.0.1:, чтобы сокет не открылся на внешнем интерфейсе (0.0.0.0).
- -f — переводит процесс SSH в фоновый режим работы сразу после успешной аутентификации.
- -N — отключает запуск интерактивного командного толмача. Сессия используется исключительно для передач сетевых сокетов.
- -p 22 — порт подключения к удаленному SSH-демону.
Проверить активный порт можно с помощью утилиты ss:
ss -tulpn | grep 1080
# Пример корректного вывода:
# tcp LISTEN 0 128 127.0.0.1:1080 0.0.0.0:* users:(("ssh",pid=14205,fd=4))
Автоматизация и устойчивость соединения: autossh и юнит systemd
При кратковременных сбоях в сети стандартный клиент ssh завершает работу. Для поддержания постоянного соединения используется утилита autossh, которая автоматически восстанавливает разорванный SSH-туннель.
Установка autossh в Debian/Ubuntu:
sudo apt update && sudo apt install autossh -y
Для автоматического запуска при загрузке системы сформируем сервисный юнит systemd.
Создайте файл службы:
sudo nano /etc/systemd/system/ssh-proxy.service
Внесите следующую конфигурацию (замените your_user, путь к ключу и user@vps_ip на собственные данные):
[Unit] Description=AutoSSH SOCKS5 Proxy Service After=network-online.target Wants=network-online.target [Service] User=your_user Type=simple ExecStart=/usr/bin/autossh -M 0 -N -q -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -o "ExitOnForwardFailure yes" -D 127.0.0.1:1080 user@vps_ip -i /home/your_user/.ssh/id_ed25519 Restart=always RestartSec=5 [Install] WantedBy=multi-user.target
Пояснение: параметр -M 0 отключает устаревший метод проверки каналов autossh собственными портами, возлагая контроль зависаний на опции OpenSSH ServerAliveInterval и ServerAliveCountMax.
Активируйте и запустите службу:
sudo systemctl daemon-reload sudo systemctl enable --now ssh-proxy.service sudo systemctl status ssh-proxy.service
Оптимизация конфига ~/.ssh/config для удобного управления
Чтобы избежать набора длинных аргументов в консоли, внесите параметры хоста в файл ~/.ssh/config:
Фрагмент кода
Host my-vps-proxy HostName 198.51.100.42 User admin Port 22 IdentityFile ~/.ssh/id_ed25519 DynamicForward 127.0.0.1:1080 ServerAliveInterval 30 ServerAliveCountMax 3 ExitOnForwardFailure yes
Теперь запуск зашифрованного SOCKS5-канала с фоновым выполнением сводится к вызову:
ssh -f -N my-vps-proxy
Поднятие SSH SOCKS5 прокси на Windows: PowerShell, PuTTY и MobaXterm
В ОС Windows поднять зашифрованный сокет можно как встроенными консольными средствами, так и с помощью графических клиентов.
Командная строка PowerShell и встроенный OpenSSH
В современных сборках Windows 10/11 встроен компонент OpenSSH Client. Запуск фонового SOCKS5-сокета выполняется в PowerShell аналогом Unix-команды:
ssh -f -N -D 1080 user@vps_ip
При аутентификации по паролю флаг -f может завершить команду с ошибкой, так как фоновый процесс не может запросить ввод с клавиатуры. Предварительно настройте беспарольный вход по ключу: сгенерируйте пару ssh-keygen -t ed25519 и занесите содержимое id_ed25519.pub в файл ~/.ssh/authorized_keys на сервере.
Пошаговая настройка динамических туннелей в PuTTY
Для настройки Dynamic Forwarding в PuTTY выполните следующие действия:
- В окне PuTTY введите IP-адрес вашего VPS в поле Host Name в категории Session.
- В левом меню перейдите по пути Connection -> SSH -> Tunnels.
- В строке Source port укажите значение 1080.
- В переключателях снизу выберите радиокнопки Dynamic и Auto.
- Нажмите кнопку Add. В окне Forwarded ports появится запись D1080.
- Вернитесь в Session, укажите имя профиля и нажмите Save.
- Нажмите Open и авторизуйтесь. Пока окно сессии открыто, на 127.0.0.1:1080 функционирует SOCKS5-прокси.

Использование MobaXterm для быстрой организации прокси-канала
В MobaXterm туннелирование настраивается через графический менеджер:
- Кликните иконку Tunneling на верхней панели инструментов.
- Нажмите New tunnel.
- Отметьте опцию Dynamic port forwarding (SOCKS proxy).
- Введите Forwarded port (1080), IP-адрес VPS, логин и порт SSH.
- Нажмите Save, а затем запустите туннель иконкой Start.
Направление трафика приложений через SSH-прокси и защита от утечек
После успешного открытия порта 127.0.0.1:1080 необходимо сконфигурировать целевой софт на работу через созданный SOCKS5-канал.
Настройка браузеров: Chrome, Firefox и расширения ZeroOmega / FoxyProxy
Перенаправлять весь трафик операционной системы через прокси не всегда целесообразно. Удобнее использовать браузерные расширения (ZeroOmega, FoxyProxy, SmartProxy), разрешающие гибкую маршрутизацию по спискам доменов.
Конфигурация в ZeroOmega:
- Откройте параметры расширения.
- Создайте новый профиль (Profile Name: SSH-SOCKS5).
- В таблице серверов выберите:
- Protocol: SOCKS5
- Server: 127.0.0.1
- Port: 1080
- Сохраните изменения нажатием Применить изменения.

Проксирование консольных утилит: proxychains-ng, ALL_PROXY и cURL
Многие консольные инструменты не имеют собственных параметров для работы с SOCKS5. Для перехвата их сетевых сокетов применяется динамический хук системных вызовов proxychains-ng.
Установите proxychains-ng:
sudo apt install proxychains4 -y # Debian / Ubuntu brew install proxychains-ng # macOS
Отредактируйте конфиг /etc/proxychains4.conf:
sudo nano /etc/proxychains4.conf
Убедитесь, что активна опция strict_chain, а в блоке [ProxyList] прописан ваш локальный сокет:
[ProxyList] # protocol host port socks5 127.0.0.1 1080
Теперь любую команду можно выполнять через SSH-прокси:
proxychains4 curl https://ifconfig.me
Использование системных переменных
Для стандартных утилит (curl, wget, git) можно объявить переменные окружения в текущей сессии:
export ALL_PROXY=socks5h://127.0.0.1:1080 export http_proxy=socks5h://127.0.0.1:1080 export https_proxy=socks5h://127.0.0.1:1080 # Проверка IP curl https://ifconfig.me
Решение проблемы утечки по DNS при SOCKS5-проксировании
Утечка DNS — это ситуация, при которой основной сетевой трафик приложения зашифрован и передается через SOCKS5-прокси, а DNS-запросы (преобразование доменных имен в IP) отправляются в незашифрованном виде на DNS-сервер вашего интернет-провайдера.

Для предотвращения утечек DNS соблюдайте правила:
- В Firefox перейдите в
about:config, найдите параметрnetwork.proxy.socks_remote_dnsи переключите его в значениеtrue. - В консоли всегда указывайте схему
socks5h://вместоsocks5://. Символhзаставляет клиент транслировать имя домена прямо на удаленную сторону.
Продвинутые сценарии: Jump Host, ProxyCommand и обход жестких фаерволов
Использование SSH-прокси позволяет формировать сложные сетевые топологии для доступа к изолированным инфраструктурам.
Многозвенные цепочки серверов через ProxyJump (-J)
Если конечный целевой сервер расположен во внутренней сети организации и доступен исключительно через внешнедоступный бастион-хост (Jump Host), прокси-сокет поднимается через каскадное подключение.
Использование ключа -J в OpenSSH:
ssh -J jump_user@bastion_vps:22 -D 127.0.0.1:1080 target_user@internal_vps
В этом сценарии SSH-клиент устанавливает защищенное соединение с bastion_vps, прозрачно пробрасывает через него сессию к internal_vps и организует SOCKS5-прокси, выходящий в сеть от лица целевого внутреннего сервера.
Эквивалентная запись в ~/.ssh/config:
Фрагмент кода
Host bastion HostName 203.0.113.10 User jump_user Host internal-node HostName 10.0.0.15 User target_user ProxyJump bastion DynamicForward 127.0.0.1:1080
Пробой корпоративных HTTP-прокси с помощью corkscrew
Если вы находитесь в жестко изолированной сети, где заблокирован исходящий 22-й порт, но разрешен доступ через корпоративный HTTP-прокси по методу CONNECT, пробить соединение помогает утилита corkscrew.
Установите corkscrew:
sudo apt install corkscrew -y
Добавьте блок в файл ~/.ssh/config:
Фрагмент кода
Host vps-via-http HostName my-external-vps.com Port 443 User admin DynamicForward 127.0.0.1:1080 ProxyCommand corkscrew corp-proxy.company.internal 8080 %h %p
corkscrew сформирует заголовок HTTP CONNECT my-external-vps.com:443 к корпоративному прокси, устанавливая сквозной туннель, внутри которого разворачивается стандартная SSH-сессия с SOCKS5.
Производительность, тюнинг и диагностика ошибок SSH-прокси
Эксплуатация SSH-прокси требует учета накладных расходов протокола SSH и специфики работы сетевого стека.
Борьба с эффектом TCP over TCP и оптимизация TCP BBR
Проблема TCP over TCP возникает из-за инкапсуляции внутреннего TCP-пакета приложения во внешний TCP-пакет SSH-сессии. В нестабильных сетях с потерями пакетов > 1-2% оба уровня TCP независимо запускают таймеры ретрансмиссии. Это вызывает каскадный взрыв повторных отправок, резко увеличивающий задержки (RTT) и снижающий пропускную способность.

Методы оптимизации:
Включите алгоритм управления перегрузками TCP BBR на VPS:
Внесите настройки в файл /etc/sysctl.conf на сервере:
Ini, TOML net.core.default_qdisc=fq net.ipv4.tcp_congestion_control=bbr
Примените изменения: sudo sysctl -p.
Используйте легкие алгоритмы шифрования:
На слабомощных клиентах без аппаратного блока AES-NI задействуйте шифр ChaCha20-Poly1305:
ssh -c chacha20-poly1305@openssh.com -f -N -D 1080 user@vps_ip
Отключите сжатие трафика (-C):
Опция сжатия gzip нагружает процессор и эффективна только на медленных каналах. На современных скоростных подключениях сжатие зашифрованных данных ухудшает производительность.
Настройка безопасности sshd_config: AllowTcpForwarding и ключи Ed25519
Для обеспечения безопасности сервера внесите правки в /etc/ssh/sshd_config:
Запретите прослушивание внешних интерфейсов:
Директива GatewayPorts должна сохранять значение no:
Ini, TOML GatewayPorts no
При значении yes открываемый прокси-сокет станет доступен внешним пользователям глобальной сети.
Разрешите проброс портов:
Убедитесь в наличии директивы:
Ini, TOML AllowTcpForwarding yes
Ограничьте права прокси-пользователя:
Если учетная запись нужна только для проксирования, ограничьте её в /etc/ssh/sshd_config:
Ini, TOML Match User proxyuser AllowTcpForwarding yes X11Forwarding no AllowAgentForwarding no ForceCommand /bin/false
Устранение обрывов связи: параметры ServerAliveInterval и TCPKeepAlive
Сетевые маршрутизаторы и государственные фаерволы обрывают неактивные TCP-сессии при отсутствии передаваемых данных в течение нескольких минут.
Для предотвращения разрывов добавьте в клиентский файл ~/.ssh/config:
Фрагмент кода
Host * ServerAliveInterval 30 ServerAliveCountMax 3 TCPKeepAlive yes
- ServerAliveInterval 30: клиент раз в 30 секунд отправляет пустые служебные пакеты внутри SSH-канала, поддерживая запись в таблицах NAT.
- ServerAliveCountMax 3: при отсутствии ответа на 3 запроса подряд (90 секунд) клиент завершает зависший процесс, давая возможность autossh пересоздать сессию.
Разбор ошибки «channel 2: open failed: administratively prohibited»
Распространенная ошибка при попытке пустить трафик через SSH-прокси:
channel 2: open failed: administratively prohibited
Причина: удаленный демон sshd заблокировал создание туннелирующего сокета.
Решение: откройте конфиг /etc/ssh/sshd_config на сервере, установите параметр AllowTcpForwarding yes, сохраните файл и выполните перезапуск службы командой sudo systemctl restart sshd.
Итоги: когда SSH-прокси незаменим, а когда стоит выбрать VPN
SSH-прокси с динамическим пробросом портов (`-D`) — это швейцарский нож в арсенале любого инженера и продвинутого пользователя. Его главное преимущество — абсолютная автономность: вам не нужно устанавливать сторонние демоны на сервер, править таблицы маршрутизации или запрашивать root-права. Полноценный зашифрованный SOCKS5-канал поднимается одной строчкой в терминале за две секунды.
Используйте SSH-прокси, если:
- Нужно быстро проксировать трафик конкретного приложения (браузера, cURL, Git, Telegram);
- На удаленном VPS нет прав root, но есть доступ по SSH;
- Требуется обойти локальные ограничения на рабочем месте без изменения сетевого профиля всей системы.
Переходите на VPN (WireGuard, OpenVPN) или Shadowsocks/sing-box, если:
- Необходим перехват 100% системного трафика на сетевом уровне (L3);
- Критически важна нативная поддержка UDP-протокола (онлайн-игры, VoIP, Torrent);
- Связь нестабильна, а потери пакетов превышают 2–3% (чтобы избежать проседания скорости из-за эффекта TCP over TCP).








