4 Eylül 2008 Perşembe

OpenVPN Kurulumu

VPN nedir?

İnternet üzerinden her hangi bir yere bağlandığımızda (web sayfası, dosya alış-verişi, sohbet vb.) aradaki veri akışı paketler halinde olur. Bu paketler ağ şeklinde düzenlenmiş İnternet alt yapısı üzerinde bir çok nokta üzerinden atlayarak gideceği yere varır. Bu noktaların her birinde paket içeriği görüntülenebilir ve hatta içeriği değiştirilebilir.

Bankacılık gibi parola girilmesi gereken 'hassas' sayfalarda bilgi güvenliğinin sağlanması amacı ile SSL (Secure Socket Layer - Güvenli Bağlantı Katmanı) adı verilen bir sistem kullanılır. Web tarayıcının adres çubuğunda kilit resminin göründüğü sayfalarda bu sistem uygulanıyor ve bilgi güvenliğiniz sağlanıyordur. SSL sistemi gidip gelen verilerin sadece gönderenin veya alanın açabileceği şekilde şifrelenmesini ve böylece ara noktalarda verinin erişilememesi ilkesine dayalı çalışır.

Yerel ağ birbirine yakın mesafedeki bilgisayarlar için kullanılan bir kavramdır. Daha doğru bir tanımla cihazlar arasında verilerin geçtiği bütün noktaların tüm erişim haklarının tek bir kişi/kurum tarafından yönetildiği ağlara yerel ağ diyebiliriz. Yani aynı yerel ağda bulunan iki cihaz arasında yapılan bilgi alış verişi (ağda bir sorun olmadığı sürece) yabancı kişiler tarafından görülemez. Burada şu açıklamayı yapmam gerekiyor: Aynı yerel ağda bulunan cihazlar İnternet üzerinden erişilebilecek sunucular üzerinden bağlantı kurabilirler. Örneğin bir çok sohbet programı bu mantık ile çalışır. Bu durumda bilgi ağ dışına çıktığı için görülebilir olmaktadır.

VPN kavramı Virtual Private Network yani Sanal Özel Ağ, kısaca İnternet üzerinden istediğiniz yerel ağa, şifreli ve güvenli olarak bağlanabilme kavramının adıdır. Yani VPN kullanıldığında İnternet'e bağlı her hangi bir noktadan, ayarları daha önce yapılmış olan, her hangi bir yerel ağa güvenli bir biçimde bağlanılabilir. Böylece veri güvenliği kaygıları yaşamadan yerel ağın kaynaklarına (Ağ yazıcısı, kurum içi web/dosya sunucusu, VoIP telefon sistemi v.b.) İnternet üzerinde her hangi bir yerden erişilebilir.

VPN ile bir noktaya şifreli olarak bağlandıktan sonra bütün İnternet bağlantılarınızı bağlandığınız cihaz üzerinden yapabilirsiniz. Özellikle açık kablosuz bağlantı noktalarında güvenliğinizin sağlanması için bu yöntemi seçebilirsiniz. Bu yöntemi kullandığınızda sizin bilgisayarınız ile bağlandığınız cihaz arasında bir tünel oluşturulacak ve İnternet'e sanki bu tünelin ucundan ulaşıyormuşsunuz gibi olacaktır. Yani bağlandığınız noktaya kadar bütün veriler şifreli gidecek, eğer bağlanılan sunucu, açılan sayfa şifreleme istemiyorsa, VPN ile bağlandığınız noktadan sonra şifresiz olacaktır.

VPN kurmak için kullanılan yöntemlerden sık kullanılan ikisi:

• IPSec (Internet Protokol Güvenliği)

• SSL/TLS

İkisi arasındaki temel fark şifrelemenin gerçekleştirildiği taşıma seviyesidir. Daha detaylı bilgi için [2] 'ye bakabilirsiniz. Şu anda söyleyebileceğim nadir de olsa IPSec paketlerinin bazı yönlendiriciler üzerinden geçerken sorun çıkarabildiğidir.

