WireGuard ile Yüksek Performanslı VPN Sunucusu Kurulumu

Modern ağ altyapılarında VPN teknolojisi artık bir lüks değil, zorunluluk haline geldi. OpenVPN ve IPSec gibi köklü çözümler yıllardır sahada olsa da WireGuard, sadeliği ve performansıyla oyunun kurallarını değiştirdi. Kernel seviyesinde çalışan bu protokol, karmaşık konfigürasyonları geride bırakıp saniyeler içinde bağlantı kurabiliyor. Bu yazıda, üretim ortamında WireGuard ile yüksek performanslı bir VPN sunucusu kurmanın her adımını ele alacağız.

WireGuard Neden Farklı?

WireGuard’ı rakiplerinden ayıran en önemli özellik, kod tabanının son derece küçük olması. OpenVPN yaklaşık 600.000 satır kodla gelirken WireGuard yalnızca ~4.000 satırla iş görüyor. Bu sadece estetik bir fark değil; daha az kod demek daha az saldırı yüzeyi ve daha kolay güvenlik denetimi demek.

Performans tarafında ise tablo çok net. WireGuard, Linux kernel 5.6 ile birlikte mainline kernel’a dahil edildi ve kernel space’de çalıştığı için user space çözümlerine kıyasla çok daha düşük latency sunuyor. Özellikle yüksek trafik yükü altında OpenVPN’in CPU kullanımının iki katına çıktığı noktalarda WireGuard sakin kalmaya devam ediyor.

Kullandığı kriptografik protokoller de modern standartları temsil ediyor:

  • ChaCha20: Şifreleme için
  • Poly1305: Mesaj doğrulama için
  • Curve25519: Anahtar değişimi için
  • BLAKE2s: Hash fonksiyonu için
  • SipHash24: Hash table anahtarları için

Sistem Hazırlığı ve Kurulum

Bu rehberde Ubuntu 22.04 LTS üzerinde çalışacağız. Senaryomuz şu: Uzaktan çalışan 50 kişilik bir ekip için merkezi bir VPN sunucusu kuruyoruz. Sunucu, hem site-to-site hem de road warrior bağlantılarını destekleyecek.

Kernel ve Sistem Gereksinimleri

# Kernel versiyonunu kontrol et
uname -r
# 5.6 ve üzeri olmalı, değilse WireGuard modülünü yükle

# Ubuntu 22.04'te direkt kurulum
apt update && apt upgrade -y
apt install wireguard wireguard-tools -y

# Modülün yüklendiğini doğrula
lsmod | grep wireguard
modinfo wireguard

Eğer eski bir kernel üzerinde çalışıyorsanız DKMS paketi ile devam edebilirsiniz:

# Eski kernel için (5.6 altı)
apt install wireguard-dkms linux-headers-$(uname -r) -y

Anahtar Çiftleri Oluşturma

WireGuard, public/private key çiftleri üzerine kurulu. Her peer için ayrı anahtar çifti oluşturmanız gerekiyor. Sunucu tarafından başlayalım:

# Güvenli bir dizin oluştur
mkdir -p /etc/wireguard/keys
chmod 700 /etc/wireguard/keys
cd /etc/wireguard/keys

# Sunucu için private ve public key oluştur
wg genkey | tee server_private.key | wg pubkey > server_public.key

# Pre-shared key oluştur (ek güvenlik katmanı)
wg genpsk > preshared.key

# İzinleri düzelt
chmod 600 server_private.key preshared.key
chmod 644 server_public.key

# Anahtarları görüntüle
echo "Private Key: $(cat server_private.key)"
echo "Public Key: $(cat server_public.key)"

Pre-shared key kullanımı opsiyonel ama production ortamında şiddetle tavsiye edilir. Quantum computing saldırılarına karşı ek bir koruma katmanı sağlar.

Sunucu Konfigürasyonu

Temel WireGuard Arayüzü

