VPN Sunucusu Kurmak

Bu başlıkta Raspberry Pi’a pivpn betiği ve araçlarını kullanılarak VPN sunucusunun kurulumu ve nasıl kullanılacağı anlatılacaktır. VPN (Virtual Private Network) sunucusu uzak bir bilgisayardan VPN kurulu sunucunun yerel ağına şifreli bir bağlantı üzerinden erişmeyi sağlar. Böylece bağlanılan ağın tüm kaynaklarına uzak bir konumdan güvenli bir şekilde erişilebilmiş olunur.

Aklınıza şu soru gelebilir: Peki, normal şartlarda kullandığımız internet bağlantısı güvenli değil mi ki VPN bağlantısına ihtiyacımız olsun? VPN temel olarak iki görevi yerine getirir. İnternet ortamında veya birbirinden ayrı ağlar üzerinde yer alan bilgisayarları bir araya getirerek özel bir sanal ağ meydana getirir. Böylece bilgisayarlar farklı ağ/internet konumlarında olsalar dahi, sanki aynı ağda ikamet ediyorlarmış gibi haberleşebilirler. VPN’nin ikinci işlevi ise VPN ağına katılan bilgisayar ile VPN ağı arasındaki veri trafiği şifrelenir. Şifrelemenin güvenliği kendini kanıtlamış matematiksel şifreleme algoritmaları ile sağlanır. Ağa bağlanacak bilgisayarların her biri kendi şifreleme anahtarına sahiptir ve bu şifreleme sadece VPN sunucusu tarafında çözülebilir. Bu başlıkta anlatılacak olan VPN kurulumunda şifre bir metin dosyasında saklanan şifreleme sertifikası olabileceği gibi metin tabanlı bir parola da olabilir.

VPN bağlantısı kuran bilgisayarlar arasındaki veri iletişimin şifrelendiğini belirtmiştim. Ağ üzerinden iletişim kuran bilgisayarların verilerini şifrelemenin önemini de şu şekilde açıklayabiliriz; Alışveriş merkezleri ya da okul gibi internet bağlantısının ortak kullanıldığı ağlar veri güvenliği açısından son derece riskli alanlardır ve saldırılara açıktır. Bu da ortak kullanıma adanmış bu gibi ağları güvensiz kılar. Örneğin aynı ağda bulunan bir saldırgan ARP şaşırtma (ARP spoofing) yöntemi ile tüm veri trafiğinizi kendine yönlendirerek ele geçirebilir ya da trafiği değiştirerek farklı saldırı vektörlerini işletebilir. Diğer taraftan benzer şeyi (bağlantı filtreleme) internet servis sağlayıcınız (ISP – Internet Service Provider) da yapabilir, erişim kayıtlarınız ile birlikte size ait olan verinin bir kopyasını kendine de alabilir veya belli internet servislerine erişiminizi kısıtlayabilir. VPN ile güvenli bağlantılar üzerinden internete erişmek mahremiyetinizi korur ve olası saldırılardan etkilenmenizi önler.

Aşağıdaki şema bir VPN kurulumunun nasıl işlediğini göstermektedir.


VPN bağlantısının sağladığı koruma

Cyberpunk Hacker Grubunun Manifestosu

Eğer mahremiyetimiz olsun istiyorsak onu savunmalıyız. Bir araya gelmeli ve anonim hareketlerin gerçekleşmesine izin veren sistemler yaratmalıyız. İnsanlar mahremiyetlerini yüzyıllardır fısıltılarla, karanlıkla, zarflarla, kapalı kapılarla, gizli el sıkışmalarıyla ve habercilerle savundu. Geçmişin teknolojileri, mahremiyetin korunmasına imkân vermiyordu; ama elektronik teknolojiler veriyor.

Biz Cypherpunk’lar kendimizi anonim sistemler inşa etmeye adadık. Mahremiyetimizi; şifrelemeyle, anonim e-posta gönderen sistemlerle, sayısal imzalarla ve elektronik parayla (kripto para) savunuyoruz.

Bu başlıkta anlatılmaya çalışılacak olan uygulamada senaryomuz şöyledir: Evimizdeki Raspberry Pi bilgisayarına kuracağımız Open VPN sunucusu ile evimizin dışındayken (örneğin bir AVM’de) internete bağlanmamız gerektiğinde ilk olarak, evimizde çalışan Raspberry Pi’a şifreli bir bağlantı üzerinden erişeceğiz ve internete evimizin bağlantısı üzerinden çıkacağız. Böylece evimizin dışında kullanmak zorunda olduğumuz internet bağlantısını ve ağı güvenli hale getirerek gelebilecek muhtemel saldırılara karşı korunmuş olacağız. Hem de evimizin yazıcı ve NAS gibi yerel ağ kaynaklarına sanki ev ağımızdaymış gibi bulunduğumuz yerden erişebileceğiz.

VPN sunucusunu evinizdeki Raspberry Pi bilgisayarına kurabileceğiniz gibi yurtdışında kiralayacağınız bir sunucuya da kurabilirsiniz. Bu durumda servis sağlayıcılar tarafından tanımlanan güvenlik duvarı kurallarını aşmış hem de veri mahremiyetinizi korumuş olursunuz.

VPN bağlantısının çalışma şekli

Bir VPN istemcisi yükleyerek daha önceden oluşturduğunuz parola ile evinizdeki VPN sunucusu kurulu Raspberry Pi bilgisayarınıza bağlanabilirsiniz. Uygulamamızda kullanacağımız OpenVPN istemcisinin MacOS, Android, Linux ve Windows’a kurabileceğiniz sürümleri vardır. İstemci kurulduğunda, işletim sistemi üzerinde sanal bir ağ bağdaştırıcısı oluşturulur. İstemci yazılımını kullanarak VPN bağlantısını etkinleştirdiğinizde de tüm paketler otomatik olarak bu ağ arabirimine yönlendirilir. VPN bağlantısı kurulduktan sonra sunucu, bu sanal ağ arabirimine otomatik olarak bir IP adresi atar. Bu andan sonra, artık ev ağınıza sanki evinizdeymiş gibi erişebilirsiniz. NAS’larınıza bağlanabilir, yazıcılarınızı kullanabilirsiniz. Kısacası evinizdeyken yapabildiklerinizin tamamını gerçekleştirebilirsiniz.

