WireGuard ile Mobil İstemci Yapılandırması

Ofiste masaüstü bilgisayardan VPN’e bağlanmak kolaydır; bir config dosyası, birkaç komut ve iş biter. Ama iş telefona gelince durum biraz karmaşıklaşıyor. Farklı ağlar, NAT arkasındaki cihazlar, pil tüketimi kaygıları ve üstüne bir de “neden bağlanamıyorum?” soruları… Bu yazıda WireGuard ile Android ve iOS cihazları yapılandırmayı, yaygın sorunları çözmeyi ve gerçek dünyada işe yarayan konfigürasyonları ele alacağım.

Temelden Başlayalım: WireGuard Mobil Mantığı

WireGuard’ın masaüstü ve mobil arasındaki en büyük farkı roaming desteğidir. Telefon Wi-Fi’den 4G’ye geçtiğinde, yani IP adresi değiştiğinde, WireGuard bağlantıyı kesmeden devam ettirebilir. Bu özellik klasik OpenVPN’de yoktur ve bu yüzden WireGuard mobil kullanım için özellikle güçlü bir tercih.

Ama bu avantajı kullanabilmek için sunucu tarafının doğru yapılandırılmış olması gerekiyor. Sunucunuzu daha önce sadece masaüstü istemciler için kurduysanız, birkaç ek ayar yapmanız gerekebilir.

Sunucu Hazırlığı

Önce sunucu tarafının mobil istemcilere hazır olduğundan emin olalım. Aşağıdaki adımlar Ubuntu/Debian bazlı sistemler için geçerli, ama mantık her dağıtımda aynı.

# WireGuard kurulu değilse
apt update && apt install wireguard -y

# Sunucu anahtar çifti oluştur
cd /etc/wireguard
wg genkey | tee server_private.key | wg pubkey > server_public.key
chmod 600 server_private.key

# Değerleri görelim
cat server_private.key
cat server_public.key

Sunucu konfigürasyonu /etc/wireguard/wg0.conf dosyasına yazılır. Mobil istemcileri düşünerek yapılandırırken DNS ayarlarına ve MTU değerine dikkat etmek gerekiyor:

cat > /etc/wireguard/wg0.conf << 'EOF'
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = SUNUCU_PRIVATE_KEY_BURAYA
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
MTU = 1420

# Android istemci - ilk kayit
[Peer]
PublicKey = ANDROID_PUBLIC_KEY_BURAYA
AllowedIPs = 10.0.0.2/32

# iOS istemci
[Peer]
PublicKey = IOS_PUBLIC_KEY_BURAYA
AllowedIPs = 10.0.0.3/32
EOF

MTU = 1420 değeri mobil bağlantılarda özellikle önemli. Mobil operatörlerin bazıları düşük MTU kullanır ve bu değeri ayarlamazsanız büyük paketler parçalanır, bağlantı yavaşlar ya da tutarsız çalışır.

IP forwarding’i aktif etmeyi unutmayın:

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf
sysctl -p

Android İstemci Yapılandırması

Yöntem 1: Manuel Konfigürasyon

Android tarafında önce WireGuard uygulamasını Google Play Store’dan ya da F-Droid üzerinden indirin. F-Droid versiyonu açık kaynaklı ve daha güvenilir bir seçenek.

Uygulama üzerinden manuel olarak tunnel ekleyebilirsiniz ama uzun anahtar dizilerini telefonda yazmak bir kabus. Bu yüzden config dosyasını sunucuda oluşturup QR kod ile aktarmak çok daha pratik.

Önce Android için anahtar çifti oluşturalım. Bunu sunucuda yapabiliriz:

# Android istemci anahtarlarini sunucuda olustur
cd /tmp
wg genkey | tee android_private.key | wg pubkey > android_public.key

echo "Android Private Key:"
cat android_private.key
echo ""
echo "Android Public Key:"
cat android_public.key

Şimdi Android için tam config dosyasını oluşturalım:

cat > /tmp/android_client.conf << EOF
[Interface]
PrivateKey = $(cat /tmp/android_private.key)
Address = 10.0.0.2/24
DNS = 1.1.1.1, 8.8.8.8
MTU = 1420

[Peer]
PublicKey = $(cat /etc/wireguard/server_public.key)
Endpoint = SUNUCU_IP_VEYA_DOMAIN:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
EOF

PersistentKeepalive = 25 ayarı mobil bağlantılarda kritik. Telefon uyku moduna geçtiğinde veya ağ geçişi yaparken NAT tabloları boşalır. Bu ayar her 25 saniyede bir küçük bir paket göndererek bağlantıyı canlı tutar. Pil tüketimini biraz artırır ama bağlantı kararlılığı için değer.

Yöntem 2: QR Kod ile Aktarım

