WireGuard ile Kill Switch Yapılandırması

VPN bağlantısı kesildiğinde trafiğinizin açıkta kalması, özellikle güvenlik odaklı ortamlarda ciddi bir sorun haline gelir. Bir pentester sahadan bağlanıyor, bir gazeteciyle hassas iletişim kuruyorsunuz ya da kurumsal ağınıza uzaktan erişen çalışanlarınız var; WireGuard tüneli düşerse ne olur? İşte tam bu noktada kill switch devreye girer.

Kill switch, VPN bağlantısı koptuğunda tüm ağ trafiğini engelleyen bir mekanizmadır. WireGuard’ın kendisi bu özelliği yerleşik olarak sunmaz ama Linux’un iptables, nftables ve routing mekanizmaları ile bunu son derece temiz ve güvenilir şekilde kurgulamak mümkündür. Bu yazıda hem Linux hem de Windows tarafında kill switch yapılandırmasını ele alacağız, gerçek dünya senaryolarıyla destekleyeceğiz.

Kill Switch Neden Önemli?

Standart bir WireGuard kurulumunda tünel düştüğünde trafik otomatik olarak fiziksel arayüzünüzden akmaya devam eder. Bu durum IP sızıntısı (IP leak) olarak bilinir. DNS sorgularınız, bağlantı istekleriniz, kısacası her şey gerçek IP adresinizle internete çıkar.

Özellikle şu senaryolarda bu durum kabul edilemezdir:

  • Kurumsal VPN üzerinden bağlanan uzak çalışanlar
  • Güvenli iletişim gerektiren gazeteciler veya aktivistler
  • Penetrasyon testi yapan güvenlik araştırmacıları
  • Torrent veya P2P uygulamalarını VPN üzerinden çalıştıranlar
  • Çok kiracılı (multi-tenant) sunucu ortamları

Kill switch olmadan VPN “güvenli görünür ama değildir” tuzağına düşmek işten bile değildir.

Linux’ta Temel Kill Switch: iptables ile

En yaygın yöntem, WireGuard arayüzü dışından gelen/giden trafiği iptables ile engellemektir. Önce klasik yöntemi görelim, sonra daha modern alternatiflere geçeceğiz.

Manuel iptables Kuralları

# Önce mevcut kuralları temizleyelim (dikkatli olun, aktif bağlantılar düşebilir)
iptables -F
iptables -X

# Varsayılan politikaları DROP olarak ayarla
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

# Loopback trafiğine izin ver
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# WireGuard UDP portuna izin ver (sunucuya bağlanabilmek için)
iptables -A OUTPUT -p udp --dport 51820 -j ACCEPT
iptables -A INPUT -p udp --sport 51820 -j ACCEPT

# WireGuard arayüzü (wg0) üzerinden geçen trafiğe izin ver
iptables -A INPUT -i wg0 -j ACCEPT
iptables -A OUTPUT -o wg0 -j ACCEPT

# Mevcut bağlantıların devamına izin ver
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Bu kurallar işe yarar ama sorun şu: Makineyi yeniden başlattığınızda kaybolurlar. Kalıcı hale getirmek için iptables-persistent kullanın:

# Debian/Ubuntu sistemlerde
apt install iptables-persistent -y

# Kuralları kaydet
netfilter-persistent save

# Servisi etkinleştir
systemctl enable netfilter-persistent

WireGuard PostUp/PreDown ile Entegrasyon

En temiz yöntem, kill switch kurallarını doğrudan WireGuard konfigürasyon dosyasına gömmektir. Böylece WireGuard arayüzü kalktığında kurallar otomatik aktif olur, düştüğünde temizlenir.

[Interface]
Address = 10.0.0.2/32
PrivateKey = <CLIENT_PRIVATE_KEY>
DNS = 10.0.0.1

# Kill switch: wg0 kalktığında kuralları ekle
PostUp = iptables -I OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT
PostUp = ip6tables -I OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT

# wg0 düştüğünde kuralları temizle
PreDown = iptables -D OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT
PreDown = ip6tables -D OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT

[Peer]
PublicKey = <SERVER_PUBLIC_KEY>
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = 203.0.113.1:51820
PersistentKeepalive = 25