VPN teknolojileri neredeyse bütün işletim sistemleri için kullanılabilir durumdadır. Ubuntu için de bir çok alternatif vardır. Bu alternatiflerden biri olan openVPN'i biraz inceleyelim. openVPN Ubuntu'nun yanında neredeyse bütün işletim sistemlerinde çalışmaktadır.


Kurulum

openVPN Ubuntu'nun universe (katkı) depolarında bulunmaktadır. Bu depoyu kullanıyorsak uçbirimden;

$ apt-get install openvpn


komutunu vererek ya da apt://openvpn bağlantısına tıklayarak openvpn'i kurabiliriz.


openVPN Nasıl Çalışır?

Çok fazla kuramsal bilgiye girmeden kısaca açıklamaya çalışayım: openVPN'i kurduğunuz ve çalıştırdığınız zaman sisteminize tun0 adında bir ağ ara birimi daha eklendiğini görürsünüz. Bu sanal bir ağ ara birimidir. Bu ara birim üzerinden gönderilen paketler şifrelenerek kullanımda olan gerçek ağ ara birimlerine aktarılırlar.

OpenVPN iki farklı veri katmanında çalışır: Katman 2 ve katman 3. Biraz ileri düzeyde bilgi gerektiren bu kavramları kısaca açıklamaya çalışayım. Katman 2 bir birine 1. dereceden (anahtar ya da hub kullanarak) bağlı bilgisayarların bağlanma şeklidir. IP adresleri olmasına karşın iletişim cihazlarının MAC yani fiziksel adresleri kullanılarak yapılır. Katman 3 ise (bu uygulama özelinde) IP adreslerinin birbirine yönlendirilmesi ile kurulan bir iletişim biçimidir. Örneğin yönlendiriciler birbirleri ile bu katmanda haberleşirler. openVPN paketleri 2. ya da 3. katmandayken alıp şifreleyebilir. Ne yaptığınızı bilmiyorsanız 3. katmanı kullanmanız tavsiye edilir.

openVPN kurulumu sunucu - istemci ve noktadan noktaya (p2p) olmak üzere iki şekilde yapılabilir. noktadan noktaya yalnızca iki cihaz arasında güvenli bağlantı kurulmak isteniyorsa tercih edilebilir. TLS sertifikaları oluşturulmadan, yalnızca bir parola ayarlanıp, bağlantının iki ucuna da girilerek bağlantı kurulabilir. Sertifika kullanımından daha güvensizdir. Sunucu - istemci modeli ise adından da anlaşılabileceği üzere bir sunucu ve birden fazla istemciden oluşabilir. Böylece ikiden fazla cihazın birbirine güvenli yoldan bağlanabilmesi sağlanır. İstemci olan bütün cihazlar sunucuya bağlanırlar ve eğer izin verilirse aralarındaki iletişim sunucu üzerinden yapılır. Her istemci ve sunucu arasında bağlantı yapılırken sertifika kontrolü yapılır.


openVPN ayarları

openVPN ayarları bir dosyaya düz metin halinde kaydedilir ve program çalıştırılırken ayarları bu dosyadan alması söylenir. MS Windows üzerinde ayarlar .ovpn soyadlı dosyalara kaydedilir.

Parola Korumalı

İlk olarak daha kolay olan noktadan noktaya - p2p tünel oluşturmak için gerekli kısa ayarlara bakalım.

Öncelikle iki cihazın birbirini tanımasını sağlayacak parolayı (anahtarı) üretmemiz gerekiyor. Bunun için:

$ openvpn --genkey --secret parola.key

komutunu veriyoruz. Bağlantı için gerekli olan parola parola.key dosyası içerisinde oluşturuldu. parola.key dosyasını diğer bilgisayara güvenli bir şekilde ulaştırmamız gerekiyor. Eğer bu dosya başka birinin eline geçerse güvenli ağımıza dahil olabilecektir. Şimdi birbirine bağlanacak cihazlardan birini sunucu, diğerini ise istemci olarak atamamız gerekiyor. Aşağıdaki ayarları birer metin dosyasına yazıp, ilgili cihazlara ait parola.key dosyası ile aynı dizin içerisine koymamız gerekiyor.

Sunucu olacak cihaz için ayar dosyası (sunucu.conf):