# /etc/wireguard/wg0.conf dosyasını oluştur
cat > /etc/wireguard/wg0.conf << 'EOF'
[Interface]
# Sunucu private key
PrivateKey = <BURAYA_SERVER_PRIVATE_KEY>

# VPN subnet içindeki sunucu IP'si
Address = 10.10.0.1/24

# WireGuard'ın dinleyeceği port
ListenPort = 51820

# Bağlantı geldiğinde routing tablolarını güncelle
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

# DNS sunucusu (opsiyonel, iç network için)
DNS = 10.10.0.1

# MTU değeri - yüksek trafikli ortamlarda ayarlanmalı
MTU = 1420
EOF

# Dosya izinlerini kısıtla
chmod 600 /etc/wireguard/wg0.conf

IP Forwarding Aktivasyonu

VPN trafiğinin yönlendirilmesi için kernel’da IP forwarding aktif olmalı:

# Geçici aktivasyon (test için)
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding

# Kalıcı aktivasyon
cat >> /etc/sysctl.conf << 'EOF'
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
# TCP/IP iyileştirmeleri
net.core.rmem_max = 26214400
net.core.wmem_max = 26214400
net.core.rmem_default = 1048576
net.core.wmem_default = 1048576
EOF

# Değişiklikleri uygula
sysctl -p

İstemci Yönetimi ve Peer Ekleme

İstemci Anahtar Üretimi ve Konfigürasyonu

Her kullanıcı için ayrı bir süreç izleyelim. Bu örneği otomatize edebilmek için bir script yazacağız:

#!/bin/bash
# /usr/local/bin/wg-add-client.sh

CLIENT_NAME=$1
SERVER_PUBLIC_IP="203.0.113.10"  # Gerçek sunucu IP'nizi girin
SERVER_PUBLIC_KEY=$(cat /etc/wireguard/keys/server_public.key)
PRESHARED_KEY=$(cat /etc/wireguard/keys/preshared.key)
WG_CONF="/etc/wireguard/wg0.conf"

if [ -z "$CLIENT_NAME" ]; then
    echo "Kullanim: $0 <istemci_adi>"
    exit 1
fi

# İstemci için sıradaki IP adresini bul
LAST_IP=$(grep "AllowedIPs" $WG_CONF | awk -F'[./]' '{print $NF}' | sort -n | tail -1)
NEW_IP=$((LAST_IP + 1))
CLIENT_IP="10.10.0.${NEW_IP}"

# Anahtar oluştur
cd /etc/wireguard/keys
wg genkey | tee ${CLIENT_NAME}_private.key | wg pubkey > ${CLIENT_NAME}_public.key
chmod 600 ${CLIENT_NAME}_private.key

CLIENT_PRIVATE=$(cat ${CLIENT_NAME}_private.key)
CLIENT_PUBLIC=$(cat ${CLIENT_NAME}_public.key)

# Sunucu konfigürasyonuna peer ekle
cat >> $WG_CONF << EOF

[Peer]
# ${CLIENT_NAME}
PublicKey = ${CLIENT_PUBLIC}
PresharedKey = ${PRESHARED_KEY}
AllowedIPs = ${CLIENT_IP}/32
EOF

# İstemci konfigürasyon dosyası oluştur
cat > /etc/wireguard/clients/${CLIENT_NAME}.conf << EOF
[Interface]
PrivateKey = ${CLIENT_PRIVATE}
Address = ${CLIENT_IP}/24
DNS = 10.10.0.1
MTU = 1420

[Peer]
PublicKey = ${SERVER_PUBLIC_KEY}
PresharedKey = ${PRESHARED_KEY}
Endpoint = ${SERVER_PUBLIC_IP}:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
EOF

echo "İstemci ${CLIENT_NAME} oluşturuldu. IP: ${CLIENT_IP}"
echo "Konfigürasyon: /etc/wireguard/clients/${CLIENT_NAME}.conf"

