Ruch UDP przez tunel SSH


66

Tytuł podsumowuje. Chciałbym wysłać ruch UDP przez tunel SSH. W szczególności muszę mieć możliwość wysyłania pakietów UDP przez tunel i umożliwienia serwerowi wysyłania ich z powrotem do mnie po drugiej stronie. Wiem jak to zrobić dla połączeń TCP. Czy jest to możliwe dzięki UDP?

Odpowiedzi:


36

W tym małym przewodniku dowiesz się, jak wysyłać ruch UDP za pośrednictwem protokołu SSH przy użyciu standardowych narzędzi (ssh, nc, mkfifo) w większości systemów operacyjnych typu UNIX.

Wykonywanie tunelowania UDP przez połączenie SSH

Krok po kroku Otwórz port przekazywania TCP z połączeniem SSH

Na komputerze lokalnym (lokalnym) połącz się z odległym komputerem (serwerem) przez SSH, z dodatkową opcją -L, aby SSH z przekierowaniem portów TCP:

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

Umożliwi to przekazywanie połączeń TCP na porcie 6667 komputera lokalnego do portu 6667 na server.foo.com za pośrednictwem bezpiecznego kanału. Skonfiguruj przekazywanie TCP do UDP na serwerze

Na serwerze otwieramy detektor na porcie TCP 6667, który przesyła dane do portu UDP 53 określonego adresu IP. Jeśli chcesz wykonywać przekazywanie DNS tak jak ja, możesz wziąć adres IP pierwszego serwera nazw, który znajdziesz w /etc/resolv.conf. Ale najpierw musimy stworzyć fifo. FIFO jest niezbędny do dwukierunkowej komunikacji między dwoma kanałami. Prosty potok powłoki komunikowałby tylko standardowe wyjście lewego procesu do standardowego wejścia prawego procesu.

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

Pozwoli to na przekierowanie ruchu TCP na porcie 6667 serwera do ruchu UDP na porcie 53.1.1.1.1.1.1.1 i odpowiedzi do powrotu. Skonfiguruj przekazywanie UDP do TCP na swoim komputerze

Teraz musimy zrobić coś przeciwnego do tego, co zostało zrobione na górnym komputerze lokalnym. Potrzebujesz dostępu uprzywilejowanego, aby powiązać port UDP 53.

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

Umożliwi to przekazywanie ruchu UDP na porcie 53 komputera lokalnego do ruchu TCP na porcie 6667 komputera lokalnego. Ciesz się lokalnym serwerem DNS :)

Jak się zapewne domyślacie, zapytanie DNS zostanie wykonane na komputerze lokalnym, np. Na lokalnym porcie UDP 53, zostanie przesłane do lokalnego portu TCP 6667, następnie do portu TCP 6667 serwera, a następnie do serwera DNS serwera , Port UDP 53 z 192.168.1.1. Aby korzystać z usług DNS na komputerze lokalnym, umieść następujący wiersz jako serwer nazw w pliku /etc/resolv.conf:

nameserver 127.0.0.1

28
To rozwiązanie nie jest bezpieczne. Nie gwarantuje się, że strumienie TCP zachowają granice komunikatów, więc pojedynczy datagram UDP może zostać podzielony na części, co zepsuje dowolny protokół.
Juho Östman

2
Przydałoby się również użyć portu 1153 zamiast 6667 (z przykładu man SSH), który jest używany przez IRC.
phil pirozhkov

1
@ JuhoÖstman Dzięki za zwrócenie uwagi na tę pułapkę. Zdając sobie sprawę z problemu ... uruchomiłeś rozwiązanie accros? czy wystarczająco małe wiadomości byłyby sposobem, aby prawdopodobnie zadziałały?
humanityANDpeace

4
Rozwiązaniem byłoby dodanie długości do każdego pakietu przed wysłaniem go przez strumień TCP i odtworzenie z niego oryginalnych pakietów. Aby to zrobić, łatwo byłoby napisać skrypt C. Nie jestem jednak pewien, czy istnieje łatwo dostępne rozwiązanie. W praktyce TCP zwykle wydaje się w tym przypadku zachowywać granice komunikatów, ale w dowolnym momencie mogą wystąpić dziwne awarie.
Juho Östman

Napotkałem na inny problem: potok i fifo są buforowane, więc granice ramki zostają utracone. Tak wiele ramek UDP można połączyć w jedną ramkę TCP.
Julio Guerra,

26

Ten przykład (myślę, że odpowiedź Johna wskazuje to samo w innym miejscu), opisuje, jak uzyskać dostęp do usług UDP / DNS innego komputera przez połączenie TCP / SSH.

Przekażemy lokalny ruch UDP / 53 do TCP, następnie ruch TCP z mechanizmem przekierowania portów SSH na inny komputer, a następnie TCP do UDP / 53 na drugim końcu.
Zazwyczaj można to zrobić za pomocą openvpn.
Ale tutaj zrobimy to za pomocą prostszych narzędzi, tylko openssh i netcat.

Na końcu tej strony znajduje się kolejny komentarz z odniesieniem do „ socat”,
Ten sam dostęp UDP / DNS jest uzyskiwany za pomocą,

