Как я могу туннелировать весь мой сетевой трафик через SSH?

117

Всякий раз, когда я использую Интернет из небезопасного места (например, общедоступного Wi-Fi), мне нравится использовать туннель ssh ( ssh -D port host), чтобы гарантировать, что мой трафик не может быть прослушан. К сожалению, кажется, что есть много приложений, которые не предоставляют способ указать прокси (Flash является одним из основных примеров).

Такое ощущение, что должен быть какой-то способ использовать туннель для всего сетевого трафика с моего компьютера, но я совершенно не знаю, как это сделать. Любая помощь будет принята с благодарностью.

НА СТРАЙК - Джереми Бэнкс
источник
16
Конечно, вы не можете туннелировать буквально ВСЕ ваш трафик через ssh, потому что это будет означать туннелирование ssh через себя, но мы знали, что вы имеете в виду. :)
CarlF
1
это хорошая идея, но вы защищены только между вашим компьютером и конечной точкой ssh. после этого ваш трафик остается открытым (если не защищено иное, например, SSL). Конечно, это гораздо вероятнее, чем через провод, но все же ... вы не можете доверять проводам, которые не контролируете.
шарлатанство
6
Но когда вы выходите в широкий Интернет, вы можете быть уверены, что являетесь одним из миллиардов пакетов, верно? Когда вы подключаетесь к общедоступному Wi-Fi, у вас одно из трех подключений, вас могут идентифицировать лично и т. Д.
endolith

Ответы:

62

Чтобы делать то, что вы хотите, я рекомендую sshuttle .

Вы используете это так:

./sshuttle -r username@sshserver 0.0.0.0/0 -vv

Он автоматически туннелирует весь ваш TCP-трафик. Вы можете добавить --dnsаргумент для туннелирования вашего DNS-трафика. На удаленном сервере должен быть установлен только Python.

Если вы хотите туннелировать только определенные программы, я бы порекомендовал прокси-цепочки .

После установки запустите прокси-сервер ssh socks следующим образом:

ssh -fND 127.0.0.1:<local port> username@sshserver

Это запустит прослушивание прокси-сервера «SOCKS» на <локальный порт>.

Затем отредактируйте файл /etc/proxychains.conf так, чтобы он указывал на тот же порт, что и <локальный порт>.

Наконец запустите вашу программу, которую вы хотите прокси-редактор, примерно так:

proxychains <program name>

Это должно просто работать. Тем не менее, некоторые программы будут иметь проблемы с работой с цепочками прокси. Также имейте в виду, что в Firefox вы должны изменить дополнительные пункты в about: config, чтобы заставить его выполнять поиск DNS через прокси, а не обходить его.

Как дополнительное примечание, о веб-браузерах. Если они поддерживают прокси-серверы socks, вам не нужно ничего делать, чтобы заставить их использовать вышеупомянутый туннель ssh, просто введите 127.0.0.1 для прокси-сервера SOCKS и <local port> для порта прокси.

РЕДАКТИРОВАТЬ 3/29/16

Так как в этом посте все еще видны некоторые отклики, я решил обновить его. Proxychains по-прежнему присутствует в большинстве репозиториев Linux и все еще работает в Linux. Однако проект фактически заброшен и не работает на OSX. Для Linux или OSX я настоятельно рекомендую перейти на все еще поддерживаемый форк: proxychains-ng: https://github.com/rofl0r/proxychains-ng

Помимо работы как в Linux, так и в OSX, его легко компилировать, а также значительно улучшена поддержка туннелирования DNS.

Я должен также упомянуть еще один вариант, который является redsocks. Он работает аналогично прокси-цепям (-ng) и, скорее всего, в вашем дистрибутивном репозитории: https://github.com/darkk/redsocks

shellster
источник
Примечание для более новых систем Linux, использующих sshuttle: на момент написания статьи была ошибка в ядре, которая давала вам сломанный канал. В этом случае используйте:sshuttle -r root@host -x host 0/0
aggregate1166877
49

man sshдает пример именно этого. ВПН на основе SSH:

SSH-BASED VIRTUAL PRIVATE NETWORKS
     ssh contains support for Virtual Private Network (VPN) tunnelling using
     the tun(4) network pseudo-device, allowing two networks to be joined
     securely.  The sshd_config(5) configuration option PermitTunnel controls
     whether the server supports this, and at what level (layer 2 or 3 traf-
     fic).

     The following example would connect client network 10.0.50.0/24 with
     remote network 10.0.99.0/24, provided that the SSH server running on the
     gateway to the remote network, at 192.168.1.15, allows it:

       # ssh -f -w 0:1 192.168.1.15 true
       # ifconfig tun0 10.0.50.1 10.0.99.1 netmask 255.255.255.252

~~ snip ~~

     Since a SSH-based setup entails a fair amount of overhead, it may be more
     suited to temporary setups, such as for wireless VPNs.  More permanent
     VPNs are better provided by tools such as ipsecctl(8) and isakmpd(8).

Как только у вас появится этот новый интерфейс, вам просто нужно будет сделать его маршрутом по умолчанию, а это другой вопрос.

PriceChild
источник
1
Не могли бы вы объяснить немного больше? Команда ifconfig создает новые интерфейсы с именем tun0, верно? Или tun0 создан с помощью ssh и просто настроен с помощью ifconfig? Может быть, добавить пример, относящийся к вопросу?
Никому
6

Ищите опцию «Туннель» в ssh. Это создаст туннельное устройство, которому вы можете назначить IP-адрес, а затем вы измените маршрут по умолчанию для использования этого туннеля.