Bu konfigürasyonda %i WireGuard’ın kendi arayüz adını otomatik olarak yerine koyduğu bir değişkendir. fwmark kullanımı ise WireGuard’ın kendi trafiğini tanıması için kullandığı firewall işaretleme mekanizmasından yararlanır; bu sayede VPN sunucusuna giden UDP paketleri engellenmez.

nftables ile Modern Kill Switch

nftables, iptables’ın modern halefidir ve çoğu güncel dağıtımda varsayılan olarak kullanılır. Fedora, RHEL 8+, Debian 10+ gibi sistemlerde nftables tercih edilir.

# /etc/nftables-killswitch.conf dosyası oluşturun

cat > /etc/nftables-killswitch.conf << 'EOF'
table inet killswitch {
    chain output {
        type filter hook output priority 0; policy drop;

        # Loopback izin ver
        oif lo accept

        # WireGuard arayüzüne izin ver
        oif wg0 accept

        # WireGuard sunucusuna UDP bağlantısına izin ver
        udp dport 51820 accept

        # Mevcut bağlantılara izin ver
        ct state established,related accept
    }

    chain input {
        type filter hook input priority 0; policy drop;

        # Loopback izin ver
        iif lo accept

        # WireGuard arayüzünden gelen trafiğe izin ver
        iif wg0 accept

        # WireGuard sunucusundan gelen UDP'ye izin ver
        udp sport 51820 accept

        # Mevcut bağlantılara izin ver
        ct state established,related accept
    }
}
EOF

# Kuralları yükle
nft -f /etc/nftables-killswitch.conf

# Systemd ile kalıcı hale getir
systemctl enable nftables

nftables’ı WireGuard PostUp ile Entegre Etmek

[Interface]
Address = 10.0.0.2/32
PrivateKey = <CLIENT_PRIVATE_KEY>
DNS = 10.0.0.1

PostUp = nft add table inet killswitch; nft add chain inet killswitch output { type filter hook output priority 0 ; policy drop ; }; nft add rule inet killswitch output oif lo accept; nft add rule inet killswitch output oif %i accept; nft add rule inet killswitch output udp dport 51820 accept; nft add rule inet killswitch output ct state established,related accept
PreDown = nft delete table inet killswitch

[Peer]
PublicKey = <SERVER_PUBLIC_KEY>
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = 203.0.113.1:51820
PersistentKeepalive = 25

DNS Sızıntısı Koruması

Kill switch koymuş olmanız DNS sızıntısını otomatik olarak engellemez. WireGuard tüneli aktif olsa bile işletim sistemi DNS sorgularını farklı bir arayüzden gönderebilir. Bunu önlemek için birkaç yöntem vardır.

systemd-resolved ile DNS Kilitleme

# /etc/systemd/resolved.conf dosyasını düzenleyin
cat > /etc/systemd/resolved.conf << EOF
[Resolve]
DNS=10.0.0.1
FallbackDNS=
DNSOverTLS=yes
DNSSEC=yes
EOF

systemctl restart systemd-resolved

WireGuard konfigürasyonunuza da bunu ekleyin:

[Interface]
Address = 10.0.0.2/32
PrivateKey = <CLIENT_PRIVATE_KEY>
DNS = 10.0.0.1
# DNS sorgularını sadece wg0 üzerinden yönlendir
PostUp = resolvectl dns %i 10.0.0.1; resolvectl domain %i "~."
PreDown = resolvectl revert %i

"~." parametresi tüm alan adı sorgularının bu arayüz üzerinden yapılması gerektiğini belirtir; bu, DNS leak korumasının kritik parçasıdır.

iptables ile DNS Sızıntısı Önleme

# wg0 dışına giden DNS trafiğini engelle
iptables -A OUTPUT ! -o wg0 -p udp --dport 53 -j REJECT
iptables -A OUTPUT ! -o wg0 -p tcp --dport 53 -j REJECT

# Sadece VPN DNS sunucusuna izin ver
iptables -A OUTPUT -o wg0 -d 10.0.0.1 -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -o wg0 -d 10.0.0.1 -p tcp --dport 53 -j ACCEPT

Çoklu WireGuard Tüneli Senaryosu

Birden fazla WireGuard tüneli çalıştırıyorsanız (örneğin hem kurumsal VPN hem de kişisel gizlilik tüneli) kill switch mantığını buna göre adapte etmeniz gerekir.

# /usr/local/bin/wg-killswitch.sh betiği

