it-swarm-eu.dev

Jednoduchý způsob, jak vytvořit tunel z jednoho místního portu do druhého?

Mám vývojový server, který je přístupný pouze od 127.0.0.1:8000, nikoli 192.168.1.x: 8000. Jako rychlý hack, existuje způsob, jak nastavit něco pro poslech na jiném portu (řekněme 8001) tak, aby se z místní sítě mohl připojit 192.168.1.x: 8001 a to by tunel provoz mezi klientem a 127.0 0,1: 8000?

83
waitinforatrain

Použití ssh je nejjednodušší řešení.

ssh -g -L 8001: localhost: 8000 -f -N [email protected]

To přeposílá místní port 8001 na vaší pracovní stanici na adresu localhost na portu 8000 na serveru remote-server.com.
-g znamená povolit ostatním klientům v mé síti připojení k portu 8001 na mé pracovní stanici. Jinak se k předávanému portu mohou připojit pouze místní klienti na vaší pracovní stanici.
-N znamená, že vše, co dělám, je přeposílání portů, nezačíná Shell.
-f znamená vidličku na pozadí po úspěšném připojení a přihlášení SSH.
Port 8001 zůstane otevřený pro mnoho spojení, dokud ssh nezemře nebo není zabit. Pokud jste náhodou na Windows, může to udělat i vynikající klient SSH PuTTY. Jako místní port a localhost použijte 8001: 8000 a cíl a do nastavení přidejte přeposílání místního portu. Můžete jej přidat po úspěšném spojení s PuTTY.

48
penguin359

Na serveru socat:

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

Ve výchozím nastavení socat poslouchá na TCP port 8001 na jakékoli adrese IPv4 nebo IPv6 (pokud je podporováno) na počítači. Můžete jej omezit na IPv4/6 nahrazením tcp-listen s tcp4-listen nebo tcp6-listen nebo na konkrétní místní adresu přidáním ,bind=that-address.

Stejné jako pro připojovací soket, ke kterému se připojujete, můžete použít libovolnou adresu namísto localhost a nahradit tcp za tcp4 nebo tcp6 Pokud chcete omezit rozlišení adres na adresy IPv4 nebo IPv6.

Všimněte si, že pro server naslouchající na portu 8000 se spojení objeví jako pocházející z proxy (v případě localhost to bude localhost), nikoli původního klienta. Budete muset použít DNAT přístupy (ale to vyžaduje oprávnění superuživatele), aby server mohl říci, kdo je klientem.

105

Nejjednodušším řešením je použití tradičního nc:

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

Tato verze nc je v netcat-traditional balíček na Ubuntu. (Musíš update-alternatives nebo volejte nc.traditional.)

Všimněte si, že na rozdíl od ssh to není šifrováno. Mějte to na paměti, pokud jej používáte mimo jednoho hostitele.

50
not-a-user

OpenBSD netcat je standardně k dispozici v Linuxu a také v 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

Alternativou, která pracuje na OS X bash, je použít obousměrná trubka . Může fungovat na jiných Unixech:

nc 127.0.0.1 8000 <&1 | nc -l 8001 >&0
27
Mark A.

Citace David Spillett 's odpověď na ServerFault

rinetd by měl dělat tuto práci, a Windows binární za to může být od http://www.boutell.com/rinetd/ (pro kohokoli, kdo hledá stejnou věc pod Linuxem, je rinetd v standardní repozitáře téměř o každém distro, takže mohou být nainstalovány s „apt-get install rinetd“ nebo „yum install rinetd“ nebo podobným)

Je to jednoduchý binární soubor, který vezme konfigurační soubor ve formátu

bindaddress bindport connectaddress connectport

Například:

192.168.1.1 8001 127.0.0.1 8000

nebo

0.0.0.0 8001 127.0.0.1 8000

pokud chcete svázat příchozí port se všemi rozhraními.

4
psychowood
iptables -t nat -A PREROUTING -p tcp --dport <Origin-port> -j REDIRECT --to-port <destination-port>

service iptables save
service iptables restart
3
Santanu Dey

Toto je nový způsob, jak vyladit dva porty udp na serveru: https://github.com/9crk/udpeer

udpeer 8001 8002

Testovat:

nc -u xxxx.com 8001
nc -u xxxx.com 8002
0
9crk

Na základě odpovědi Mark A. , jsem musel udělat malý Tweak, abych to mohl fungovat pro můj Mac (alespoň na macOS Mojave verze 10.14.4)

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

Toto prohlášení printf se zdá být klíčové. Jinak se příkaz netcat pro připojení k portu 8000 nebude nikdy pokoušet připojit, a příkaz netcat pro poslech na portu 8001 nikdy nebude skutečně poslouchat na portu 8001. Bez printf by se pokaždé, když bych se pokusil připojit k portu 8001, dostalo Spojení odmítnuto.

Předpokládám, že netcat musí nějakým způsobem zablokovat stdin (možná se to snaží z nějakého důvodu číst), než skutečně provede jakékoli operace Socket. Proto bez zápisu příkazu printf na číslo a, příkaz netcat nikdy nezačne poslouchat na portu 8001.

Poznámka: Na Markův příspěvek bych nechal odpověď, ale zatím nemám pověst.

0
Daniel K