Config dosyasını QR koda çevirmek için qrencode aracını kullanacağız:

# qrencode kurulumu
apt install qrencode -y

# QR kodu terminalde goster
qrencode -t ansiutf8 < /tmp/android_client.conf

# Ya da PNG dosyasi olarak kaydet
qrencode -o /tmp/android_qr.png < /tmp/android_client.conf

# Dosyayi yerel makinene kopyala
scp kullanici@sunucu_ip:/tmp/android_qr.png ./

Sonra WireGuard uygulamasında “+” butonuna basın, “QR kodundan tara” seçeneğini seçin ve kamerayı terminaldeki QR koda tutun. Birkaç saniye içinde tünel yapılandırılmış olur.

Güvenlik notu: QR kodu ürettikten sonra geçici dosyaları silmeyi unutmayın:

rm -f /tmp/android_private.key /tmp/android_public.key /tmp/android_client.conf /tmp/android_qr.png

Android’e Özgü Ayarlar

WireGuard Android uygulamasında bazı ekstra ayarlar var. Bunlara uygulama içindeki tunnel ayarlarından ulaşabilirsiniz:

  • Split tunneling: Hangi uygulamaların VPN üzerinden gideceğini belirleme. Örneğin sadece bankacılık uygulamaları için VPN kullanmak isteyebilirsiniz.
  • Kill switch: VPN bağlantısı kesilirse interneti de kes. Android 8+ üzerinde desteklenir.
  • Exclude private IPs: Yerel ağ trafiğini VPN’den hariç tut.

iOS İstemci Yapılandırması

iOS tarafı Android’e çok benziyor ama birkaç fark var. App Store’dan WireGuard uygulamasını indirin.

# iOS istemci anahtarlarini olustur
cd /tmp
wg genkey | tee ios_private.key | wg pubkey > ios_public.key

# iOS config dosyasi
cat > /tmp/ios_client.conf << EOF
[Interface]
PrivateKey = $(cat /tmp/ios_private.key)
Address = 10.0.0.3/24
DNS = 1.1.1.1
MTU = 1280

[Peer]
PublicKey = $(cat /etc/wireguard/server_public.key)
Endpoint = SUNUCU_IP_VEYA_DOMAIN:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
EOF

# QR kod olustur
qrencode -t ansiutf8 < /tmp/ios_client.conf

iOS için MTU = 1280 değerini öneririm. Apple’ın ağ yığını bazı durumlarda daha küçük paketleri tercih eder ve bu değer tutarsız bağlantı sorunlarını çözer.

iOS’ta dikkat edilmesi gereken bir nokta: uygulama arka plana atıldığında WireGuard bağlantısı durabilir. Bu iOS’un arka plan uygulama kısıtlamalarından kaynaklanıyor. Bunu tamamen çözmek mümkün değil ama On-Demand özelliği ile belirli koşullarda otomatik bağlanmasını sağlayabilirsiniz.

iOS On-Demand ayarı uygulama içinden şöyle yapılır: Tunnel ayarlarına girip “On-Demand Activation” bölümünden Wi-Fi veya hücresel ağ koşullarını belirleyebilirsiniz. Örneğin “Güvenilmeyen Wi-Fi ağlarında otomatik bağlan” gibi kurallar oluşturabilirsiniz.

Çoklu Cihaz Yönetimi: Gerçek Dünya Senaryosu

Diyelim ki bir şirketiniz var ve 20 çalışanınızın hem iş laptopu hem de telefonu için VPN erişimi sağlayacaksınız. Her cihaz için ayrı ayrı key üretmek ve sunucu config’ini güncellemek yorucu olur. Bunun için küçük bir bash script yazalım:

#!/bin/bash
# wireguard_add_mobile.sh
# Kullanim: ./wireguard_add_mobile.sh kullanici_adi cihaz_tipi

KULLANICI=$1
CIHAZ=$2
WG_CONF="/etc/wireguard/wg0.conf"
CIKAR_DIR="/tmp/wg_clients"
SUNUCU_IP="sunucu.example.com"
SUNUCU_PORT="51820"

mkdir -p $CIKAR_DIR

# Mevcut son IP'yi bul, bir sonrakini ata
SON_IP=$(grep -oP 'AllowedIPs = 10.0.0.K[0-9]+' $WG_CONF | sort -n | tail -1)
YENI_OKTET=$((SON_IP + 1))
YENI_IP="10.0.0.${YENI_OKTET}"

# Anahtar ciftini olustur
PRIVATE_KEY=$(wg genkey)
PUBLIC_KEY=$(echo $PRIVATE_KEY | wg pubkey)

# Config dosyasini olustur
CONFIG_DOSYA="$CIKAR_DIR/${KULLANICI}_${CIHAZ}.conf"