#!/bin/bash

WG_INTERFACES=("wg0" "wg1")
VPN_ENDPOINTS=("203.0.113.1" "198.51.100.1")
VPN_PORTS=("51820" "51821")

enable_killswitch() {
    # Tüm çıkış trafiğini engelle
    iptables -P OUTPUT DROP
    iptables -P INPUT DROP

    # Loopback izin ver
    iptables -A INPUT -i lo -j ACCEPT
    iptables -A OUTPUT -o lo -j ACCEPT

    # Her VPN tüneli için kural ekle
    for i in "${!WG_INTERFACES[@]}"; do
        iface="${WG_INTERFACES[$i]}"
        endpoint="${VPN_ENDPOINTS[$i]}"
        port="${VPN_PORTS[$i]}"

        # VPN endpoint'ine bağlantı
        iptables -A OUTPUT -d "$endpoint" -p udp --dport "$port" -j ACCEPT
        iptables -A INPUT -s "$endpoint" -p udp --sport "$port" -j ACCEPT

        # Tünel üzerinden trafik
        iptables -A OUTPUT -o "$iface" -j ACCEPT
        iptables -A INPUT -i "$iface" -j ACCEPT
    done

    # Established bağlantılar
    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

    echo "Kill switch etkinlestirildi."
}

disable_killswitch() {
    iptables -P INPUT ACCEPT
    iptables -P OUTPUT ACCEPT
    iptables -F
    echo "Kill switch devre disi birakildi."
}

case "$1" in
    enable)  enable_killswitch ;;
    disable) disable_killswitch ;;
    *)       echo "Kullanim: $0 {enable|disable}" ;;
esac
chmod +x /usr/local/bin/wg-killswitch.sh

Systemd Servis Entegrasyonu

Kill switch’i systemd servisi olarak tanımlamak, önyükleme sırasında ve WireGuard öncesinde devreye girmesini sağlar:

# /etc/systemd/system/wg-killswitch.service

[Unit]
Description=WireGuard Kill Switch
[email protected]
Wants=network.target
After=network.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/bin/wg-killswitch.sh enable
ExecStop=/usr/local/bin/wg-killswitch.sh disable