dev tun

ifconfig 10.8.0.1 10.8.0.2

secret parola.key


istemci olacak cihaz için ayar dosyası (istemci.conf):


remote sunucu.adresi

dev tun

ifconfig 10.8.0.2 10.8.0.1

secret parola.key


sunucu.adresi 'ni sunucunun IP veya alan adı adresi ile değiştirmeniz gerekir. İstemci, sunucuya UDP 1194 portundan erişmeye çalışacaktır. Eğer sunucu bir NAT, firewall ya da ADSL modem arkasındaysa bu portun sunucuya yönlendirilmesi gerekmektedir. Her bir ayar dosyasındaki ifconfig satırlarının ilki cihazın ip adresi, ikincisi de karşıdaki cihazın ip adresi olarak atanacaktır. Sunucu üzerinde

$ openvpn sunucu.conf


komutunu, daha sonra istemci üzerinde

$ openvpn istemci.conf


komutunu verdiğiniz zaman iki cihazın birbirine bağlanması gerekir. İstemci üzerinden

$ ping 10.8.0.1


komutunu vererek bağlantıyı test edebilirsiniz. (Eğer ping isteklerine yanıt gelirse, bağlantı çalışıyor demektir.)

Daha fazla bilgi için: http://openvpn.net/index.php/documentation/miscellaneous/static-key-mini-howto.html adresine bakmanızda fayda var.

Sertifikalı Bağlantı

Birden fazla bilgisayarın birbirine bağlanabilmesini sağlamak ve güvenliği artırmak için sertifikalı bağlantıların seçilmesi daha uygun olacaktır.

Sertifikalı bağlantılar çalışma biçimleri özetle şöyle açıklanabilir: Her bir cihazın sertifikası tek bir sertifika otoritesi (certificate authority - CA) tarafından imzalanır. Bağlantı kuracak taraflar birbirlerine sertifikalarını gönderirler. Sertifikayı alan taraf sertifika otoritesine bakarak sertifikanın gerçek olup olmadığını anlar. Eğer sertifika gerçekse, bundan sonra gönderilen veriler bu sertifika (kamu anahtarı) kullanılarak şifrelenir. Ve şifrelenmiş bu veriyi, yalnızca sertifika sahibi yani özel anahtarı bulunduran kişi açabilir.

Sertifika otoritesi olan kuruluşlar vardır. Özellikle e-ticaret, bankacılık gibi uygulamalarda güvenliğin arttırılması için sertifikalar bu tür kuruluşlara onaylatılmalıdır. Fakat bizim kuracağımız sistem kontrolümüz altında olacağı için sertifika otoritesinin de biz olmamızda bir sorun yoktur.

Yapacağımız işlemler:

• Sertifikalar için parametreleri belirlemek
• Sertifika Otoritesi (CA) dosyasını oluşturmak.
• Sunucu için sertifika oluşturma.
• İstemci için sertifika oluşturma.
• Ayar dosyalarının düzenlenmesi.

openVPN içerisinde sertifikaların daha kolay oluşturulabilmesi için hazırlanmış bazı kodlar vardır. Bu kodlar Ubuntu içinde /usr/share/doc/openvpn/examples/easy-rsa/ dizininde bulunurlar. 2.0 sürümünü aşağıdaki komut ile kendi dizininize kopyalayıp gerekli anahtarları oluşturmaya başlayabilirsiniz.

(not: Dosyaların bütünlüğünün korunabilmesi açısından bundan sonraki işlemlerin sunucuda gerçeklenmesi önerilir. Fakat şart değildir.)

$ cp /usr/share/doc/openvpn/examples/easy-rsa/2.0 ~/easy-rsa
$ cd ~/easy-rsa


(not: bu noktadan sonra yapacaklarımızı dizinin içindeki README dosyasından da takip edebilirsiniz)