VPN bağlantısı teknik olarak oldukça karmaşık bir çalışma yapısına sahiptir. VPN bağlantısının kurulmasını ve taşıma katmanında güvenli veri aktarımını sağlayan TLS protokolünün detaylı çalışmasını tls.ulfheim.net adresinden inceleyebilirsiniz.

VPN kurulumundan önce yapılması gerekenler

Raspberry Pi’a kuracağımız VPN sunucusu varsayılan olarak UDP 1394 port’unu dinlemeye alacak ve VPN bağlantı isteklerini buradan kabul edecektir. Ev ağınızın dışından bu port’a bağlanabilmeniz için modeminizden port yönlendirmesi yapmanız gerekir. Port yönlendirmesi, modem/router’ın marka ve modeline göre değişkenlik gösterdiğinden yönlendirme işleminin nasıl yapılacağını modeminizin kullanım kitapçığından öğrenmelisiniz. Temel olarak port forwarding (port yönlendirme) anahtar kelimesinden yola çıkarak ilgili ayarı kolayca yapabilirsiniz. Ayrıca, modem/router’ınızın marka ve modeline uygun olarak portforward.com/router.htm adresindeki talimatları uygulayabilirsiniz.

internet bağlantınız dinamik IP adresi kullanıyorsa (yani modem/router’unuza internet servis sağlayıcınız tarafından sabit bir internet IP adresi atanmamışsa) bir alan adını bu değişken IP adresi ile güncellemeniz gerekir. Böylece Raspberry Pi üzerine kurduğunuz VPN sunucusunun internet IP adresi değişse bile bunu öğrenmenize gerek kalmaz, her zaman bu alan adı ile ulaşabilirsiniz.

VPN sunucusunun kurulması

Farklı işletim sistemlerinde çalışan birçok açık ve kapalı kaynak kod VPN çözümü vardır. OpenVPN de bunlardan en çok tercih edilenlerden biridir. OpenVPN’in kaynak kodları açıktır ve internette ücretli/ücretsiz VPN hizmeti veren birçok servisin de alt yapısını oluşturur. OpenVPN, istemci olarak Windows, macOS ve Linux dışında Android ve iOS’u da destekler. Hatta daha az bilinen FreeBSD, QNX, Solaris, Maemo ve Windows Mobile’ı gibi işletim sistemlerinde de kullanılabilir.

OpenVPN’in kurulumu ve yapılandırması yeni başlayan kullanıcılar için bazen meşakkatli olabilmektedir. Bu nedenle OpenVPN’in kurulumunu ve kullanımı kolaylaştıran pivpn[1] adlı projeden bahsetmek istiyorum.

pivpn, OpenVPN’i Raspberry Pi üzerine yüklemeyi kolay ve güvenli hale getiren bir kurulum betiğidir ve beraberinde gelen pivpn komut satırı aracı ile kolayca yönetilebilir. Bazı kaynaklarda Debian ve türevi diğer dağıtımlara da aynı şekilde kurulabileceğinden bahsedilmektedir. Araç yeni bir VPN hesabı oluşturma, mevcut VPN bağlantı istatistiklerini takip etme ve OpenVPN kurulumunu kaldırma gibi yeteneklere sahiptir.

pivpn betiği aracılığı ile OpenVPN’i kurmak için aşağıdaki komutu vermeniz yeterlidir. Gerekli kurulum betiği internetten indirilerek çalıştırılacak ve kurulum başlatılacaktır.

Kurulum yardımcısı çalıştıktan sonra sizden sırasıyla aşağıdaki şu sorulara cevap vermenizi isteyecek:

  1. Static IP Address: Statik IP adresi, OpenVPN bir sunucu olarak kurulacağı için sabit bir IP adresine sahip olması gerekir. Bu aşamada hâlihazırdaki IP adresini kalıcı (statik) olarak atayıp atamamak istediğiniz sorulur. Dilerseniz hayır seçeneğini seçerek yeni bir IP adresi tanımlayabilirsiniz. Modem/router üzerinde port’u yönlendireceğiniz adres bu adrestir.
  2. Local Users: Yapılandırma ayarlarının saklanacağı kullanıcı hesabının seçildiği ekrandır. Sonraki aşamaya geçmek için “pi” kullanıcısı ile devam edin.
  3. Unattended Upgrades: Katılımsız (elle müdahaleniz olmadan) güncellemelere izin vererek OpenVPN sunucunuzun daima güncel kalmasını sağlayabilirsiniz.
  4. Protocol: VPN hizmetinin hangi protokol üzerinden verileceğini belirleyin. UDP veya TCP’den birisini seçebilirsiniz. UDP protokolü, TCP’ye göre daha hızlı bağlantıların kurulmasını sağlar. Bunun nedenlerini ise kısaca şöyle sıralayabiliriz:
  1. UDP bağlantı yönelimli değildir. Bir UDP veri paketinin hedefine ulaştığını doğrulayan bir mekanizma yoktur.
    1. TCP paketleri hedef düğümde tekrar sıraya konularak birleştirilirken, UDP’de ise bu işlem OpenVPN tarafından uygulama katmanında (OSI) yapılır.
    1. UDP veri paketlerinin hedefe ulaştığını teyit eden bir mekanizma sunmazken TCP sunar.
    1. TCP veri paketinin başlık bilgisi uzunluğu 20Byte iken bu UDP’de 8 byte’dır. Bu da UDP’yi daha hızlı hale getirir.
    1. Bir TCP bağlantısı oluşturulurken 3’lü el sıkışma adı verilen kurallara ait veri paketleri de kullanılır. TCP bir veri göndermeden önce 3’lü el sıkışma için 3 ayrı paket gönderir. Bu durum UDP’de yoktur. Bu da UDP’nin daha hızlı olmasını sağlar.
  • Default OpenVPN Port: OpenVPN yazılımının varsayılan port numarası 1194’dür. Bu port numarası iyi bilinen standart olmuş bir numaradır. Port ekranında iken dilerseniz başka bir port numarası da seçebilirsiniz.
  • Installation mode: Bu ekranda OpenVPN sunucusuna bağlanmak için kullanacağınız istemci program OpenVPN v2.4’ü destekliyorsa, kimlik doğrulama ve anahtar değişim şifreleme algoritmaları olarak Eliptic Curves kullanılacaktır. Eğer istemcileriniz eski ise hayır seçeneği ile devam edebilirsiniz. Fakat bu da OpenVPN’in sağlamayı amaçladığı iletişim güvenliğini sekteye uğratır. Diğer taraftan da istemci programlar ile en yüksek uyumluluğu sağlar.
  • ECDSA encryption strength: Bu ekranda sunucuya özel rastgele bir şifreleme anahtarı oluşturulacaktır. Bu anahtarın uzunluğunu (bit) seçerek devam edin. Daha uzun anahtar iletişimin daha güvenli olmasını sağlar.
  • Public IP or DNS: Bu ekranda modeminizin IP adresini veya modeminizin dinamik olarak güncellediği alan adını yazabilirsiniz.
  • DNS Provider: OpenVPN bağlanacak olan istemcilere DNS hizmeti de verir. Bunun için listeden bir DNS sunucu adresi seçin.

