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 или DNS0.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 остаётся удобным вариантом.


