WireGuard ile Peer-to-Peer VPN Kurulumu

Modern ağ altyapılarında güvenli bağlantı kurma ihtiyacı her geçen gün artıyor. OpenVPN ve IPSec gibi köklü çözümler hâlâ kullanılsa da WireGuard, sadeliği, yüksek performansı ve modern kriptografi kullanımıyla bu alanda ciddi bir alternatif haline geldi. Kernel seviyesinde çalışması, minimal kod tabanı (yaklaşık 4000 satır kod) ve kolay yapılandırması sayesinde hem hobicilerin hem de kurumsal sysadminlerin gözdesi oldu. Bu yazıda iki veya daha fazla sunucu arasında peer-to-peer WireGuard VPN kurulumunu gerçek dünya senaryolarıyla ele alacağız.

WireGuard Nedir ve Neden Tercih Edilmeli?

WireGuard, 2016 yılında Jason Donenfeld tarafından geliştirilen ve Linux kernel 5.6 ile birlikte mainline’a giren modern bir VPN protokolüdür. Geleneksel çözümlerle kıyaslandığında birkaç temel avantajı öne çıkıyor.

Performans: OpenVPN’e göre genellikle 2-3 kat daha yüksek throughput değerleri elde ediliyor. Bunun temel nedeni kernel space’te çalışması ve ChaCha20-Poly1305 gibi hızlı şifreleme algoritmalarını kullanması.

Güvenlik: Küçük kod tabanı saldırı yüzeyini dramatik biçimde azaltıyor. OpenSSL bağımlılığı yok, sabit bir kriptografi paketi kullanıyor (Curve25519, ChaCha20, Poly1305, BLAKE2, SipHash24, HKDF).

Basitlik: Bir WireGuard arayüzü yapılandırmak, bir ağ kartı yapılandırmaktan farklı değil. Birkaç satır config yeterli.

Roaming Desteği: Mobil cihazlar için çok önemli olan IP değişikliklerinde bağlantının kopmaması özelliği WireGuard’da built-in geliyor.

Senaryo: İki Veri Merkezi Arasında Güvenli Bağlantı

Bu yazı boyunca şu senaryoyu uygulayacağız: İstanbul ve Ankara’da bulunan iki sunucu arasında peer-to-peer WireGuard tüneli kuruyoruz. Bu tünel üzerinden her iki taraftaki iç ağlar birbirine erişebilecek.

  • Sunucu A (İstanbul): Public IP: 203.0.113.10, iç ağ: 10.0.1.0/24, WireGuard IP: 10.10.0.1/24
  • Sunucu B (Ankara): Public IP: 203.0.113.20, iç ağ: 10.0.2.0/24, WireGuard IP: 10.10.0.2/24

Kurulum

Ubuntu/Debian Sistemlerde Kurulum

# Her iki sunucuda da çalıştır
sudo apt update && sudo apt upgrade -y
sudo apt install wireguard wireguard-tools -y

# Kernel modülünü yükle
sudo modprobe wireguard

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

RHEL/CentOS/Rocky Linux Sistemlerde Kurulum

# EPEL repository ekle
sudo dnf install epel-release -y

# WireGuard kur
sudo dnf install wireguard-tools -y

# Kernel modülü (RHEL 8+ için kernel-modules-extra gerekebilir)
sudo dnf install kernel-modules-extra -y
sudo modprobe wireguard

Kurulum tamamlandıktan sonra her iki sunucuda da anahtar çiftleri oluşturmamız gerekiyor.

Anahtar Çifti Oluşturma

WireGuard, asimetrik kriptografi kullanır. Her peer’in bir private key ve buna karşılık gelen bir public key’i olması gerekiyor. Bu anahtarlar Curve25519 algoritmasına dayanıyor.

# Çalışma dizini oluştur ve izinleri ayarla
sudo mkdir -p /etc/wireguard
sudo chmod 700 /etc/wireguard
cd /etc/wireguard

# Private key oluştur
wg genkey | sudo tee /etc/wireguard/private.key
sudo chmod 600 /etc/wireguard/private.key

# Public key türet
sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key

# Anahtarları görüntüle
echo "Private Key: $(sudo cat /etc/wireguard/private.key)"
echo "Public Key: $(sudo cat /etc/wireguard/public.key)"

Bu işlemi her iki sunucuda ayrı ayrı yapman gerekiyor. Oluşturulan public key’leri not al, yapılandırma dosyasında kullanacaksın. Private key’i asla dışarıya sızdırma, config dosyasının içinde kalacak.

