UDP трафік через тунель SSH


66

Назва в значній мірі підсумовує це. Я хотів би відправити трафік UDP через тунель SSH. Зокрема, мені потрібно мати можливість відправляти пакети UDP через тунель і сервер мати можливість надсилати їх мені назад з іншого боку. Я знаю, як це зробити для TCP-з'єднань. Чи можливо це за допомогою UDP?

Відповіді:


36

Цей невеликий посібник розповідає, як надсилати UDP-трафік через SSH, використовуючи інструменти, стандартні (ssh, nc, mkfifo), для більшості UNIX-подібних операційних систем.

Виконання тунелювання UDP через з'єднання SSH

Крок за кроком Відкрийте передній порт TCP зі своїм SSH-з'єднанням

На локальній машині (локальній) підключіться до віддаленої машини (сервера) за допомогою SSH з додатковою опцією -L, щоб SSH з TCP-портом вперед:

local# ssh -L 6667:localhost:6667 server.foo.com

Це дозволить TCP-з'єднанням на номер порту 6667 вашої локальної машини пересилати на номер порту 6667 на сервері server.foo.com через захищений канал. Встановіть TCP на UDP вперед на сервері

На сервері ми відкриваємо слухач на порту 6667 TCP, який буде пересилати дані до порту 53 UDP зазначеного IP. Якщо ви хочете переадресувати DNS, як я, ви можете взяти IP першого сервера імен, який ви знайдете в /etc/resolv.conf. Але для початку нам потрібно створити фіфо. Фіфо необхідний для двостороннього зв'язку між двома каналами. Проста оболонка передає лише стандартний вхід лівого процесу «стандартний вихід до правого процесу».

server# mkfifo /tmp/fifo
server# nc -l -p 6667 < /tmp/fifo | nc -u 192.168.1.1 53 > /tmp/fifo

Це дозволить пересилати трафік TCP на порт 6667 сервера до трафіку UDP на порту 53 192.168.1.1 і відповіді повертатися. Налаштуйте UDP на TCP вперед на вашому комп'ютері

Тепер нам потрібно зробити протилежне тому, що було зроблено вгорі на локальній машині. Вам потрібен приватний доступ, щоб зв’язати порт UDP 53.

local# mkfifo /tmp/fifo
local# sudo nc -l -u -p 53 < /tmp/fifo | nc localhost 6667 > /tmp/fifo

Це дозволить передати UDP-трафік на порту 53 локальної машини на TCP-трафік на порту локальної машини 6667. Насолоджуйтесь локальним сервером DNS :)

Як ви, напевно, вже здогадалися, коли запит DNS буде виконуватися на локальній машині, наприклад, на локальному порту UDP 53, він буде пересланий на локальний порт TCP 6667, потім на порт TCP-порту 6667 сервера, потім на DNS-сервер сервера , Порт UDP 53 від 192.168.1.1. Щоб користуватися послугами DNS на локальній машині, поставте наступний рядок як сервер імен у своєму /etc/resolv.conf:

nameserver 127.0.0.1

28
Це рішення не є безпечним. Потоки TCP не гарантують збереження меж повідомлення, тому одна дейтаграма UDP може бути розділена на частини, порушуючи будь-який протокол.
Juho Östman

2
Також може бути непогано використовувати порт 1153 замість 6667 (з прикладу man SSH), який використовується IRC.
філ пірожков

1
@ JuhoÖstman Дякуємо за вказівку на цей підводний камінь. Усвідомлюючи проблему ... Ви застосували рішення для акроса? Чи досить малі повідомлення стануть способом зробити так, щоб це ймовірно працювало?
людствоANDpeace

4
Рішенням було б додати довжину до кожного пакету перед тим, як вони будуть відправлені через потік TCP, і реконструювати вихідні пакети з цього. Було б легко написати сценарій С, щоб це зробити, але я не впевнений, чи існує доступне рішення. На практиці, як правило, TCP, як правило, зберігає межі повідомлення в цьому випадку, але дивні збої можуть статися в будь-який час.
Juho Östman

Я зіткнувся з ще однією проблемою з цим: труба та фіфоза буферизовані, тому межі рамки втрачені. Стільки кадрів UDP можна об'єднати в один кадр TCP.
Хуліо Гуерра

26

Цей приклад (я думаю, що відповідь Джона вказує те саме на інше місце), описує, як отримати доступ до служб UDP / DNS іншої машини через з'єднання TCP / SSH.

Ми будемо пересилати локальний трафік UDP / 53 на TCP, потім TCP-трафік з механізмом переадресації портів SSH на іншу машину, потім TCP на UDP / 53 на інший кінець.
Як правило, це можна зробити за допомогою openvpn.
Але тут ми зробимо це з більш простими інструментами, лише openssh і netcat.

В кінці цієї сторінки - ще один коментар із посиланням на " socat",
той самий доступ до UDP / DNS,

