önyüklemede otomatik bir ters SSH bağlantısı yapma


9

Digitalocean VPC ile ters SSH bağlantısı yapan bir NAT arkasında bir bilgisayar var. Bu tersine çevrilmiş SSH bağlantısını, ofis bilgisayarıma (bunu yapmaya yetkiliim) giriş yapmak ve dosyaları kopyalamak ve diğer önemli şeyleri yapmak için evden kullanıyorum.

Sık sık olmasa da, ofis bilgisayarımın yeniden başlatıldığını (elektrik kesintileri vb. Nedeniyle) ve VPC'imle yaptığı ters SSH bağlantısını kopardığını fark ettim. Bu tür durumlarda, ev bilgisayarımdan ofis bilgisayarıma bağlanamıyorum.

Ofis PC'de oluşturulan trafiğimi anonimleştirmek için ters bağlantı + dinamik proxy yapmak için aşağıdaki komut dosyasını çalıştırıyorum (Göz atma bilgilerini paylaşmak zorunda değilim).

autossh -CD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC

Bu komut dosyasını fiziksel olarak orada olmadığım için yeniden başlatma sırasında ofis bilgisayarımda çalıştırabilmem mümkün değil. Bu sorunu çözmek için aşağıdaki crontab'ı kurdum.

Not: rev.shdosya yukarıdaki satırı içerir. "DigitalOcean" sertifikası ve rev.sh dosyası içinde yer almaktadır Ubuntu home. Bu nedenle, ./rev.shUbuntu terminalimde yürüttüğümde dinamik bir proxy alıyorum ve ayrıca ym DigitalOcean sunucusuna erişiyorum. Bu yöntem% 100 çalışır.

Ancak chrontab'ı aşağıdaki yöntemle yüklediğimde, ubuntu bilgisayarım asla Dinamik proxy oluşturmaz. Bunu görebiliyorum çünkü bu proxy'yi Google Chrome'dan kontrol ettiğimde proxy'nin bağlantıyı reddettiğini söylüyor.

İşte kökler cronejobs olarak denediğim cronejobs. Bunları da normal bir kullanıcı olarak denedim, yine de işe yaramadı.

@reboot bash /home/user/rev.sh 
@reboot /home/user/rev.sh 
@reboot cd /home/user && ./rev.sh

Daha sonra şimdiki zamandan birkaç dakika önce bir chrontab kurdum ve çalışmasını bekledim.

24 12 8 * * * bash /home/user/rev.sh
24 12 8 * * * /home/user/rev.sh

bunlar da çalışmadı.

Lütfen hatamı tespit etmeme yardımcı olacak kadar nazik ol. Bu web sitesinde sorunumla ilgili birçok benzer soru var. Bu yüzden birçok cevaba değindim ama hiçbiri yardımcı görünmüyordu.


Burada sorunun ne olduğundan emin değilim. Cron herhangi bir işe başlamıyor mu? Veya komut dosyası çalışmıyor mu? Her iki sorunla birlikte, lütfen günlüklere bakın. Cron bir yere yazmalı /var/log/cron*. Test amacıyla basit bir şey yazabilirsiniz */2 * * * * /path/to/script- her 2 dakikada bir komut dosyası çalıştıracaktır. Ayrıca, cron çalıştıran kullanıcı için posta olup olmadığını kontrol edin. Kök mü? mailKomutu kullan . Oh, ssh anahtarý kullandýđýnýzý görebiliyorum. Geçişten sonra tam bir yol vermezseniz, cron işinin bulabileceğinden şüpheliyim -i.
Kalavan

Yanıtlar:


8

cronBaşlangıçta bir komut dosyasını çalıştırmak için kullanmanın iyi bir fikir olup olmadığından emin değilim . Daha uygun gördüğüm bir alternatif, burada açıklandığı gibi bir SystemD hizmeti oluşturmaktır . Adlı bir dosya oluşturun /etc/systemd/system/autossh.service:

[Unit]
Description=Auto Reverse SSH
Requires=systemd-networkd-wait-online.service
After=systemd-networkd-wait-online.service
[Service]
ExecStart=/full/path/to/autossh -CD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC
[Install]
WantedBy=multi-user.target

Ardından root olarak aşağıdaki komutu çalıştırın:

systemctl enable autossh.service

1

Deneyebileceğiniz birkaç şey:

chmod +x rev.sh

Bazen yolunuz önyükleme zamanında veya cronjobs aracılığıyla tam olarak ayarlanmadığından, autossh'i tam yolla değiştirin, sistemimdeki

/usr/bin/autossh

@reboot motifi cron daemon başlangıç ​​zamanına bağlıdır, bu nedenle diğer alt sistemler (ağ?) çalışmaya başlamadan önce çağrılabilir.

Ve crontab örneğiniz:

24 12 8 * * * bash /home/user/rev.sh

yalnızca her ayın 8'inde çağrılacaktır. Ve ekstra bir alanı var. Deneyin

24 12 * * * /home/user/rev.sh

yanlislikla oldu. '24 12 * * * /home/user/rev.sh 'denedim ama hala işe yaramadı. Şaşırtıcı bir şekilde bile '24 12 * * * yeniden başlatma 'işe yaramadı.
Denis

1
Kök olarak çağırmadıkça iyi yeniden başlatma kesinlikle işe yaramaz.
slowko

/ Usr / bin / autossh eklemeyi denedim. İşe yaramadı.
Denis