Opsiyonel: Pre-shared Key Oluşturma

Ekstra bir güvenlik katmanı için pre-shared key (PSK) kullanabilirsin. Bu, kuantum bilgisayar saldırılarına karşı ek koruma sağlar.

# Her iki sunucuda aynı PSK kullanılacak, sadece bir sunucuda oluştur
wg genpsk | sudo tee /etc/wireguard/preshared.key
sudo chmod 600 /etc/wireguard/preshared.key

Yapılandırma Dosyalarını Oluşturma

Sunucu A (İstanbul) Yapılandırması

# /etc/wireguard/wg0.conf - Sunucu A
[Interface]
# WireGuard tünel arayüzüne atanacak IP
Address = 10.10.0.1/24

# Dinlenecek port
ListenPort = 51820

# Bu sunucunun private key'i
PrivateKey = <SUNUCU_A_PRIVATE_KEY>

# IP forwarding için kurallar (iç ağa yönlendirme gerekiyorsa)
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

# Sunucu B peer tanımı
[Peer]
# Sunucu B'nin public key'i
PublicKey = <SUNUCU_B_PUBLIC_KEY>

# Opsiyonel: Pre-shared key
PresharedKey = <PRESHARED_KEY>

# Bu peer'e gönderilecek trafik için izin verilen IP'ler
AllowedIPs = 10.10.0.2/32, 10.0.2.0/24

# Sunucu B'nin public IP ve portu
Endpoint = 203.0.113.20:51820

# NAT arkasındaysa keepalive kullan (25 saniye önerilir)
PersistentKeepalive = 25

Sunucu B (Ankara) Yapılandırması

# /etc/wireguard/wg0.conf - Sunucu B
[Interface]
Address = 10.10.0.2/24
ListenPort = 51820
PrivateKey = <SUNUCU_B_PRIVATE_KEY>

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

[Peer]
PublicKey = <SUNUCU_A_PUBLIC_KEY>
PresharedKey = <PRESHARED_KEY>
AllowedIPs = 10.10.0.1/32, 10.0.1.0/24
Endpoint = 203.0.113.10:51820
PersistentKeepalive = 25

Config dosyalarının izinlerini de doğru ayarla:

sudo chmod 600 /etc/wireguard/wg0.conf

Kernel’de IP Forwarding Etkinleştirme

İki ağ arasında trafik yönlendirmesi yapılacaksa IP forwarding’in aktif olması şart. Aksi hâlde paketler iletilmez.

# Geçici olarak etkinleştir (reboot sonrası kaybolur)
sudo sysctl -w net.ipv4.ip_forward=1

# Kalıcı hale getir
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.d/99-wireguard.conf
echo "net.ipv6.conf.all.forwarding = 1" | sudo tee -a /etc/sysctl.d/99-wireguard.conf
sudo sysctl -p /etc/sysctl.d/99-wireguard.conf

# Değeri doğrula
sysctl net.ipv4.ip_forward

Güvenlik Duvarı Kuralları

UFW Kullananlar İçin

# WireGuard portunu aç
sudo ufw allow 51820/udp comment "WireGuard VPN"

# Forwarding'e izin ver (ufw default forward policy)
sudo nano /etc/default/ufw
# DEFAULT_FORWARD_POLICY="ACCEPT" olarak değiştir

# UFW'yi yeniden başlat
sudo ufw disable && sudo ufw enable
sudo ufw status verbose

firewalld Kullananlar İçin (RHEL/Rocky)

# WireGuard servisini ekle
sudo firewall-cmd --permanent --add-port=51820/udp
sudo firewall-cmd --permanent --add-masquerade
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

WireGuard’ı Başlatma ve Yönetme

# Her iki sunucuda da çalıştır

# Arayüzü başlat
sudo wg-quick up wg0

# Sistem başlangıcında otomatik başlatmak için
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0

# Durumu kontrol et
sudo wg show

# Ayrıntılı durum
sudo wg show wg0

# Arayüzü durdur
sudo wg-quick down wg0

wg show komutunun çıktısı başarılı bir bağlantıda şuna benzer görünmeli:

interface: wg0
  public key: <PUBLIC_KEY>
  private key: (hidden)
  listening port: 51820