SUNUCU_PUB=$(cat /etc/wireguard/server_public.key)

cat > $CONFIG_DOSYA << EOF
[Interface]
PrivateKey = $PRIVATE_KEY
Address = $YENI_IP/24
DNS = 1.1.1.1, 8.8.8.8
MTU = 1420

[Peer]
PublicKey = $SUNUCU_PUB
Endpoint = $SUNUCU_IP:$SUNUCU_PORT
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
EOF

# Sunucu config'ine peer ekle
cat >> $WG_CONF << EOF

# $KULLANICI - $CIHAZ - $(date +%Y-%m-%d)
[Peer]
PublicKey = $PUBLIC_KEY
AllowedIPs = $YENI_IP/32
EOF

# WireGuard'i yeniden yukle (baglantilari kesmeden)
wg addconf wg0 <(wg-quick strip wg0)
wg set wg0 peer $PUBLIC_KEY allowed-ips $YENI_IP/32

# QR kodu olustur
apt-get install -y qrencode > /dev/null 2>&1
qrencode -o "$CIKAR_DIR/${KULLANICI}_${CIHAZ}_qr.png" < $CONFIG_DOSYA

echo "Islem tamamlandi!"
echo "Kullanici: $KULLANICI"
echo "Cihaz: $CIHAZ"
echo "Atanan IP: $YENI_IP"
echo "Config: $CONFIG_DOSYA"
echo "QR Kod: $CIKAR_DIR/${KULLANICI}_${CIHAZ}_qr.png"

Bu script ile yeni bir mobil istemci eklemek tek satıra iniyor:

chmod +x wireguard_add_mobile.sh
./wireguard_add_mobile.sh ahmet_yilmaz android
./wireguard_add_mobile.sh fatma_kaya ios

Bağlantı Sorunlarını Giderme

“Handshake yok” Sorunu

Mobil cihaz bağlantı kuramıyorsa ilk bakılacak yer handshake durumu:

# Sunucuda aktif baglantilari izle
watch -n 1 'wg show wg0'

# Sadece handshake zamanlarini goster
wg show wg0 latest-handshakes

# Paket istatistiklerini kontrol et
wg show wg0 transfer

Eğer “latest-handshake” değeri sürekli 0 ya da çok eski bir zaman gösteriyorsa:

  • Sunucu firewall kurallarını kontrol edin (UDP 51820 açık mı?)
  • Endpoint IP/domain adresinin doğru olduğunu doğrulayın
  • Public key değerlerinin eşleştiğini kontrol edin
# Firewall durumunu kontrol et
ufw status | grep 51820
# veya
iptables -L -n | grep 51820

# UFW ile portu ac
ufw allow 51820/udp

DNS Sızıntısı Kontrolü

Mobil cihazdan VPN’e bağlandıktan sonra DNS sorgularının VPN üzerinden gittiğini doğrulamak için:

# Sunucuda DNS sorgularini izle (tcpdump ile)
tcpdump -i wg0 port 53 -n

# Android/iOS'ta tarayicidan dns leak test sitelerine bakabilirsiniz
# dnsleaktest.com veya ipleak.net

Eğer DNS sızıntısı varsa istemci config’indeki DNS satırını kontrol edin. Bazen AllowedIPs değerini 0.0.0.0/0 yerine sadece kurumsal subnet’e sınırlarsanız DNS trafiği VPN dışında kalabilir.

MTU Sorunları

Büyük dosyaları indirirken veya video akışında sorun yaşıyorsanız MTU muhtemelen yanlış ayarlanmış. Bunu test etmek için:

# VPN tünel üzerinden ping ile MTU testi
# Sunucudan istemciye dogru boyuttaki paket gonder
ping -M do -s 1400 10.0.0.2

# Sonucu iteratif olarak dusur
ping -M do -s 1300 10.0.0.2
ping -M do -s 1200 10.0.0.2

“Frag needed” hatası almadan geçen en büyük değer + 28 (header boyutu) sizin MTU değeriniz olmalı.

Split Tunneling: Sadece Şirket Trafiği VPN’den Gitsin

Tüm trafiği VPN üzerinden göndermek pil tüketimini ve sunucu yükünü artırır. Çoğu kurumsal kullanımda sadece belirli ağların VPN’den gitmesi yeterli:

# Sadece belirli subnetlere yon ver
# Ornegin sirket ic agi 192.168.1.0/24 ise

cat > /tmp/split_tunnel_client.conf << EOF
[Interface]
PrivateKey = ISTEMCI_PRIVATE_KEY
Address = 10.0.0.5/24
DNS = 10.0.0.1
MTU = 1420

[Peer]
PublicKey = SUNUCU_PUBLIC_KEY
Endpoint = sunucu.example.com:51820
AllowedIPs = 10.0.0.0/24, 192.168.1.0/24, 172.16.0.0/12
PersistentKeepalive = 25
EOF

