WireGuard Loglama ve Sorun Giderme Rehberi

WireGuard kurulumu tamamlandı, tüneller ayağa kalktı, her şey güzel görünüyor. Sonra bir gün bağlantı kesiliyor, peer’lar birbirini bulamıyor ya da trafik bir türlü akış olmuyor. İşte o an başlıyor asıl macera. WireGuard’ın minimalist yapısı çoğu zaman avantaj olsa da sorun giderme söz konusu olduğunda sizi biraz düşündürebilir çünkü varsayılan olarak çok az log üretir. Bu yazıda WireGuard’da loglama mekanizmalarını nasıl aktif edeceğinizi, hangi araçlarla sorunları tespit edeceğinizi ve gerçek dünya senaryolarında nasıl çözüm üreteceğinizi ele alacağız.

WireGuard Loglama Mimarisi

WireGuard, kernel space’de çalışan bir modül olduğu için loglar doğrudan /var/log/syslog veya journald üzerinden gelir. Userspace implementasyonu olan wireguard-go ise biraz farklı davranır. Her iki durumu da ayrı ayrı ele almak gerekiyor.

Kernel modülü kullanan sistemlerde WireGuard loglarına şu komutla ulaşabilirsiniz:

# Kernel ring buffer'dan WireGuard loglarini filtrele
sudo dmesg | grep -i wireguard

# Gercek zamanli izleme icin
sudo dmesg -w | grep -i wireguard

# journald ile systemd servis loglarini goruntule
sudo journalctl -u wg-quick@wg0 -f

# Son 100 satiri goruntule
sudo journalctl -u wg-quick@wg0 -n 100 --no-pager

Varsayılan kurulumda WireGuard çok az log üretir. Bağlantı kurulumu, handshake hataları ve kritik kernel uyarıları gibi şeyler görürsünüz ama trafik detayları göremezsiniz. Bu yüzden debug loglama seviyesini aktif etmek gerekebilir.

Kernel Debug Loglamasını Aktif Etmek

WireGuard kernel modülü için dynamic debug özelliğini kullanabilirsiniz. Bu özellik, kernel’ın debug mesajlarını runtime’da açıp kapatmanıza izin verir.

# WireGuard debug loglamasini aktif et
echo "module wireguard +p" | sudo tee /sys/kernel/debug/dynamic_debug/control

# Sadece belirli dosyalar icin aktif et (ornegin handshake logları)
echo "file net/wireguard/handshake.c +p" | sudo tee /sys/kernel/debug/dynamic_debug/control

# Tum WireGuard debug mesajlarini gormek icin
echo "file net/wireguard/* +p" | sudo tee /sys/kernel/debug/dynamic_debug/control

# Debug loglamasini kapat
echo "module wireguard -p" | sudo tee /sys/kernel/debug/dynamic_debug/control

Bu komutu verdikten sonra dmesg -w ile izlemeye başlayın. Handshake denemeleri, şifreleme/şifre çözme işlemleri ve paket yönlendirme hakkında detaylı bilgi görmeye başlayacaksınız.

Dikkat: Production sistemlerde bu kadar verbose loglama disk I/O’sunu artırır ve performansı etkileyebilir. Test ortamında kullanın ya da kısa süreli tutun.

wg Komutu ile Anlık Durum İzleme

Sorun gidermenin ilk adımı her zaman mevcut durumu anlamaktır. wg komutu bu iş için biçilmiş kaftandır.

# Tum interface'lerin durumunu goster
sudo wg show

# Belirli bir interface icin
sudo wg show wg0

# Sadece peer bilgilerini goster
sudo wg show wg0 peers

# Son handshake zamanlarini goster (Unix timestamp)
sudo wg show wg0 latest-handshakes

# Transfer istatistiklerini goster
sudo wg show wg0 transfer

# Tum bilgileri JSON formatinda al (scripting icin)
sudo wg show wg0 dump

latest-handshakes çıktısına özellikle dikkat edin. Eğer bir peer’ın son handshake zamanı 180 saniyeden (3 dakika) fazlaysa veya hiç handshake yapılmamışsa, o peer ile bağlantı problemi var demektir. WireGuard her 180 saniyede bir handshake yeniler. Bu değerin üzerindeyse bağlantı kesilmiş ya da hiç kurulamamış demektir.

Gerçek Dünya Senaryosu 1: Peer Handshake Yapamıyor