[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable wg-killswitch.service
systemctl start wg-killswitch.service

# WireGuard'ı kill switch'in ardından başlat
systemctl start wg-quick@wg0

Windows’ta WireGuard Kill Switch

Windows tarafında WireGuard’ın resmi istemcisi AllowedIPs = 0.0.0.0/0 tanımlandığında Windows Firewall üzerinden otomatik bir kill switch mekanizması oluşturur. Ancak bu her zaman yeterli değildir.

Windows Defender Firewall ile PowerShell üzerinden daha sağlam bir kill switch kurabilirsiniz:

# WireGuard kill switch - PowerShell betiği
# Yönetici olarak çalıştırın

# WireGuard arayüzü dışından gelen trafiği engelle
New-NetFirewallRule -DisplayName "WireGuard Kill Switch - Block All" `
    -Direction Outbound `
    -Action Block `
    -Enabled True `
    -Profile Any `
    -InterfaceType Any

# WireGuard tüneline izin ver
New-NetFirewallRule -DisplayName "WireGuard Kill Switch - Allow WG" `
    -Direction Outbound `
    -Action Allow `
    -Enabled True `
    -Profile Any `
    -InterfaceAlias "WireGuard Tunnel" `
    -Protocol Any

# VPN sunucusuna UDP bağlantısına izin ver
New-NetFirewallRule -DisplayName "WireGuard Kill Switch - Allow WG Endpoint" `
    -Direction Outbound `
    -Action Allow `
    -Enabled True `
    -Profile Any `
    -Protocol UDP `
    -RemotePort 51820

# Loopback'e izin ver
New-NetFirewallRule -DisplayName "WireGuard Kill Switch - Allow Loopback" `
    -Direction Outbound `
    -Action Allow `
    -Enabled True `
    -Profile Any `
    -InterfaceAlias "Loopback Pseudo-Interface 1"

Write-Host "Kill switch etkinlestirildi." -ForegroundColor Green

Kill Switch Test Prosedürü

Kill switch kurulduktan sonra doğrulamak kritik önemdedir. Şu test senaryolarını uygulayın:

# 1. VPN aktifken IP adresini kontrol et
curl -s https://api.ipify.org
# VPN IP'si görünmeli

# 2. WireGuard'ı kapat ve hemen IP test et
wg-quick down wg0 && curl --max-time 5 -s https://api.ipify.org
# Bu istek zaman aşımına uğramalı veya bağlantı reddedilmeli

# 3. DNS sızıntısı testi
wg-quick up wg0
dig +short myip.opendns.com @resolver1.opendns.com
# Sadece VPN IP'si görmeli

# 4. IPv6 sızıntı testi
curl -6 --max-time 5 https://api6.ipify.org
# Hata vermeli (IPv6 koruması varsa)

# 5. iptables kurallarını doğrula
iptables -L OUTPUT -n --line-numbers
# Daha kapsamlı test için tcpdump kullan
# wg0 dışından çıkan trafiği izle
tcpdump -i eth0 -n 'not host 203.0.113.1' &
sleep 3
curl -s https://example.com
# tcpdump çıktısında yalnızca VPN endpoint trafiği görünmeli

Gerçek Dünya Senaryosu: Güvenli Uzak Çalışan Ortamı

Bir şirkette 50 uzak çalışanınız var ve tamamının kurumsal kaynaklara VPN üzerinden erişmesi gerekiyor. Kill switch olmadan bir çalışan VPN düştüğünde farkında olmadan hassas dökümanları şifresiz ağ üzerinden indirmiş olabilir.

Bu senaryoda izlenecek yol:

# Merkezi konfigürasyon şablonu oluştur
# /etc/wireguard/templates/client.conf

[Interface]
Address = 10.10.0.{CLIENT_ID}/24
PrivateKey = {CLIENT_PRIVATE_KEY}
DNS = 10.10.0.1
PostUp = iptables -I OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT
PostUp = ip6tables -I OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT
PreDown = iptables -D OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT
PreDown = ip6tables -D OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT

[Peer]
PublicKey = {SERVER_PUBLIC_KEY}
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = vpn.sirket.com:51820
PersistentKeepalive = 25

PersistentKeepalive = 25 değeri, NAT arkasındaki bağlantıların canlı kalmasını sağlar ve gereksiz kopmaların önüne geçer; bu da kill switch’in yanlış tetiklenmesini azaltır.

Sık Karşılaşılan Sorunlar ve Çözümleri

Kill switch aktifken LAN erişimi kaybolması:

# Yerel ağa erişimi koru
LOCAL_NETWORK="192.168.1.0/24"
iptables -A OUTPUT -d "$LOCAL_NETWORK" -j ACCEPT
iptables -A INPUT -s "$LOCAL_NETWORK" -j ACCEPT

PostUp kuralları wg-quick restart sonrası çakışması:

# Kural eklemeden önce varsa sil (idempotent yaklaşım)
PostUp = iptables -D OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT 2>/dev/null; iptables -I OUTPUT ! -o %i -m mark ! --mark $(wg show %i fwmark) -m addrtype ! --dst-type LOCAL -j REJECT

IPv6 devre dışı bırakma (IPv6 koruması yoksa):

# Geçici
sysctl -w net.ipv6.conf.all.disable_ipv6=1

# Kalıcı
echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.conf
sysctl -p

Sonuç

Kill switch, WireGuard kurulumunun vazgeçilmez bir parçasıdır; VPN değil, VPN + kill switch bir bütündür. Temel iptables kurallarından nftables’a, PostUp/PreDown entegrasyonundan systemd servislerine kadar ele aldığımız yöntemlerin hepsi farklı ihtiyaçlara yanıt verir.

Kişisel kullanım için WireGuard konfigürasyon dosyasına gömülü PostUp/PreDown yöntemi en pratik çözümdür. Kurumsal ortamlarda ise systemd servis entegrasyonu ve merkezi konfigürasyon şablonları tercih edilmelidir. Her iki durumda da DNS sızıntısı korumasını ihmal etmeyin; kill switch kusursuz çalışsa bile DNS sorguları gerçek konumunuzu ele verebilir.

Test aşamasını atlamayın. Kill switch kurulumunun işe yaradığını düşünmek ile gerçekten çalıştığını doğrulamak arasında ciddi bir fark vardır. tcpdump, curl ve dig üçlüsü ile düzenli aralıklarla doğrulama yapın ve bu testleri otomasyona dahil edin.

Yorum yapın