Kurulum OpenVPN ile birlikte dnsutils, git ve expect paketlerini de yükleyecek ve gerekli iptables kuralları ile çekirdeğin IP yönlendirme desteğini etkinleştirecektir. Kurulumun tamamlanabilmesi için Raspberry Pi’ı yeninden başlatın. OpenVPN sunucusunun 1194. UDP port’unu dinleyip dinlemediğini listelemek için netstat aracını kullanabilirsiniz.

Yukarıdaki netstat çıktısında 257 PID (process ID) numaralı openvpn işleminin tüm yerel IP’lerin (0.0.0.0) 1194. UDP port’unu dinlediği görülmektedir.

VPN istemcisi eklemek

Pivpn’i kurduktan sonra, istemcilerin VPN sunucusuna bağlanabilmesini sağlayan özel ve genel anahtarların yer aldığı yapılandırma dosyasını oluşturmalıyız. Bu anahtarlar, VPN sunucunun IP adresi, protokol, port ve sertifika bilgilerinin de yer aldığı, .ovpn uzantılı bir istemci yapılandırma dosyasında saklanır. Aşağıdaki gibi pivpn aracına add seçeneğini geçerek yeni bir istemci oluşturabilirsiniz.

Bu komutun ardından; ilk olarak, oluşturulacak olan istemci hesabına bir isim vermeniz istenir (tankado). Ardından istemci için oluşturulacak özel anahtarı korumak için bir parola girmeniz istenir. Özel anahtarınız bu parola ile şifreleneceğinden yeterince uzun ve karmaşık olması çok önemlidir. Böylece istemci yapılandırma dosyanız başkasının eline geçse bile kullanılamayacaktır. Bu özellik ile her bağlantından önce parola girmeniz istenecektir. Parolayı iki kez girip doğruladıktan sonra ~/ovpns dizini altında belirtilen istemci adıyla ovpn uzantılı bir dosya (tankado.ovpn) yaratılacaktır. tankado istemcisinin VPN bağlantısı için gerekli tüm yapılandırma ayarları bu dosyaya kaydedilir. Ayrıca OpenVPN, özel anahtarları okumak için bu dosyanın bir kopyasını da /etc/openvpn/easy-rsa/pki dizininde saklar. Bu dizine doğal olarak sadece root kullanıcısının erişim hakkı vardır.

Not: Parola korumasız bir istemci yapılandırması oluşturmak için pivpn add nopass seçeneğini kullanabilirsiniz.

Oluşturulan VPN istemci yapılandırma dosyanın genel yapısı aşağıdaki gibidir:

Yukarıdaki yapılandırma dosyasının içeriğini oluşturan seçeneklerden bahsetmek gerekirse:

  • client: Bu dosyanın bir istemciyi yapılandırmak için oluşturulduğunu söyler.
  • dev (device): Sunucu tarafından VPN istemcisinin bağlantısını kabul eden sanal bir ağ arabirimi oluşturulur. İki arabirim türü vardır. tap ve tun. Eğer broadcast yoluyla haberleşen uygulamalar ya da IP dışında yönlendirme protokolleri (IPX ve NETBIOS) kullanılacaksa tap seçilmelidir. Tap bağlantı şeklini bridged modda gerçekleştirir. Bridged mod taşıma katmanında iletişim sağlar, dolayısıyla IP protokolünün dışındaki protokollerin VPN tüneli içerisinde kullanımı mümkün olur. IP protokolünü kullanan uygulamaların yönlendirilmesi söz konusu olduğunda tun arabirim türü kullanılır. VPN istemcisi sunucuya bağlandığında, veri paketleri varsayılan olarak tun0 arabiriminden gelip gider. Birden fazla sanal ağ arabirimi varsa tun1, tun2 vb. değerler kullanılabilir.
  • proto (protocol): Bağlantı için TCP ya da UDP’den hangisinin kullanılacağını tanımlar.
  • remote: Bağlanılacak olan VPN sunucusunun hangi IP ve port’da hizmet verdiğini belirtir. istemci burada tanımlanan IP adresine bağlanacağından, ilgili VPN sunucusuna modem/router üzerinden gerekli yönlendirmelerin yapılması gerekir. Genellikle bu satırda bir internet IP adresi yazar. Eğer modem/router’unuzun UDP 1194 port’unu Raspberry Pi’ın yerel IP adresine yönlendirmezseniz VPN bağlantısı yerel ağ dışından gerçekleştirilemez.
  • resolv-retry infinite: Eğer remote adresi olarak bir alan adı ya da bilgisayar adı kullanıyorsanız bu adın çözülmesi, yani IP adresine çevrilmesi gerekir. Bazen bu çözme işlemi başarısızlıkla sonuçlanabilir. infinite tanımı çözme başarısız olduğunda sürekli olarak denenmesini söyler.
  • nobind: VPN sunucusundan, istemciye gönderilen paketler için rastgele kaynak port numarası kullanılmasını sağlar. Bu, birden fazla VPN istemcisi aynı sunucu üzerinde çalışırken faydalıdır.
  • persist-key: Sunucu veya istemci tarafında openvpn süreci (process) yetki kaybı yaşar ya da süreç yeniden başlarsa, korunmakta olan özel anahtarlar tekrar okunamayabilir. Bu seçenek anahtarların oturum boyunca bellekte muhafaza edilmesini sağlar.
  • persist-tun: Ağ arabiriminin kapatılıp tekrar açılmadan sıfırlanmasını sağlar. Bu özellikle tünel içinden geçen DHCP istekleri için çok faydalıdır.
  • remote-cert-tls: MITM saldırılarından korunmak amacıyla sunucu sertifikasının doğrulanmasını söyler. Böylece istemci doğru sunucuya bağlandığından emin olur. Taşıma katmanının (OSI) güvenliğini sağlayan bu mekanizmada, güvenilir bir üçüncü taraf sertifika otoritesi kullanılır.
  • tls-version-min: Sunucuya bağlanırken kullanılacak en düşük TLS sürüm numarasını tanımlar. TLS, verinin taşınması sırasındaki şifreleme ve yetkilendirme süreçlerini yerine getirir. TLS aynı işi yapan SSL’in modern ve güvenli halidir.
  • verify-x509-name: Bu seçenek ile bir sunucu adı tanımlaması yapılır. Tanımlanan sunucu adı sayesinde, sadece kendisini bu isimle tanımlamış VPN sunucularına bağlanılabilir. Bu isim, sunucu tarafından rastgele olarak oluşturulur ve istemciler ile paylaşılır.
  • cipher: VPN oturumundaki veri akış kanalının şifrelenmesinde kullanılacak algoritmayı tanımlar. openvpn –show-ciphers komutu ile sunucu tarafından desteklenen şifreleme algoritmaları listelenebilir.
  • auth: Sunucuya kimlik doğrulama yapılırken kullanılacak hash (karıştırma) algoritmasını tanımlar.
  • auth-nocache: Kimlik doğrulamasının ön belleğe alınmamasını söyler. Böylece mümkün olan her durumda yeniden kimlik doğrulaması yapılır.
  • verb: Hata ayıklamaya yönelik; VPN günlüklerine (log) yansıyacak açıklamaların detay seviyesini ayarlar. Ön tanımlı değeri 3 olan ayarın olağan sınır aralığı 1 ile 5 arasındadır. 11’e kadar olan detay seviyeleri de vardır ve ileri düzey sorun giderme çalışmaları için daha çok programcı seviyesindeki kişiler için kullanışlıdır.
  • <ca>: Sertifika otoritesinin (Certificate Authority) satır içi sertifika tanımını içerir. Bu sertifika diğer sertifikaların imzalanması için kullanılır. Pivpn’inin alt yapısını oluşturan OpenVPN yüklenirken, kendi CA sertifikasını da oluşturur. CA sertifikası oluşturulurken sunucuda bu CA’ye ait bir de özel anahtar oluşturulur. İstemciler ile paylaşılan CA sertifikası (açık anahtar), istemcinin genel anahtarını şifrelemek için kullanılır. Böylece istemci doğru VPN sunucusuna bağlandığından emin olur. Bu mekanizma aynı zamanda; istemci yetkisiz bir sunucuya bağlanmaya çalıştığında, sunucu açık anahtarın şifresi çözemeyeceğinden istemci ve sunucu arasındaki güven ilişkisinin kurulmasını sağlar. Bu sertifika sunucuda ve tüm istemcilerde bulunmak zorundadır.
  • <cert>: İstemcinin genel anahtarını saklayan satır içi tanımlamadır.
  • <key>: Özel anahtarın satır içi olarak tanımlandığı etikettir. Sunucu tarafında, istemcinin genel anahtarı ile şifrelenen veri bu anahtar ile çözülür. İstemcinin özel anahtarı burada depolandığı için özenle korunmalıdır.
  • <tls-crypt>: Bu seçenek kullanılacak ek şifreleme anahtarını satır içi olarak tanımlar. Önceden paylaşılan bu anahtar, taşıma katmanının şifrelenmesini sağlayan el sıkışma prosedürüne ait paketlerin kendisinin de şifrelenmesini sağlar. Bu anahtar var olan taşıma katmanı güvenliğinin üzerine bir zırh daha ekler. Diğer faydalı yanı da, kullanılmadığı durumlarda belli bir süre açık kalarak sunucu belleğini işgal eden el sıkışma süreçlerinin, daha en baştan başarısız olmasını sağlayarak, açık kalacak muhtemel soketlerden kaynaklanabilecek bir DoS (Servis dışı bırakma) saldırısının önüne geçer.

VPN bağlantısı gerçekleştirmek

Önceki başlıkta anlatıldığı üzere oluşturduğumuz ~/ovpns/tankado.ovpn dosyası, uzak bir ağ konumundan VPN sunucusuna bağlanmak için gerekli tüm tanımlamaları içerir. VPN bağlantısının istemci bilgisayar tarafından kullanılmaya başlanabilmesi için, sunucunun ~/ovpns dizinine bir dosya olarak kaydedilen bu yapılandırma dosyasının istemciye kopyalanması gerekir. Bunun için cat komutu ile içeriği görüntüleyerek fare ile seçin ve ardından kopyalayarak yeni bir metin belgesi içerisine yapıştırın. Bu işlemi Linux ve Windows işletim sistemlerinde yeni bir metin dosyası oluşturarak yapabilirsiniz.

İçerisine yapıştırdığınız dosyanın uzantısını ovpn olmalıdır. VPN sunucusuna bağlantı kuracak bilgisayarın işletim sistemine uygun OpenVPN istemcisini kurmak için OpenVPN indirme sayfasını ziyaret edin:

https://openvpn.net/community-downloads/

Windows ortamında VPN bağlantısının kurulması