# WireGuard'ı yeniden başlatmadan peer ekle
wg addconf wg0 <(grep -A4 "[Peer]" $WG_CONF | tail -5)

Bu script’i çalıştırılabilir hale getirip istemci dizinini oluşturalım:

chmod +x /usr/local/bin/wg-add-client.sh
mkdir -p /etc/wireguard/clients

# Yeni istemci ekle
wg-add-client.sh ahmet
wg-add-client.sh mehmet

Yüksek Performans için İyileştirmeler

Network Ayarları ve BBR

Yüksek trafikli ortamlarda network stack’i optimize etmek kritik önem taşıyor:

# /etc/sysctl.d/99-wireguard-performance.conf
cat > /etc/sysctl.d/99-wireguard-performance.conf << 'EOF'
# BBR congestion control algoritması
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

# Buffer boyutlarını artır
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864

# UDP buffer (WireGuard için kritik)
net.core.netdev_max_backlog = 5000
net.ipv4.udp_rmem_min = 8192
net.ipv4.udp_wmem_min = 8192

# ARP cache optimizasyonu
net.ipv4.neigh.default.gc_thresh1 = 4096
net.ipv4.neigh.default.gc_thresh2 = 8192
net.ipv4.neigh.default.gc_thresh3 = 16384
EOF

sysctl --system

Firewall Kuralları

Üretim ortamı için kapsamlı bir firewall konfigürasyonu:

# UFW kullanıyorsanız
ufw allow 51820/udp comment "WireGuard VPN"
ufw allow OpenSSH
ufw enable

# Alternatif: iptables ile daha granüler kontrol
# Mevcut kuralları temizle
iptables -F
iptables -X
iptables -t nat -F

# Default policy
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# Loopback ve established bağlantılara izin ver
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# SSH ve WireGuard portlarına izin ver
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p udp --dport 51820 -j ACCEPT

# WireGuard interface üzerinden gelen trafiği forward et
iptables -A FORWARD -i wg0 -j ACCEPT
iptables -A FORWARD -o wg0 -j ACCEPT

# NAT masquerade
iptables -t nat -A POSTROUTING -s 10.10.0.0/24 -o eth0 -j MASQUERADE

# Kuralları kaydet
apt install iptables-persistent -y
netfilter-persistent save

Servis Yönetimi ve Monitoring

Systemd ile Otomatik Başlatma

# WireGuard servisini etkinleştir
systemctl enable wg-quick@wg0
systemctl start wg-quick@wg0
systemctl status wg-quick@wg0

# Aktif bağlantıları görüntüle
wg show

# Detaylı istatistikler
wg show wg0 dump

Monitoring Script’i

Production ortamında peer durumlarını ve trafik istatistiklerini takip etmek için basit ama etkili bir monitoring script’i:

#!/bin/bash
# /usr/local/bin/wg-monitor.sh
# Crontab ile her 5 dakikada çalıştırılabilir

LOG_FILE="/var/log/wireguard/connections.log"
ALERT_THRESHOLD=600  # 10 dakika inaktif peer'lar için uyarı

mkdir -p /var/log/wireguard

echo "=== WireGuard Durum Raporu: $(date) ===" >> $LOG_FILE

