Bir yerel porttan diğerine tünel oluşturmanın basit yolu?


76

192.168.1.x: 8000'den değil, yalnızca 127.0.0.1:8000'den erişilebilen bir geliştirme sunucum var. Hızlıca kesmek gerekirse, başka bir limanda (örneğin, 8001) dinleyecek bir şey ayarlamanın bir yolu var mı? 8000: • 0.1?


4
Netcat bunu yapabilir.
Andy

Yanıtlar:


44

Ssh kullanmak en kolay çözümdür.

ssh -g -L 8001: yerel bilgisayar: 8000 -f -N user@remote-server.com

Bu, iş istasyonunuzdaki 8001 numaralı yerel bağlantı noktasını remote-server.com 8000 numaralı bağlantı noktasındaki localhost adresine yönlendirir. Ağımdaki
-gdiğer istemcilerin iş istasyonumdaki 8001 bağlantı noktasına bağlanmasına izin verir. Aksi halde, iş istasyonunuzdaki yalnızca yerel istemciler iletilen bağlantı noktasına bağlanabilir.
-NTüm yaptığım portları yönlendirmek demek, bir kabuk başlatmak yok.
-fBaşarılı bir SSH bağlantısı ve oturum açtıktan sonra arka plana çatal anlamına gelir.
8001 Limanı, ssh kaybolana ya da öldürülene kadar birçok bağlantı için açık kalacak Windows'da olursanız, mükemmel SSH istemcisi PuTTY de bunu yapabilir. Yerel port ve localhost: 8000 ve hedef olarak 8001 kullanın ve ayarlarda yerel bir port yönlendirme ekleyin. PuTTY ile başarılı bir şekilde bağlandıktan sonra ekleyebilirsiniz.


4
Ne yapar user@remote-server.com? Port yönlendirme için kesinlikle gerekli değildir, ancak ssh bu argümana sahip olmayı zorunlu kılar, daha çok, oraya bağlanmaya çalışır. Ve bu sinir bozucu seçeneği hostname olarak ayarladıktan sonra çıktı verir …port 22: Connection refused (hayır, 22 portunu kullanmadım) . Bir şeyi kaçırmıyorsam, komut açıkça işe yaramaz.
Hi-Angel,

@ Hi-Angel user@remote-server.comsadece bir örnek ve tam anlamıyla almamalısınız. Bunu, bağlanmak istediğiniz bilgisayarın adı ve bu bilgisayardaki kullanıcı adınızla değiştirmeniz gerekir. Bu bilgi ssh bağlantısı kurmak için gereklidir. Sadece ssh bağlantısı kurulduktan sonra portlar bu bağlantı üzerinden iletilebilir.
Piotr Dobrogost

Bağlantı noktasının önyüklemeden erişilebilir olmasını istiyorsanız, yukarıdaki yöntemi kullanarak sistemd hizmetinde "autossh" ı görün - everythingcli.org/ssh-tunnelling-for-fun-and-profit-autossh
Richard Hollis