OpenVPN indirme sayfasından (openvpn.net/download-open-vpn/) Windows için OpenVPN Connect yükleyicisini indirip varsayılan ayarlarla kurun. OpenVPN istemcisinin kurulumu tamamlandıktan sonra, ağ bağlantılarına yeni sanal bir ağ arabirimi eklenir (TAP adapter) ve program çalıştırıldıktan sonra sistem tepsisinde OpenVPN simgesi belirir. Simge üzerine sağ tıklatarak import file (dosyayı içe aktar) seçeneğini seçin ve pivpn kurulumu yaptığınız Raspberry Pi bilgisayarından kopyaladığınız  .ovpn dosyasını gösterin.


Windows ortamında OpenVPN sistem tepsisi simgesi ve import seçeneği

İçe aktarma başarılı olduğunda “File imported successfully” mesajı görüntülenir. Bu işlemin ardından sistem tepsisindeki OpenVPN simgesine sağ tıklatılırsa, eklemiş olduğumuz yeni VPN yapılandırması (tankado) listelenecektir.


Windows ortamında VPN yapılandırmalarının listelenmesi

Bu istemci adının altındaki Connect seçeneğine tıklatıldığında ise bir parola diyalog penceresi gelir. Parolayı doğru girdiğiniz takdirde OpenVPN sunucusuna güvenli bir tünel açılarak sunucu ağına ve oradan da internete güvenli erişim sağlanır. Sunucu ile tünel bağlantısının kurulu olduğu zamanlarda, sistem tepsisindeki simge yeşil renkte görüntülenir. Bağlantıda sorun olduğunda ise sarı renge dönüşür. Sorunları görüntülemek için yukarıdaki ekran görüntüsünde de yer alan “View Log” seçeneğini kullanabilirsiniz. Bu dosyada, mevcut OpenVPN yapılandırması içerisindeki (tankado) verb seçeneğine uygun detay seviyesinde günlük kayıtları yer alır. Daha detaylı günlük kayıtları elde etmek için yapılandırma dosyasındaki verb değerini artırabilirsiniz.


OpenVPN bağlantısı parola diyalog penceresinin ekran görüntüsü

Bağlantı gerçekleştikten sonra Windows sanal ağ arabirimine, VPN sunucusu tarafından sıradaki IP adresi atanır (örneğin: 10.8.0.3). Bağlı olduğunuz pivpn bilgisayarında oluşturulan tun0 ağ arabiriminin adresi ise 10.8.0.1’dir ve Windows sanal ağ arabirimin ağ geçidi olarak ayarlanmıştır. Dolayısıyla Windows makinesinden internete yapılacak tüm çıkışlar 10.8.0.3 arabirimi üzerinden 10.8.0.1’e yönlendirilecektir. Bağlantı öncesindeki ve sonrasındaki internet IP adresinizi karşılaştırmak için whatismyipaddress.com sitesini kullanabilirsiniz. Tabi VPN sunucusuna yer ağınızdan değil, de uzak bir bilgisayardan bağlandığınızı varsayıyoruz.



Bağlı olan Windows OpenVPN istemcisinden, Raspberry Pi tun0 arabiriminin ping’lenmesi

Raspberry Pi OS üzerinde VPN istemcisi ile bağlanmak

Raspberry Pi OS üzerinde bir istemci olarak VPN sunucusuna bağlanmak için öncelikle openvpn paketini yükleyin.

Ardından, daha önce oluşturmuş olduğunuz istemci yapılandırmasının yer aldığı ovpn dosyasını aşağıdaki gibi config seçeneğine parametre olarak verin:

Yapılandırma dosyasında parolanız ile korunan özel anahtarı açmak için parolayı girdikten sonra openvpn istemcisi vpn sunucusuna bağlanacak ve yönlendirme tablosuna gerekli kayıtları ekleyecektir. Bundan sonra tüm internet bağlantınız VPN sunucunuz üzerinden çıkar.

VPN bağlantınızı test etmek için canihazip.com sitesini aşağıdaki gibi kullanabilirsiniz. Ekrana basılan IP adresi o anda inernette geçerli olan IP adresinizdir.

Android ortamından VPN bağlantısının kurulması

OpenVPN’in, Google Play Store üzerinden ücretsiz olarak dağıtılan OpenVPN Connect [2]adlı uygulaması ile mobil cihazınızı VPN üzerinden internete çıkartabilirsiniz. Bunun için Google Play Store’a girerek uygulamayı yükleyin.

Uygulamayı yükledikten sonra çalıştırarak OVPN Profile düğmesini tıklatın [1]. Bu ekranda daha önce oluşturduğunuz ovpn uzantılı VPN yapılandırma dosyanızı seçmek için bir dosya göz atıcısı yer alır. Daha önceden SD kartınıza ya da telefonunuzun dâhili belleğine kopyaladığınız ovpn dosyasını seçin ve import düğmesine tıklatın[2]. OpenVPN yapılandırması (profile) başarıyla içe aktarıldıktan sonra VPN profiline tanıtıcı bir isim (title) vermenizi isteyecek [3]. Dilerseniz bu ekranda özel anahtarınızı koruduğunuz parolanızı da kaydedebilirsiniz [4]. Böylece her bağlantıda ve bağlantı otomatik yenilendiğinde parola girmezsiniz. Tanıtıcı isim ve parolayı girdikten sonra Add düğesine tıklatın [5].


Android işletim sistemi üzerinde OpenVPN profili içe aktarma adımları

Artık VPN bağlantısını kullanmaya hazır sayılırız; ama bazı ince ayarları yaparak güvenliği en üst düzeye çıkartabiliriz. Bu ince ayarları iki grupta toparlarsak ilki, VPN Connect uygulamasının dâhili ayarları, diğeri de Android işletim sisteminin VPN bağlantısını kullanış şekli ile ilgili olan ayarladır. VPN Connect uygulamasının ayarlar menüsüne girerek “Reconnect on reboot” [6], “Seamless Tunnel” [7],  “Connection timeout” [8] ve “Compression” [9] seçeneklerini aşağıdaki gibi ayarlayın ve kaydedin.


OpenVPN Conncet uygulama içi ayarları

