sshuttle: туннель трафика через SSH без VPN-сервера

sshuttle — способ завернуть TCP (и DNS) через обычный SSH, почти как «лёгкий VPN», но без отдельного VPN-сервера на удалённой стороне. На сервере достаточно SSH-доступа и Python; на клиенте — сама утилита. Ниже: установка, базовые сценарии и типичные флаги.

Что делает sshuttle

Клиент поднимает локальный прозрачный туннель: перехватывает выбранные подсети (часто через netfilter/pf) и гонит трафик по SSH на remote host, откуда пакеты выходят в сеть сервера. Права root обычно нужны на клиенте (для правил маршрутизации/NAT), на сервере суперпользователь не обязателен.

Зачем так, а не full VPN

  • Простота. Нет WireGuard/OpenVPN-демона на сервере — только sshd.
  • Шифрование SSH. Трафик едет в уже знакомом канале.
  • Гибкость. Можно гнать весь IPv4 (0.0.0.0/0) или только нужные префиксы (офисная LAN, private cloud).
  • Обход жёстких ACL. Часто достаточно исходящего 22/tcp, который и так открыт.

Установка

Ubuntu / Debian

sudo apt-get update
sudo apt-get install sshuttle

CentOS / Fedora / RHEL-подобные

На свежих Fedora/RHEL-семействах:

sudo dnf install sshuttle

На CentOS с EPEL:

sudo yum install epel-release
sudo yum install sshuttle

macOS (Homebrew)

brew install sshuttle

Windows через WSL

Поставьте WSL (Ubuntu из Store), внутри:

sudo apt-get update
sudo apt-get install sshuttle

Маршрутизация Windows-хоста через WSL зависит от версии WSL и сетевого режима — проверяйте на своей связке.

Базовое использование

Весь IPv4 через remote

sshuttle -r user@remote_host 0.0.0.0/0
  • user — логин на сервере
  • remote_host — IP или DNS
  • 0.0.0.0/0 — все IPv4-направления (осторожно с локальными сетями и split-tunnel)

Только нужная подсеть

sshuttle -r user@remote_host 192.168.1.0/24

Так удобно зайти во внутреннюю LAN за bastion-хостом, не таща весь интернет через SSH.

SSH-ключи

Без пароля на каждый запуск:

ssh-keygen -t ed25519
ssh-copy-id user@remote_host
sshuttle -r user@remote_host 0.0.0.0/0

DNS через туннель

Часто нужен резолв «как с сервера» (внутренние имена, geo DNS):

sshuttle --dns -r user@remote_host 0.0.0.0/0

Для IPv6-префикса указывают, например, ::/0 (поддержка зависит от ОС и версии sshuttle).

Фон / daemon-режимы

В разных версиях флаги фона и «не трогать DNS» отличаются. Смотрите sshuttle --help у своей сборки: встречаются -D (daemon), режимы auto/tproxy и т.д. Не копируйте устаревшие one-liners вслепую.

Как это устроено коротко

На клиенте поднимаются правила (iptables/nft/pf и т.п.), трафик выбранных сетей уходит в локальный handler на Python, дальше — по SSH на remote, где пакеты выпускаются в сеть. Отсюда и требования: Python на сервере, рабочий SSH, на клиенте — права на сетевые правила.

Плюсы относительно классического VPN

  • не нужно поднимать VPN-сервис и сертификаты на хосте;
  • на сервере часто хватает обычного пользователя и Python;
  • используется уже открытый SSH-порт.

Минусы тоже есть: нагрузка на SSH, особенности UDP/QUIC, зависимость от client-side netfilter, не всегда удобно как постоянный корпоративный VPN.

Краткий итог

sshuttle — практичный инструмент, когда нужен быстрый защищённый выход или доступ к private-сетям через bastion без отдельного VPN-стека. Поставили пакет, указали -r user@host и префиксы, при необходимости добавили --dns — и можно работать. Для долгоживущих туннелей и высокой производительности чаще смотрят WireGuard; для ad-hoc доступа через SSH sshuttle остаётся удобным вариантом.

Источники и ссылки


Комментарии загружаются…