SSH ile ters tünel açmak (reverse ssh)

Ters tünel güvenlik duvarı veya nat arkasındaki bilgisayarlara bağlanabilmek için kullanılıyor. İşin ana fikri şu; biz güvenlik duvarı arkasına bir bağlantı açamayabiliriz fakat o bize açabilir. Yani bağlantıyı ilk başlatan karşı taraf olursa bağlantı gerçekleşir. SSH ile ters tünel açmak için -R parametresi kullanılıyor. Bu parametrenin başında öncelikle tünel açılacak karşı tarafın ip:port tanımı yapılıyor. Aşağıdaki şekilden de görebileceğiniz gibi senaryomuzda Bilgisayar-1 ve Bilgisayar-2 söz konusu. Bilgisayar-1 duvar arkasında yer alıyor. Bağlantıyı başlatacak olan da bu bilgisayar. Bu örnekte her iki tarafta da SSH sunucusunun bulunması gerekiyor aksi takdirde tünel açılamayacaktır. Şekli inceleyin.

reverse_tunnel

Tüneli Açmadan Önce Hazırlıklar

Her iki tarafta Linux ise büyük olasılıkla SSH sunucu kurulu demektir. Değilse apt-get install opensshd ile kolayca yükleyebilirsiniz.

Benim örneğimde bilgisayar-2 bir windows olduğu için OpenSSH  kurup bazı ince ayarlar yaptım. OpenSSH’ın kurulum talimatlarını tamamladıktan sonra size tavsiyem tünelin ucunda güvenlik açığı yaratmamak adına etc/passwd dosyasındaki gereksiz kullanıcıları kaldırın.  Bu ssh hesaplarını tünelleme dışında kullanmayacaksanız hepsinin switch olan komut kabuğunu false yapın. Böylece bilgisayar-2’yi ssh oturumu açılmasına karşı korumuş oldum. Bunu yaptıysanız (false) tünel açarken -N parametresini de kullanmalısınız. N parametresi bağlantıdan hemen sonra kabuk talebinin işleme koyulmamasını sağlayacak aksi takdirde tünel hemen kapanacaktır.  Tünel komutumuzun son hali şöyle olacak:

 ssh -N -R 2222:localhost:22 [email protected]

Passwd dosyamın içeriği:

Can:unused_by_nt/2000/xp:1000:513:U-Can-Bilgisayar\Can,S-1-5-21-23434337-2173434-6176343483-1000:/home/Can:/bin/false

Ayrıca tünel oluşturan komutumuzu cron’a atacağız. Herhangi bir kullanıcı-klavye etkileşimi olmayacağından parola da giremeyeceğiz. Bu nedenle tanımladığımız hesabın (bu örnekte can) parolasını da boş geçebilmemiz gerekiyor. Bu anlamda ssh’ın parola belirtebileceğimiz bir parametresi yok.  Dikkat ederseniz tünelin bağlanacağı bilgisayarı belirtirken can hesabını da belirttik ([email protected])  parolasız bağlanmak için şunu yapın:

Bilgisayar-2 üzerinde bir ssh hesabı olan can kullanıcısının parolasını sıfırlamak için şunu yazın:

ssh -t [email protected] passwd

Parola sıfırlamanın ekran görüntüsü aşağıdakine benzer olacak:

Screenshot_1

Bilgisayar-2 de kurulu opensshd’ye bir ayar daha yapmamız gerekiyor. Parolayı sıfırladığımız için opensshd’ye boş parola ile giriş izni tanımlamalıyız. Aksi takdirde parolasız hesapların bağlanmasına izin vermeyecektir. Bunun için etc/sshd_config dosyasına şu satırı ekleyin ve opensshd’yi yeniden başlatın:

PermitEmptyPasswords yes

Openssh’ı yeniden başlatmak için windows komut satırına şunu yazın:

net stop opensshd
net start opensshd

Ters Tüneli Açmak