En sık karşılaşılan sorunların başında peer’ların birbirini bulamaması gelir. Şöyle bir senaryo düşünün: VPN sunucunuz çalışıyor, istemci tarafından bağlanmaya çalışıyorsunuz ama wg show çıktısında latest-handshake alanı hep sıfır gösteriyor.

Sistematik bir yaklaşımla ilerleyelim:

# 1. Adim: Sunucu tarafinda port dinleniyor mu?
sudo ss -ulnp | grep 51820
# ya da
sudo netstat -ulnp | grep 51820

# 2. Adim: Firewall kurallari kontrol et
sudo iptables -L INPUT -n -v | grep 51820
sudo iptables -L FORWARD -n -v

# UFW kullananlar icin
sudo ufw status verbose

# 3. Adim: WireGuard interface aktif mi?
ip link show wg0
ip addr show wg0

# 4. Adim: Routing tablosunu kontrol et
ip route show table main
ip route show dev wg0

Eğer sunucu tarafında port açık ama bağlantı kurulamıyorsa, istemci tarafında tcpdump ile UDP paketlerini izleyin:

# Istemci tarafinda (giden paketleri izle)
sudo tcpdump -i eth0 -n "udp port 51820" -v

# Sunucu tarafinda (gelen paketleri izle)
sudo tcpdump -i eth0 -n "udp port 51820" -v

Eğer paketler sunucuya ulaşıyor ama cevap gelmiyorsa, büyük ihtimalle sunucunun WireGuard yapılandırmasında PublicKey veya AllowedIPs yanlış tanımlanmıştır. Eğer paketler hiç ulaşmıyorsa ağ seviyesinde bir engel var demektir.

Gerçek Dünya Senaryosu 2: Handshake Başarılı Ama Trafik Akışı Yok

Bu senaryo daha sinir bozucudur çünkü wg show çıktısında handshake başarılı görünüyor, ping bile atabiliyorsunuz ama belirli servisler çalışmıyor veya tüm trafik tünelden geçmiyor.

# WireGuard interface uzerinden ping dene
ping -I wg0 10.0.0.1

# Trafik sayaclarini izle (her 2 saniyede bir guncelle)
watch -n 2 'sudo wg show wg0 transfer'

# Routing'in dogru oldugunu dogrula
ip route get 8.8.8.8
# VPN uzerinden gitmesi gerekiyorsa ciktida "dev wg0" gormeliyiz

# AllowedIPs kontrolu - peer icin tanimlanan IP araligini goster
sudo wg show wg0 allowed-ips

AllowedIPs çok kritik bir kavramdır. Hem routing tablosu hem de basit bir firewall görevi görür. Eğer 0.0.0.0/0 yerine sadece 10.0.0.0/24 tanımladıysanız, internet trafiği tünelden geçmeyecektir.

IP forwarding sorunları da bu kategoride sık görülür:

# IP forwarding aktif mi kontrol et
cat /proc/sys/net/ipv4/ip_forward
# 1 olmasi lazim

# Aktif degilse gecici olarak aktif et
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

# Kalici hale getirmek icin
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

# IPv6 icin
cat /proc/sys/net/ipv6/conf/all/forwarding
echo "net.ipv6.conf.all.forwarding = 1" | sudo tee -a /etc/sysctl.conf

NAT yapılandırması da sık atlanan bir detaydır. VPN sunucunuz internet erişimi sağlıyorsa masquerade kuralı şart:

# NAT kurali ekle (eth0 yerine kendi interface adinizi yazin)
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# Mevcut NAT kurallarini kontrol et
sudo iptables -t nat -L -n -v

# iptables-persistent ile kaydet
sudo netfilter-persistent save

Loglama için Özel Script Geliştirme

Standart araçlar yetmediğinde kendi izleme scriptinizi yazabilirsiniz. Aşağıdaki script peer durumlarını sürekli izler ve handshake kesilmelerini raporlar:

#!/bin/bash
# wg-monitor.sh - WireGuard peer durumunu izle

INTERFACE="wg0"
LOG_FILE="/var/log/wg-monitor.log"
HANDSHAKE_TIMEOUT=300  # 5 dakika

log_message() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

