Aynı terminal komutunu kullanarak LAN içinden ve dışından SSH erişimi


10

Bir Raspberry Pi (RPi) var ve ssh kullanarak uzaktan bağlantılar yapıyorum. RPG'yi hem yerel alan ağından hem de internetten (yönlendiricimde açtığım belirli bir bağlantı noktasını kullanarak) erişebileceğim şekilde doğru şekilde kurmayı başardım.

Bir kullanıcı adı johnve bir RPi varsayıldığında raspi:

Dahili LAN erişimi

ssh john@192.168.2.7
ssh john@raspi
ssh raspi

Dış LAN erişimi

ssh -p 1234 john@12.345.67.89
ssh -p 1234 12.345.67.89

Ancak ssh raspiLAN'ımın dışından nasıl yapabilirim ? Raspi'yi biri LAN'da, diğeri internette olmak üzere iki IP adresini işaret edecek şekilde yapılandırmanın bir yolu var mı?

Temelde istediğim, ister evde ister işte olsam da, RPi'ime tek bir şekilde erişmek.


Yerel lan üzerinde yerel ras ip adresi ile "raspi" adı isteğine yanıt veren bir DNS sunucusu çalıştırabilirsiniz. Şimdi aynı adın farklı bir dış adrese çözümlenmesi, söz konusu adın da çözümlenecek şekilde doldurulmasını (dinamik dns) gerektirir. Ama muhtemelen "raspi" den daha uzun bir isme ihtiyacınız olacak.
Aralık'ta ChuckCottrill

Bu soru ve cevaplara
slm

Yanıtlar:


7

Sorunuza daha yakından baktığınızda, aynı bilgisayarı LAN'ın içinden ve dışından kullandığınız anlaşılıyor. Cevabımı buna göre gözden geçirdim:

İçine şunu ~/.ssh/configekleyin:

Host raspi-wan
    HostName 12.34.56.78
    User john
    Port 1234

Host raspi-lan
    HostName 192.168.1.2
    User john
    Port 22

Ardından, DNS sunucularıyla uğraşmadan veya tüm kullanıcılar için düzenleme yapmadan veya hatta kök olarak herhangi bir şey yapmanıza gerek kalmadan ssh raspi-wanLAN dışından veya LAN ssh raspi-laniçinden /etc/hostsyapabilirsiniz. Adın raspibulunduğunuz yere bağlı olarak farklı şekilde çözümlenmesini istiyorsanız, muhtemelen ağınızı algılamak ve buna göre hareket etmek için bazı kabuk komut dosyası sihirleri gerekir.


1
Teşekkürler DopeGhoti, bir -wanve -lanpostfix eklemek için çözümünüzle çok rahatım . Benim ssh ancak Usernamealanı beğenmedi (Kötü yapılandırma seçeneği). Onsuz iyi çalışıyor.
Ocak'ta Aeronaelius

2
Üzgünüm, doğru sözdizimi User johndeğil UserName. Cevabımı bunu yansıtacak şekilde düzeltiyorum ve yapılandırmanızı ayarladıktan sonra, kullanıcı adını sshkomut satırından çıkarabilirsiniz .
DopeGhoti

5