Bilgisayar-1’in konsoluna geçerek aşağıdaki ekran görüntüsündeki gibi -R ve -N ile parametreleri ile tünel açma komutunuzu girin.

b1

Eğer parolasız giriş tanımlamışsak üstteki resimdekinin aksine parola sormayacak ve karşı tarafa TCP bağlantısı kurarak beklemeye geçecek. Bundan sonra yapmamız gereken tünelin diğer ucundan (2222:localhost) ssh ile giriş yapmak. Tünel sayesinde çıkacağımız yer güvenlik duvarının arkasındaki bilgisayarın komut kabuğu olacaktır

b2

Özetlemek gerekirse biz karşı tarafa bağlanamıyoruz, onun bize bağlantı açmasını sağlayarak açtığı bağlantıyı tünel olarak kullanıyoruz ve bu tünelden hedef makinede ssh oturumu açmak için faydalanıyoruz.

Tunel Açılışını Cron ile Otomatik Hale Getirmek

Güvenlik duvarı arkasındaki Bilgisayar-1 ‘in başına geçip tünel aç komutunu veremeyeceğimiz durumlarda (sistem yeniden başlatılmış olabilir, tünel kurulduktan sonra bağlantı kesilmiş olabilir vb) bu işi otomatik yapan bir betik yazıp belirli zaman aralıklarıyla çalıştırabiliriz. Öncelikle aşağıdaki betiği create_ssh_tunell.sh adıyla ev dizininizde bir yere kaydedin (örn: ~/scripts/create_ssh_tunnel.sh)

[/crayon]

Yukarıdaki betiğe dikkat edecek olursanır -p parametresi ile port belirttik. Eğer bilgisayar-2 modem arkasında duruyor ise modemden port yönlendirmesi de yapmalısınız. Bu örnekte bilgisayar-2’nin kullandığı modemin 2222. portuna dışarıdan gelen bağlantı isteklerini  bilgisayar-2’nin 22. portuna yönlendirdim.

Ardından chmod 755 create_ssh_tunnel.sh ile çalıştırılabilme izni verelim. Daha sonra sudo crontab -e yazarak cron tablomuza şu satırı ekleyelim ve kaydederek çıkalım.

# Her 6. dakikada ssh tuneli kur
*/6 * * * * ~/scripts/create_ssh_tunnel.sh > tunnel.log 2>&1

Şuan yapmamız gereken tün işlemleri tamamladık. bilgisayar-1 nerede olduğu farketmeksizin (sadece internet bağlantısı olması yeterli) her zaman ona ssh ile bağlanabileceğiz. Bu konu linux deneyimi az olanlar için biraz uygulaması zor bir konu, farkındayım. Ben de bazı konularda zorlanmıştım. Sorularınız olursa yazabilirsiniz. Elimden geldiğince yanıtlamaya çalışırım.

Kaynaklar:

[1] http://unix.stackexchange.com/questions/46235/how-does-reverse-ssh-tunneling-work
[2] http://www.tunnelsup.com/raspberry-pi-phoning-home-using-a-reverse-remote-ssh-tunnel

Yazar: Özgür Koca

Yazar - Tankado.com

“SSH ile ters tünel açmak (reverse ssh)” için 3 yorum

  1. Not:

    Tünel açılmıyorsa Bilgisayar-2”nin SSH sunucusunun dinlediği IP”yi (örn: 192.168.0.10) tünelin ucuna şöyle ekleyin:

    /usr/bin/ssh -N -R 192.168.0.10:2222:localhost:22 -p 2222 bilgisayar2.domain.com

    Bilgisayar-2”deki sunucu tüm IP”leri dinliyorsa tünel komutu şöyle olmalı:

    /usr/bin/ssh -N -R 0.0.0.0:2222:localhost:22 -p 2222 bilgisayar2.domain.com

Özgür Koca için bir yanıt yazın Yanıtı iptal et

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.