Eski VPN protokolleriyle uğraşmış her sysadmin bilir: OpenVPN config dosyası bin satırı geçer, IPSec’in key exchange mekanizmaları baş ağrıtır, L2TP/IPSec ise NAT arkasında can çekişir. Sonra bir gün WireGuard ile tanışırsın ve “neden bu kadar basit?” diye kendin sorgularsın. Bu yazıda WireGuard’ın ne olduğunu, nasıl çalıştığını ve neden modern altyapılarda bu kadar hızlı benimseniyor olduğunu gerçek dünya perspektifinden ele alacağız.
WireGuard Nedir?
WireGuard, Jason Donenfeld tarafından geliştirilen ve 2020 yılında Linux kernel 5.6 ile birlikte mainline kernel’e dahil edilen modern bir VPN protokolüdür. Açık kaynaklıdır, son derece minimal bir kod tabanına sahiptir ve kriptografi konusunda iyi kararlar almıştır.
Bunu somutlaştıralım: OpenVPN yaklaşık 600.000 satır kod içerirken, WireGuard yalnızca yaklaşık 4.000 satır kod içerir. Bu fark sadece estetik bir tercih değildir. Daha az kod demek daha az saldırı yüzeyi, daha kolay güvenlik denetimi ve daha az bug demektir. Güvenlik araştırmacıları bir hafta sonu WireGuard’ın tüm kod tabanını inceleyebilir. Aynı şeyi OpenVPN için yapamazsınız.
WireGuard, bir VPN çözümü değil, bir VPN protokolüdür. Yani WireGuard’ın üzerine inşa edilmiş birçok çözüm vardır: Tailscale, Netbird, Headscale, wg-easy bunların başında gelir. Ama temel protokolü anlamak, bu çözümleri daha iyi kullanmanızı sağlar.
Teknik Temeller: WireGuard Nasıl Çalışır?
Kriptografi Yaklaşımı
WireGuard’ın en güçlü yanlarından biri kriptografi konusunda opinionated olmasıdır. Yani size “hangi şifrelemeyi kullanmak istersin?” diye sormaz. Kullanacağınız algoritmaları kendisi belirler:
- ChaCha20: Veri şifreleme için
- Poly1305: Mesaj doğrulama (MAC) için
- Curve25519: Elliptic-curve Diffie-Hellman anahtar değişimi için
- BLAKE2s: Hash fonksiyonu için
- SipHash24: Hashtable anahtar olarak
Bu algoritmaların tamamı modern, peer-reviewed ve güvenilir algoritmalardır. “Cipher negotiation” yoktur. Bu, downgrade attack gibi saldırıların önüne geçer. IPSec’te yanlış yapılandırılmış cipher suite’ler nedeniyle yaşanan güvenlik sorunlarını hatırlayın. WireGuard’da bu sorun yoktur çünkü seçenek verilmez.
Noise Protocol Framework
WireGuard, handshake mekanizması için Noise Protocol Framework kullanır. Bu, sadece handshake için yaklaşık 1-2 paket gerektirir anlamına gelir. TLS’in handshake süreciyle karşılaştırıldığında bu dramatik bir fark yaratır. Özellikle yüksek latency’li bağlantılarda bağlantı kurma hızı kritik öneme sahiptir.
UDP Tabanlı Çalışma
WireGuard yalnızca UDP üzerinde çalışır. TCP üzerinde çalışmaz. Bu bazı ortamlarda dezavantaj gibi görünse de birçok avantaj sağlar:
- Head-of-line blocking sorunu yoktur
- TCP over TCP sorununu ortadan kaldırır
- Kernel seviyesinde daha verimli işlenir
Varsayılan port 51820 UDP‘dir ama bu değiştirilebilir. Kısıtlı ağlarda 443/UDP veya 53/UDP kullanmak mümkündür.
Roaming ve IP Değişimi
WireGuard, bağlantıları IP adresleri üzerinden değil public key çiftleri üzerinden tanımlar. Bu şu anlama gelir: Bir peer’ın IP adresi değişse bile bağlantı kopmaz. Laptop’ınızla ofis Wi-Fi’sinden çıkıp 4G’ye geçtiğinizde VPN bağlantısını yeniden kurmanıza gerek yoktur. WireGuard arka planda sessizce devam eder. Bu özellik özellikle mobil senaryolarda muazzam bir kullanıcı deneyimi farkı yaratır.
Kurulum ve Temel Yapılandırma
Ubuntu/Debian Üzerine Kurulum
# Paket listesini güncelle
sudo apt update
# WireGuard kur
sudo apt install -y wireguard wireguard-tools
# Kernel modülünün yüklendiğini doğrula
lsmod | grep wireguard
# WireGuard versiyonunu kontrol et
wg --version
Key Pair Oluşturma
WireGuard’da her peer için bir public/private key çifti gerekir. Bu işlem son derece basittir:
# Güvenli bir dizinde çalış
cd /etc/wireguard
# Private key oluştur
wg genkey | tee server_private.key
# Private key'den public key türet
cat server_private.key | wg pubkey | tee server_public.key
# İzinleri düzelt - private key asla başkaları tarafından okunamalı
chmod 600 server_private.key
# Ya da tek satırda her ikisini oluştur
wg genkey | tee privatekey | wg pubkey > publickey
# Preshared key oluştur (opsiyonel ama önerilir)
wg genpsk > preshared.key
Sunucu Yapılandırması (wg0.conf)
Diyelim ki bir VPN server kuruyorsunuz. Tüm remote çalışanlar bu sunucu üzerinden şirket ağına bağlanacak. Sunucu yapılandırması şöyle görünür:
# /etc/wireguard/wg0.conf dosyasını oluştur
cat > /etc/wireguard/wg0.conf << 'EOF'
[Interface]
# Sunucunun VPN arayüzüne atanacak IP adresi
Address = 10.0.0.1/24
# WireGuard'ın dinleyeceği UDP portu
ListenPort = 51820
# Sunucunun private key'i
PrivateKey = <SERVER_PRIVATE_KEY_BURAYA>
# IP forwarding için - gelen trafiği yönlendirmek istiyorsan
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
# İlk peer: Ahmet'in laptop'u
[Peer]
PublicKey = <AHMET_PUBLIC_KEY>
PresharedKey = <PRESHARED_KEY>
AllowedIPs = 10.0.0.2/32
# İkinci peer: Mehmet'in laptop'u
[Peer]
PublicKey = <MEHMET_PUBLIC_KEY>
PresharedKey = <PRESHARED_KEY_2>
AllowedIPs = 10.0.0.3/32
EOF
# Dosya izinlerini düzelt
chmod 600 /etc/wireguard/wg0.conf
IP Forwarding Aktifleştirme
Sunucunun paketleri yönlendirebilmesi için kernel düzeyinde IP forwarding aktif olmalıdır:
# Geçici olarak aktifleştir
echo 1 > /proc/sys/net/ipv4/ip_forward
# Kalıcı olarak aktifleştir
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf
sysctl -p
# Doğrula
sysctl net.ipv4.ip_forward
Arayüzü Başlatma
# WireGuard arayüzünü başlat
sudo wg-quick up wg0
# Sistem başlangıcında otomatik başlat
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0
# Durumu kontrol et
sudo wg show
# Daha ayrıntılı bilgi için
sudo wg show wg0
İstemci Yapılandırması
Sunucu hazır olduğunda istemci tarafını yapılandırıyoruz. Bu senaryo için Ahmet’in laptop’unu ele alalım:
# İstemcide de aynı kurulum adımları
sudo apt install -y wireguard
# İstemci için key pair oluştur
cd /etc/wireguard
wg genkey | tee client_private.key | wg pubkey > client_public.key
chmod 600 client_private.key
# İstemci yapılandırması
cat > /etc/wireguard/wg0.conf << 'EOF'
[Interface]
# İstemcinin VPN IP adresi
Address = 10.0.0.2/24
# İstemcinin private key'i
PrivateKey = <CLIENT_PRIVATE_KEY>
# DNS sunucusu - VPN üzerinden gidecek
DNS = 10.0.0.1
[Peer]
# Sunucunun public key'i
PublicKey = <SERVER_PUBLIC_KEY>
# Preshared key (sunucudakiyle aynı olmalı)
PresharedKey = <PRESHARED_KEY>
# Sunucunun gerçek IP adresi ve portu
Endpoint = vpn.sirket.com:51820
# Hangi trafik VPN üzerinden geçecek?
# 0.0.0.0/0 = tüm trafik VPN'den geçer (full tunnel)
# Sadece şirket ağı için: 192.168.1.0/24
AllowedIPs = 0.0.0.0/0, ::/0
# NAT keepalive - 25 saniyede bir keepalive paketi gönderir
PersistentKeepalive = 25
EOF
chmod 600 /etc/wireguard/wg0.conf
# Bağlantıyı başlat
sudo wg-quick up wg0
Gerçek Dünya Senaryosu: Site-to-Site VPN
Şirketin İstanbul ve Ankara ofisleri arasında güvenli bir tünel kurmak istiyorsunuz. Her iki tarafta da WireGuard kurulu bir router ya da Linux sunucu var.
İstanbul ofisi (172.16.1.0/24 iç ağı, 203.0.113.1 public IP):
# /etc/wireguard/istanbul-ankara.conf
[Interface]
Address = 10.10.10.1/30
ListenPort = 51820
PrivateKey = <ISTANBUL_PRIVATE_KEY>
# Trafik yönlendirme
PostUp = ip route add 172.16.2.0/24 via 10.10.10.2
PostDown = ip route del 172.16.2.0/24 via 10.10.10.2
[Peer]
PublicKey = <ANKARA_PUBLIC_KEY>
Endpoint = 203.0.113.2:51820
# Ankara ofisinin iç ağı
AllowedIPs = 10.10.10.2/32, 172.16.2.0/24
PersistentKeepalive = 30
Bu konfigürasyonda İstanbul ofisindeki kullanıcılar 172.16.2.0/24 ağındaki Ankara kaynaklarına doğrudan erişebilir. Trafik WireGuard tüneli üzerinden şifreli şekilde geçer.
Monitoring ve Troubleshooting
Bağlantı kurulduktan sonra izleme ve hata giderme şöyle yapılır:
# Anlık durum görüntüle
sudo wg show
# Belirli bir arayüz için
sudo wg show wg0
# Bağlantı istatistikleri - transfer edilen veri ve son handshake zamanı
sudo wg show wg0 transfer
sudo wg show wg0 latest-handshakes
# Tcpdump ile WireGuard trafiğini izle
sudo tcpdump -i eth0 -n udp port 51820
# WireGuard arayüzündeki trafiği izle
sudo tcpdump -i wg0
# Peer'ın erişilebilir olup olmadığını test et
ping 10.0.0.2
# Bağlantı loglarına bak
sudo journalctl -u wg-quick@wg0 -f
# Peer ekleme (yeniden başlatmaya gerek yok)
sudo wg set wg0 peer <NEW_PUBLIC_KEY> allowed-ips 10.0.0.10/32
# Peer silme
sudo wg set wg0 peer <PUBLIC_KEY> remove
OpenVPN ile Karşılaştırma
WireGuard’ın neden tercih edildiğini anlamak için performans ve kullanım kolaylığı açısından bakalım.
Performans farkları:
- WireGuard, kernel space’te çalışır. OpenVPN user space’te çalışır. Bu fark özellikle yüksek throughput senaryolarında belirginleşir.
- Gigabit ethernet bağlantıda WireGuard genellikle 900+ Mbps throughput sağlarken, OpenVPN single-thread kısıtlaması nedeniyle 200-400 Mbps civarında kalır.
- Latency overhead açısından WireGuard çok daha düşük overhead ekler.
Yapılandırma karmaşıklığı:
- OpenVPN yapılandırması: CA oluşturma, sertifika yönetimi, CRL, TLS auth, cipher seçimi… onlarca parametre.
- WireGuard yapılandırması: Key pair oluştur, config’e yaz, başlat. Hepsi bu.
Güvenlik denetimi:
- 4.000 satır kod ile 600.000 satır kod arasındaki fark, güvenlik açığı bulma ve düzeltme hızı açısından kritik öneme sahiptir.
Dezavantajlar:
- WireGuard’ın da eksikleri vardır. Perfect Forward Secrecy mekanizması farklı çalışır; uzun süreli bağlantılarda 3 dakikada bir otomatik key rotation yapılır ama bu handshake yapılmadan gerçekleşmez.
- Obfuscation yoktur. DPI (Deep Packet Inspection) ile WireGuard trafiği tespit edilebilir. Kısıtlayıcı ülkelerde ya da aggressive firewall’ları olan ağlarda bu sorun olabilir.
- Peer listesi statiktir. Dinamik peer yönetimi için ek araçlar gerekir. Büyük ölçekli deploymentlarda Tailscale veya Netbird gibi çözümler bu sorunu çözer.
- Loglama yoktur. Varsayılan olarak WireGuard bağlantı logları tutmaz. Compliance gereksinimleri olan ortamlarda bu problem yaratabilir.
Güvenlik Sertleştirme Önerileri
Temel kurulumun ötesinde, production ortamı için ek güvenlik önlemleri alınmalıdır:
# Firewall kuralları - sadece WireGuard portuna izin ver
# UFW kullanıyorsan
sudo ufw allow 51820/udp
sudo ufw allow OpenSSH
sudo ufw enable
# nftables kullanıyorsan
nft add rule inet filter input udp dport 51820 accept
# WireGuard config dosyalarının izinlerini doğrula
ls -la /etc/wireguard/
# Tüm .conf ve key dosyaları 600 olmalı
# Kullanılmayan peer'ları düzenli temizle
# Hangi peer'lar son 7 gündür bağlanmadı?
sudo wg show wg0 latest-handshakes | awk '{
diff = systime() - $2;
if (diff > 604800) print "Inactive peer:", $1, "- Last seen:", diff/86400, "days ago"
}'
Sonuç
WireGuard, VPN dünyasında gerçek anlamda bir paradigma değişikliğini temsil ediyor. “Basit ama güvenli” prensibini başarıyla uygulayan nadir teknoloji örneklerinden biri. Sysadmin olarak bizi en çok zorlayan şey karmaşıklıktır. Karmaşık sistemler hata yapar, karmaşık config’ler yanlış yapılandırılır, karmaşık protokoller yanlış anlaşılır.
WireGuard bu karmaşıklığı dramatik biçimde azaltıyor. Bir config dosyası insan tarafından okunabilir ve bir saatte tamamen anlaşılabilir durumda. Kernel’e entegre çalışması performans konusunda rakipsiz kılıyor. Modern kriptografi seçimleri güvenlik açısından doğru kararlar almanızı garanti ediyor.
Şirket VPN’i, site-to-site tüneller, uzaktan erişim çözümleri ya da kişisel kullanım için; WireGuard her senaryoda OpenVPN ve IPSec’e kıyasla daha hızlı kurulur, daha kolay yönetilir ve daha az şeylerin yanlış gidebileceği bir yapı sunar.
Tek uyarım şu: Büyük ölçekli deploymentlarda (yüzlerce peer) saf WireGuard yerine üzerine inşa edilmiş orchestration araçlarına bakmak gerekir. Tailscale, Netbird ya da Headscale bu ihtiyacı karşılar. Ama temeli anlamadan bu araçları kullanmak, araba sürmeden önce motoru anlamamak gibi eksik kalır.
WireGuard’ı deneyin. İlk başarılı bağlantı kurulduğunda “bu kadar mı kolay?” diye şaşıracaksınız. Ve bir daha eski protokollere dönmek istemeyeceksiniz.