Dinamik IP adresleri ve DNS yönetimi, OpenVPN kurulumlarında en sık karşılaşılan sorunların başında gelir. Sabit IP’niz yoksa sunucunuz her yeniden başladığında veya ISP bağlantısı kesildiğinde farklı bir IP alabilir ve istemcileriniz bağlanamaz hale gelir. Bu yazıda hem dinamik IP sorununu hem de OpenVPN üzerinde DNS yapılandırmasını gerçek dünya senaryolarıyla ele alacağız.
Dinamik IP Problemini Anlamak
Diyelim ki evde ya da küçük ofiste bir OpenVPN sunucusu kuruyorsunuz. ISP’niz size statik IP sağlamıyor, dolayısıyla her gün veya haftada bir IP adresiniz değişiyor. İstemciler ise sunucuya IP adresiyle bağlandığı için her değişiklikte yapılandırmayı güncellemeniz gerekiyor. Bu durum özellikle 20-30 istemcisi olan ortamlarda kabus haline gelir.
Çözüm: Dinamik DNS (DDNS). Bir DDNS sağlayıcısı üzerinden aldığınız sabit hostname’i, değişen IP adresinize otomatik olarak güncelliyorsunuz. İstemciler IP yerine bu hostname’e bağlanıyor.
Dinamik DNS Sağlayıcısı Seçimi ve Kurulumu
Ücretsiz ve güvenilir seçenekler arasında Duck DNS, No-IP ve Dynu sayılabilir. Ben genellikle Duck DNS tercih ediyorum, hem ücretsiz hem de API kullanımı son derece basit.
Duck DNS Kurulumu
Önce Duck DNS sitesine kayıt olup bir subdomain alıyorsunuz. Sonra sunucunuza şu scripti ekliyorsunuz:
mkdir -p /opt/duckdns
cat > /opt/duckdns/duck.sh << 'EOF'
#!/bin/bash
DOMAIN="sunucunuz"
TOKEN="duck-dns-token-buraya"
curl -s "https://www.duckdns.org/update?domains=${DOMAIN}&token=${TOKEN}&ip="
-o /opt/duckdns/duck.log
echo "$(date): IP guncellendi" >> /opt/duckdns/update.log
EOF
chmod +x /opt/duckdns/duck.sh
Bu scripti cron ile her 5 dakikada bir çalıştırıyoruz:
# Crontab'a ekle
crontab -e
# Şu satırı ekle
*/5 * * * * /opt/duckdns/duck.sh >/dev/null 2>&1
Test etmek için scripti manuel çalıştırın:
/opt/duckdns/duck.sh
cat /opt/duckdns/duck.log
# Başarılıysa "OK" yazısını görmelisiniz
No-IP ile Alternatif Yaklaşım
No-IP kullanıyorsanız resmi istemcilerini yükleyebilirsiniz:
cd /usr/local/src
wget http://www.no-ip.com/client/linux/noip-duc-linux.tar.gz
tar xf noip-duc-linux.tar.gz
cd noip-*
make install
# Servis olarak başlatma
systemctl enable noip2
systemctl start noip2
OpenVPN Sunucu Yapılandırması
DDNS kurulumundan sonra asıl işe geliyoruz. OpenVPN sunucusu kurulumunu hızlıca geçelim ve dinamik IP senaryosuna özgü ayarlara odaklanalım.
Temel Sunucu Kurulumu
# Ubuntu/Debian
apt update && apt install -y openvpn easy-rsa
# CentOS/RHEL
yum install -y epel-release
yum install -y openvpn easy-rsa
PKI altyapısını kuruyoruz:
make-cadir /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa
# vars dosyasını düzenle
cat > 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 "Sirketiniz"
set_var EASYRSA_REQ_EMAIL "[email protected]"
set_var EASYRSA_REQ_OU "IT"
set_var EASYRSA_KEY_SIZE 2048
set_var EASYRSA_CA_EXPIRE 3650
set_var EASYRSA_CERT_EXPIRE 825
EOF
./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa gen-req server nopass
./easyrsa sign-req server server
./easyrsa gen-dh
openvpn --genkey --secret /etc/openvpn/ta.key
Sunucu Yapılandırma Dosyası
İşte dinamik IP ortamına uyarlanmış sunucu yapılandırması:
cat > /etc/openvpn/server.conf << 'EOF'
# Temel ayarlar
port 1194
proto udp
dev tun
# Sertifikalar
ca /etc/openvpn/easy-rsa/pki/ca.crt
cert /etc/openvpn/easy-rsa/pki/issued/server.crt
key /etc/openvpn/easy-rsa/pki/private/server.key
dh /etc/openvpn/easy-rsa/pki/dh.pem
tls-auth /etc/openvpn/ta.key 0
# Ağ yapılandırması
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /var/log/openvpn/ipp.txt
# DNS yapılandırması - kritik kısım
push "dhcp-option DNS 1.1.1.1"
push "dhcp-option DNS 8.8.8.8"
push "redirect-gateway def1 bypass-dhcp"
# Bağlantı kararlılığı için
keepalive 10 120
persist-key
persist-tun
# Logging
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 3
# Güvenlik
cipher AES-256-CBC
auth SHA256
tls-version-min 1.2
user nobody
group nogroup
EOF
mkdir -p /var/log/openvpn
systemctl enable openvpn@server
systemctl start openvpn@server
DNS Yapılandırması: Derinlemesine Bakış
DNS yapılandırması OpenVPN kurulumlarında en çok sorun çıkaran konulardan biri. İstemciler VPN’e bağlandıktan sonra DNS sorguları nereye gidiyor? Split DNS mi kullanıyorsunuz yoksa tüm trafiği mi yönlendiriyorsunuz? Hepsini tek tek ele alalım.
Tüm Trafiği VPN Üzerinden Yönlendirme
Sunucu tarafında zaten redirect-gateway def1 direktifini ekledik. Bu, istemcinin tüm internet trafiğini VPN tünelinden geçirmesini söylüyor. Bu durumda DNS de VPN üzerinden gittiği için sızdırma (DNS leak) riski azalıyor.
İstemci tarafında da bunu desteklememiz gerekiyor:
# İstemci yapılandırma dosyası (client.ovpn)
cat > /tmp/client.ovpn << 'EOF'
client
dev tun
proto udp
remote sunucunuz.duckdns.org 1194
# Bağlantı kararlılığı
resolv-retry infinite
nobind
persist-key
persist-tun
# Sertifikalar (inline veya dosya olarak)
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-CBC
auth SHA256
verb 3
# DNS sızıntısını önle
block-outside-dns
# Aşağıya sertifikaları ekleyin
EOF
block-outside-dns direktifi Windows istemciler için özellikle önemli. Bu direktif olmadan Windows, VPN tüneli aktifken bile yerel DNS sunucusunu kullanmaya devam edebilir.
Split DNS: Şirket İçi Alan Adları
Kurumsal ortamlarda sık karşılaşılan senaryo şu: İstemciler VPN’e bağlandığında *.sirket.local alan adları için şirket DNS sunucusunu, geri kalan her şey için de kendi ISP DNS’ini kullansın. Buna split DNS diyoruz.
Sunucu tarafında şu ayarları ekleyin:
# /etc/openvpn/server.conf dosyasına ek ayarlar
# Sadece şirket alan adları için VPN DNS'i kullan
push "dhcp-option DNS 192.168.1.10"
push "dhcp-option DOMAIN sirket.local"
push "dhcp-option DOMAIN-SEARCH sirket.local,alt.sirket.local"
# redirect-gateway direktifini KALDIRIN
# yerine sadece şirket ağına rotalar ekleyin
push "route 192.168.1.0 255.255.255.0"
push "route 10.0.0.0 255.0.0.0"
Linux istemcilerde split DNS düzgün çalışması için update-resolv-conf veya update-systemd-resolved script’i kullanmanız gerekiyor:
# Ubuntu 18.04 ve üzeri için systemd-resolved ile
# /etc/openvpn/client.conf dosyasına ekleyin
script-security 2
up /etc/openvpn/update-systemd-resolved
down /etc/openvpn/update-systemd-resolved
down-pre
# Script'i kur
apt install -y openvpn-systemd-resolved
DNS Sızıntı Testi
VPN bağlantısı aktifken DNS sorgularınızın gerçekten VPN üzerinden gittiğini doğrulayın:
# Terminal üzerinden test
dig +short myip.opendns.com @resolver1.opendns.com
# DNS leak test için
dig whoami.akamai.net
nslookup whoami.akamai.net
# Daha kapsamlı test (curl ile)
curl -s https://ipleak.net/json/ | python3 -m json.tool | grep -E '"ip"|"country_name"'
Eğer DNS leakage varsa, görünen IP’ler hem VPN sunucusunun IP’sini hem de gerçek ISP’nizin DNS IP’lerini gösterecektir.
Dinamik IP ile Bağlantı Kararlılığı
Dinamik IP ortamında en büyük sorun şu: IP değiştiğinde aktif VPN oturumları kopuyor. Bunu minimize etmek için birkaç strateji var.
İstemci Tarafında Yeniden Bağlanma Mekanizması
# İstemci yapılandırmasına eklenecek direktifler
# Bağlantı koptuğunda sonsuza kadar yeniden dene
resolv-retry infinite
# Sunucu hostname'ini her bağlantı denemesinde yeniden çözümle
# Bu dinamik IP güncellemelerinin algılanması için kritik
remote-random-hostname
# Yeniden bağlanma parametreleri
connect-retry 5 30
connect-retry-max unlimited
# Ping tabanlı bağlantı kontrolü
ping 15
ping-restart 60
Keepalive ve Timeout Optimizasyonu
Sunucu tarafında bağlantı kararlılığını artırmak için:
# /etc/openvpn/server.conf içinde
keepalive 10 60
# Bağlantı koptuğunda tüm rotaları temizle
explicit-exit-notify 1
# Float: istemcinin IP değişmesine izin ver (mobile clients için)
float
float direktifi özellikle mobil istemciler için çok kullanışlı. Laptop ile hem ofiste Wi-Fi hem de 4G kullanıyorsanız, IP değiştiğinde oturumunuz kesilmiyor.
IP Havuzu ve İstemci Yönetimi
Çok istemcili ortamlarda belirli istemcilere sabit VPN IP’si atamak isteyebilirsiniz. Örneğin bir sunucuya her zaman 10.8.0.10 IP’sinin verilmesi gibi.
# İstemciye sabit IP ata
mkdir -p /etc/openvpn/ccd
cat > /etc/openvpn/ccd/istemci-adi << 'EOF'
ifconfig-push 10.8.0.10 255.255.255.0
# İstemciye özel rota
push "route 192.168.10.0 255.255.255.0"
EOF
# server.conf'a ekle
echo "client-config-dir /etc/openvpn/ccd" >> /etc/openvpn/server.conf
İstemci IP havuzunu görüntülemek ve yönetmek için:
# Aktif bağlantıları izle
watch -n 5 'cat /var/log/openvpn/openvpn-status.log'
# Bağlı istemcileri listele
grep "^" /var/log/openvpn/openvpn-status.log | head -30
# Belirli bir istemcinin bağlantısını kes (management interface üzerinden)
echo "kill istemci-ortak-adı" | nc 127.0.0.1 7505
Management interface’i aktifleştirmek için server.conf’a ekleyin:
management 127.0.0.1 7505
management-log-cache 100
Firewall ve NAT Yapılandırması
Dinamik IP ortamında iptables kurallarının da doğru ayarlanması gerekiyor:
# VPN trafik yönlendirmesi için NAT kuralı
# eth0 yerine sunucunuzun gerçek interface adını yazın
INTERFACE=$(ip route | grep default | awk '{print $5}' | head -1)
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o $INTERFACE -j MASQUERADE
iptables -A FORWARD -i tun0 -j ACCEPT
iptables -A FORWARD -o tun0 -j ACCEPT
iptables -A INPUT -i tun0 -j ACCEPT
iptables -A INPUT -p udp --dport 1194 -j ACCEPT
# Kuralları kalıcı hale getir
apt install -y iptables-persistent
netfilter-persistent save
# IP forwarding'i etkinleştir
echo 1 > /proc/sys/net/ipv4/ip_forward
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
Monitoring ve Sorun Giderme
Gerçek dünyada en çok zaman harcadığınız kısım burası olacak. Kullanışlı komutları ve senaryoları paylaşayım.
Log Analizi
# Gerçek zamanlı log takibi
tail -f /var/log/openvpn/openvpn.log
# Başarısız bağlantıları filtrele
grep -i "tls error|auth failed|certificate verify failed" /var/log/openvpn/openvpn.log
# Bağlantı geçmişini görüntüle
grep "CLIENT_CONNECT|CLIENT_DISCONNECT" /var/log/openvpn/openvpn.log | tail -50
# DNS çözümleme sorunlarını kontrol et
grep -i "resolve|dns|hostname" /var/log/openvpn/openvpn.log
DDNS Güncelleme Doğrulama
IP güncellemelerinin düzgün çalıştığını doğrulamak için basit bir izleme scripti:
cat > /opt/duckdns/monitor.sh << 'EOF'
#!/bin/bash
DOMAIN="sunucunuz.duckdns.org"
LOG_FILE="/opt/duckdns/monitor.log"
CURRENT_IP=$(curl -s ifconfig.me)
DNS_IP=$(dig +short $DOMAIN @8.8.8.8)
if [ "$CURRENT_IP" != "$DNS_IP" ]; then
echo "$(date): UYARI - IP uyusmazligi! Gercek: $CURRENT_IP, DNS: $DNS_IP" >> $LOG_FILE
# Güncellemeyi zorla
/opt/duckdns/duck.sh
echo "$(date): DNS guncelleme tetiklendi" >> $LOG_FILE
else
echo "$(date): OK - IP eslesiyor: $CURRENT_IP" >> $LOG_FILE
fi
EOF
chmod +x /opt/duckdns/monitor.sh
# 2 dakikada bir çalıştır
echo "*/2 * * * * /opt/duckdns/monitor.sh" | crontab -
Yaygın Sorunlar ve Çözümleri
Dinamik IP ve DNS yapılandırmalarında sıkça karşılaşılan sorunlar şunlar:
- TLS handshake hatası: Saat farkından kaynaklanabilir.
ntpdate -u pool.ntp.orgile saati senkronize edin. - DNS çözümleme başarısız: DDNS sağlayıcısının propagation süresi 5-10 dakika alabilir. Sabırlı olun.
- İstemciler bağlanıyor ama internet gitmiyor: IP forwarding veya NAT kurallarını kontrol edin.
- DNS leak var:
block-outside-dnsdirektifini istemci yapılandırmasına ekleyin (Windows için kritik). - IPv6 üzerinden sızıntı: Sunucuda IPv6’yı devre dışı bırakın veya OpenVPN yapılandırmasına
tun-ipv6ve ilgili push direktiflerini ekleyin.
# IPv6 sızıntısını önlemek için
echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.conf
sysctl -p
Yedeklilik: Birden Fazla DDNS Sağlayıcısı
Kritik altyapı için tek bir DDNS sağlayıcısına bağlı kalmak riskli. İstemci yapılandırmasında birden fazla remote adresi tanımlayabilirsiniz:
# client.ovpn içinde birden fazla sunucu/hostname
remote birinci.duckdns.org 1194 udp
remote ikinci.no-ip.com 1194 udp
remote ucuncu.dynu.com 443 tcp
# Rastgele sırayla dene
remote-random
# Bağlanamadıysa bir sonrakine geç
resolv-retry infinite
Bu yapılandırmayla bir DDNS sağlayıcısı çökse bile istemciler diğerine geçecektir.
Sonuç
Dinamik IP ortamında güvenilir bir OpenVPN altyapısı kurmak, birkaç temel bileşeni doğru bir şekilde bir araya getirmekten ibaret. DDNS servisi düzenli IP güncellemesi yapmalı, OpenVPN istemcisi bağlantı koptuğunda agresif bir şekilde yeniden bağlanmayı denemeli, DNS yapılandırması ise hem güvenli hem de ihtiyaca göre split veya full-tunnel modunda çalışmalı.
Burada anlattığım yapıyı kendi ortamınıza uyarlarken en kritik noktaları hatırlatmak isterim: DDNS güncelleme sıklığını ihtiyacınıza göre ayarlayın, DNS leak testlerini düzenli yapın ve log dosyalarını takip edin. Özellikle kurumsal ortamlarda CCD dizini ile istemci bazlı IP ataması ve özel rota yönetimi, yönetilebilir ve izlenebilir bir altyapı sağlar.
Sorularınız veya karşılaştığınız farklı senaryolar için yorum kısmını kullanabilirsiniz. Bir sonraki yazıda OpenVPN ile iki faktörlü kimlik doğrulamayı ele alacağız.