while true; do
    # Her peer icin handshake zamanini kontrol et
    while IFS= read -r line; do
        PEER=$(echo "$line" | awk '{print $1}')
        LAST_HANDSHAKE=$(echo "$line" | awk '{print $2}')
        CURRENT_TIME=$(date +%s)
        
        if [ "$LAST_HANDSHAKE" -eq 0 ]; then
            log_message "UYARI: $PEER hic handshake yapmamis"
        elif [ $((CURRENT_TIME - LAST_HANDSHAKE)) -gt $HANDSHAKE_TIMEOUT ]; then
            ELAPSED=$((CURRENT_TIME - LAST_HANDSHAKE))
            log_message "UYARI: $PEER son handshake ${ELAPSED} saniye once (timeout: ${HANDSHAKE_TIMEOUT}s)"
        else
            log_message "OK: $PEER baglantisi aktif"
        fi
    done < <(sudo wg show "$INTERFACE" latest-handshakes)
    
    sleep 60
done

Bu scripti systemd servisi olarak çalıştırabilirsiniz:

# /etc/systemd/system/wg-monitor.service dosyasini olustur
sudo tee /etc/systemd/system/wg-monitor.service << 'EOF'
[Unit]
Description=WireGuard Monitor Service
[email protected]

[Service]
Type=simple
ExecStart=/usr/local/bin/wg-monitor.sh
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now wg-monitor

Gerçek Dünya Senaryosu 3: Aralıklı Bağlantı Kesintileri

Bu senaryo en çok zaman alan sorun türüdür. Bağlantı bazen çalışıyor, bazen çalışmıyor. Özellikle NAT arkasındaki istemcilerde yaygın görülür.

NAT traversal sorunları genellikle NAT tablosundaki bağlantı kayıtlarının zaman aşımına uğramasından kaynaklanır. Çözüm PersistentKeepalive parametresidir:

# Mevcut WireGuard yapilandirmasini goster
sudo wg showconf wg0

# Calistirma zamaninda keepalive ekle (kalici degil)
sudo wg set wg0 peer <PEER_PUBLIC_KEY> persistent-keepalive 25

# Yapılandirma dosyasina ekle (kalici)
# /etc/wireguard/wg0.conf icinde ilgili [Peer] bloguna:
# PersistentKeepalive = 25

PersistentKeepalive = 25 demek, 25 saniyede bir boş paket gönder demektir. Bu, NAT tablolarının süresi dolmadan önce bağlantıyı canlı tutar.

MTU sorunları da aralıklı bağlantı kesintilerine yol açabilir. Büyük paketler iletilirken sorun yaşanıyorsa MTU değerini kontrol edin:

# Mevcut MTU degerini goster
ip link show wg0 | grep mtu

# MTU sorununu test et (buyuk paket gonder)
ping -M do -s 1400 -I wg0 10.0.0.1

# Kucuk paketler calisiyor ama buyukler calismiyor mu?
ping -M do -s 1300 -I wg0 10.0.0.1
ping -M do -s 1400 -I wg0 10.0.0.1
ping -M do -s 1450 -I wg0 10.0.0.1

# MTU degerini manuel olarak ayarla
sudo ip link set mtu 1380 dev wg0

# wg-quick icin yapilandirma dosyasina ekle
# [Interface] bloguna:
# MTU = 1380

WireGuard genellikle 1420 MTU kullanır ancak bazı ISP’lerde veya tünel içinde tünel senaryolarında bu değeri düşürmeniz gerekebilir. 1280 minimum güvenli değer olarak kabul edilir.

Logrotate ile WireGuard Log Yönetimi

Özel log dosyaları oluşturduysanız bunları yönetmek için logrotate konfigürasyonu ekleyin:

# /etc/logrotate.d/wireguard dosyasini olustur
sudo tee /etc/logrotate.d/wireguard << 'EOF'
/var/log/wg-monitor.log {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    create 640 root adm
    postrotate
        systemctl restart wg-monitor 2>/dev/null || true
    endscript
}
EOF

# Logrotate'i test et
sudo logrotate -d /etc/logrotate.d/wireguard

Prometheus ve Grafana ile İzleme

Daha profesyonel bir izleme altyapısı istiyorsanız prometheus-wireguard-exporter kullanabilirsiniz:

# wireguard-exporter'i indir ve kur
wget https://github.com/MindFlavor/prometheus_wireguard_exporter/releases/download/3.6.6/prometheus_wireguard_exporter_linux_amd64
chmod +x prometheus_wireguard_exporter_linux_amd64
sudo mv prometheus_wireguard_exporter_linux_amd64 /usr/local/bin/wireguard_exporter

