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 51820ile paket akışını izle.
- Bağlantı kuruluyor ama internet yok: IP forwarding aktif mi kontrol et.
sysctl net.ipv4.ip_forwarddeğ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.1ile MTU testleri yap.
- Sık kesilen bağlantılar: NAT arkasındaki istemciler için
PersistentKeepalive = 25değerini ayarla.
- DNS çözümlenemiyor:
resolvectl statusile 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.