Сторона сервера: socat tcp4-listen:5353,reuseaddr,fork UDP:nameserver:53
Сторона клієнта:socat udp4-listen:53,reuseaddr,fork tcp:localhost:5353

Додаткову інформацію див. У прикладах socat .


3
Цей здається мені набагато кориснішим, ніж прийнята відповідь. Мені потрібно було однонаправлене перенаправлення відеопотоку (TS / UDP) ... ssh orig_strm_src socat udp4-listen:4003,reuseaddr,fork STDOUT| socat STDIN udp-sendto:localhost:4003
nhed

FWIW, я написав більш детальне керівництво на своїй домашній сторінці, в якому описано, як налаштувати socat через SSH для пересилання UDP. В якості прикладу використовується SNMP.
Пітер В. Морч

20

SSH (принаймні OpenSSH) має підтримку простих VPN. Використовуючи в клієнті -wабо Tunnelпараметр ssh, ви можете створити tunпристрій на обох кінцях, який можна використовувати для пересилання будь-якого типу IP-трафіку. (Дивіться також Tunnelна сторінці керівництва ssh_config(5).) Зауважте, що для цього потрібні OpenSSH (і, можливо, права root) на обох кінцях.


Для цього потрібні кореневі привілеї на віддаленій машині навіть для тунелювання UDP непривілейованих портів та PermitRootLogin, встановлених на "ні". Дуже погано.
phil pirozhkov

@grawity Дякую за вказівку на цю опцію, яка навіть тоді, коли філіпірожков вказала на необхідний кореневий логін. Цікаво, чи може бути спосіб, як обманути це, не потребуючи корінь?
людствоANDpeace

4
@humanityANDpeace: Ви можете заздалегідь створити пристрої налаштування / дотику та зробити їх власністю конкретного користувача, використовуючи ip tuntap add.
grawity

Привіт @grawity. Мені подобається ваше рішення, але не можу змусити його працювати. Я попередньо створив tunпристрій таким чином: sudo ip tuntap add mode tunале коли-небудь використовувати такий -wваріант: ssh $Server -w $portя розумію, Tunnel device open failed. Could not request tunnel forwarding.що я роблю неправильно?
Лукас Аймаретто

16

Або ви можете просто використовувати ssf (який був розроблений для обробки цього випадку використання), за допомогою простої команди:


Сторона клієнта:

#>./ssfc -U 53:192.168.1.1:53 server.foo.com

Ця команда переадресовує локальний порт 53 (dns) на порт 532.168.1.1 через захищений тунель між localhost та server.foo.com.


Вам знадобиться ssf-сервер (замість - або поруч із вашим ssh-сервером):

#>./ssfs

До речі, і клієнтська, і серверна частина ssf працюють у Windows / Linux / Mac. Це програма для користувачів, тому вам не потрібні налаштування / натискання або VPN.

Щоб перенаправити порт 53, вам знадобляться права адміністратора - незалежно від інструменту, який ви використовуєте.

Для отримання додаткової інформації, деталей, використовуйте регістр або завантажте: https://securesocketfunneling.github.io/ssf/


Будьте обережні, відповідаючи: "ось мій товар", це прикордонний спам. Я пропоную прочитати та дотримуватися вказівок довідкового центру .
важкий

7
Принаймні, це безсоромна пробка. У будь-якому випадку рішення може відповідати вашому запиту. До речі, SSF - це OpenSource та некомерційний.
ssf-developers

11
@heavyd: Якщо він опублікував купу хакі-скриптів, це було б прийнятно, але оскільки він зробив зрілий інструмент з відкритим кодом, це не так? Це ідеально відповідає на оригінальне запитання.
Synthead

Я мушу з жалем визнати, що це саме той інструмент, який я шукав, навіть якщо це була безсоромна пробка.
therealrootuser

9

Мені не ncвдалося працювати на SNMP, оскільки клієнти SNMP постійно вибирають новий вихідний порт UDP, і декілька можуть бути активними відразу.

Натомість я написав публікацію, в якій описував, як це зробити socatу цій публікації блогу , використовуючи SNMP як приклад. По суті, використовуючи два термінали, починаючи з огляду:

огляд

Термінал перший:

client$ ssh -L 10000:localhost:10000 server
server$ socat -T10 TCP4-LISTEN:10000,fork UDP4:switch:161

Це створює SSH пересилання TCP-порту 10000 і запускає socat на сервері. Зверніть увагу, як IP-адреса комутатора згадується в командному рядку socat як "комутатор".

Термінал другий:

client$ sudo socat UDP4-LISTEN:161,fork TCP4:localhost:10000

Це налаштовує socat на клієнта. Це повинно це робити.


це працювало для мене :)
Пол Фенні

4

VPN - це краще рішення, якщо у вас є доступ до порту UDP.

Якщо ви маєте доступ лише до порту TCP SSH, то тунель SSH такий же хороший, як і VPN, принаймні для зворотного відстеження пінгу та пакетів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.