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

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

sshuttle заворачивает TCP и DNS в обычное SSH-соединение. Получается почти VPN, только без VPN-сервера на удалённой стороне: на сервере нужен SSH-доступ и Python, на клиенте сама утилита и права root. Свежая версия 2.0.0 вышла 28 сентября 2026 года. Ниже установка, основные сценарии и полезные ключи.

Что делает sshuttle

На клиенте sshuttle ставит правила файрвола для выбранных подсетей и перехватывает исходящие TCP-соединения в них. Дальше трафик идёт по SSH на сервер, где копия sshuttle открывает те же соединения уже из своей сети и гоняет данные туда и обратно. Пакеты внутри TCP не заворачиваются, поэтому нет проблемы TCP поверх TCP, из-за которой обычный туннель через SSH тормозит.

Ставить sshuttle на сервер не нужно. Он сам загружает свой код в удалённый Python и запускает его. Root нужен только на клиенте, чтобы менять правила файрвола, на сервере хватает обычного пользователя.

Зачем так, а не полноценный VPN

  • Просто: на сервере нет демона WireGuard или OpenVPN, только sshd.
  • Шифрует SSH, то есть канал, который у вас уже настроен и которому вы доверяете.
  • Гибко: можно пустить через сервер весь IPv4 или только нужные подсети, например офисную сеть за бастионом.
  • Работает там, где наружу открыт только 22-й порт.

Требования и методы

С версии 2.0 и клиенту, и серверу нужен Python 3.10 или новее, поддержку 3.9 убрали. Способ перехвата трафика называется методом и выбирается автоматически, но его можно задать ключом --method:

  • nat на Linux через iptables: TCP и DNS, IPv4 и IPv6;
  • nft на Linux через nftables: то же самое;
  • tproxy на Linux: единственный метод, который умеет ещё и UDP;
  • pf на macOS, FreeBSD, OpenBSD и pfSense;
  • на Windows экспериментальный метод windivert.

Установка

Пакет есть почти во всех дистрибутивах, полный список в документации. Учтите, что в репозиториях дистрибутива версия может быть старше 2.0.

# Debian, Ubuntu
sudo apt install sshuttle
# Fedora, RHEL и похожие (на RHEL нужен EPEL)
sudo dnf install sshuttle
# Arch
sudo pacman -S sshuttle
# macOS
brew install sshuttle
# свежая версия из PyPI
sudo pip install sshuttle

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

Пустить весь IPv4 через сервер:

sshuttle -r user@remote_host 0.0.0.0/0
# то же короче
sshuttle -r user@remote_host 0/0

Здесь user это логин на сервере, remote_host его адрес или имя. Сам адрес SSH-сервера sshuttle исключает из туннеля автоматически. Если подключение идёт через ProxyCommand, исключать нужно руками ключом -x.

Только нужная подсеть, например сеть за бастионом, без всего интернета:

sshuttle -r user@remote_host 192.168.1.0/24

DNS через туннель, когда нужно резолвить имена так, как их видит сервер, например внутренние:

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

Быстрый вариант на случай, когда сломался рабочий VPN и надо срочно попасть во внутренние адреса. Ключ -N сам подбирает подсети с сервера, -H подтягивает имена хостов:

sshuttle --dns -NHr user@remote_host 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16

Чтобы не вводить пароль при каждом запуске, настройте вход по ключу:

ssh-keygen -t ed25519
ssh-copy-id user@remote_host

Полезные ключи

  • -x подсеть исключает адреса из туннеля, например локальную сеть.
  • -D уводит sshuttle в фон, вместе с ним пригодятся --pidfile и --syslog.
  • --disable-ipv6 выключает перехват IPv6.
  • -v включает подробный вывод, когда что-то не работает.
  • --sudoers-no-modify печатает файл для sudoers, чтобы запускать без пароля sudo. Авторы предупреждают, что это небезопасно: через --ssh-cmd такой пользователь сможет выполнить что угодно от root.

Полный список ключей в справке sshuttle.

Windows

На Windows есть экспериментальная поддержка через метод windivert: нужен пакет pydivert и консоль администратора, а работает только TCP по IPv4, без IPv6, UDP и DNS. Второй вариант из документации: запустить sshuttle в Linux-виртуалке с сетевым мостом и направить через неё маршрут Windows.

Ограничения

Вся нагрузка ложится на одно SSH-соединение, UDP работает только в режиме tproxy, а значит QUIC и голосовые сервисы через обычный режим не пойдут. Для постоянного корпоративного доступа и высокой скорости обычно ставят WireGuard.

В итоге sshuttle удобен, когда нужен быстрый защищённый выход в интернет или доступ к внутренней сети через бастион без отдельного VPN-стека. Поставили пакет, указали -r user@host и подсети, при необходимости добавили --dns, и можно работать.

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


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