# Tüm peer'ları kontrol et
wg show wg0 dump | tail -n +2 | while read line; do
    PUBLIC_KEY=$(echo $line | awk '{print $1}')
    ENDPOINT=$(echo $line | awk '{print $3}')
    LAST_HANDSHAKE=$(echo $line | awk '{print $5}')
    RX_BYTES=$(echo $line | awk '{print $6}')
    TX_BYTES=$(echo $line | awk '{print $7}')
    
    CURRENT_TIME=$(date +%s)
    INACTIVE_TIME=$((CURRENT_TIME - LAST_HANDSHAKE))
    
    # İnsan okunabilir boyutlar
    RX_MB=$(echo "scale=2; $RX_BYTES/1048576" | bc)
    TX_MB=$(echo "scale=2; $TX_BYTES/1048576" | bc)
    
    # Sunucu konfigürasyonundan peer adını bul
    PEER_NAME=$(grep -B1 "PublicKey = $PUBLIC_KEY" /etc/wireguard/wg0.conf | grep "^#" | awk '{print $2}')
    
    echo "Peer: ${PEER_NAME:-Bilinmiyor}" >> $LOG_FILE
    echo "  Endpoint: $ENDPOINT" >> $LOG_FILE
    echo "  Son handshake: ${INACTIVE_TIME}s önce" >> $LOG_FILE
    echo "  Alınan: ${RX_MB}MB | Gönderilen: ${TX_MB}MB" >> $LOG_FILE
    
    # Uzun süredir inaktif peer'lar için uyarı
    if [ "$INACTIVE_TIME" -gt "$ALERT_THRESHOLD" ] && [ "$LAST_HANDSHAKE" -ne "0" ]; then
        echo "UYARI: $PEER_NAME ${INACTIVE_TIME}s süredir inaktif!" | tee -a $LOG_FILE
        # Buraya mail gönderme veya Slack webhook eklenebilir
    fi
done

echo "" >> $LOG_FILE

Gerçek Dünya Senaryoları

Split Tunneling Konfigürasyonu

Bazı kullanıcılar tüm trafiği VPN üzerinden geçirmek istemeyebilir. Sadece şirket kaynaklarına erişim için split tunneling:

# İstemci konfigürasyonunda AllowedIPs'i değiştir
# Sadece iç ağ trafiğini VPN üzerinden yönlendir

[Peer]
PublicKey = <SUNUCU_PUBLIC_KEY>
PresharedKey = <PRESHARED_KEY>
Endpoint = 203.0.113.10:51820
# Sadece şirket ağları için
AllowedIPs = 10.10.0.0/24, 192.168.1.0/24, 172.16.0.0/12
# PersistentKeepalive NAT arkasındaki istemciler için önemli
PersistentKeepalive = 25

Multi-hop VPN Yapılandırması

Ekstra anonimlik veya coğrafi routing gerektiren senaryolarda peer üzerinden peer’a bağlantı:

# Relay sunucusu konfigürasyonu (orta nokta)
# /etc/wireguard/wg0.conf - Relay Server

[Interface]
PrivateKey = <RELAY_PRIVATE_KEY>
Address = 10.10.1.1/24
ListenPort = 51820
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

# Ana sunucu peer
[Peer]
PublicKey = <MAIN_SERVER_PUBLIC_KEY>
AllowedIPs = 10.10.0.0/24
Endpoint = 203.0.113.10:51820
PersistentKeepalive = 25

# Son kullanıcı peer
[Peer]
PublicKey = <CLIENT_PUBLIC_KEY>
AllowedIPs = 10.10.1.2/32

DNS Sızıntısı Önleme

VPN kullanırken DNS sorgularının VPN dışına çıkması kritik bir güvenlik açığı. Bu sorunu çözmek için:

# Sunucu tarafında DNS resolver kur (örnek: systemd-resolved veya unbound)
apt install unbound -y

cat > /etc/unbound/unbound.conf.d/wireguard.conf << 'EOF'
server:
    interface: 10.10.0.1
    access-control: 10.10.0.0/24 allow
    do-ip4: yes
    do-udp: yes
    do-tcp: yes
    hide-identity: yes
    hide-version: yes
    harden-glue: yes
    harden-dnssec-stripped: yes
    use-caps-for-id: yes
    cache-min-ttl: 900
    cache-max-ttl: 14400
    prefetch: yes
    num-threads: 4
    verbosity: 1
    logfile: "/var/log/unbound.log"
EOF

systemctl enable unbound
systemctl start unbound

# İstemci konfigürasyonunda DNS'i sunucuya yönlendir
# [Interface]
# DNS = 10.10.0.1

Sertifika ve Anahtar Yönetimi

