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?
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?
Yanıtlar:
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
-g
diğ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.
-N
Tüm yaptığım portları yönlendirmek demek, bir kabuk başlatmak yok.
-f
Baş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.
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.
user@remote-server.com
sadece 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.
-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 socat
veya netcat
StephaneChazelas ve olmayanHoward kullanıcının cevapları olarak
İle socat
sunucuda:
socat tcp-listen:8001,reuseaddr,fork tcp:localhost:8000
Varsayılan socat
olarak, makinedeki herhangi bir IPv4 veya IPv6 adresinde (destekleniyorsa) 8001 numaralı TCP bağlantı noktasını dinler. IPv4 / 6 tcp-listen
olarak tcp4-listen
veya ile değiştirerek tcp6-listen
veya 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 localhost
değiştirin .tcp
tcp4
tcp6
Port 8000 tarihinde dinleme sunucu için bağlantı (durumunda vekaleten geliyormuş gibi görüneceğini unutmayın localhost
olacak, localhost
orijinal 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.
range
ve tcpwrap
seçeneklerinden) dinlemesini söyleme socat
.
Geleneksel nc
kullanımı en kolay çözümdür:
nc -l -p 8001 -c "nc 127.0.0.1 8000"
Bu sürümü nc
ise netcat-traditional
Ubuntu üzerine paketin. (Aramanız update-alternatives
veya 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.
netcat-openbsd
mı?
nc
komut ilk uzak bağlantıdan sonra bitiyor. Çalışmaya -k
devam etmeniz gerekirse ekleyin .
nc: cannot use -p and -l
CentOS 6.4'te. Etrafta bir iş var mı?
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
ss -tan
veya tarafından görüldüğü gibi bağlantı noktasını açmak için başarısız olur netstat -tan
.
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.
iptables -t nat -A PREROUTING -p tcp --dport <origin-port> -j REDIRECT --to-port <destination-port>
service iptables save
service iptables restart
dport
olduğu gibi, nc -v localhost 2345
ben alıyorum Connection refused
. Iptables'ta pek iyi değilim ama sanırım dport'un bir dinleme uygulaması olması gerekiyor.
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.
Bu sunucudaki iki udp portunu tünellemenin yeni bir yoludur: https://github.com/9crk/udpeer
udpeer 8001 8002
Test etmek için:
nc -u xxxx.com 8001
nc -u xxxx.com 8002