Uzak ofisler arasında güvenli iletişim kurmak, çalışanların evden şirket ağına erişmesi veya bulut sunucularına güvenli tünel açmak gibi ihtiyaçlar her geçen gün artıyor. OpenVPN, bu ihtiyaçları karşılamak için onlarca yıldır kullanılan, battle-tested bir çözüm. Açık kaynaklı olması, geniş platform desteği ve sağlam kriptografi altyapısıyla kurumsal ortamlarda da bireysel kullanımda da tercih edilen bir VPN çözümü olmaya devam ediyor. Bu yazıda sıfırdan bir OpenVPN sunucusu kuracak, PKI altyapısını oluşturacak ve gerçek dünya senaryolarına uygun yapılandırmaları adım adım ele alacağız.
OpenVPN Nedir ve Nasıl Çalışır
OpenVPN, TLS/SSL protokolü üzerinden şifrelenmiş tüneller oluşturan bir VPN yazılımıdır. Çalışma modeline göre iki temel seçenek sunar: tun (routing/katman 3) ve tap (bridging/katman 2). Çoğu senaryoda tun modu yeterlidir ve daha verimlidir.
Bağlantı kurulurken şu süreç işler:
- İstemci, sunucuya TCP veya UDP üzerinden bağlanır (varsayılan port 1194/UDP)
- Sunucu ve istemci, TLS el sıkışması yaparak birbirini doğrular
- Sertifika tabanlı kimlik doğrulama tamamlandıktan sonra sanal ağ arayüzü (tun0) oluşturulur
- Trafik bu tünel üzerinden yönlendirilir
PKI (Public Key Infrastructure) altyapısı, OpenVPN’in güvenlik temelini oluşturur. Bir CA (Certificate Authority), sunucu sertifikası ve istemci sertifikaları bu zincirin parçalarıdır.
Gereksinimler ve Ortam Hazırlığı
Bu yazıda Ubuntu 22.04 LTS üzerinde kurulum yapacağız. Sunucunun şu özelliklere sahip olması yeterli:
- 1 vCPU, 1 GB RAM (küçük ortamlar için)
- Statik IP adresi veya DDNS
- Root veya sudo yetkisi
- 1194/UDP portu açık (güvenlik duvarında)
Önce sistemi güncelleyelim ve gerekli paketleri yükleyelim:
sudo apt update && sudo apt upgrade -y
sudo apt install openvpn easy-rsa -y
Easy-RSA, PKI altyapısını yönetmek için kullanacağımız araç. OpenVPN paketinin içinde de basit bir PKI sistemi var ama Easy-RSA çok daha esnek ve yönetilebilir.
PKI Altyapısının Kurulumu
PKI kurulumu için ayrı bir dizin oluşturalım. Bu dizini production ortamında sunucudan bağımsız, güvenli bir yerde tutmanızı tavsiye ederim. Hatta CA’yı ayrı, internet bağlantısı olmayan bir makinede yönetmek en güvenli yaklaşım.
mkdir ~/openvpn-ca
cp -r /usr/share/easy-rsa/* ~/openvpn-ca/
cd ~/openvpn-ca
Şimdi vars dosyasını oluşturarak PKI parametrelerini tanımlayalım:
cat > ~/openvpn-ca/vars << 'EOF'
set_var EASYRSA_REQ_COUNTRY "TR"
set_var EASYRSA_REQ_PROVINCE "Istanbul"
set_var EASYRSA_REQ_CITY "Istanbul"
set_var EASYRSA_REQ_ORG "SirketAdi"
set_var EASYRSA_REQ_EMAIL "[email protected]"
set_var EASYRSA_REQ_OU "IT Department"
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"
set_var EASYRSA_CA_EXPIRE 3650
set_var EASYRSA_CERT_EXPIRE 825
EOF
EASYRSA_ALGO: Eliptik eğri kriptografi kullanır, RSA’ya göre daha hızlı ve aynı güvenlik seviyesi için daha kısa anahtar uzunluğu gerektirir. EASYRSA_CERT_EXPIRE: Sertifika geçerlilik süresi gün cinsinden. 825 gün Apple ekosistemiyle uyumluluk için iyi bir değer. EASYRSA_CA_EXPIRE: CA sertifikasının geçerlilik süresi, 10 yıl olarak ayarlandı.
PKI’yi başlatalım ve CA sertifikasını oluşturalım:
cd ~/openvpn-ca
./easyrsa init-pki
./easyrsa build-ca nopass
nopass parametresi CA anahtarının parola koruması olmadan oluşturulmasını sağlar. Production ortamında bu parametreyi kaldırmanızı öneririm; her CA işleminde parola girmeniz gerekir ama güvenlik açısından çok daha sağlamlıdır.
Sunucu Sertifikası ve Anahtarlarının Oluşturulması
cd ~/openvpn-ca
./easyrsa gen-req vpn-server nopass
./easyrsa sign-req server vpn-server
İkinci komut çalıştırıldığında “Confirm request details” onayı isteyecek, yes yazarak devam edin.
Diffie-Hellman parametrelerini ve TLS kimlik doğrulama anahtarını oluşturalım. DH parametreleri yerine daha modern bir yaklaşım olan TLS 1.3 ve ECDH kullanacağız:
# TLS Auth anahtarı (replay attack koruması için)
sudo openvpn --genkey secret /etc/openvpn/server/ta.key
# Gerekli dosyaları OpenVPN dizinine kopyalayalım
sudo cp ~/openvpn-ca/pki/ca.crt /etc/openvpn/server/
sudo cp ~/openvpn-ca/pki/issued/vpn-server.crt /etc/openvpn/server/
sudo cp ~/openvpn-ca/pki/private/vpn-server.key /etc/openvpn/server/
Sunucu Yapılandırması
Ana yapılandırma dosyasını oluşturalım. Gerçek dünya ortamına uygun, yorumlu bir konfigurasyon hazırlıyorum:
sudo cat > /etc/openvpn/server/server.conf << 'EOF'
# Temel Sunucu Ayarları
port 1194
proto udp
dev tun
# Sertifika ve Anahtar Dosyaları
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/vpn-server.crt
key /etc/openvpn/server/vpn-server.key
tls-auth /etc/openvpn/server/ta.key 0
# Ağ Ayarları
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /var/log/openvpn/ipp.txt
# İstemcilere varsayılan rota push et (tüm trafiği tünelden geçirir)
# push "redirect-gateway def1 bypass-dhcp"
# DNS push et
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
# Güvenlik Ayarları
tls-version-min 1.2
tls-cipher TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384
cipher AES-256-GCM
auth SHA512
tls-server
# Bağlantı Kararlılığı
keepalive 10 120
compress lz4-v2
push "compress lz4-v2"
# Ayrıcalık Düşürme (Güvenlik)
user nobody
group nogroup
persist-key
persist-tun
# Log Ayarları
status /var/log/openvpn/status.log
log-append /var/log/openvpn/openvpn.log
verb 3
mute 20
# İstemciler arası iletişim (ihtiyaca göre açın)
# client-to-client
EOF
Log dizinini oluşturalım:
sudo mkdir -p /var/log/openvpn
IP Yönlendirme ve Güvenlik Duvarı Ayarları
VPN trafiğinin sunucudan internete çıkabilmesi için IP forwarding aktif edilmeli ve iptables kuralları eklenmeli:
# IP forwarding aktif et
sudo sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf
sudo sysctl -p
# Hangi arayüzün internet bağlantısı olduğunu bul
ip route | grep default
Çıktı genellikle eth0 veya ens3 şeklinde bir arayüz gösterecek. O arayüz adını aşağıdaki kurallarda kullanın:
# NAT kuralı ekle (eth0 yerine kendi arayüz adınızı yazın)
sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
sudo iptables -A INPUT -i tun0 -j ACCEPT
sudo iptables -A FORWARD -i tun0 -j ACCEPT
sudo iptables -A FORWARD -i tun0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT
# Kuralları kalıcı hale getir
sudo apt install iptables-persistent -y
sudo netfilter-persistent save
UFW kullanıyorsanız alternatif olarak:
sudo ufw allow 1194/udp
sudo ufw allow OpenSSH
UFW ile MASQUERADE kuralı için /etc/ufw/before.rules dosyasını düzenlemeniz gerekir ama iptables doğrudan kullanmak bu senaryoda daha az karmaşık.
Servisi Başlatma
sudo systemctl enable openvpn-server@server
sudo systemctl start openvpn-server@server
sudo systemctl status openvpn-server@server
Servis active (running) durumundaysa kurulum başarılı. tun0 arayüzünün oluşturulduğunu doğrulayalım:
ip addr show tun0
İstemci Sertifikası Oluşturma
Her VPN kullanıcısı için ayrı sertifika oluşturmanız gerekiyor. Bu hem güvenlik açısından doğru yaklaşım hem de bir kullanıcının erişimini iptal etmenizi kolaylaştırıyor.
cd ~/openvpn-ca
./easyrsa gen-req ahmet-laptop nopass
./easyrsa sign-req client ahmet-laptop
Sertifika dosyalarını topladıktan sonra istemciye bir .ovpn profil dosyası oluşturuyoruz. Bu dosya her şeyi tek bir paket halinde barındırır ve istemciye dağıtımı kolaylaştırır:
#!/bin/bash
# make_client_config.sh
CLIENT=$1
CA_DIR=~/openvpn-ca
OUTPUT_DIR=~/client-configs
mkdir -p $OUTPUT_DIR
cat > $OUTPUT_DIR/$CLIENT.ovpn << EOF
client
dev tun
proto udp
remote SUNUCU_IP_ADRESI 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
tls-version-min 1.2
cipher AES-256-GCM
auth SHA512
compress lz4-v2
verb 3
key-direction 1
<ca>
$(cat $CA_DIR/pki/ca.crt)
</ca>
<cert>
$(cat $CA_DIR/pki/issued/$CLIENT.crt)
</cert>
<key>
$(cat $CA_DIR/pki/private/$CLIENT.key)
</key>
<tls-auth>
$(cat /etc/openvpn/server/ta.key)
</tls-auth>
EOF
echo "$CLIENT.ovpn dosyasi olusturuldu: $OUTPUT_DIR/$CLIENT.ovpn"
chmod +x make_client_config.sh
./make_client_config.sh ahmet-laptop
Oluşan .ovpn dosyasını güvenli bir kanal üzerinden (SFTP, şifreli e-posta vb.) kullanıcıya iletebilirsiniz.
Gerçek Dünya Senaryoları
Senaryo 1: Uzak Çalışanlar İçin Split Tunneling
Tüm trafiği VPN üzerinden geçirmek hem bant genişliğinizi yorar hem de kullanıcıların YouTube izlerken yaşadığı hız düşüşü nedeniyle şikayetlere yol açar. Split tunneling ile sadece şirket ağına yönelik trafiği tünelden geçirebilirsiniz.
Sunucu yapılandırmasında redirect-gateway satırını yorum satırı bırakın ve bunun yerine sadece iç ağ yönlendirmesini push edin:
# server.conf içinde
# Sadece şirket iç ağını (192.168.1.0/24) tünelden geçir
push "route 192.168.1.0 255.255.255.0"
push "route 10.10.0.0 255.255.0.0"
# Genel internet trafiği istemcinin normal bağlantısından gider
Senaryo 2: İstemciye Sabit IP Atama
Belirli bir kullanıcının her bağlandığında aynı VPN IP’sini almasını istiyorsanız, istemci yapılandırma dizini kullanın:
sudo mkdir -p /etc/openvpn/server/ccd
# ahmet kullanıcısına her zaman 10.8.0.10 IP'si verilecek
sudo cat > /etc/openvpn/server/ccd/ahmet-laptop << 'EOF'
ifconfig-push 10.8.0.10 255.255.255.0
EOF
Sunucu yapılandırmasına da şu satırı eklemeniz gerekiyor:
# server.conf içine ekle
client-config-dir /etc/openvpn/server/ccd
Bu yaklaşım özellikle firewall kurallarında VPN kullanıcısına göre farklı erişim seviyeleri tanımlamak istediğinizde çok işe yarıyor. Muhasebe departmanının sadece muhasebe sunucusuna, IT ekibinin tüm ağa erişebilmesi gibi senaryolarda sabit IP ataması kaçınılmaz oluyor.
Senaryo 3: Sertifika İptal Etme
Bir çalışan şirketten ayrıldığında veya cihazı çalındığında, sertifikasını hemen iptal etmeniz gerekir:
cd ~/openvpn-ca
./easyrsa revoke ahmet-laptop
./easyrsa gen-crl
# CRL dosyasını OpenVPN dizinine kopyala
sudo cp ~/openvpn-ca/pki/crl.pem /etc/openvpn/server/crl.pem
sudo chmod 644 /etc/openvpn/server/crl.pem
Sunucu yapılandırmasına CRL kontrolünü ekleyin:
# server.conf içine ekle
crl-verify /etc/openvpn/server/crl.pem
Servisi yeniden başlattıktan sonra iptal edilen sertifikayla bağlantı kurmak artık mümkün olmayacak.
İzleme ve Sorun Giderme
Aktif bağlantıları görmek için status dosyasını inceleyin:
cat /var/log/openvpn/status.log
Gerçek zamanlı log takibi:
sudo tail -f /var/log/openvpn/openvpn.log
Bağlantı sorunlarında log seviyesini artırabilirsiniz. server.conf içinde verb 3 yerine verb 6 veya verb 9 yazarak çok daha ayrıntılı çıktı alırsınız. Sorun çözüldükten sonra geri düşürmeyi unutmayın, disk dolarsa başka sorunlar çıkar.
Yaygın sorunlar ve çözümleri:
- TLS handshake hatası: Sunucu ve istemci arasındaki saat farkı 5 dakikayı aşmamalı.
ntpdateveyachronyile senkronizasyonu kontrol edin. - ta.key uyuşmazlığı:
key-direction 0sunucu,key-direction 1istemci için kullanılır. Karıştırmayın. - route push çalışmıyor: İstemci OS’unda yönetici/root yetkisiyle çalıştığınızdan emin olun.
- DNS sızıntısı: Windows istemcilerde
block-outside-dnsdirektifini istemci yapılandırmasına ekleyin.
Bağlantı istatistiklerini kontrol etmek için:
# Aktif tun arayüzü istatistikleri
ip -s link show tun0
# Bağlantı sayısı
grep "^CLIENT_LIST" /var/log/openvpn/status.log | wc -l
Güvenlik Sertleştirme Önerileri
Varsayılan kurulumun ötesine geçmek için dikkat etmeniz gereken noktalar:
- nobody/nogroup ile çalıştırma: Yapılandırmaya eklediğimiz
user nobodyvegroup nogroupdirektifleri, OpenVPN sürecinin root yetkisini düşürmesini sağlar. Bu sayede potansiyel bir açık exploit edilse bile saldırgan sistem üzerinde sınırlı yetkiye sahip olur.
- tls-auth yerine tls-crypt: Modern kurulumlar için
tls-authyerinetls-cryptkullanabilirsiniz. Bu direktif hem kimlik doğrulama hem şifreleme sağlar ve sunucuya anonim bağlantı denemelerini tamamen engeller.
- Port değiştirme ve obfuscation: Varsayılan 1194 portunu değiştirmek basit port taramalarına karşı koruma sağlar. Daha ileri gitmek istiyorsanız OpenVPN trafiğini HTTPS gibi gösterecek obfuscation araçlarına (obfs4 gibi) bakabilirsiniz.
- Sertifika geçerlilik sürelerini takip edin: Sertifikalar süresi geçtiğinde bağlantılar aniden kesilir. Bunu otomatize etmek için cronjob yazabilirsiniz.
# Süresi 30 gün içinde dolacak sertifikaları listele
cd ~/openvpn-ca
for cert in pki/issued/*.crt; do
expiry=$(openssl x509 -enddate -noout -in "$cert" | cut -d= -f2)
expiry_epoch=$(date -d "$expiry" +%s)
now_epoch=$(date +%s)
days_left=$(( (expiry_epoch - now_epoch) / 86400 ))
if [ $days_left -lt 30 ]; then
echo "UYARI: $cert - $days_left gun kaldi"
fi
done
- Fail2ban entegrasyonu: Brute force denemelerine karşı OpenVPN loglarını fail2ban ile izleyebilirsiniz. Bu özellikle username/password authentication eklediğinizde önem kazanıyor.
Performans Optimizasyonu
Yüksek kullanıcı sayısı veya büyük veri transferlerinde performans optimizasyonu gerekebilir:
- UDP tercih edin: TCP yerine UDP kullanmak her zaman daha performanslı. TCP üzerinde TCP (TCP-in-TCP problemi) bağlantı sorunlarına yol açabilir.
- MTU ayarı: Paket fragmentasyon sorunlarında
tun-mtu 1500vemssfix 1450değerlerini test edin. - Sıkıştırma: Zaten şifrelenmiş trafikte sıkıştırma pek işe yaramaz, hatta CPU yükünü artırır. Dosya transferi ağırlıklı bir VPN’de lz4 hız avantajı sağlayabilir.
- Multi-threading: OpenVPN tek thread ile çalışır. Çok sayıda kullanıcı için birden fazla OpenVPN instance farklı portlarda çalıştırıp load balancer önüne koyabilirsiniz.
Sonuç
OpenVPN, doğru yapılandırıldığında son derece güvenilir ve esnek bir VPN çözümü sunuyor. Bu yazıda anlattıklarımızı özetlersek: Easy-RSA ile sağlam bir PKI altyapısı kurduk, sunucu ve istemci sertifikaları oluşturduk, güvenlik açısından sertleştirilmiş bir sunucu yapılandırması hazırladık ve gerçek dünya senaryolarına uygun split tunneling ile sabit IP atama örneklerini ele aldık.
Production ortama almadan önce şu kontrol listesini geçmenizi tavsiye ederim: CA anahtarını parola ile koruyun ve güvenli bir yerde saklayın, sertifika süre takibini otomatize edin, log rotasyonunu yapılandırın, CRL mekanizmasının çalıştığını test edin ve düzenli yedek alın.
WireGuard gibi daha modern alternatiflerin popülaritesi artıyor olsa da OpenVPN’in geniş platform desteği, olgun ekosistemi ve kapsamlı yapılandırma seçenekleri onu hala geçerli ve güçlü bir tercih yapıyor. Özellikle legacy istemcileri desteklemeniz gerekiyorsa veya fine-grained erişim kontrolüne ihtiyacınız varsa OpenVPN doğru seçim olmaya devam ediyor.