Bu seçenekler şu işe yarar:

  • Reconnect on reboot: Android işletim sistemi yeniden başladığında VPN connect uygulaması otomatik olarak VPN sunucusuna bağlanarak VPN bağlantısını etkinleştirecektir. Bu özellik VPN bağlantısının sürekli olarak etkin kalmasını garanti eder.
  • Seamless Tunnel: VPN bağlantısı durduğunda ya da yeniden bağlandığı sırada cihazın internet bağlantısı kesilecektir. Bu özellik sürekli olarak VPN bağlantısı ile internete bağlanıyor olduğunuzu garanti altına alan bir güvenlik özelliğidir.
  • Connection timeout: OpenVPN istemcisinin bağlantısı koptuğunda ne kadar süre bağlanmaya çalışacağını belirleyen süredir. Bu süreyi ne kadar uzun tanımlarsanız o kadar iyidir.
  • Compression: Full seçeneği giden ve gelen bağlantıları sıkıştırarak bant genişliğinden tasarruf etmeyi sağlar ve trafik hızını artırır.

İşletim sistemi tarafındaki ayarları gerçekleştirmek için, Android’in ayarlar menüsüne giderek sırasıyla “Ağ ve İnternet” [10] ardından “Gelişmiş” [11] ve VPN  seçeneklerine dokunun ve ardından VPN istemcisinin çark simgesine [12] dokunarak ayarları açın.

Bu ekranda yer alan “Her zaman açık VPN” [13] ve “VPN’si olmayan bağlantıları engelle” [14] anahtarlarını etkinleştirin. Bu ayarlar VPN’in işletim sistemi düzeyinde sürekli açık tutacak ve hiçbir internet bağlantısının VPN dışında internete ulaşamamasını sağlayacaktır (böylece gerçek IP adresiniz her zaman gizli kalır). VPN bağlantınız etkin olduğunda bildirim çubuğunda bir soket ve anahtar simgesi görürsünüz.

VPN sunucusunun yapılandırılması yönetilmesi

OpenVPN sunucusunu systemctl aracı ile aşağıdaki gibi durdurup başlatabilirsiniz. Pivpn’in  altyapısını oluşturan OpenVPN ’in ana yapılandırma dosyası olan /etc/openvpn/server.conf ’daki değişiklikleri uygulamak için OpenVPN servisini yeniden başlatmak gerekir. OpenVPN varsayılan olarak günlük kayıtlarını /var/log/openvpn.log dosyasında tutar.

OpenVPN sunucusunun yapılandırma ayarlarının tutulduğu server.conf’un içeriği istemci yapılandırmasına benzer ve aşağıdadır:

Yukarıdaki yapılandırma dosyasını oluşturan ve daha önce açıklanmayan seçeneklerin görevleri şunlardır:

  • port: OpenVPN’in VPN hizmetini hangi port üzerinden vereceğini tanımlar.
  • proto: VPN bağlantısının hengi protokol (TCP/UDP) kullanılarak gerçekleştireceğini belirler.
  • server: Sunucuya bağlanacak istemciler için bir IP havuzu tanımlar. Örneğin 10.8.0.0 ağ adresi ve 255.255.255.0 ağ maskesi ile tanımlanan bir ağda istemcilere 10.8.0.1 ile 10.8.0.254 aralığındaki IP adresleri tahsis edilir.
  • topology: VPN ağını subnet, net30 ve p2p seçenekleri ile sırasıyla broadcast tabanlı geleneksel IP tabanlı ağ olarak, sürüm 2.0.9 ve öncesi OpenVPN Windos istemcileri için 30’bitlik bir ağ topolojisi (3 IP adresi atamasını destekler) olarak ve eşler arası (peer-to-perr) VPN ağı kurmak için ayarlar .
  • push dhcp-option: Sunucuya bağlanacak istemcilere DHCP yapılandırması tanımlamak için kullanılır. dhcp-option DNS seçeneği, otomatik bir IP adresi atanacak olan istemcilere kullanacakları bir DNS sunucu adresi bildirir.
  • push block-outside-dns: istemcilerin dhcp-option DNS ile belirtilenler dışındaki DNS sunuculara UDP 53 ve TCP 53 üzerinden erişimlerini yasaklar. Tünel bağlantısı içinde sadece belirtilen DNS sunuculara olan sorgulara izin verilir.
  • user: Sunucuda çalışmakta olan openvpn prosesi (servis) için bir sahip kullanıcı tanımlar. Nobody kullanıcısı son derece yetkisiz sembolik bir kullanıcı hesabını ifade eder. Bu kullanıcı sayesinde OpenVPN güvenlik açıkları kullanılarak yetki yükseltme yapılmasının önüne geçilebilir.
  • group: Sunucuda çalışmakta olan openvpn prosesi (servis) için bir sahip grubu tanımlar.
  • crl-verify: Geçersiz kabul edilecek istemci sertifikalarının listesini tutmak için kullanılır.
  • ca, cert, key: ca sertifikası tüm istemcilerde ve sunucuda bulunmak zorundadır ve VPN istemcisinin eklenmesinin anlatıldığı başlıkta detaylıca ele alınmıştır. Cert sertifikası, VPN sunucunun sertifikasıdır ve sadece sunucuda bulunur. Key dosyası ise diğer tüm sertifikaların imzalanmasında kullanılır ve sunucunun özel anahtarını temsil eder. Bu nedenle o da sadece sunucuda veya güvenli bir ortamda bulunmalıdır.
  • dh: pem dosyası biçiminde Diffie-Hellman seçeneklerini saklayan dosyanın yolunu ayarlar. TLS kontrol kanalı oluşturulurken OpenVPN’i sunucu rolüne konuşlandıran tls-server seçeneği ile birlikte kullanılır. Diffie-Hellman ortak gizli anahtarın güvensiz bir iletişim ortamı üzerinden güvenli şekilde paylaşılmasını sağlayan bir yöntem sağlar.
  • redirect-gateway: VPN sunucuya bağlanan istemciler internete çıkmaları gerektiğinde redirect-gateway ile belirtilen yönlendiriciye yönlendirirler. Eğer bu satırı siler ya da satırın başına # işaretini koyarak etkisiz hale getirirseniz, VPN ağına dâhil olan istemciler diğer istemciler ile konuşabilir, ağ kaynaklarını kullanabilir fakat internete çıkamazlar.
  • client-to-client: OpenVPN tek bir tun veya tap ağ arabirimi ile birçok istemciyi aynı ağda buluşturabilir. Bu yönüyle etkili bir yönlendiricidir (router). Bu seçenek ile istemcilerin birbirlerini görebilmelerine, başka bir deyişle aralarında paket yönlendirmesi yapabilmelerine izin verilir. Normalde istemciler sadece sunucuyu görebilir ve iletişim kurabilirler.
  • status: VPN bağlantıları hakkındaki durum bilgilerinin kaydedileceği dosyayı tanımlar. İkinci seçeneği ise bu dosyanın ne kadar süre aralıklarla güncelleneceğini saniye cinsinden tanımlar.
  • status-version: status seçeneği ile tanımlanan durum günlüğü dosyasının biçimini belirler. 1 değeri, istemcinin genel adı, gerçek IP adresi, alınan ve gönderilen veri miktarı ve ne kadar süredir bağlı olduğu bilgilerinin yer almasını sağlar. 2 değeri, 1’dekine ek olarak istemcinin yerel IP adresi, kullanıcı adı, kullanıcı kimliği ve eş kimliği alanlarının da yer almasını sağlar. 3 değeri, 2’de yer alan alanların aynısını virgülle ayırmak yerine tab ile ayırarak listeler.
  • keepalive: İstemci ile olan bağlantının varlığının belli zaman aralıklarıyla kontrol edilmesini sağlar. Bağlantının varlığı ping paketlerinin belli zaman aralıklarıyla gönderilip cevap alınması ile teyit edilir. Bu seçeneğin ilk argümanı süre ikinci argümanı da zaman aşımıdır. Süre ile belirtilen zaman aralıklarında ping paketi gönderilir ve zaman aşımı kadar sürede cevap gelmesi beklenir. Eğer cevap gelmezse istemcinin bağlantısı kesilir. Zaman aşımı değeri sunucu tarafında gerçekte iki katı olarak uygulanır, bunun nedeni istemci tarafından zaman aşımının fark edildiğinden emin olmaktır.
  • syslog: OpenVPN günlük kayıtlarının syslog isimli sistem günlük kayıtçısı tarafından tutulacağını söyler.

