Prosty sposób na utworzenie tunelu z jednego portu lokalnego do drugiego?


76

Mam serwer programistyczny, który jest dostępny tylko od 127.0.0.1:8000, a nie 192.168.1.x: 8000. Jako szybki hack istnieje sposób, aby skonfigurować coś do nasłuchiwania na innym porcie (powiedzmy 8001), aby z sieci lokalnej mógł połączyć 192.168.1.x: 8001 i tunelowałby ruch między klientem a 127.0 .0.1: 8000?


4
Netcat może to zrobić.
— Andy

Odpowiedzi:


44

Korzystanie z ssh jest najłatwiejszym rozwiązaniem.

ssh -g -L 8001: localhost: 8000 -f -N użytkownik@remote-server.com

To przekierowuje port lokalny 8001 na stacji roboczej na adres hosta lokalnego na porcie remote-server.com 8000.
-goznacza, że ​​pozwala innym klientom w mojej sieci na połączenie się z portem 8001 na mojej stacji roboczej. W przeciwnym razie tylko lokalni klienci na stacji roboczej mogą połączyć się z przekierowanym portem.
-Noznacza, że ​​wszystko, co robię, to przekierowywanie portów, nie uruchamiaj powłoki.
-foznacza rozwidlenie w tle po udanym połączeniu SSH i zalogowaniu.
Port 8001 pozostanie otwarty dla wielu połączeń, dopóki ssh nie umrze lub nie zostanie zabity. Jeśli zdarzyło Ci się być w systemie Windows, doskonały klient SSH PuTTY może to zrobić. Użyj 8001 jako portu lokalnego i hosta lokalnego: 8000 oraz miejsca docelowego i dodaj przekierowanie portu lokalnego w ustawieniach. Możesz go dodać po udanym połączeniu z PuTTY.


4
Czego user@remote-server.comzrobić? Jest to zdecydowanie niepotrzebne do przekierowania portów, jednak ssh wymaga tego argumentu, a ponadto próbuje się tam połączyć. A po ustawieniu tej irytującej opcji na nazwę hosta wypisuje …port 22: Connection refused (nie, nie użyłem portu 22) . Jeśli coś mi nie brakuje, polecenie po prostu nie działa.
— Hi-Angel,

@ Hi-Angel user@remote-server.comto tylko przykład i nie powinieneś brać tego dosłownie. Musisz zastąpić to nazwą komputera, z którym chcesz się połączyć, i swoją nazwą użytkownika na tym komputerze. Informacje te są potrzebne do nawiązania połączenia ssh. Tylko po ustanowieniu połączenia ssh porty mogą być przekazywane przez to połączenie.
— Piotr Dobrogost

Jeśli chcesz, aby port był dostępny podczas rozruchu, zobacz „autossh” w usłudze systemowej przy użyciu powyższej metody - everythingcli.org/ssh-tunnelling-for-fun-and-profit-autossh
— Richard Hollis

Dostaję również „odmowę połączenia”. I nadal nie rozumiem, dlaczego argument user@remote-server.com jest potrzebny, gdy nie ma w nim połączenia SSH (zgodnie z -N). Powinny po prostu przekazywać pakiety.
— Alexander Taylor,

2
@AlexanderTaylor -Nnie oznacza, że ​​nie ma połączenia SSH. To po prostu oznacza do not execute a remote command(patrz strona podręcznika ). <user>@<host>Argument jest to konieczne, ponieważ nie otworzyć połączenie SSH <host>(które dla przypadku OP będzie localhost) i przekazuje odpowiedni port przez tunelu SSH. Jest to jedno rozwiązanie problemu OP, ale nie najprostsze. Do przekazania localhost bez ssh, można użyć socatlub netcatjak w StephaneChazelas i not-a-user „s odpowiedzi

94

Z socatna serwerze:

socat tcp-listen:8001,reuseaddr,fork tcp:localhost:8000

Domyślnie socatnasłuchuje na porcie TCP 8001 na dowolnym adresie IPv4 lub IPv6 (jeśli jest obsługiwany) na komputerze. Możesz ograniczyć go do IPv4 / 6, zastępując tcp-listengo tcp4-listenlub tcp6-listen, lub do określonego adresu lokalnego, dodając ,bind=that-address.

To samo dotyczy gniazda podłączanego do serwera proxy, możesz użyć dowolnego adresu zamiast localhosti zastąpić tcpgo tcp4lub tcp6jeśli chcesz ograniczyć rozdzielczość adresów do adresów IPv4 lub IPv6.

Należy zauważyć, że w przypadku serwera nasłuchującego na porcie 8000 połączenie będzie wyglądało tak, jakby pochodziło od serwera proxy (w takim przypadku localhostbędzie localhost), a nie od oryginalnego klienta. Aby serwer mógł stwierdzić, kto jest klientem , musisz użyć podejść DNAT (ale wymaga to uprawnień administratora).


1
Dzięki, to świetnie, ponieważ nie musisz mieć uruchomionego lokalnego serwera ssh.
— jontro

Czy mogę używać tego samego portu, ale innego adresu?
— Amos

@amos, patrz edycja.
— Stéphane Chazelas

Czy byłoby również możliwe przekazywanie ruchu tylko z określonych adresów IP?
— Phate

1
@ Phate, zobacz Informowanie socat, aby nasłuchiwało połączeń z jednego adresu IP ( rangeoraz tcpwrapopcji i na socatstronie man).
— Stéphane Chazelas

46