peer: <PEER_PUBLIC_KEY>
  preshared key: (hidden)
  endpoint: 203.0.113.20:51820
  allowed ips: 10.10.0.2/32, 10.0.2.0/24
  latest handshake: 23 seconds ago
  transfer: 1.45 MiB received, 2.10 MiB sent

latest handshake satırında yakın bir zaman görüyorsan bağlantı kurulmuş demektir. Transfer değerlerinin artması ise trafik aktığını gösterir.

Bağlantıyı Test Etme

# Sunucu A'dan Sunucu B'nin WireGuard IP'sine ping at
ping -c 4 10.10.0.2

# Sunucu B'nin iç ağındaki bir makinaya ping at
ping -c 4 10.0.2.50

# MTU ve latency testi
ping -c 10 -s 1400 10.10.0.2

# Bandwidth testi (iperf3 kurulu olmalı)
# Sunucu B'de server başlat
iperf3 -s -p 5201

# Sunucu A'dan test et
iperf3 -c 10.10.0.2 -p 5201 -t 30

Eğer ping çalışıyor ama iç ağa erişim olmuyorsa IP forwarding ve routing kurallarını tekrar kontrol et.

Sorun Giderme

Handshake Gerçekleşmiyorsa

İlk kontrol noktası UDP 51820 portunun açık olup olmadığı. Her iki yönde de test et:

# Karşı tarafın portunu test et (nc -u ile UDP test)
nc -u -v -z 203.0.113.20 51820

# tcpdump ile paketlerin gelip gelmediğini izle
sudo tcpdump -i eth0 udp port 51820 -n

# WireGuard loglarını incele (systemd kullanıyorsan)
sudo journalctl -u wg-quick@wg0 -f

# Kernel log
sudo dmesg | grep wireguard

Sık Karşılaşılan Sorunlar:

  • Handshake yok: Endpoint IP/port yanlış, güvenlik duvarı bloklıyor veya private/public key eşleşmiyor olabilir.
  • Handshake var ama ping yok: IP forwarding kapalı veya routing tablosunda eksiklik var.
  • Yüksek latency: MTU ayarı yanlış olabilir. WireGuard overhead’i nedeniyle MTU’yu 1420 veya daha düşük ayarlamayı dene.
  • Bağlantı aralıklı kopuyor: PersistentKeepalive değerini ayarla, NAT timeout sounu olabilir.

MTU Optimizasyonu

# MTU sorunlarını test et
ping -c 4 -M do -s 1472 10.10.0.2

# Config'de MTU ayarla
# [Interface] bloğuna ekle:
# MTU = 1420

# Mevcut MTU değerini kontrol et
ip link show wg0

Dinamik Peer Yönetimi

Üretim ortamında peer’leri servis yeniden başlatmadan ekleyip çıkarabilirsin.

# Çalışan arayüze yeni peer ekle (config dosyası değişmez)
sudo wg set wg0 peer <NEW_PEER_PUBLIC_KEY> 
  allowed-ips 10.10.0.3/32 
  endpoint 203.0.113.30:51820 
  persistent-keepalive 25

# Mevcut durumu config dosyasına kaydet
sudo wg-quick save wg0

# Peer'i kaldır
sudo wg set wg0 peer <PEER_PUBLIC_KEY> remove

# Tüm peer'leri listele
sudo wg show wg0 peers

Çok Noktali (Multi-Peer) Yapılandırma

Gerçek dünyada çoğu zaman ikiden fazla lokasyon arasında bağlantı kurmak gerekiyor. Hub-and-spoke mimarisinde merkezi bir sunucu (hub) tüm peer’leri birbirine bağlar.

# Hub sunucu (merkez ofis) yapılandırması
[Interface]
Address = 10.10.0.1/24
ListenPort = 51820
PrivateKey = <HUB_PRIVATE_KEY>
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

# Şube 1 - Ankara
[Peer]
PublicKey = <ANKARA_PUBLIC_KEY>
AllowedIPs = 10.10.0.2/32, 10.0.2.0/24

# Şube 2 - İzmir
[Peer]
PublicKey = <IZMIR_PUBLIC_KEY>
AllowedIPs = 10.10.0.3/32, 10.0.3.0/24

# Şube 3 - Bursa
[Peer]
PublicKey = <BURSA_PUBLIC_KEY>
AllowedIPs = 10.10.0.4/32, 10.0.4.0/24

Her şube sunucusunda hub’ı tek peer olarak tanımlarsın ve AllowedIPs’e diğer şubelerin ağlarını da eklersin. Bu sayede şubeler arası trafik merkez üzerinden akar.