Aktif VPN bağlantılarının listelenmesi

Pivpn kurulumunu yaptığınız Raspberry Pi bilgisayarının terminaline aşağıdaki komutu yazarak aktif VPN bağlantılarının detaylarını listeletebilirsiniz.

-c seçeneği bağlı istemcileri (connected clients) listeler. İstemciler hakkında listelenen bilgiler şunlardır:

  • Name: bağlanan istemcinin profil adı.
  • Remote IP: Bağlantıyı kuran istemcinin IP adresi ve istemci soketinin kaynak port adresi.
  • Virtual IP: Bağlantıyı kuran istemciye atanan dinamik IP adresi. İstemci bağlandığı sunucunun ağında bu IP adresi ile temsil olunur.
  • Received: İstemciden alına veri miktarı.
  • Sent: İstemciye gönderilen veri miktarı.
  • Connected Since: İstemcinin ne zamandan beri bağlı olduğu.

pivpn’in –c seçeneği bir betik çalıştırarak /var/log/openvpn-status.log dosyasının içeriğini okur ve yeniden biçimlendirerek ekrana basar. openvpn-status.log dosyasının nasıl kullanılacağı ise /etc/openvpn/server.conf dosyasında –status-version seçeneği ile tanımlanmıştır.

Pivpn’in sunucu yapılandırma dosyası olan /etc/openvpn/server.conf  dosyasındaki keepalive seçeneğinin ping ve zaman aşımı değerleri sırasıyla 1800 ve 3600 saniye olarak tanımlanmıştır. Yani, UDP üzerinden bağlanan bir istemcinin bağlantısı kesildiğinde en az 3600 saniye (yani 1 saat) sonra –c listesinden çıkacaktır. UDP protokolü bağlantı yönelimli bir protokol değildir. Yani, UDP kullanılarak istemci ile sunucu arasında sürekli aktif kalan bir bağlantı yoktur, sadece iletişim ihtiyacı olduğunda veri alışverişi yapılır. Bu nedenle varsayılan olarak UDP protokolünü kullanan pivpn kurulumunun zaman aşımı değerleri yüksek tutulmuştur. Dilerseniz bu değerleri ufaltarak –c (istemci) çıktısının daha sık güncellenmesini sağlayabilirsiniz. Bunu keepalive seçeneğini değiştirmeden yapmak isterseniz server.conf dosyasındaki proto seçeneğini TCP olarak ayarlayabilirsiniz, böylece bağlı istemciler listesi anında güncellenir. Bu durumda OpenVPN sunucusu, veri taşımak için TCP protokolünü kullanacağından, fazladan eklenecek TCP başlık bilgileri nedeniyle bağlantı hızı ve başarım hatırı sayılır miktarda düşer.

Geçerli istemci sertifikalarının listelenmesi

Pivpn add komutu ile oluşturulan istemci yapılandırmaları, –l (list) seçeneği ile listelenebilir. Listede oluşturulan istemcilerin adları ve sertifikalarının geçerlilik durumları listelenir.

Oluşturulan listedeki ilk satır VPN sunucusunun geçerlilik durumu ve adıdır. Revoked ile listelenen istemciler geçersizdir ve VPN sunucusuna bağlanamazlar. Valid ile etiketlenenler ise geçerli istemci ve yapılandırmalarını ifade eder. Esasında bu çıktının kaynağını /etc/openvpn/easy-rsa/pki/index.txt dosyası oluşturur. –l seçeneği sadece, bu kaynağı yeniden biçimlendirerek görüntüler.

Bir istemcinin sertifikasını iptal etmek

