Ssh tüneli halka nasıl açılır?


174

Bu soruya tekrar atıfta bulunarak , komutu çalıştırıyorum

ssh -R 8080:localhost:80 -N root@example.com

Mac’te. Oysa tünellenen liman halka açık değil. Uzak bağlantı noktasında yerel bağlantı noktasının açılabilmesi için böyle bir komut çalıştırıyorum. Uzak bilgisayardaki localhost'taki bağlantı noktasını açarken de çalışır, ancak uzaktaki bilgisayarın genel IP adresine yerel bilgisayarımdan erişmeye çalıştığımda bağlantı noktası açık görünmüyor. Tüneli kimsenin erişmesi için IP’de herkese açık hale nasıl getirebilirim?

EDIT: Uzak taraf bütün arayüzler yerine sadece localhost'a bağlanmış gibi görünüyor.

EDIT 2: İstemci Mac OS X 10.6 ve sunucu Linux Mint, ancak ikisi de OpenSSH.


Genel IP ne demektir? Yönlendirici üzerinden ve İnternet üzerinden yerel bir bilgisayara bağlanmaya çalışıyorsanız, çoğu yönlendirici bu geridönüşe izin vermez.
harrymc

Yanıtlar:


351

Manşet sayfasını ssh için kontrol ederseniz, şunu yazacağınızı göreceksiniz -R:

-R [ bind_adresi :] port : ana bilgisayar : hostport

Ne zaman bind_address(sizin örnekte olduğu gibi) atlanırsa, liman geri döngü arabiriminde yalnızca bağlıdır. Tüm arayüzlere bağlanmasını sağlamak için

ssh -R \*:8080:localhost:80 -N root@example.com

veya

ssh -R 0.0.0.0:8080:localhost:80 -N root@example.com

veya

ssh -R "[::]:8080:localhost:80" -N root@example.com

İlk versiyon tüm arayüzlere ayrı ayrı bağlanır. İkinci versiyon genel bir IPv4 bağlantısı oluşturur, bu portun IPv4 üzerinden tüm arayüzlerde erişilebilir olduğu anlamına gelir. Üçüncü versiyon muhtemelen birincisine teknik olarak eşdeğerdir, ancak yine de yalnızca tek bir ::bağlantı oluşturur; bu, bağlantı noktasına yerel olarak IPv6 aracılığıyla ve IPv4 üzerinden IPv4 eşlemeli IPv6 adresleriyle erişilebilir (Windows, OpenBSD üzerinde çalışmaz) . (Tırnaklara ihtiyacınız var, çünkü [::]aksi halde bir küre olarak yorumlanabilir.)

Not Eğer OpenSSH kullanırsanız sshdsunucuyu, sunucunun GatewayPortsseçeneği etkin olması gerekir (ayarlı yesveya clientspecifiedbu iş için (dosyasını kontrol) /etc/ssh/sshd_configsunucuda). Aksi halde (bu seçenek için varsayılan değer şudur no), sunucu her zaman bağlantı noktasını yalnızca geridöngü arabirimine bağlanmaya zorlar.


12
Oh benim tanrım işe yaradı !!!!! Ben tam olarak 1 milyon kere yaptım !! Sadece *bash dosya vereceğini ve ihtiyacım olacağını unuttum\*
Trevor Rudolph

4
Evet, işte bu yüzden hep tercih ederim 0.0.0.0- sadece IPv4, ama çoğu zaman yapacağım :)
Stefan Seidel

34
GatewayPorts evet sorunumu çözdü.
Sunry

4
GatewayPorts = evet (uzak sshd yapılandırmasında) benim için de
düzeltti

3
"GatewayPorts yes" günümden geçti, teşekkürler @StefanSeidel
karser

37

Düzenle:

-g yerel iletilen bağlantı noktaları için çalışır, ancak istediğiniz farklı bir ters / uzaktan iletilen bağlantı noktasıdır.

İstediğin bu .

Esasen, üzerine example.com, set GatewayPorts=clientspecifiediçinde /etc/ssh/sshd_config.

--- önceki (yanlış) cevap ---

-G seçeneğini kullanın. Ssh's man sayfasından:

-g     Allows remote hosts to connect to local forwarded ports.

çalışmıyor gibi görünüyor ... başlıyor ama uzaktan bağlanamıyorum
Trevor Rudolph

2
netstat -elnptHangi bağlantı noktalarının hangi adrese bağlı olduğunu bulmak için ayrı bir bağlantı noktasından çalıştırmayı deneyin . Olmadan -g, bir bağlantı noktasına bağlı olmalıdır 127.0.0.1:PORT. İle -g, 0.0.0.0:PORTuzaktan erişilebilir olmasını sağlayan bağlı olmalıdır .
snapshoe,


