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 can@192.168.0.100

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 (can@192.168.0.100)  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 can@192.168.0.100 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)

#!/bin/bash
createTunnel() {
/usr/bin/ssh -N -R 2222:localhost:22 -p 2222 bilgisayar2.domain.com
if [[ $? -eq 0 ]]; then
echo Tunel basariyla olusturuldu.
else
echo Tunel olusturulurken hata: $?
fi
}
/bin/pidof ssh
if [[ $? -ne 0 ]]; then
echo Yeni tunel olusturulacak.
createTunnel
fi

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

3 YORUMLAR

  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

pu için bir cevap yazın İptal

This site uses Akismet to reduce spam. Learn how your comment data is processed.