Bir bağlantı noktasını bir makineden diğerine nasıl yönlendirebilirim?


19

Aşağıdaki durumu düşünün:

Evimde bir yönlendirici (internete bağlı), sunucu (S) ve ana makinem (M) var. S, internetten erişilebilir (statik IP'ye sahiptir) ve 7/24, M değil.

Bazen, bazı uygulamaları (M'deki bazı bağlantı noktalarını dinler, örneğin 8888) dış internetten erişilebilir yapmak istiyorum.

Bunun için, S: 2222'ye erişen herkes M: 8888'e erişiyormuş gibi hissetmek için S (2222) üzerinde bir port kurmak istedim.

Ssh port yönlendirme kullanmaya çalıştım, en iyi denemem şöyleydi:

ssh -L 2222:M:8888 -N M

Ama bu sadece 2222 portuna sunucunun kendisinden erişmeme izin veriyor, diğer makinelerden değil.

Düzgün yapmanın bir yolu var mı? Tercihen, artık bu iletime ihtiyaç duymadığım zaman ^ C ile başlayıp kapatabileceğim basit bir komut olmasını istiyorum.


En olsun bir web sitesi olan localhost.run deneyin localhost.run Oraya .. ürününüzü almanın bir yolu olduğunu düşünüyorum
Angelena Neilsomt

Yanıtlar:


16

Evet, buna GatewayPortsSSH denir . Şu kaynaktan bir alıntı ssh_config(5):

GatewayPorts
        Specifies whether remote hosts are allowed to connect to local
        forwarded ports.  By default, ssh(1) binds local port forwardings
        to the loopback address.  This prevents other remote hosts from
        connecting to forwarded ports.  GatewayPorts can be used to spec‐
        ify that ssh should bind local port forwardings to the wildcard
        address, thus allowing remote hosts to connect to forwarded
        ports.  The argument must be “yes” or “no”.  The default is “no”.

SSH-ing ile aynı makineye yönlendirme yaptığınız için yönlendirme localhostyerine kullanabilirsiniz M- eğer sorunuzu doğru anlarsam.

Yani, komut şu olacak:

ssh -L 2222:localhost:8888 -N -o GatewayPorts=yes hostname-of-M

ve şu şekilde görünecektir netstat -nltp:

tcp        0      0    0.0.0.0:2222   0.0.0.0:*  LISTEN  5113/ssh

Şimdi bu makineye 2222 numaralı TCP portundan erişen herkes, aslında M ana makinesinde görüldüğü gibi localhost: 8888 ile konuşacak.


1
Teşekkürler! Bu çalışır! Ancak bazı gariplik var - bazı nedenlerden dolayı, çıktı "bind: zaten kullanımda olan adres" satırını içeriyor. Bu ne anlama geliyor?
Rogach

1
Bu bağlantı noktasında çalışan bir işleminiz zaten var. netstatTam olarak ne olduğunu bulmak için aynı komutu kullanın . Muhtemelen başka bir benzer SSH hala arka planda çalışıyor ve PID netstat'ı kullanarak öldürüyor.
gertvdijk

Eğlenceli olan şey, bunu zaten yaptım - hem S hem de M'de bu portlar üzerinde hiçbir süreç yok. Bazıları varsa, tüm inşaat muhtemelen işe yaramazdı.
Rogach

10

Başka bir yol var. Iptables ile S: 2222'den W: 8888'e bağlantı noktası yönlendirmeyi ayarlayabilirsiniz. Tek komut:

iptables -t nat -A PREROUTING -p tcp --dport 2222 \
         -j DNAT --to-destination 1.2.3.4:8888

burada 1.2.3.4, M'nin IP adresidir. Buna NAT (Ağ Adres Çevirisi) denir.


1
Burada yalnızca NAT hedefini (NAT kaynağının aksine) yaptığınız için, bu yalnızca belirli durumlarda güvenilir bir şekilde çalışır ve yönlendirme tablolarını değiştirmeyi gerektirebilir. Ana makine (S) üzerinde çalışan sanal makinelere (M) yönlendirme için bu işe yarayabilir.
gertvdijk

Bu komut ağ geçidinde verilmelidir. S ve M'nin aynı LAN'da olduğunu varsayıyorum. Kaynak NAT, modern Linux çekirdeklerindeki bağlantı izleyici tarafından otomatik olarak yapılacaktır. Ofis ağımda böyle bir yapılandırma var ve mükemmel çalışıyor. Bununla birlikte, komutu daha spesifik hale getirmek mümkündür (örneğin, iptables -i eth0'a eth0'ın dış arayüz olduğu söylenmesi).
Gevial

S ve M aynı LAN üzerindeyse, aralarında hiçbir trafik ağ geçidini geçmediği için orada port yönlendirmeye ihtiyacınız yoktur.
gertvdijk

1
Yeap, ama M: 8888'e bağlanmak internetten yapılmış, sanırım. Birisi İnternet -> S: 2222 -> iptables ile M ve S LAN yönlendirici -> M: 8888
Gevial

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.