Pivpn aracının revoke seçeneği istemci sertifikasını sunucu tarafında geçersiz kılar ve istemci bir daha VPN bağlantısı başlatamaz. Aşağıdaki örnekte tankado istemcisinin sertifikası devre dışı bırakılmıştır.

-r (revoke) seçeneği /etc/openvpn/easy-rsa/pki/index.txt dosyasında listelenen tankado istemcisinin sertifikasını iptal edildi olarak işaretler (R) ve /etc/openvpn/easy-rsa/pki/crl.pem konumundaki sertifika iptal listesini günceller. Aynı zamanda pivpn’in ~/ovpns dizininde oluşturduğu istemci yapılandırma dosyasını da siler. Tankado istemcisine özel olarak oluşturulan sertifikalar yok edildiği için, sunucu tarafında aynı istemci adı ve parolası ile yeni bir istemci oluşturulsa dâhi istemci tarafındaki eski yapılandırma ile bir daha bağlantı gerçekleştirilemez. Çünkü her ne kadar istemci adı ve parolası aynı olsa da yeni oluşturulan özel anahtar ve dolayısıyla istemci sertifikası farklı olacaktır. Aynı istemci adı ile yeni bir yapılandırma oluşturulduğunda pivpn listesi şu şekilde gözükür:

İstemcilere sabit IP ataması yapmak

VPN üzerinden bağlanan bazı istemcilerinizin her seferinde sabit IP adresleri almasını istiyorsanız,  istemcinize özel yapılandırma tanımlayabilirsiniz. OpenVPN’in yapılandırma dosyası olan /etc/openvpn/server.conf’da bunun için client-config-dir seçeneği kullanılır. Bu seçenek ile istemcilere özel yapılandırmaların yer aldığı bir dizinin yolu tanımlanır. Örneğin ccd (client config dir) adındaki dizini aşağıdaki oluşturarak erişim izinlerini tanımlayım:

Daha sonra server.conf yapılandırma dosyasını nano ile açarak istemci yapılandırmalarının barındırıldığı dizini (/etc/openvpn/ccd) ve istemcilere tahsis edeceğimiz IP adreslerinin saklanacağı dosyanın yolunu tanımlayalım:

Bu örnekteki ipp.txt dosyası istemcilere sabit olarak atanacak olan IP adreslerini kaydedeceğimiz dosyadır; fakat bu dosya istemcilere IP ataması yapmaz, sadece dinamik yapılandırma ile bağlanacak istemcilerin, sabit adrese sahip bir istemci ile çakışma yaşamasını önler. Şimdi, openvpn add komutu ile daha önce tanımladığımız tankado adlı istemcinin, VPN ağına her bağlandığında aynı IP adresine sahip olmasını sağlayalım. Bunun için önceki adımda oluşturduğumuz /etc/openvpn/ccd dizini içerisinde istemci adıyla (tankado) bir metin dosyası oluşturalım. Bunun için nano editörünü aşağıdaki gibi çalıştırabilirsiniz. Burada dikkat etmeniz gereken nokta, dosyanın istemci adıyla aynı olması gerektiğidir.

Yukarıdaki yapılandırmanın ilk satırında yer alan ifconfig-push direktifi ile tankado adlı istemciye 10.8.0.10 adresinin atanması sağlandı ve ağ geçidi olarak OpenVPN sunucumuzun tünel arabirimi olan tun0’ı yani 10.8.0.1 adresli arabirimi kullanmasını belirtmiş olduk.

İkinci satırda ise, istemcinin 10.8.0.0/24 ağını (10.8.0.0 255.255.255.0) hedef alan tüm paketlerinin 10.8.0.1’e yönlendirilmesini sağladık. Bundan sonra OpenVPN sunucusunu yeniden başlatarak yapılan değişikliklerin geçerli olmasını sağlayabilirsiniz.

OpenVPN’in çevrim içi dokümantasyonu oldukça faydalı bilgiler içerir[3]. Mümkün olan tüm yapılandırma seçenekleri hakkında detaylı bilgi sahibi olmak sorunları hızlı şekilde teşhis etmek ve çözmek için faydalı olacaktır.

Günlük kayıtlarını incelemek ve hata ayıklamak

OpenVPN sunucusunun bağlantı sorunlarını ya da çalışması sırasındaki olup bitenleri /var/log/openvpn.log dosyasından takip edebilirsiniz. /etc/openvpn/server.conf dosyasındaki verb seçeneği, bu log dosyasının ne kadar detaylı olacağını belirler. Verb seçeneğini 1 ile 11 arasında bir değere ayarlayabilirsiniz. 5 ile 11 arasındaki değerler oldukça detaylı bilgi sunar. verb’u ayarladıktan sonra sunucuyu yeniden başlatın ve tail aracı ile aşağıdaki gibi izlemeye alın. Bağlantı sorunları ve diğer sorunlar log dosyasına yansıyacaktır.

Aşağıdaki çıktı openvpn servisi yeniden başlatıldıktan hemen sonra alınmıştır ve server.conf dosyasındaki –server seçeneğinin yanlış yapılandırıldığını söylemektedir. Bu durumda -server seçeneğine geçilen değerlerin kontrol edilmesi gerekir.

VPN sunucusunu kaldırmak

Pivpn’i sistemden kaldırmak için basitçe –u seçeneğini verebilirsiniz:

pivpn sistemden kaldırıldıktan sonra, pivpn ile beraber yüklenen git, iptables-persistent ve dnsutils gibi araçları da kaldırmak isteyip istemediğiniz ayrıyeten sorulacaktır. Bu araçlara ihtiyacınız varsa sisteminizde bulundurmaya devam edebilirsiniz. Aksi takdirde y (yes) cevabını vererek kaldırmanızı tavsiye ederim. Kaldırma işleminin tamamlanması için Raspberry Pi yeniden başlatılacaktır.


[1] pivpn – http://www.pivpn.io

[2] OpenVPN Connect Android Uygulaması: https://play.google.com/store/apps/details?id=net.openvpn.openvpn

[3] OpenVPN çevrim içi yardım dokümanı – http://tiny.cc/open-vpn-docs

Yazar: Özgür Koca

Yazar - Tankado.com

Bir yanıt yazın

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.