2
GatewayPorts=clientspecifiedveyaGatewayPorts clientspecified
Trevor Rudolph

ve bunu müşteriye mi yoksa uzaktaki birime mi ekleyebilirim?
Trevor Rudolph

14

İşte tamamlama için cevabım:

Ben kullanarak sona erdi ssh -R ...tünel için ve kullanma socatiçin ağ trafiğini yönlendirme için bunun üstüne 127.0.0.1:

tünel 127.0.0.1'e bağlandı: ssh -R mitm:9999:<my.ip>:8084 me@mitm

SoCat: mitm$ socat TCP-LISTEN:9090,fork TCP:127.0.0.1:9999

Diğer bir seçenek bunun üzerine sadece yerel bir tünel yapmak, fakat bunu daha yavaş buluyorum

mitm$ ssh -L<mitm.ip.address>:9090:localhost:9999 localhost


Sshd yapılandırması ile uğraşmak zorunda olmadığım ve hepsini sudo olmadan yapabildiğim gerçeğini seviyorum. Artı, toplumun var olduğunu öğrendim. Teşekkürler!
BrutusCat

+ yukarı iyi gidiyorsunuz efendim. Ssh'a 0.0.0.0'a bağlanmadan başarılı bir şekilde bağlanmasını söylemeye çalıştım .. sonra * sözdizimini gördüm, denedim, zar yok. Sshd config üzerinde bir çeşit güvenlik özelliği veya buna izin vermeyen bir şey olabileceğini hayal ediyorum. Sonunda bu yazıyı gördüm ve socatharika çalıştı. Süper yararlı, bu benim arka cebime koyarak;]
Jaime

10

Ayrıca / etc / ssh / sshd_config komutunu değiştirmezseniz veya değiştirirseniz, double double kullanabilirsiniz.

Öncelikle uzak makinedeki geridöngü aygıtında geçici bağlantı noktasına (örneğin 10080) iletin, ardından tüm arabirimlerde bağlantı noktasını 10080 - 80'e yönlendirmek için yerel ileri kullanın:

ssh -A -R 10080:localhost_or_machine_from:80 user@remote.tld "ssh -g -N -L 80:localhost:10080 localhost"

1
Bu aslında yönlendirme kurallarını atlamak için çalışıyor!
Michael Schubert

Bu çözümü seviyorum. Makinede yapılandırma değişikliği istemiyorsanız harika bir çözüm
Grezzo

8

"Ağ geçidi bağlantı noktaları" seçeneğini kullanın.

ssh -g -R REMOTE_PORT:HOST:PORT ...

Bunu kullanmak için, muhtemelen GatewayPorts yessunucunuza " " eklemeniz gerekir /etc/ssh/sshd_config.


Aslında bu işe yaradı. Yaptığım şey, EC2 örneğini REST sunucuma iletici olarak kullanmam. Bu sayede sunucumu DMZ'ye sokmaya ihtiyacım yok ve halka açık bir IP'ye ihtiyacım yok. Yeterince komik, yarattığım ilk EC2 örneğiyle, ssh -R remote_port: localhost: port xxx @ ec2xxx gayet iyi çalıştı ancak daha sonra bir sebepten ötürü başka bir örnek oluşturmak zorunda kaldım ve bu noktadan sonra sürekli alıyorum: bağlantı reddetti. Ne elde ettiğime bakmak için tcpdump kullandım ve fazla bilgi yoktu. -g artı GatewayPorts evet hile yaptı.
ET

1

Jump hostları , OpenSSH'e oldukça yeni bir ektir. Bu, SSH'ye araca erişim gerektirir, ancak ek yapılandırma olmadan çalışmalıdır.

ssh -J root@example.com remoteuser@localhost -p 8080

Bu komut, SSH'ye önce root@example.combu makineye bağlanmasını ve ardından bu makineden, kullanıcı adı localhostaltında 8080 numaralı bağlantı noktasına (yani, atlama sunucusundan uzak ana bilgisayara tünellenen bağlantı noktası) bir bağlantı başlatmasını söyler remoteuser.


0

~/.ssh/configKomut satırı parametrelerini kullanmak yerine yapılandırmayı içine koymak isterseniz, bunun gibi bir şey deneyebilirsiniz

Host REMOTE_HOST_NAME RemoteForward \*:8080 127.0.0.1:80

Uzak ana makinenin güvenlik duvarının 8080 bağlantılarına izin verdiğini ve yapılandırma GatewayPortsseçeneğinin /etc/ssh/sshdayarlanmadığından emin olduğunu unutmayın .no

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.