Köklerin crontabında 24 12 8 * * * yeniden başlatmayı denedim. İşe yaramadı. Sizinkinde çalışıyor mu?
Denis

/usr/binbile her zaman varsayılan PATH, içincron
roaima

1

Komut dosyası crontab üzerinden yürütüldüğünde sertifikanızı bulamıyor gibi görünüyor.

Kullanıcı olarak komut dosyasını yürüttüğünüzde, /home/ubuntu-user/.ssh / ... adresinden sertifikayı kullanır. Ancak komut dosyası crontab'dan yürütüldüğünde kök olarak çalışır. root sertifikaları /root/.ssh adresinden alır.

Bu yüzden çalışmasını sağlamak için birden fazla yol var, ama bence crontab içinde ubuntu-kullanıcı olarak betiği çalıştırıyor .

Düzenle:

sertifika için tam nitelikli bir yol sağladığınızdan emin olun


1

Kullanmayı deneyin su:

su -l user -c /home/user/rev.sh

Sorununuza yardımcı olacak mı?


0

Sorunun içinde çok fazla veri olmadığı için sıfırdan başlayacağımla başlayacağım

Tüm yapılandırmaları / etc / ssh / ssh_config dizinine koyarım:

 Host mytunnel
    HostName      IPofDigitalOcean
    User          root     # Are you sure about this??
    IdentityFile  /etc/ssh/mytunnel_key
    RemoteForward 8081 localhost:22
    DynamicForward 8080

Anahtarı koyardım /etc/ssh/mytunnel_key

sonra böyle bir cron girişi (upstart / systemd hizmeti daha iyi olurdu) ile denemek istiyorum:

@reboot /usr/bin/autossh -f -M 0 -T -N mytunnel

0

Terminal olmadan çalıştırdığınızda -f kullanmanız ve bir komut çalıştırmanız gerekir . İşte size bir örnek:

autossh -M 12374 \
-R 2205:127.0.0.1:22 \
-p 2200 \
-f \
user@www.hostname.com \
sleep 31536000

-f bunu arka plana yerleştirir, ancak arka plana yerleştirmek ssh'ın bağlanacağı anlamına gelir, ardından görevi tamamlanır tamamlanmaz bağlantıyı keser. Yani bir göreve ihtiyacın var.

uyku 31536000 ssh'a bağlandıktan sonra 1 yıl boyunca "uyku" çalıştırmasını söyler. Bu süre zarfında tünelleriniz açık kalacaktır.

Bir komut çalıştırmazsanız, ssh bağlanacak, 2205 numaralı bağlantı noktasında ters tüneli kuracak ve bu işlem tamamlandığında çıkacaktır. Autossh kullanarak, bağlantı başarısız olursa, yeniden bağlanır ve uyku modunu yeniden başlatır. Gerçekten istikrarlı bir internet bağlantısı olsa bile, bir yıl mümkün olduğundan şüpheliyim.

BTW - bu diğer jokerlerden farklı olarak, bunun işe yaradığını biliyorum, çünkü aslında test ettim çünkü elbette benzer bir şey yapıyorum ve şimdi çalıştığımdan, çok güvenilir bir şekilde size doğru cevabı verebilirim.

-f ve "komut"

Eksik olan bu.


1
Burada başkalarının isimlerini aramamız gerektiğini sanmıyorum.
Jeff Schaller

1
Ben başkalarına isim demiyorum. Daha önce önerilen çözümlerin, onları öneren insanlar tarafından asla denenmediğine dikkat çekiyorum. Bana inanmıyor musunuz? Onları dene.
Jimminy Doe

1
Soruya da değindiğinizi sanmıyorum - OP iddiaları Bu yöntem% 100 işe yarıyor . Soruları, bilgisayarları yeniden başlatıldıktan sonra komut dosyalarını otomatik olarak çalıştırmaya odaklanıyor.
Jeff Schaller

1
Eğer işte ise, ters tünelleri eve kurabilir, çünkü OP bir terminalde çalışıyor - BU zamanın% 100'ü çalışıyor. Ssh (ve autossh) programları, işlemle ilişkili bir terminali yoksa farklı davranır. Tam olarak -f kullanmadığı için crontab (terminal olmadan çalışan) tünelleri yeniden bağlamakta sorun yaşıyordu ve öyle olsa bile , tüneller kurulduktan sonra bir şey çalıştırmadan ssh çıkacaktı - benim durumumda bir yıl boyunca uyku. -F betiğinde SSH'nin çıkmasını engelleyen bir KOMUT İLE kullanılmalıdır. Bu onun sorunu.
Jimminy Doe

1
Sanırım Jeff Schaller, bana bir aşağılık oy verdiğiniz için, doğru çözümü verdiğiniz ve gerçekten test ettiğiniz için. Temelde olduğu gibi aynı kurulumu yapıyorum, ancak bir güvenlik duvarından geçmek için bir PI kurup rdesktop'u başlatmam ve bunu Linux hakkında hiçbir şey bilmeyen ofis yöneticimize vermem dışında kullanıyorum . Kurşun geçirmez bir çözümüm olduğundan eminim, şimdi kullanıyorum ve hem pi'imi hem de yerel kablo modemimi yeniden başlattım - sadece güvenli olmak için .. Ama heck, doğru cevabın girmesine izin verme şişirilmiş, kazanılmamış bir egonun yolu.
Jimminy Doe
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.