Dosyalar kopyalandıktan sonra easy-rsa dizinine giriyoruz. vars dosyasını bir metin düzenleyici ile açarak gerekli değişiklikleri yapıyoruz. Bir çok ayarı değiştirmeniz gerekmez. Dosyayı gözden geçirin, eğer özel bir durumunuz yoksa yalnızca dosyanın sonundaki ön tanımlı değerleri değiştirmeniz yeterli olacaktır. Bu değerler her bir sertifikanın içine gömülecek verilerin daha hızlı girilebilmesine yardımcı olurlar. Her bir sertifika için farklı bilgiler girebilirsiniz. Değişiklikleri yaptıktan sonra kaydedin ve çıkın.

$ . vars
$ ./clean-all


komutlarını vererek, değişkenleri işler hale getiriyoruz ve anahtar dizinimizi oluşturuyoruz. Anahtar dizini, eğer vars dosyasını değiştirmediyseniz, ~/easy-rsa/keys dizini olacaktır. Bundan sonra üreteceğimiz bütün dosyaları (anahtarlar ve sertifikalar) bu dizinde bulacağız. Şunu aklımızda tutmakta fayda var: Bu dizin içinde oluşturulacak .key soyadlı dosyalar gizli ve hususi dosyalardır, özel anahtarları ihtiva ederler. .crt soyadlı dosyalar ise dağıtılabilirler.

Sırası ile aşağıdaki komutları veriyoruz.

$ ./build-dh
$ ./pkitool --initca
$ ./pkitool --server iyiSunucu
$ ./pkitool istemci1


Verdiğimiz komutları açıklayayım:

  1. Sertifikaları ve anahtarları oluşturmadan önce karşılıklı şifrelemenin gerçekleşebilmesi için bazı parametrelerin belirlenmesi gerekmektedir. Bu değişim parametreleri Diffie Hellman adı verilen teknik ile sağlanmaktadır.
  2. CA sertifikasını ve anahtarını oluşturur.
  3. Sunucu için gerekli sertifika/anahtar çiftini oluşturur. Sunucumuzun adı bundan sonra iyiSunucu olarak anılır.
  4. istemci1 istemcisi için gerekli sertifika/anahtar çiftini oluşturur.

Böylece, CA, sunucu ve istemci için sertifika/anahtarı oluşturmuş olduk. Bundan sonra her hangi bir istemci için sertifika/anahtar üretmek için:

$ . vars
$ ./pkitool istemciAdı


komutlarını vermek yeterli olacaktır. Dikkat edilmesi gereken oluşturma işlemi sırasında keys dizini altında ca.key ve ca.crt dosyalarının bulunmasıdır. Bütünlüğü bozmamak ve dosyaların taşınarak güvenliklerinin tehlikeye atılmaması için bütün oluşturma işlemlerinin tek bir bilgisayar üzerinde yapılması tavsiye edilir.


Ayar Dosyaları

Sertifikalar oluşturulduktan sonra bu sertifika ve anahtarları kullanacak ayar dosyalarının da yaratılması gerekmektedir. Örnek ayar dosyalarının birer kopyasını /usr/share/doc/openvpn/examples/sample-config-files/ dizininde bulabilirsiniz. client.conf ve server.conf.gz dosyalarını uygun bir dizine kopyalayıp, gz'yi açtıktan sonra server.conf dosyasını sunucu.conf ve client.conf dosyasını istemci1.conf olarak kopyalayalım ve sunucu.conf dosyasını ayarlamakla işe başlayalım.

$ mkdir ~/openvpn
$ cd ~/openvpn
$ cp /usr/share/doc/openvpn/examples/sample-config-files/{client.conf,server.conf.gz} .
$ gunzip server.conf.gz
$ cp {server,sunucu}.conf
$ cp {client,istemci1}.conf


Aşağıda sunucu.conf dosyası içerisinde mutlaka bulunması gereken satırları yazıyorum. Bunun dışındaki satırlar için dosya içinde bulunan yorumlara ve açıklamalara başvurabilirsiniz.

sunucu.conf:

port 1194
proto udp

dev tun

ca ca.crt
cert iyiSunucu.crt
key iyiSunucu.key

dh dh1024.pem

server 10.8.0.0 255.255.255.0