Monitoring ve Alerting

Üretim ortamında WireGuard bağlantılarını izlemek kritik önem taşıyor. Basit bir bash scriptiyle peer durumlarını kontrol edebilirsin:

#!/bin/bash
# /usr/local/bin/wg-monitor.sh

ALERT_EMAIL="[email protected]"
MAX_HANDSHAKE_AGE=180  # 3 dakika

check_peers() {
  while IFS= read -r line; do
    if [[ $line =~ ^peer: (.+)$ ]]; then
      current_peer="${BASH_REMATCH[1]}"
    fi
    if [[ $line =~ latest handshake: (.+) ago ]]; then
      handshake_info="${BASH_REMATCH[1]}"
      # Saniyeye çevir (basit kontrol)
      if [[ $handshake_info =~ ([0-9]+) minute ]]; then
        minutes="${BASH_REMATCH[1]}"
        if (( minutes > 3 )); then
          echo "UYARI: Peer $current_peer ile handshake $minutes dakika önce!"
          # Mail gönder
          echo "WireGuard peer $current_peer bağlantı sorunu" | 
            mail -s "WireGuard Alert" "$ALERT_EMAIL"
        fi
      fi
    fi
  done < <(wg show wg0 2>/dev/null)
}

check_peers

Bu scripti cron’a ekle:

# Her 5 dakikada kontrol et
echo "*/5 * * * * root /usr/local/bin/wg-monitor.sh" | sudo tee /etc/cron.d/wg-monitor
sudo chmod 755 /usr/local/bin/wg-monitor.sh

Daha kapsamlı monitoring için Prometheus WireGuard Exporter kullanabilirsin. Bu exporter, peer başına handshake süresi, transfer byte sayısı ve allowed IP bilgilerini Prometheus formatında sunar. Grafana ile görselleştirmek oldukça yaygın bir tercih.

Güvenlik Tavsiyeleri

WireGuard’ı kurup çalıştırmak yeterli değil, birkaç önemli güvenlik pratiğini de uygulamak gerekiyor.

Anahtar Rotasyonu: Private key’leri düzenli aralıklarla (3-6 ayda bir) rotasyon yaparak yenile. Bunun için önce yeni anahtar çiftleri oluştur, peer’leri yeni public key ile güncelle, sonra eski config’i değiştir.

Minimal AllowedIPs: AllowedIPs alanında 0.0.0.0/0 kullanmaktan kaçın (full-tunnel modeli gerekmedikçe). Sadece gerçekten erişilmesi gereken ağları ekle.

Log Tutma: WireGuard kernel seviyesinde minimal log tutar, bu tasarımsal bir karar. Ancak uygulama katmanında bağlantı loglarını tutmak için flow log araçları kullanabilirsin.

Fail2ban Entegrasyonu: UDP tabanlı olduğundan klasik brute-force koruması çalışmaz. Ancak invalid handshake denemeleri için kernel log izleme yapabilirsin.

Fiziksel Güvenlik: Config dosyalarının ve private key dosyalarının izinleri her zaman 600 olmalı, backup’larını şifreli ortamda sakla.

Sonuç

WireGuard, peer-to-peer VPN kurulumu için gerçekten temiz ve modern bir çözüm sunuyor. Bu yazıda ele aldığımız adımları özetlersek: kurulum ve anahtar oluşturma oldukça hızlı tamamlanıyor, config dosyaları son derece okunabilir ve yönetilebilir, dinamik peer yönetimi sayesinde servis kesintisiz operasyonlar yapılabiliyor.

Hub-and-spoke senaryo için merkezi bir yapı kursak da WireGuard özünde mesh topolojisi destekliyor. Daha ileri aşamada her peer’in birbirini doğrudan tanıdığı full-mesh yapılandırmaları için wg-meshconf veya netmaker gibi araçları incelemenizi öneririm. Bunlar özellikle onlarca node’lu ortamlarda konfigürasyon yönetimini büyük ölçüde kolaylaştırıyor.

Üretim ortamına alırken mutlaka monitoring ekle, anahtar rotasyon politikası belirle ve firewall kurallarını minimum privilege prensibiyle yapılandır. WireGuard’ın sadeliği bazen “bu kadar mı?” dedirtebiliyor, ama o sadeliğin arkasında çok sağlam bir kriptografi ve kernel implementasyonu yatıyor. Güvende kalın.

Yorum yapın