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.