openVPN'e şöyle dedik:

  • UDP protokolünün 1194 nolu portundan gelen bağlantıları kabul et.
  • Katman 3 bir tünel oluştur (dev tun).
  • CA sertifikası ca.crt, sunucu sertifikan iyiSunucu.crt ve sunucu anahtarın iyiSunucu.key dosyasındadır.
  • Diffie-Hellman için dh1024.pem dosyasını kullan.
  • Ağdaki IP adreslerini 10.8.0.0 - 10.8.0.254 arasında dağıt kendine de 10.8.0.1 adresini al.

Ek olarak şu ayarları yapabilirsiniz:

Sunucuya bağlanan bilgisayarların IP adreslerini korunması ve her seferinde aynı kalması için aşağıdaki komutu verebilirsiniz.

ifconfig-pool-persist ipp.txt

Bağlanan istemcilerin birbirini görebilmesi için:

client-to-client

bağlantılarda sıkıştırma kullanılması için:

comp-lzo

Sürekli kendini terkarlayan mesajların susturulması için:

mute 20

Ayar dosyası ile çalıştırmak için aşağıdaki bölüme bakabilirsiniz. Şimdi istemci cihazın da ayar dosyasını yapalım.

istemci.conf:

client

dev tun

proto udp

remote sunucu.adresi 1194

ca ca.crt
cert istemci1.crt
key istemci1.key


yani şöyle dedik;

  • sen istemcisin. Bağlanmaya çalış ve ayarların bir kısmını bağlandıktan sonra al.
  • sunucu.adresi adresindeki sunucunun 1194 numaralı portuna UDP protokolü ile bağlan.
  • Katman 3 bir tünel oluştur (dev tun).
  • CA sertifikası ca.crt, sertifikan istemci1.crt ve anahtarın istemci1.key dosyasındadır.


ek olarak;

eğer sunucuda sıkıştırma açıldı ise;

comp-lzo

Sürekli kendini terkarlayan mesajların susturulması için:

mute 20

komutları kullanılabilir.


Programın Çalıştırılması


Ubuntu'nun paket deposundan yüklediğinizde program daemon olarak çalışmaya başlar. Ve kendini her açılışta çalıştırmak üzere ayarlar. Otomatik olarak başlarken okuması gereken ayar dosyalarını /etc/openvpn/ dizini altına koyabilirsiniz. Böylece her açılışta doğru ayarlar ile başlayacaktır. Şu anda cihazı açıp kapatma gibi bir lüksümüz olmadığı için öncelikle deamon'ı sonlandıralım.

$ sudo /etc/init.d/openvpn stop


Şimdi deneme amaçlı başlatacağımız ve belki çıkacak sorunları çözmemiz gerekeceği için programı;

$ sudo openvpn ayarDosyasi.conf


komutunu vererek başlatalım. Böylece programın üreteceği çıktılar direk olarak ekrana yazılacak, böylece log dosyalarını takip etmemiz gerekmeyecektir. Öncelikle sunucuyu etkin hale getirmemiz gerekiyor.

$ sudo openvpn sunucu.conf


komutunu verdiğimizde sunucu ayarlamalarını yapacak, gerekli dosyaları okuyacak ve UDP 1194 potunu dinlemeye başlayacaktır. Kalabalık çıktıları okumaya çalışın. Eğer en sonda

Initialization Sequence Completed


yazısını görürseniz sorun yok demektir. Eğer bu satırı göremediyseniz, dosyalarınızın yerlerini ve ayar dosyalarınızı tekrar kontrol edin. Kalabalık yazılar arasında sorunun nedeni yazacaktır.

Şimdi de istemci tarafına geçip buradaki dosyayı çalıştıralım:

$ sudo openvpn istemci1.conf


Yine kalabalık olan çıktılar arasında aşağıdaki satırları görürseniz işlem tamamlanmış demektir.

Peer Connection Initiated with sunucu.adresi:1194
...
Initialization Sequence Completed


Bu sırada sunucu tarafındaki ekranı da takip ederseniz bağlantı detaylarının ekrana yazıldığını görebilirsiniz. İstemci tarafında yeni bir uçbirim açıp;

$ ifconfig


komutunu verirseniz tun0 arabirimi için atanmış bir inet adresi görmeniz gerekir. Yukarıdaki ayarları aynen uyguladı iseniz bu adres büyük olasılıkla 10.8.0.6 olacaktır. İstemciden sunucu'ya yani 10.8.0.5 adresine (*) ping atarak;

