Debian.pro/

Про Debian


Извращенные методы туннелирования трафика: часть 1. Прощай openvpn, привет sshuttle

Кажется, что я вспомнил про свой блог и решил сюда чего-нибудь написать. Точнее, не чего-нибудь, а самый прекрасный способ быстренько организовать себе VPN-соединение через другой сервер.
На «другой сервер» вам нужен только ssh (при том — не обязательно под рутом). Ещё на той стороне понадобится установленный python 2.3+ (а это все дебианы, начиная с 4-ки, кажется, и все убунты, начиная с 8.04). Ну и понадобится рутовый доступ на своём любимом ноутбучке. Всё — этого достаточно для того, чтобы зароутить весь трафик системы через ssh через сервер у нормального провайдера.
Заинтригованы? Поехали.

Для начала, поставим виновника торжества — пакет sshuttle

root@laptop:~# apt-get install sshuttle

Теперь цепляем VPN:

root@laptop:~# sshuttle -r user@remoteserver 0.0.0.0/0 -vv

Последней командой мы завернули весь ipv4-трафик (0.0.0.0/0) своей системы через ssh-туннель до remoteserver. Всё.

Когда я первый раз наткнулся на эту утилиту у меня на лице выражение было с тегом «WAT?». Это же действительно гениально, ей б-гу. SSH-ей у всех хватает, OpenVPN поднимать ради «раз в неделю из открытой wifi-сети посидеть» лениво (окей-окей, не всем).

Ну да ладно, теперь о технических деталях. Сначала о минусах. Первый минус — нет поддержки ipv6. Второй — медленно, блеа! 2 мегабита в секунду через hetzner (с RTT всё хорошо, тем не менее). Но с медленно — это понятно, это ssh, он зашифрован на отличненько, хочет хороший процессор с обеих сторон (а у меня на второй стороне виртуалка с одним ядром). Ещё к минусам можно отнести то, что из коробки он пробрасывает через себя только tcp (и udp пробрасывает хреново, хотя и справляется с dns-трафиком).
Плюсы — мало кто догадывается, что можно делать так. Сами знаете о чём я. Следующий плюс — оно действительно «Just works» и не нужно ни с чем извращаться.

Теперь о том, как работает.
1) в момент запуска sshuttle копирует на удаленный сервер некий assembler.py (/usr/lib/sshuttle/assembler.py с ноута)
2) запускает assembler.py на удаленном сервере (python2 -c import sys; skip_imports=1; verbosity=2; exec compile(sys.stdin.read(764), «assembler.py», «exec»))
3) запускает на локалхосте /usr/lib/sshuttle/main.py
4) в iptables добавляет правило, по которым весь tcp трафик заворачивается в ssh-туннель.

Ещё несколько примеров. Завернем DNS трафик через туннель тоже:

root@laptop:~# sshuttle -r user@remoteserver 0.0.0.0/0 -vv --dns

(учтите, что если у вас в resolv.conf прописаны провайдерские dns-резолверы, то к ним вас после этой команды могут «не пустить». Впрочем — кто такой херней страдает и оставляет провайдерские dns?)

Используем ssh-ключ для коннекта:

root@laptop:~# sshuttle -r user@remoteserver 0.0.0.0/0 -vv --dns --ssh-cmd "ssh -i /home/username/.ssh/id_dsa"

Используем ssh-агента для коннекта:

root@laptop:~# sudo SSH_AUTH_SOCK="$SSH_AUTH_SOCK" sshuttle -r root@messer.qs.biz 0.0.0.0/0 -vv

Отроутим трафик через ssh только до определенных сетей/хостов:

root@laptop:~# SSH_AUTH_SOCK="$SSH_AUTH_SOCK" sshuttle -r root@messer.qs.biz 188.40.35.183/32 153.121.72.212/32 153.121.72.211/32 173.194.122.0/24 -vv

Да, ещё где-то в недрах «это ж опенсорс!» есть версия, которая умеет роутить вообще весь трафик (и icmp, и весь udp), но она не очень похожа на стабильную. https://github.com/brianmay/sshuttle/tree/tproxy — вот здесь (это НЕ апстрим проекта).

И если вы никуда не торопитесь — то такой туннель можно поднять и внутри любого другого VPN-соединения ;)


Комментарии (1):

  1. Благодарный читатель :

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

Написать комментарий