Büyük ölçekli deployment’larda anahtar rotasyonu hayati önem taşıyor. Manuel süreçler hata yaratır, bu yüzden otomatize etmek şart:

#!/bin/bash
# /usr/local/bin/wg-rotate-keys.sh
# Aylık çalıştırılması önerilir

BACKUP_DIR="/etc/wireguard/keys/backup/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR

# Mevcut anahtarları yedekle
cp /etc/wireguard/keys/server_private.key $BACKUP_DIR/
cp /etc/wireguard/keys/server_public.key $BACKUP_DIR/

# Yeni anahtar çifti oluştur
cd /etc/wireguard/keys
NEW_PRIVATE=$(wg genkey)
NEW_PUBLIC=$(echo $NEW_PRIVATE | wg pubkey)

# Dosyaları güncelle
echo $NEW_PRIVATE > server_private.key
echo $NEW_PUBLIC > server_public.key
chmod 600 server_private.key

# Konfigürasyon dosyasını güncelle
OLD_KEY=$(grep "PrivateKey" /etc/wireguard/wg0.conf | awk '{print $3}')
sed -i "s|PrivateKey = $OLD_KEY|PrivateKey = $NEW_PRIVATE|" /etc/wireguard/wg0.conf

# Servisi yeniden başlat
systemctl restart wg-quick@wg0

echo "Anahtar rotasyonu tamamlandı: $(date)"
echo "Yeni public key: $NEW_PUBLIC"
echo "İstemcilere yeni public key'i dağıtmayı unutmayın!"

Sorun Giderme

Üretim ortamında en sık karşılaşılan sorunlar ve çözümleri:

  • Handshake gerçekleşmiyor: UDP 51820 portuna erişimi firewall’da kontrol et. tcpdump -i eth0 udp port 51820 ile paket akışını izle.
  • Bağlantı kuruluyor ama internet yok: IP forwarding aktif mi kontrol et. sysctl net.ipv4.ip_forward değerini doğrula.
  • Yüksek latency: MTU değerini düşür. 1420’den 1380’e indirmeyi dene. ping -M do -s 1400 10.10.0.1 ile MTU testleri yap.
  • Sık kesilen bağlantılar: NAT arkasındaki istemciler için PersistentKeepalive = 25 değerini ayarla.
  • DNS çözümlenemiyor: resolvectl status ile DNS durumunu kontrol et. Unbound servisinin çalıştığını doğrula.
# Hızlı debug komutları
wg show                          # Genel durum
wg show wg0 latest-handshakes    # Son handshake zamanları
wg show wg0 transfer             # Transfer istatistikleri
ip route show table main         # Routing tablosu
journalctl -u wg-quick@wg0 -f   # Canlı log takibi

Sonuç

WireGuard, modern sysadmin araç kutusunda hak ettiği yeri aldı. Kurulum kolaylığı, düşük CPU kullanımı ve üstün performansıyla özellikle uzak çalışanların yoğun olduğu ortamlarda OpenVPN ve IPSec’e ciddi bir alternatif sunuyor.

Bu yazıda ele aldığımız konuları özetlemek gerekirse: temel kurulum ve anahtar yönetiminden başlayarak üretim kalitesinde firewall kuralları, DNS sızıntısı önleme, monitoring otomasyonu ve anahtar rotasyonuna kadar geniş bir yelpazede pratik bir kurulum gerçekleştirdik. 50 kişilik ekipten 500 kişilik bir yapıya ölçeklenmesi gerektiğinde, peer konfigürasyonlarını merkezi bir yönetim sistemine (örneğin NetBird veya Tailscale arka planı) taşıyabilirsiniz.

Güvenlik tarafında en kritik noktalar şunlar: pre-shared key kullanımını ihmal etme, anahtar rotasyonunu takvime bağla ve monitoring script’ini mutlaka devreye al. VPN sadece trafik şifrelemek değil, kim neye erişiyor sorusunun cevabını her an elinin altında bulundurabilmek demek.

Yorum yapın