Korzystanie z tradycyjnego ncjest najłatwiejszym rozwiązaniem:

nc -l -p 8001 -c "nc 127.0.0.1 8000"

Ta wersja ncjest w netcat-traditionalpakiecie na Ubuntu. (Musisz to update-alternativeslub zadzwonić nc.traditional.)

Zauważ, że w przeciwieństwie do ssh nie jest to szyfrowane. Pamiętaj o tym, jeśli używasz go poza jednym hostem.


2
ktoś zna odpowiednik na netcat-openbsd?
— Sridhar Sarnobat

2
Analogowego do netcatwersji, która jest zawarta w busybox: nc -v -lk -p 8001 -e /usr/bin/nc 127.0.0.1 8000. ( Opis parametrów )
— Ivan Kolmychek

2
Działa, ale ncpolecenie kończy się po pierwszym zdalnym połączeniu. Dodaj, -kjeśli chcesz, aby był nadal uruchomiony.
— Sopalajo de Arrierez

Pojawia się ten błąd: nc: cannot use -p and -lw CentOS 6.4. Czy jest w pobliżu praca?
— Nick Predey

Wolę to rozwiązanie od ssh, ponieważ ułatwia korzystanie z niego jako root, gdy trzeba lokalnie przesłać uprzywilejowany port.
— Christian

24

Netcat OpenBSD jest domyślnie dostępny w systemie Linux, a także w systemie OS X.

OSX:

mkfifo a
mkfifo b
nc 127.0.0.1 8000 < b > a &
nc -l 8001 < a > b &

Linux:

mkfifo backpipe
nc -l 12345 0<backpipe | nc www.google.com 80 1>backpipe

Alternatywą działającą w bash OS X jest użycie potoku dwukierunkowego . Może działać na innych Uniksach:

nc 127.0.0.1 8000 <&1 | nc -l 8001 >&0

Z początku nie zauważyłem, że używasz netbata openbsd. Jest to lepsze niż konieczność instalowania kolejnego netcata z pakietu Ubuntu.
— RobertR

Przykład OpenBSD nie powiódł się na Ubuntu 15.04. Dzięki przekierowaniom powłoki netcat nie otwiera portu do nasłuchiwania widzianego przez ss -tanlub netstat -tan.
— Justin C

⁺¹. FTR: alternatywny sposób działa na Ubuntu
— Hi-Angel,

Nie rozumiem twojego rozwiązania. Możesz to wyjaśnić?
— Trismegistos,

@trismegistos W tych przykładach słuchacz i klient netcat przekierowują dane wejściowe do niektórych udostępnionych plików (mkfifo pipes..pierwsze pierwsze wyjście) i używają tych udostępnionych plików jako źródła / miejsca docelowego wejścia / wyjścia, skutecznie tworząc tunel. Zwykle używa się klienta / słuchacza, ale niektóre techniki używają klienta + klienta / słuchacza + słuchacza- wiki.securityweekly.com/... i slideshare.net/amiable_indian/secrets-of-top-pentesters muszą przeczytać.
— Info5ek,

4

Cytując Davida Spillett „s odpowiedź na ServerFault

rinetd powinien wykonać zadanie, a plik binarny dla systemu Windows można go pobrać ze strony http://www.boutell.com/rinetd/ (dla każdego, kto szuka tego samego pod Linuksem, rinetd znajduje się w standardowych repozytoriach niemal każdej dystrybucji więc można go zainstalować za pomocą „apt-get install rinetd” lub „yum install rinetd” lub podobnego)

Jest to prosty plik binarny, który pobiera plik konfiguracyjny w formacie

bindaddress bindport connectaddress connectport

Na przykład:

192.168.1.1 8001 127.0.0.1 8000

lub

0.0.0.0 8001 127.0.0.1 8000

jeśli chcesz powiązać port przychodzący ze wszystkimi interfejsami.


3
iptables -t nat -A PREROUTING -p tcp --dport <origin-port> -j REDIRECT --to-port <destination-port>

service iptables save
service iptables restart

Po próbie połączenia się dport, jak w nc -v localhost 2345, dostaję Connection refused. Nie jestem zbyt dobry w iptables, ale myślę, że dport musi mieć aplikację do słuchania.
— Hi-Anioł

Co się stanie, jeśli port źródłowy ma inny interfejs niż port docelowy?
— Trismegistos,

0

W oparciu o odpowiedź Marka A. musiałem dokonać drobnej modyfikacji, aby działała na moim komputerze Mac (przynajmniej w systemie macOS Mojave w wersji 10.14.4)

mkfifo a
mkfifo b
nc 127.0.0.1 8000 < b > a &
nc -l 8001 < a > b &
printf "" > a

To oświadczenie printf wydaje się kluczowe. W przeciwnym razie polecenie netcat do połączenia z portem 8000 nigdy nie spróbuje się połączyć, a polecenie netcat do nasłuchiwania na porcie 8001 nigdy nie będzie nasłuchiwać na porcie 8001. Bez printf za każdym razem, gdy będę próbował połączyć się z portem 8001, dostanę połączenie odrzucone.

Zakładam, że netcat musi jakoś zablokować standardowe wejście (być może z jakiegoś powodu próbuje to odczytać) przed wykonaniem jakichkolwiek operacji Socket. Jako taki, bez wypisania instrukcji printf do fifo a, polecenie netcat nigdy nie zacznie nasłuchiwać na porcie 8001.

Uwaga: zostawiłbym odpowiedź na postu Marka, ale nie mam jeszcze reputacji.


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.