Bu konfigürasyonla telefon internete direkt bağlanırken sadece şirket ağına giden trafik VPN tünelinden geçer. Hem pil ömrü korunur hem de sunucu bant genişliği daha verimli kullanılır.

Systemd ile Otomatik Yönetim

Sunucunuz her yeniden başladığında WireGuard’ın otomatik başlamasını sağlayın:

# WireGuard servisini etkinlestir
systemctl enable wg-quick@wg0
systemctl start wg-quick@wg0
systemctl status wg-quick@wg0

# Logları takip et
journalctl -u wg-quick@wg0 -f

# Konfigürasyon değişikliklerini uygula (bağlantıları kesmeden)
wg syncconf wg0 <(wg-quick strip /etc/wireguard/wg0.conf)

wg syncconf komutu çok değerli. Özellikle yeni peer eklerken servisi yeniden başlatmak yerine bu komutla değişiklikleri canlı olarak uygulayabilirsiniz. Mevcut bağlantılar kesilmez.

Güvenlik İçin Ek Önlemler

Mobil cihazlar sıklıkla farklı ağlara bağlandığından güvenlik katmanını sağlamlaştırmak önemli:

# Sunucuda sadece taninan peer'lara izin ver
# Her peer icin AllowedIPs'i kesinlikle /32 ile sinirlandir
# Boylece bir istemci baska bir istemcinin IP'sini taklit edemez

# Ornek: yanlis yapilandirma
# AllowedIPs = 10.0.0.0/24  <-- BU YANLIS, tum ic agi taklit edebilir

# Dogru yapilandirma
# AllowedIPs = 10.0.0.2/32  <-- SADECE bu IP

# Sunucu uzerindeki peer listesini periyodik kontrol
wg show wg0 peers
wg show wg0 allowed-ips

Ayrıca artık kullanılmayan peer’ları düzenli temizleyin:

# Peer kaldirma (dinamik olarak, servis yeniden baslatmadan)
PUBLIC_KEY="kaldirmak_istedigin_public_key"
wg set wg0 peer $PUBLIC_KEY remove

# Ayni zamanda /etc/wireguard/wg0.conf dosyasindan da ilgili bolumu sil

Performans İzleme

Birçok mobil istemci bağlandığında sunucu performansını izlemek için:

#!/bin/bash
# wg_monitor.sh - WireGuard baglanti izleme

echo "=== WireGuard Baglantilar ==="
echo "Aktif peer sayisi: $(wg show wg0 peers | wc -l)"
echo ""

echo "=== Son Handshake Zamanlari ==="
wg show wg0 latest-handshakes | while read peer time; do
    if [ "$time" -gt 0 ]; then
        GECEN=$(( $(date +%s) - $time ))
        if [ $GECEN -lt 180 ]; then
            DURUM="AKTIF"
        else
            DURUM="PASIF ($GECEN sn once)"
        fi
        echo "Peer: ${peer:0:20}... - $DURUM"
    fi
done

echo ""
echo "=== Transfer Istatistikleri ==="
wg show wg0 transfer | awk '{
    rx = $2/1024/1024
    tx = $3/1024/1024
    printf "Peer: %s | RX: %.2f MB | TX: %.2f MBn", substr($1,1,20), rx, tx
}'

Bu script ile kaç mobil cihazın aktif bağlı olduğunu, son ne zaman handshake yaptıklarını ve ne kadar veri transfer ettiklerini tek bakışta görebilirsiniz.

Sonuç

WireGuard’ı mobil cihazlara açmak göründüğü kadar karmaşık değil. Kritik noktalara bakacak olursak: MTU değerlerini doğru ayarlayın (Android için 1420, iOS için 1280 başlangıç noktası), PersistentKeepalive’ı 25 saniye olarak bırakın, her peer’ı /32 ile sınırlandırın ve config dağıtımında QR kod kullanın.

Gerçek dünyada en çok karşılaştığım sorun yanlış MTU değerleri ve DNS sızıntısı. Bunları baştan doğru yapılandırırsanız, WireGuard mobil bağlantıları gerçekten de rakipsiz bir kararlılık sunuyor. Özellikle Wi-Fi’den 4G’ye geçişlerde bağlantının kopmaması, kurumsal kullanım için büyük bir avantaj.

Çok sayıda cihazı yönetiyorsanız otomatik script yazmak başlangıçta zaman alıyor ama sonrasında her yeni cihaz ekleme işlemini dakikalar içinde tamamlıyorsunuz. Ve wg syncconf ile değişiklikleri canlı uygulamak, servis kesintisi olmadan onlarca peer yönetmenizi mümkün kılıyor.

Yorum yapın