$ ping 10.8.0.5


bağlantıyı test edebilirsiniz. Aklınızda bulunsun, testin çalışabilmesi için sunucunun ping isteklerine cevap vermesi gereklidir.

(*) openVPN Ubuntu üzerinde çalışırken adresleri teker teker dağıtmamakta her bir istemci için bir alt-ağ oluşturabilmektedir. Bu yüzden bağlanan her bir istemcinin adresinin 1 eksiği sunucunun adresi olacaktır. Detaylar için yönlendirme tablosuna (route komutu ile) bakabilirsiniz.

Son ayarlar ve toparlama

Eğer aradaki bağlantıyı sorunsuz olarak kurabildiyseniz, çalıştığı ekranlarda Ctrl - C ile openVPN uygulamalarını kapatabilirsiniz. İsterseniz her bağlanma için komutları yukarıda tarif edilen şekilde verebilirsiniz. Fakat sunucu için bu pek uygun olmayacaktır. Sunucu tarafında bulunan sunucu.conf dosyasını /etc/openvpn/ dizininin altına kopyalayalım. ca.crt, sunucu.key, sunucu.crt ve dh1024.pem dosyalarını da /root/openvpn dizinine kopyalayalım. İlgili dizin için de görünürlüğü kısıtlayalım. Yeri değişen dosyalar için conf dosyamızı ayarlayalım. openVPN'in yetkilerini düşürelim. Böylece güvenliğimizi artıralım. Sonra da sunucumuzu yeniden başlatalım.

Sunucu üzerinde;

sunucu.conf dosyasının son hali:

port 1194
proto udp

dev tun

ca /root/openvpn/ca.crt
cert /root/openvpn/iyiSunucu.crt
key /root/openvpn/iyiSunucu.key

dh /root/openvpn/dh1024.pem

server 10.8.0.0 255.255.255.0

ifconfig-pool-persist ipp.txt

comp-lzo

user nobody
group nogroup

persist-key
persist-tun


$ sudo cp sunucu.conf /etc/openvpn/
$ sudo mkdir /root/openvpn
$ sudo chmod 600 /root/openvpn
$ sudo mv ca.crt iyiSunucu.crt iyiSunucu.key dh1024.pem /root/openvpn
$ sudo /etc/init.d/openvpn restart


Hayırlı olsun.


Notlar

  • Eğer her bir sertifika içine farklı bilgiler gömmek isterseniz pkitool komutlarını --interact parametresi ile çalıştırabilirsiniz.
  • İstemcilerin bütün İnternet trafiklerinin sunucu üzerinden olmasını istiyorsanız, sunucu ayarları içine
    push “redirect-gateway”
    komutunu koymanız gerekir. Bu durumda sunucu üzerinden İnternet'e çıkış ayarlarını da ayrıca yapmanız gerekir.
  • "redirect-gateway" komutu bütün trafiği yönlendirdiği için DHCP adresi alamama gibi sorunlara da yol açabilmektedir.
  • VPN'in IP adresleri ile yerel ağ bağlantılarının adreslerinin çakışmamasına (aynı alt ağda olmamasına) dikkat ediniz.
  • IPv4 ve yönelnedirmeler hakkında biraz bilgi edinmeniz işinizi kolaylaştıracaktır.


kaynaklar:
[1] http://www.olympos.org/howto-nasil/openvpn/openvpn-ile-vpn-uygulamalari-20220.html
[2] http://penguence.linux.org.tr/?~p=dergi&action=show&which=77
[3] http://openvpn.net/index.php/documentation/howto.html

4 yorum:

Adult dedi ki...
Bu yorum bir blog yöneticisi tarafından silindi.
selcuk dedi ki...

Çok detaylı ve süper bir kurulum açıklaması. Elinize sağlık. Teşekkürler.

guvenatbakan dedi ki...

Çok güzel bir kaynak olmuş, elinize sağlık.

Cem Alptekinoğlu dedi ki...
Bu yorum yazar tarafından silindi.