# Systemd servisi olustur
sudo tee /etc/systemd/system/wireguard-exporter.service << 'EOF'
[Unit]
Description=Prometheus WireGuard Exporter
[email protected]

[Service]
Type=simple
ExecStart=/usr/local/bin/wireguard_exporter -a 0.0.0.0:9586
Restart=always
User=root

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now wireguard-exporter

# Metriklerin geldigini dogrula
curl http://localhost:9586/metrics | grep wireguard

Bu exporter ile her peer için handshake zamanı, gönderilen/alınan byte sayısı gibi metrikleri Grafana üzerinde görselleştirebilirsiniz.

Sık Karşılaşılan Hata Mesajları ve Anlamları

WireGuard loglarında görebileceğiniz bazı önemli mesajlar ve ne anlama geldikleri şu şekilde özetlenebilir:

  • “Invalid handshake initiation”: Gelen handshake paketi doğrulanamadı. Büyük ihtimalle yanlış public key veya saat senkronizasyonu sorunu.
  • “Receiving keepalive packet”: Normal, PersistentKeepalive çalışıyor demek.
  • “Handshake for peer did not complete after 5 seconds”: Peer’a ulaşılamıyor veya peer cevap vermiyor.
  • “Too many failed handshakes”: Kısa sürede çok fazla başarısız handshake. Saldırı ya da yanlış yapılandırma olabilir.
  • “Interface gone down”: WireGuard interface’i kapandı.

Saat senkronizasyonu özellikle kritiktir çünkü WireGuard’ın handshake protokolü zaman tabanlı koruma mekanizmaları kullanır:

# Sistem saatini kontrol et
timedatectl status

# NTP senkronizasyonunu dogrula
chronyc tracking
# ya da
ntpq -p

# Saat farki fazlaysa zorla senkronize et
sudo chronyc makestep

İstemci ile sunucu arasında 3-5 dakikadan fazla saat farkı varsa handshake başarısız olabilir. Bu genellikle sanallaştırma ortamlarında veya uzun süre kapalı kalan makinelerde görülür.

Yapılandırma Doğrulama

Sorun gidermenin kritik bir adımı da yapılandırmanın syntax açısından doğru olduğunu teyit etmektir:

# wg-quick ile yapilandirmayı test et (uygulamadan once)
sudo wg-quick strip wg0
# Bu komut yapilandirmayi isler ve gerekli kisimlarini gosterir

# Konfigurasyonu geri yukle (sifirlama)
sudo wg syncconf wg0 <(sudo wg-quick strip wg0)

# Interface'i tamamen yeniden baslat
sudo wg-quick down wg0 && sudo wg-quick up wg0

# Tum WireGuard yapilandirmalarini listele
ls -la /etc/wireguard/

# Dosya izinlerini kontrol et (0600 olmali)
stat /etc/wireguard/wg0.conf

/etc/wireguard/wg0.conf dosyasının izinleri 0600 olmalıdır. Eğer başka bir kullanıcı okuyabiliyorsa private key tehlikeye girmiş olabilir ve WireGuard da bu durumda uyarı verir.

Sonuç

WireGuard’ın sadeliği hem güç hem de sorun gidermede ekstra dikkat gerektiren bir özellik. Diğer VPN çözümlerinin aksine onlarca log satırı üretmediği için başlangıçta ne olduğunu anlamak zor gelebilir. Ancak doğru araçları ve sistematik yaklaşımı bir araya getirince her sorunu çözebilirsiniz.

Özetleyecek olursak: wg show ile durumu anlayın, dmesg ve journalctl ile kernel mesajlarını takip edin, gerektiğinde dynamic debug modunu açın. Handshake olmayan bir peer gördüğünüzde önce firewall, sonra routing, sonra yapılandırma sırasıyla kontrol edin. Aralıklı kesintilerde MTU ve PersistentKeepalive’ı inceleyin. Saat senkronizasyonunu asla göz ardı etmeyin.

Production ortamlarınız için mutlaka bir izleme scripti ya da Prometheus exporter kullanın. Sorun oluştuktan sonra değil, oluşmadan önce haberdar olmak her zaman daha iyidir. WireGuard minimal yapısıyla güvenilir bir araç ama onu en iyi şekilde yönetmek sizin elinizde.

Yorum yapın