SSH'de ana bilgisayar başına iki farklı ip adresi kullanın


23

gammaSürekli çalışan ve işte çalışan bir sunucum var . Bazen evden bağlarım, bu durumda genel IP adresini kullanırım 55.22.33.99. Bazen, işteyken bağlantı kurarım ve paketlerimi gereksiz yere fırlatmak yerine yerel IP adresi ile bağlarım 192.168.1.100.

Şu anda, onları iki farklı girişe ayırdım. ~/.ssh/conf

Host gamma-local
        HostName 192.168.1.100
        Port 22
        User andreas

Host gamma-remote
        HostName 55.22.33.99
        Port 12345
        User andreas

Yani, eğer işteysem, yazmam gereken tek şey ssh gamma-local; eğer evdeysem (veya dünyanın başka bir yerindeki), koşarım ssh gamma-remote.

Sunucuya bağlanırken, bulunduğum yere bağlı olarak farklı bir ad girmem gerekecekti, o kısım otomatik olarak yapılmalı; örneğin, bazı durumlarda nerede olduğumu bilmeyen, otomatik olarak çalışan komut dosyaları kullanıyorum.

Orada çözer bir Bash komut dosyası kullanarak bu sorunu bir soru "deneyin" ilk yerel birine bağlanmak ve bu bağlantı yoksa, uzak IP adresine bağlanmayı deneyin. Bu çok hoş, ama (1) yetersiz görünüyor (özellikle bazen bağlantıların zaman aşımına uğramadığı için hemen bağlantı kurmak için "beklemek zorundasınız" çünkü) ve (2) Bash ve senaryoyu dolaşmayı gerektiriyor.

Bağlantının ilk önce çalışıp çalışmadığını görmek için Bash komut dosyalarının kullanımına ya da "sınama" ya dayanmayan alternatif bir yol var mı?


Bulmaya çalıştığım, /etc/hostsbunu başarmak için birinin SSH config dosyasıyla mı yoksa biriyle mi dolaşabileceği ? Ya da belki şu anda hangi LAN'a bağlı olduğunuzu tespit etmenin bir yolu?
IQAndreas

Ofis ağınız tarafından kullanılan ayrı bir ad sunucusu setiniz var mı?
Sree

@Sree Ah, bununla nereye gittiğinizi görüyorum; zeki! Şu anda bir ad sunucusu çalıştırmıyoruz, ancak makinelerden birini kesinlikle birine dönüştürebilirim.
IQAndreas

@Sree "Ofis ağınızda bir ad sunucunuz varsa ..."
IQAndreas

Bunu yaptım. Oy için yukarı / aşağı çekinmeyin :)
Sree

Yanıtlar:


28

Hangi ağda olduğunuzu tanımak için bir yönteminiz varsa, istediğinizi yapmak için Matchanahtar kelimeyi kullanabilirsiniz ~/.ssh/config. Bu OpenSSH ≥6.5 gerektirir.

Benzer bir şey kullanıyorum

Match originalhost gamma exec "[ x$(/sbin/iwgetid --scheme) != xMyHomeESSID ]"
  HostName 192.168.1.100
  Port 22

Host gamma
  User andreas
  Port 12345
  HostName 55.22.33.99

Bu yüzden SSH bağlantısı için evde olup olmadığına karar vermek için kullanılan wifi ağının tanımlayıcısını kullanıyorum, ancak bilgisayarınıza atanan IP adresini veya iki ağı farklı kılan herhangi bir şeyi kontrol etmek de kullanılabilir. .


+1 akıllıca kullanımı Match, teşekkürler! Algılamayı, sıfır veya sıfır olmayan çıkış durumuyla çıkan bir komut dosyasına sarmak iyi bir fikir olabilir, çünkü bu, yeniden kullanılabilir hale getirir.
peterph,

Kesinlikle bir dış senaryoya kesinlikle soyutlanabilirdi, ama şu ana kadar sadece bir yere ihtiyacım vardı, bu yüzden üçün kuralı henüz devreye girmedi.
Michał Politowski

İşteyseniz ne olurdu, ama aslında başka bir makineye bağlanmak ister misiniz? Exec ifadesi, HomeESSID'nizle WiFi bağlantınız olmadığından ve dolayısıyla ana bilgisayar adını 192.168.1.100 olarak ayarladığınızdan eşleşmez mi?
gitti

@gone Ben soru anlamıyorum. Maç ayrıca hedef ana bilgisayarda.
Michał Politowski

1
@typelogic Bildiğim kadarıyla kolay değil. Kullanmayı deneyebilirsin ProxyCommand nc $address sshama sonra örn. Tüm cihazların aynı anasistem anahtarı var mı? Yine de bir ortam değişkeni ayarlamanız gerekiyorsa, doğrudan doğrudan bir argüman olarak bağlanılacak adresi vermek kolay olmaz sshmı?
Michał Politowski

5