Bu, lan ve wan için ayrı takma adlar kullanmadan veya ileriye yönelik herhangi bir bağlantı noktası oluşturmadan, sadece ssh config ile mükemmel bir şekilde yapılabilir. (Ama doğal olarak lan'in içinde olup olmadığını tespit etmek için bir yol bulmalısın)

İçinde ~/.ssh/config, böyle bir şey eklemek isteyeceksiniz:

Match host raspi exec "am_i_outside_of_my_lan"
    HostName 12.345.67.89
    Port 1234

Bunun yerine, am_i_outside_of_my_lanev ağınızın içinde olup olmadığınızı belirleyen bir komut yerleştirmek isteyeceksiniz ve bunun dışındaysanız 0 çıkış kodu ve başka bir şey ile geri döneceksiniz.

hostDurum muhtemelen kendi kendini açıklayıcı olmakla birlikte, execdurum garanti bir açıklaması: Bu eşleştiğinde çıkış kodu 0, yani verilen komut döner. hata yok.

Başka bir deyişle, bunun yaptığı şey, host raspiana bilgisayar raspi'ye bağlanmaya çalıştığınızda bu kuralı kısıtlar ve exec "am_i_outside_my_lan"daha da kısıtlar, böylece yalnızca ev ağınızın dışından bağlandığınızda geçerli olur. Ev ağınızın içinde ssh user@raspinormalde tam olarak ne yaparsa yapın, ancak bunun dışında kural eşleşir ve bunun yerine eşdeğerdir ssh -p 1234 user@12.345.67.89.

Ne kullanacağınıza gelince am_i_outside_of_my_lan, bu tamamen kurulumunuza bağlıdır. Komutları satır içi yazmaya çalışmak yerine ayrı bir komut dosyasına yerleştirmeyi öneririm, çünkü alıntı yapmak biraz zor olabilir.

Şahsen, kendi ağımın içinde olup olmadığımı tespit etmek için aşağıdaki Python komut dosyasını kullandım: (Etki alanı adım kendi ağımdaki yerel bir IP'ye çözümlendiğinden)

#! /usr/bin/env python
import socket, sys

sys.exit(socket.gethostbyname('mydomain.com').startswith('192.168.1.'))

Benzer bir kurulumunuz yoksa, başka bir şey yapmanız gerekebilir. (Örneğin, bağlandığınız kablosuz ağın adına bakabilir, hatta bağlandığınız ağın harici ip'ini almak için my-ip-servisini sorgulayabilirsiniz)


Bu doğru cevap; diğerlerinin daha fazla oy alması çok üzücü.
Jonathan Tomer

@JonathanTomer: Adil olmak gerekirse, bunu sorulduktan 3 yıl sonra cevapladım, oysa daha yüksek puanlı cevaplar birkaç saat içinde yayınlandı, bu yüzden sadece "erken kuş solucanı alıyor": P (ayrıca Ellis Hoag'ın bu genel çözümün spesifik varyantını oldukça sevdiğimi söylemek - arp kullanmak oldukça zekidir ve ağ algılama komutunda her ağ kurulumu için ayarlanması gerekmediği için çözümü daha genel hale getirir)
Aleksi Torhamo

3

Bilgisayarınıza (ile bağlama Açık ing bir), sizin için bir hostname ayarlayabilirsiniz 12.345.67.89. /etc/hostsDosyanızı açın ve bir DNS girişi ayarlayın:

12.345.67.89    raspi

Daha sonra makineniz yerel rasgele DNS çözümleme sürecinin bir parçası olarak "raspi" yi "12.345.67.89" a dönüştürecektir. Birden fazla makine kullanıyorsanız, değişikliklerin her birinde yapılması gerekir. Sorun: düzenlemek için kök erişimi gerektiriyor /etc/hostsve her yerde olmayabilir.

"Raspi" nin herhangi bir yerden otomatik olarak tanınmasını istiyorsanız, üzgünüm: mümkün değil. Bunun için "raspi" nin bir alan adı olarak kaydedilmesi gerekir, çünkü "raspi" nin TLD'si yoktur ve herhangi bir DNS kök sunucusuna bağımlı olmaz. Ancak, bir alan adı kaydedebilirsiniz (diyelim cfbaptista.meve WAN IP adresinize yönlendirebilirsiniz. Bazı bağlantı noktası iletme ile Raspberry Pi'nize aşağıdakilerle erişebilirsiniz:

ssh (you@)(raspi.)cfbaptista.me

(yine de, neredeyse hiçbir şey için para harcıyor ...)

Parçayla ilgili user@olarak, farklı makinelerde giriş adınıza bağlıdır. Eğer aynı adı varsa bağlayan makinenin ve üzerinde uzaktan biri, daha sonra gerek belirtmek için. Değilse, uzak makinede kim olduğunuzu belirtmeniz gerekir .


not: diğer cevapta belirtildiği gibi, SSH yapılandırmanızda elbette root gerektirmeyen ana bilgisayar takma adları oluşturabilirsiniz.
strugee


0

Amaç: ssh raspi LAN içinde ve genel İnternet üzerinde çalışmalıdır.

Bunu yapmak için adın LAN'daki dahili IP'ye ve dışarıdan genel IP'ye çözümlendiğinden emin olmanız gerekir.

İlk olarak, gibi bir alan adı almalısınız raspi.yourdomain.com. Hobi kullanımı için ücretsiz alan adları için http://freedns.afraid.org/ adresini ziyaret edin . Alan adını herkese açık IP'nize yönlendirin

LAN için DNSMasq çalıştırmanızı öneririm. Açık DD-WRT ürün yazılımı, DHCP ve DNS için kullanarak DNSMasq ile sıkı bir şekilde bütünleşir. Sadece arama alan adınızı ("alanadiniz.com") belirtmeniz gerekir ve her müşterinin istediği isme göre DNS adlarını otomatik olarak atar. Bu işi yapmak için raspi'nin / etc / hostname yazması gerekir raspi.

Bu ayarlandıktan sonra raspi.alanadiniz.com, LAN'ınızdaki yerel IP'ye çözümlenmelidir (tüm makinelerinizde yerel DNS'yi kullandığınızdan emin olun).

Şimdi, muhtemelen 22 numaralı bağlantı noktasını halka açık internete maruz bırakmak istemiyorsunuz, çünkü bir ton daha sniffer trafiği alacaksınız. Böylece yönlendiricinizin raspi: 22'yi başka bir port gibi açığa çıkarabilirsiniz, örneğin 1234. Hem genel hem de dahili ağlarda aynı portu kullanmak için raspi'ye bir port yönlendirme kuralı ekleyebilirsiniz. Linux'ta:

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 1234 -j REDIRECT --to-port 22
sudo sh -c 'iptables-save > /etc/iptables/iptables.rules'

(eth0'ı ağ arayüzünüzün adıyla ip linkveya olarak gösterildiği şekilde ifconfigve 1234'ü genel bağlantı noktanız olarak değiştirin)

Artık ssh -p 1234 raspi.yourdomain.comhem herkese açık hem de LAN'dan yapabilirsiniz.

ssh raspi@DopeGhoti tarafından belirtildiği gibi, bunu kısaltmak için istemci makinenizdeki ~ / .ssh / config dosyasına bir giriş ekleyebilirsiniz .

Aynı ortak IP'de ek makinelerin SSH bağlantı noktalarını göstermek istiyorsanız, işlemi başka bir DNS adı ve genel bağlantı noktasıyla tekrarlamanız yeterlidir. Şerefe!


0

Aleksi Torhamo'nun şu anki genel ipinizi almak için kıvırmayı kullanarak ve daha sonra sunucunuzun genel ipiyle eşleşip eşleşmediğini (yani, aynı yerel ağda olup olmadığınızı) kontrol etmenin özlü, çalışan bir sürümü.

Senin içinde ~/.ssh/configeklenti

Match host raspi exec "[[ $(curl -s ipinfo.io/ip) == '12.345.67.89' ]]"
  User john
  HostName 192.168.2.7

Match host raspi exec "[[ $(curl -s ipinfo.io/ip) != '12.345.67.89' ]]"
  User john
  HostName 12.345.67.89
  Port 1234

Ben inanıyorum ssh bu yüzden teoride böyle bir şey yapmak gerekir, sırayla, tüm eşleşen direktifleri işleyecek Match host raspi / User john / HostName 192.168.2.7ardından Match host raspi exec "[[ $(curl -s ipinfo.io/ip) != '12.345.67.89' ]]" / HostName 12.345.67.89 / Port 1234tek ile aynı etkiyi ve almak curl, çağırma izin == '12.345.67.89'vaka ikinci başarısızlığı tarafından varsayılabilir Matchkural en exec.
FeRD

(Birincisinde belirtilen her bağımsız değişkenin Matchikincisinde aynı olduğundan veya aynı zamanda belirtildiğinden emin olmanız gerekir - Port xxxxbirincisinde standart olmayan bir standart belirttiyseniz Matchve ikincisinde standart bağlantı noktasını kullanmak istiyorsanız Match, Port 22bağlantı noktasını kullanmaya devam etmemesi için açıkça bir şekilde geçersiz xxxx
kılmanız gerekir

0

Makinenizin LAN'ınıza bağlıyken IP 192.168.1. * Olduğunu varsayarsak, bunu bağlamak için ~/.ssh/configher zaman aynı komutu (sadece ssh raspi) kullanabilmeniz için aşağıdaki yapılandırmayla yapabilirsiniz :

Match Originalhost raspi Exec "ifconfig | grep 192\.168\.1\."
    HostName 192.168.1.2
    User john
    Port 22

Host raspi
    HostName 12.34.56.78
    User john
    Port 1234

0

Bu çözüm, ev ağınızın ortak durum olduğuna inandığım tek bir yönlendiriciye sahip olduğunu varsayar.

Ekleyin ~/.ssh/config

Match host raspi exec "test $(arp 192.168.1.1 | awk '{print $4}') = ROUTER_MAC_ADDRESS"
        Hostname 192.168.2.7
        User john

Host raspi
        Hostname 12.345.67.89
        Port 1234
        User john
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.