Питер Айзентраут
источник
4

Я разработал программное обеспечение, которое позволяет вам пересылать все TCP и, опционально, UDP через прокси-сервер SOCKS5 для всей системы.

http://code.google.com/p/badvpn/wiki/tun2socks

Он даже может быть установлен на маршрутизаторе для пересылки всех соединений с компьютеров в локальной сети.

Амброз Бижак
источник
0

ВИРТУАЛЬНЫЕ ЧАСТНЫЕ СЕТИ НА ОСНОВЕ SSH ssh содержит поддержку туннелирования виртуальной частной сети (VPN) с использованием псевдоустройства tun (4), что позволяет безопасно соединять две сети. Параметр конфигурации sshd_config (5) PermitTunnel контролирует, поддерживает ли сервер это и на каком уровне (трафик уровня 2 или 3).

 The following example would connect client network 10.0.50.0/24 with
 remote network 10.0.99.0/24 using a point-to-point connection from
 10.1.1.1 to 10.1.1.2, provided that the SSH server running on the gateway
 to the remote network, at 192.168.1.15, allows it.

 On the client:

       # ssh -f -w 0:1 192.168.1.15 true
       # ifconfig tun0 10.1.1.1 10.1.1.2 netmask 255.255.255.252
       # route add 10.0.99.0/24 10.1.1.2

 On the server:

       # ifconfig tun1 10.1.1.2 10.1.1.1 netmask 255.255.255.252
       # route add 10.0.50.0/24 10.1.1.1

 Client access may be more finely tuned via the /root/.ssh/authorized_keys
 file (see below) and the PermitRootLogin server option.  The following
 entry would permit connections on tun(4) device 1 from user “jane” and on
 tun device 2 from user “john”, if PermitRootLogin is set to
 “forced-commands-only”:

   tunnel="1",command="sh /etc/netstart tun1" ssh-rsa ... jane
   tunnel="2",command="sh /etc/netstart tun2" ssh-rsa ... john

 Since an SSH-based setup entails a fair amount of overhead, it may be
 more suited to temporary setups, such as for wireless VPNs.  More perma‐
 nent VPNs are better provided by tools such as ipsecctl(8) and
 isakmpd(8).
Кристиан Хермансен
источник
1
Пожалуйста, добавьте источник вашей информации. примечание: это старый вопрос.
Лоренцо фон Маттерхорн
-2

Я просто хотел прояснить, что (хост порта ssh -D) не является 100% безопасным способом для отслеживания трафика. Добавление (ssh -D -c хозяина порта blowfish) было бы лучшим выбором, потому что вы как минимум добавляете шифрование к своему сеансу. Вы можете добавить больше опций, но достаточно просто набрать "man ssh" в своем терминале или в Google, чтобы получить полный список.

Я думаю, что вам нужен вариант настройки VPN (виртуальная частная сеть)

Перед тем, как приступить к настройке собственной VPN, ознакомьтесь с этой статьей, чтобы понять разницу между этими двумя понятиями ( SSH и VPN ) или хорошую обобщенную версию . Если вы решите пойти по VPN-маршруту, я рекомендую OpenVPN , его бесплатное и множество документации и поддержки.

ricbax
источник
6
плохой совет. «blowfish» - это шифр SSH-1; это быстро, считается безопасным (по состоянию на 1999: unixhelp.ed.ac.uk/CGI/man-cgi?ssh+1 ), но все же. Вы, вероятно, хотите ssh -2 -C -D [...](форсировать SSH2, использовать сжатие) и отбросить -c. согласно моей системе man sshсписок шифров в SSH2 по умолчанию равен aes128-cbc,3des-cbc,blowfish-cbc,[etc]. Я хочу -c blowfishсказать, что если вы захотите, вы можете получить SSH1, который гораздо менее безопасен, чем SSH2.
шарлатанство
2
Правда, но у Джереми сложилось впечатление, что соединение было защищено только с -D 8080, я просто заявил, что это лучше, чем то, что он использовал. Вы делаете правильное замечание, и именно поэтому я упоминаю руководство для большего количества вариантов.
Рикбакс
Может быть, вы должны изменить свой ответ, так как это полезно в противном случае.
эндолит
Забыл, я спросил об этом, не пользуйтесь этим сайтом регулярно. Спасибо за разъяснения ... У меня сложилось впечатление, что SSH по умолчанию безопасен.
НА УДАРОК ​​- Джереми Бэнкс
9
WTF не использует SSH шифрование по умолчанию?
LatinSuD
-3

Используйте эти примеры:

  • Перенаправить порт 80 с удаленного хоста на 8888 на вашем локальном хосте

    ssh -fnN -L8888: localhost: 80 пользователь @ сервер

    Используйте это для доступа к службам на удаленном хосте, которые доступны только там

  • Перенаправьте порт 80 с вашего локального хоста на 8888 на удаленном хосте

    ssh -fnN -R8888: localhost: 80 пользователь @ сервер

    Используйте это, чтобы предоставить пользователям доступ к вашим услугам: веб-серверу или как угодно.

Ура! :)

kolypto
источник
Хороший комментарий, но никак не связанный с тем, о чем мы здесь говорим. Обратный ssh ​​позволяет СЕРВЕРУ запрашивать, чтобы КЛИЕНТ направил ОДИН порт трафика к нему. Потребовалась бы дополнительная настройка, чтобы затем направить этот трафик в Интернет. Вам также необходимо настроить туннель SSH для каждого порта. И это должно быть инициировано с сервера, а не с клиента - зачем вам это когда-либо делать, если бы вам не пришлось?
Beachhouse