Ayrıca "bağlantı reddedildi" alıyorum. Ve neden SSH bağlantısı olmadığında (-N'ye göre) user@remote-server.com argümanına neden ihtiyaç duyulduğunu anlamıyorum. Sadece paketleri iletmeli.
Alexander Taylor,

2
@AlexanderTaylor -N, SSH bağlantısı olmadığı anlamına gelmez. Bu sadece do not execute a remote command( man sayfasına bakınız ) anlamına gelir . <user>@<host>Argümanı, çünkü gerekli olan yapar SSH bağlantısı açık <host>(OP durum için olurdu localhost), ve arzu edilen bir bağlantı noktası iletir yoluyla SSH tüneli. OP'nin sorunu için bir çözümdür, ancak en basiti değil. Ssh kullanmadan localhost'a iletmek için, kullanabilir socatveya netcatStephaneChazelas ve olmayanHoward kullanıcının cevapları olarak

94

İle socatsunucuda:

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

Varsayılan socatolarak, makinedeki herhangi bir IPv4 veya IPv6 adresinde (destekleniyorsa) 8001 numaralı TCP bağlantı noktasını dinler. IPv4 / 6 tcp-listenolarak tcp4-listenveya ile değiştirerek tcp6-listenveya a ile belirli bir yerel adresle sınırlayabilirsiniz ,bind=that-address.

Proxy bağlantısı kurduğunuz bağlantı soketi için aynı, yerine herhangi bir adres kullanabilir ve adres çözünürlüğünü IPv4 veya IPv6 adresleriyle sınırlandırmak istiyorsanız veya ile localhostdeğiştirin .tcptcp4tcp6

Port 8000 tarihinde dinleme sunucu için bağlantı (durumunda vekaleten geliyormuş gibi görüneceğini unutmayın localhostolacak, localhostorijinal istemci). Sen kullanmanız gerekir DNAT yaklaşımları (ama hangi süper ayrıcalıklar gerektirir) sunucu istemci kim söylemek mümkün olabilmesi için.


1
Teşekkürler, çalışan yerel bir ssh sunucunuz olması gerekmediğinden bu harika.
jontro

Aynı bağlantı noktasını ancak farklı adresleri kullanabilir miyim?
Amos

@ amos, düzenlemeye bakın.
Stéphane Chazelas

Trafiği yalnızca belirli IP'lerden iletmek de mümkün müdür?
Phate

1
@Phate, bkz. Socat'a, bağlantıları tek bir IP adresinden (ve man sayfasındaki rangeve tcpwrapseçeneklerinden) dinlemesini söyleme socat.
Stéphane Chazelas

46

Geleneksel nckullanımı en kolay çözümdür:

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

Bu sürümü ncise netcat-traditionalUbuntu üzerine paketin. (Aramanız update-alternativesveya aramanız gerekir nc.traditional.)

Bunun ssh'nin aksine şifrelenmediğine dikkat edin. Bunu bir ana bilgisayarın dışında kullanıyorsanız aklınızda bulundurun.


2
eşdeğeri bilen var netcat-openbsdmı?
Sridhar Sarnobat

2
İçin Analog netcatdahildir sürümü busybox: nc -v -lk -p 8001 -e /usr/bin/nc 127.0.0.1 8000. (
Paramlerin

2
Çalışıyor, ancak nckomut ilk uzak bağlantıdan sonra bitiyor. Çalışmaya -kdevam etmeniz gerekirse ekleyin .
Sopalajo de Arrierez,

Bu hatayı alıyorum: nc: cannot use -p and -lCentOS 6.4'te. Etrafta bir iş var mı?
Nick Predey,

Bu çözümü ssh one üzerinden tercih ediyorum çünkü yerel olarak ayrıcalıklı bir bağlantı noktasını yönlendirmek gerektiğinde, root olarak kullanılmasını kolaylaştırıyor.
Hıristiyan,

24

OpenBSD netcat, Linux'ta ve OS X'te varsayılan olarak bulunur.

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

OS X bash üzerinde çalışan bir alternatif, çift ​​yönlü bir boru kullanmaktır . Diğer Unix'ler üzerinde çalışabilir:

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

İlk başta openbsd netcat kullandığınızı fark etmedim. Bu, bir Ubuntu paketinden başka bir netcat kurmak zorunda kalmaktan iyidir.
RobertR

OpenBSD örneği Ubuntu 15.04'te başarısız oldu. Kabuk yönlendirmelerinde netcat, ss -tanveya tarafından görüldüğü gibi bağlantı noktasını açmak için başarısız olur netstat -tan.
Justin C

⁺¹. FTR: Alternatif yol Ubuntu'da çalışır
Hi-Angel

Çözümünüzü anlamıyorum. Bunu açıklayabilir misin?
Trismegistos

trismegistos Bu örneklerde netcat dinleyicisi ve istemci girdiyi bazı paylaşılan dosyalara (mkfifo pipes.. ilk önce) yönlendirir ve bu paylaşılan dosyaları etkin bir tünel oluşturarak giriş / çıkış kaynağı / hedefi olarak kullanır. Genellikle müşteri / dinleyici kullanılır, ancak bazı tekniklerde müşteri + müşteri / dinleyici + dinleyici-wiki.securityweekly.com/… kullanılır ve slideshare.net/amiable_indian/secrets-of-top-pentesters okur gerekir.
Info5ek

4

Bir aktaran Davut Spillett 'ın cevabını ServerFault üzerinde

Rinetd işi yapmalı ve bunun için bir Windows ikili dosyası http://www.boutell.com/rinetd/ adresinden (Linux altında aynı şeyi arayan herkes için, hemen hemen her dağıtımın standart depolarında) bulunmalı. yani "apt-get install rinetd" veya "yum install rinetd" veya benzeri ile yüklenebilir)

Bu formattaki bir konfigürasyon dosyasını alan basit bir ikili dosyadır.

bindaddress bindport connectaddress connectport

Örneğin:

192.168.1.1 8001 127.0.0.1 8000

veya

0.0.0.0 8001 127.0.0.1 8000

Eğer gelen portu bütün arayüzlere bağlamak istiyorsanız.


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

service iptables save
service iptables restart

Bağlanmaya çalışılırken üzerine dportolduğu gibi, nc -v localhost 2345ben alıyorum Connection refused. Iptables'ta pek iyi değilim ama sanırım dport'un bir dinleme uygulaması olması gerekiyor.
Hi-Angel,

Eğer kaynak portu, hedef porttan farklı bir arayüzde ise?
Trismegistos

0

Mark A.'nın cevabına dayanarak, Mac'imde çalışması için küçük bir ayar yapmak zorunda kaldım (en azından macOS Mojave Sürüm 10.14.4'te)

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

Bu printf ifadesi çok önemli görünüyor. Aksi takdirde, 8000 numaralı bağlantı noktasına bağlanacak netcat komutu hiçbir zaman bağlanmaya çalışmaz ve 8001 numaralı bağlantı noktasını dinlemeye yönelik netcat komutu aslında 8001 numaralı bağlantı noktasını asla dinlemez. Printf olmadan, her seferinde 8001 numaralı bağlantı noktasına bağlanmayı denerdim Bağlantı reddedildi.

Benim varsayım, Netcat'ın herhangi bir Soket işlemi yapmadan önce bir şekilde stdin'i (belki de bir nedenle okumaya çalışıyor) engellemesi gerektiğidir. Bu nedenle, printf ifadesi ikiye alamazsa, netcat komutu asla 8001 portunu dinlemeye başlamaz.

Not: Mark'ın gönderisine bir cevap bırakmış olurdum, ancak henüz itibarım yok.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.