Як я можу тунелювати весь мережевий трафік через SSH?


117

Щоразу, коли я користуюся Інтернетом із незахищеного місця (наприклад, загальнодоступного Wi-Fi), я люблю використовувати тунель ssh ( ssh -D port host), щоб переконатися, що мій трафік не може бути занюханий. На жаль, здається, що існує багато програм, які не дозволяють вказати проксі (Flash - один з основних прикладів).

Схоже, має бути якийсь спосіб використовувати тунель для всього мережевого трафіку з мого комп’ютера, але я зовсім не знаю, як це зробити. Будь-яка допомога буде дуже вдячна.


16
Звичайно, ти не можеш тунелювати буквально ВСІЙ свій трафік через ssh, тому що це означатиме тунелювання ssh через себе, але ми знали, що ти маєш на увазі. :)
CarlF

1
це гарна ідея, але ви захищені лише між комп’ютером та кінцевою точкою ssh. після цього ваш трафік буде очищений (якщо не захищено інше, наприклад SSL). На жаль, набагато більше шансів на те, що ви перестанете провід, але все ж ... ви не можете дійсно довіряти проводам, якими ви не керуєте.
шарлатаний кіхот

6
Але коли ви перебуваєте в широкому Інтернеті, у вас є певна безпека бути лише одним з мільярдів пакетів, правда? Коли ви підключаєтесь до загальнодоступного Wi-Fi, ви є одним із, можливо, 3-х з'єднань, вас можна ідентифікувати особисто тощо.
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" на <local port>.

Потім відредагуйте /etc/proxychains.conf, щоб вказати на той самий порт, що і <local port>.

Нарешті запустіть програму, яку ви хочете, як проксі:

proxychains <program name>

Це має просто працювати. Однак у кількох програм виникнуть проблеми з роботою з проксі-ланцюгами. Також майте на увазі, що за допомогою Firefox вам потрібно змінити додаткові елементи в розділі about: config, щоб змусити його робити пошук DNS через проксі, а не обминати його.

Як додаткова примітка - у веб-браузерах. Якщо вони підтримують проксі-носки шкарпеток, вам не потрібно робити нічого додаткового, щоб змусити їх використовувати вищезгаданий ssh-тунель, просто введіть 127.0.0.1 для проксі-сервера SOCKS та <local port> для проксі-порту.

РЕДАКЦІЯ 3/29/16

Оскільки ця публікація все ще бачить деякі оновлення, я подумав, що я б її оновив. Проксічани все ще знаходяться в більшості репонів Linux і досі працюють у Linux. Однак проект фактично відмовляється і не працює на OSX. Для Linux або OSX я настійно рекомендую перейти на збережений форк: proxychains-ng: https://github.com/rofl0r/proxychains-ng

Окрім роботи в Linux та OSX, її легко компілювати, а також набагато краща підтримка тунелінгу DNS.

Я також повинен згадати ще один варіант - це червоні шкарпетки. Він працює аналогічно проксі-ланцюгам (-ng), і також є ймовірним у вашому dist repo: https://github.com/darkk/redsocks


Зверніть увагу на новіші системи Linux, які використовують sshuttle: під час написання є помилка ядра, яка дасть вам зламану трубку. У цьому випадку використовуйте:sshuttle -r root@host -x host 0/0
агрегат1166877

49

man sshнаводить приклад саме цього. Vpn на основі 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

~~ сніп ~~

     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).

Після того, як у вас з’явився новий інтерфейс, вам просто доведеться зробити його маршрутом за замовчуванням, це вже інше питання.


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% безпечним способом, щоб трафік не був нюханий. Додавання (хосту порту порту "blowfish ssh -D -c") було б кращим вибором, оскільки ви принаймні додаєте шифрування до свого сеансу. Ви можете додати більше варіантів, але досить просто ввести "man ssh" у свій термінал або Google для повного переліку.

Я думаю, що ви шукаєте, це налаштування VPN (Virtual Private Network)

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


6
погана порада. "міхур" - шифр 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, я просто заявив, що це краще, ніж те, що він використовує. Ви вказуєте на дійсну точку, і саме тому я згадую посібник для отримання додаткових варіантів.
ricbax

Можливо, вам слід змінити свою відповідь, оскільки це корисно інакше.
ендоліт

Забув, я запитав це, не використовуйте цей сайт регулярно. Дякую за роз’яснення… У мене було сильне враження, що SSH був захищений за замовчуванням.
Джеремі Бенкс

9
WTF не використовує шифрування SSH за замовчуванням ??
LatinSuD

-3

Скористайтеся цими прикладами:

  • Переадресація порту 80 з віддаленого хоста на 8888 у вашому localhost

    ssh -fnN -L8888: localhost: 80 користувач @ сервер

    Використовуйте це для доступу до послуг віддаленого хоста, які доступні лише там

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

    ssh -fnN -R8888: localhost: 80 користувач @ сервер

    Використовуйте це, щоб дозволити користувачам отримати доступ до ваших послуг: веб-сервер чи будь-що інше.

Ура! :)


Хороший коментар, але зовсім не пов'язаний з тим, про що ми тут говоримо. Зворотний ssh ​​дозволяє СЕРВЕРУ вимагати, щоб КЛІЄНТ відправив один порт трафіку до нього. Потрібно отримати більше конфігурації, щоб потім прокласти трафік до Інтернету. Вам також доведеться встановити тунель SSH для кожного порту. І його потрібно ініціювати з сервера, а не від клієнта - чому б ви це робили коли-небудь, якщо вам не довелося?
Beachhouse
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.