Po stronie serwera: po socat tcp4-listen:5353,reuseaddr,fork UDP:nameserver:53
stronie klienta:socat udp4-listen:53,reuseaddr,fork tcp:localhost:5353

Więcej przykładów można znaleźć w socat .


3
Ten wydaje mi się bardziej przydatny niż zaakceptowana odpowiedź. Potrzebowałem jednokierunkowego przekierowania strumienia wideo (TS / UDP) ... ssh orig_strm_src socat udp4-listen:4003,reuseaddr,fork STDOUT| socat STDIN udp-sendto:localhost:4003
nhed

FWIW, napisałem bardziej szczegółowy przewodnik na mojej stronie głównej, opisujący, jak skonfigurować socat przez SSH do przekazywania UDP. Używa SNMP jako przykładu.
Peter V. Mørch,

20

SSH (przynajmniej OpenSSH) obsługuje proste VPN. Korzystając z opcji -wlub Tunnelw sshkliencie, możesz utworzyć tunurządzenie na obu końcach, które może służyć do przekazywania dowolnego rodzaju ruchu IP. (Zobacz także Tunnelna stronie podręcznika ssh_config(5).) Należy pamiętać, że wymaga to OpenSSH (i prawdopodobnie uprawnień roota) na obu końcach.


Wymaga to uprawnień roota na zdalnej maszynie, nawet w przypadku tunelowania UDP nieprzypisanych portów i ustawienia PermitRootLogin na „nie”. Szkoda
phil pirozhkov

@grawity Dziękujemy za wskazanie tej opcji, która nawet, jak zauważył philpirozhkov, wymagany login roota. Zastanawiam się, czy może istnieć sposób na nakłonienie go do niepotrzebowania roota?
ludzkośćANDpeace

4
@humanityANDpeace: Możesz wstępnie przygotować urządzenia tun / tap i uczynić je własnością określonego użytkownika, używając ip tuntap add.
grawity

Cześć @grawity. Podoba mi się twoje rozwiązanie, ale nie mogę go uruchomić. Wstępnie przygotowałem tunurządzenie w następujący sposób: sudo ip tuntap add mode tunale kiedy kiedykolwiek korzystam z takiej -wopcji: ssh $Server -w $portRozumiem Tunnel device open failed. Could not request tunnel forwarding.Co robię źle?
Lucas Aimaretto

16

Lub możesz po prostu użyć ssf (który został zaprojektowany do obsługi tego przypadku użycia), za pomocą prostego polecenia:


Strona klienta:

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

To polecenie przekierowuje lokalny port 53 (dns) na port 192.168.1.1 przez bezpieczny tunel między localhost a server.foo.com.


Będziesz potrzebował serwera ssf (zamiast - lub obok - twojego serwera ssh):

#>./ssfs

Nawiasem mówiąc, zarówno klient, jak i serwer ssf działają w systemach Windows / Linux / Mac. Jest to aplikacja dla użytkowników, więc nie potrzebujesz tun / tap ani VPN.

Aby przekierować port 53, potrzebujesz uprawnień administracyjnych - niezależnie od używanego narzędzia.

Aby uzyskać więcej informacji, szczegółów, przypadku użycia lub pobrać: https://securesocketfunneling.github.io/ssf/


Zachowaj ostrożność, odpowiadając: „oto mój produkt”, to spam z pogranicza. Proponuję przeczytać i postępować zgodnie z wytycznymi z centrum pomocy .
ciężki

7
Co najwyżej jest to bezwstydna wtyczka. W każdym razie rozwiązanie może pasować do Twojego żądania. Nawiasem mówiąc, SSF to OpenSource i non-profit.
ssf-developers

11
@heavyd: Gdyby opublikował kilka zhackowanych skryptów, byłoby to do przyjęcia, ale ponieważ stworzył dojrzałe narzędzie typu open source, prawda? Idealnie odpowiada na pierwotne pytanie.
Synthead,

Muszę niechętnie przyznać, że właśnie tego szukałem, nawet jeśli była to bezwstydna wtyczka.
therealrootuser

9

Nie mogłem ncpracować dla SNMP, ponieważ klienci SNMP wybierają nowy źródłowy port UDP, a kilka może być jednocześnie aktywnych.

Zamiast tego napisałem post opisujący, jak to zrobić socatw tym poście na blogu , używając SNMP jako przykładu. Zasadniczo za pomocą dwóch terminali, zaczynając od przeglądu:

Przegląd

Terminal pierwszy:

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

To powoduje przekierowanie SSH portu TCP 10000 i uruchamia socat na serwerze. Zwróć uwagę, jak adres IP przełącznika jest wymieniony w wierszu polecenia socat jako „przełącznik”.

Terminal drugi:

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

To konfiguruje socat na kliencie. Że należy to zrobić.


to zadziałało dla mnie :)
Paul Fenney

4

VPN jest lepszym rozwiązaniem, jeśli masz dostęp do portu UDP.

Jeśli masz dostęp tylko do portu TCP SSH, to tunel SSH jest tak dobry jak VPN, przynajmniej do pingowania i śledzenia pakietów.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.