İş yerinde özel bir ad sunucunuz varsa ve aynı dizüstü bilgisayarı ofisten ve evden kullanıyorsanız, bunu başarmak için bundan yararlanabilirsiniz:

  1. nsswitch.confMakinenizi, önce DNS’yi kontrol etmek üzere değiştirin.
  2. gammaÖzel DNS'nizde 192.168.1.100'e çözümlemek için bir DNS girişi oluşturun .
  3. gamma55.22.33.99'a çözmek için makinenizin / etc / hosts dosyasında bir giriş oluşturun .

Bu şekilde, ssh gammaofisten olduğunuzda , ofis DNS’inden 192.168.1.100’e kadar çözer ve evden bağlandığınızda, ana makinenizden 55.22.33.99’a kadar çözülür.

Not : Bu cevap, gamanın genel bir DNS girişi olmasını istemediğinizi varsayar. Ayrıca, eğer bir Windows makinesinden sunucunuza SSHing yapıyorsanız, hosts dosyası girişlerini geçersiz kılmak için nssswitch.conf dosyasına eşdeğer bir yer olması gerektiğini düşünüyorum.


Var - ana bilgisayar dosyasıdır. Ve aynen böyle yapıyorum - evde ne zaman kamuya açık alanım yerel IP adresime çözülür. Mükemmel cevap - benim de düşündüğüm ilk şeydi. Pekala ... bugün, birkaç yıl önce kurduğumda, bir çözüm bulmak için çok uğraştım.
mikeserv

2

Bunu yapmanın mümkün olup olmadığını bilmiyorum ~/.ssh/configama başka bir yaklaşım, harici IP adresinize dayanarak birine veya diğerine bağlanmak olacaktır. Tahminen, işteyken, IP’niz olacağından 55.22.33.NNN, şöyle bir şeyi çalıştırabilirsiniz:

[[ $(wget -qO - http://wtfismyip.com/text) =~ ^'55.22.33.' ]] && 
    ssh 192.168.1.100 ||
    ssh -p 12345 55.22.33.99

Daha basit bir yaklaşım dahili IP'nizi kullanmaktır. İki ağınızın nasıl kurulduğunu bilmiyorum, ancak IP üzerinden işyerinde olup olmadığınızı belirlemek kolaysa (örneğin, işyerinde belirli bir IP’niz varsa 192.168.1.12), eth0ağ kartınızın adı ne olursa olsun değiştirin ):

[[ $(ip address show dev eth0 | grep -Po 'inet \K[\d.]+') = '192.168.1.12' ]] && 
    ssh 192.168.1.100 ||
    ssh -p 12345 55.22.33.99

Hangisini kullanmaya karar verirseniz verin, onu kabuğunuzun diğer adı olarak ekleyebilirsiniz ( ~/.bashrceğer kullanıyorsanız , bu satırı kabuğunuzun başlatma dosyasına ekleyin bash):

alias gamma="[[ $(wget -qO - http://wtfismyip.com/text) =~ ^'55.22.33.' ]] && ssh 192.168.1.100 || ssh -p 12345 55.22.33.99

Ayrıca, diğer komut dosyalarının da erişebilmesini istiyorsanız ( .bashrckomut dosyası çalışırken takma adlar okunmaz) bunu bir komut dosyasında yapabilirsiniz.


2

~/.ssh/configIP adreslerini ana bilgisayar adı olarak kullanırken bunu başaramazsınız . Ek olarak, aslında sadece farklı IP adreslerine değil, aynı zamanda farklı bağlantı noktalarına da bağlanmamanız nedeniyle, DNS çözümleyicinizde herhangi bir değişiklik yapmamanız gerektiği için ortaya çıkmıştır.

Düzeltilmiş durumdayım - Match originalhost ... exec ...combo in kullanabilirsiniz ~/.ssh/config- @ MichałPolitowski'nin cevabını görün . Bununla birlikte, OpenSSH için gayet iyi çalışmasına rağmen, diğer SSH istemcilerinde benzer işlevleri mutlaka bulamayabilirsiniz.

sshHangi ağ üzerinde bulunduğunuzu kontrol edecek ve uygun Hostgirişi kullanacaksanız, basit bir sarmalayıcı (çeşitli kabuklardan kullanmanız gerekirse bir kabuk işlevi veya bir komut dosyası) kullanarak bu sorunu çözebilirsiniz . Asıl soru, hangi ağda olduğunuzun güvenilir şekilde nasıl tespit edilebileceğidir. Yerel IP adresi akla geliyor, ancak güvenilir değil, çünkü çalışma ağınızla aynı alt ağı kullanan bir LAN’dan bağlanıyor olabilirsiniz.

Hem yerel hem de uzak ağlar için aynı bağlantı noktasına sahipseniz /etc/resolv.conf, bulunduğunuz ağa bağlı olarak düzenleyebilirsiniz - açıkçası otomatik olarak yapılması gerekir (büyük olasılıkla DHCP istemcinizin bir kod dosyasından). Veya - daha iyi - yerel isim sunucusunu çalıştırın (örneğin, örneğin dnsmasq) ve uygun konfigürasyon ile verin. Bu olsa da bu sorunun kapsamı dışındadır.

Başka bir seçenek - yalnızca etkileşimli olarak bağlanmanız gerekiyorsa - tarama yapacak komut tamamlamayı kullanmaktır ~/.ssh/config. Bu size biraz yazmaktan tasarruf sağlar (özellikle de yeterince değişken girdiyseniz Host). Bunun gibi bir şey ( bashbaşlangıç ​​için):

# complete session names for ssh
declare -g _ssh_complete_hostlist 2> /dev/null
function _ssh_complete_init () {
    _ssh_complete_hostlist=$( \
        sed -nr '/^\s*Host\s*=/{s/^[^=]+= *//;s/ /\n/g;p}' ~/.ssh/config \
        | sort )
}
_ssh_complete_init

function _ssh_complete () {
    local match=${COMP_WORDS[${COMP_CWORD}]}
    local hosts=
    local default=
    for h in $_ssh_complete_hostlist; do
        if [[ $h =~ ^$match ]]; then
            hosts="$hosts $h"
        fi
    done
    if ! (( ${COMP_CWORD} == ${#COMP_WORDS[@]}-1 )); then
        default=$( compgen -f ${COMP_WORDS[${COMP_CWORD}]} )
    fi
    COMPREPLY=($hosts $default)
}
complete -F _ssh_complete ssh

İlk işlev, ana bilgisayarların tamamlandığı bir liste oluşturur (genellikle bunu her kabukta bir kez çalıştırmak yeterlidir), ikincisi ise, biraz sakarca olsa da, asıl tamamlamayı yapar - yalnızca ana bilgisayar adını tamamlandığı zaman tamamlar. komut satırındaki son simge.

Bütün bunlar, bu soruna yaklaşmanın doğru yolunun, bir VPN üzerinden iş ağına bağlanmak olduğunu ve böylece yerel iş IP adreslerini ofisteymiş gibi erişilebilir olmasını sağlamak olduğunu söyledi. Daha sonra adresi, hangi katmanı tercih ederseniz edin ~/.ssh/config, /etc/resolv.confveya (en iyi seçenek) ofis adı sunucusuna bağlayabilirsiniz.


Limanlar taştan yapılmış değil. gammaİşleri kolaylaştıracaksa, yerel SSH portunu uzaktaki portla eşleşecek şekilde değiştirebilirim .
IQAndreas

2

Birkaç yıl önce benzer bir amaç için bir program yazdım . İhtiyaçlarınızı karşılayabilir. Bu program ile ssh konfigürasyonu şöyle görünebilir:

Host gamma
    ProxyCommand ssh-multipath-proxy 192.168.1.100:22 55.22.33.99:12345
    User andreas

1

Diğer bir çözüm ise SSH için iki farklı yapılandırma dosyası kullanmaktır. Bunu, tek bir yapılandırma dosyasında her şeye sahip olmaktan biraz daha az zarif olarak düşünebilirsiniz, ancak bakımı kolaydır.

Kullanmak istediğiniz yapılandırma dosyasını seçersiniz -F <configfile>.


Teşekkürler. -FSeçeneği beğendim .
typelogic

0

Kısmi cevap:

Yukarıdaki birçok cevap "hangi ağda olduğunuzu tespit edebiliyorsanız" ile başlar. Bunun için, normal ağlarımdan birine bağlandığımda çeşitli şeyleri başlatmak için (genellikle VPN'ler) arayüzler bağlandığında çalışan bir betik kullanıyorum. Teknik, ağ geçidinin MAC adresini elde etmek için ARP kullanmaktır:

function identifyConnection {
    gatewayIP=$(route -n | grep -e '^0\.0\.0\.0' | tr -s ' ' | cut -d ' ' -f 2)

    if [[ ! -z "$gatewayIP" ]]
    then
        # Identify the gateway by its MAC (uniqueness...)
        log "Gateway IP address=$gatewayIP"
        log "Obtaining corresponding gateway MAC address"
        gatewayData=($(arp -n $gatewayIP | grep -e $gatewayIP | tr -s ' '))
        if [[ "${gatewayData[1]}" == "(incomplete)" ]]
        then
            log "Status of gateway $gatewayIP "incomplete""
            echo ""
        elif [[ "${gatewayData[2]}" == "--" ]]
        then 
            log "No MAC address found for $gatewayIP"
            echo ""
        else
            log "Gateway MAC address=[${gatewayData[2]}]"
            echo "${gatewayData[2]}"
        fi
    fi
}

Sonra ağ ağ geçidi MAC ile ilişkilendirmek için bir arama tablosu var. Tabii ki bu masa aynı ağ için birkaç MAC tutabilir (tipik bir durum büyük bir şirket sitesindeki çeşitli Wifi noktalarıdır). Başka bir arama tablosu, o ağ için çalıştırılacak komut dosyasını belirlemek için kullanılır.

Benim durumumda, script Plazma masaüstü bildirimleri kullanılarak çalıştırılır, bu yüzden her şey kullanıcı alanına girer.

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.