WireGuard ile Site-to-Site Tünel Yapılandırması

İki farklı lokasyondaki ağı birbirine bağlamak, eskiden pahalı donanımlar ve karmaşık IPSec/OpenVPN konfigürasyonları gerektirirdi. WireGuard bu denklemi tamamen değiştirdi. Sadece birkaç satır konfigürasyonla, kurumsal kalitede şifreli bir tünel kurabiliyorsunuz. Bu yazıda, iki ofis ağını WireGuard ile nasıl bağlayacağınızı adım adım ele alacağız.

Senaryo ve Ağ Topolojisi

Gerçek dünyadan bir örnek üzerinden gidelim. İstanbul’da merkez ofisimiz, Ankara’da ise bir şube ofisimiz var. Her iki lokasyonda da bir Linux sunucusu (Ubuntu 22.04) WireGuard gateway olarak çalışacak.

İstanbul Merkez Ofis:

  • WAN IP: 203.0.113.1 (statik, public IP)
  • LAN ağı: 192.168.1.0/24
  • WireGuard interface IP: 10.0.0.1/24

Ankara Şube Ofis:

  • WAN IP: 198.51.100.1 (statik, public IP)
  • LAN ağı: 192.168.2.0/24
  • WireGuard interface IP: 10.0.0.2/24

Hedefimiz, İstanbul’daki 192.168.1.0/24 ağındaki cihazların Ankara’daki 192.168.2.0/24 ağına doğrudan erişebilmesi. Bunu yaparken tüm trafik WireGuard tüneli üzerinden geçecek ve end-to-end şifreli olacak.

WireGuard Kurulumu

Her iki sunucuda da kurulumu yapalım. Ubuntu/Debian için:

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

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

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

CentOS/RHEL/Rocky Linux kullananlar için:

# EPEL repo gerekli
sudo dnf install -y epel-release
sudo dnf install -y wireguard-tools

# Kernel headerları gerekebilir
sudo dnf install -y kernel-devel kernel-headers
sudo modprobe wireguard

Anahtar Çifti Oluşturma

WireGuard, asimetrik kriptografi kullanır. Her sunucu için bir public/private key çifti oluşturmamız gerekiyor. Private key’leri asla paylaşmayın, sadece public key’ler değiş tokuş edilir.

İstanbul sunucusunda:

# /etc/wireguard dizinine geçin
cd /etc/wireguard

# Güvenli izinler için umask ayarı
umask 077

# Key çifti oluştur
wg genkey | tee istanbul-private.key | wg pubkey > istanbul-public.key

# Oluşturulan anahtarları görüntüleyin
echo "Private Key:" && cat istanbul-private.key
echo "Public Key:" && cat istanbul-public.key

# İzinleri doğrulayın
ls -la /etc/wireguard/

Ankara sunucusunda:

cd /etc/wireguard
umask 077
wg genkey | tee ankara-private.key | wg pubkey > ankara-public.key

echo "Private Key:" && cat ankara-private.key
echo "Public Key:" && cat ankara-public.key

Opsiyonel ama tavsiye edilen bir adım olarak preshared key de oluşturabilirsiniz. Bu, post-quantum kriptografiye karşı ek bir güvenlik katmanı sağlar:

# İstanbul sunucusunda çalıştırın
wg genpsk > preshared.key
cat preshared.key
# Bu değeri her iki tarafın konfigürasyonuna ekleyeceksiniz

İstanbul Merkez Sunucusu Konfigürasyonu

/etc/wireguard/wg0.conf dosyasını oluşturalım:

# İstanbul sunucusunda
cat > /etc/wireguard/wg0.conf << 'EOF'
[Interface]
# WireGuard interface IP adresi
Address = 10.0.0.1/24

# Dinlenecek port (güvenlik duvarında açık olmalı)
ListenPort = 51820

# Private key (istanbul-private.key içeriği)
PrivateKey = <ISTANBUL_PRIVATE_KEY_BURAYA>

# IP forwarding için post-up/down kuralları
PostUp = iptables -A FORWARD -i %i -j ACCEPT
PostUp = iptables -A FORWARD -o %i -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT
PostDown = iptables -D FORWARD -o %i -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

# Ankara şube peer tanımı
[Peer]
# Ankara sunucusunun public key'i
PublicKey = <ANKARA_PUBLIC_KEY_BURAYA>

# Opsiyonel: Preshared key (ekstra güvenlik)
PresharedKey = <PRESHARED_KEY_BURAYA>

# Ankara tarafından erişilebilecek ağlar
AllowedIPs = 10.0.0.2/32, 192.168.2.0/24

# Ankara sunucusunun public IP ve portu
Endpoint = 198.51.100.1:51820

# NAT geçişi için keepalive (her 25 saniyede bir)
PersistentKeepalive = 25
EOF

# Dosya izinlerini güvenli yapın
chmod 600 /etc/wireguard/wg0.conf

Buradaki AllowedIPs parametresine dikkat edin. Bu parametre hem routing hem de ACL görevi görür. 10.0.0.2/32 WireGuard tünel IP’si, 192.168.2.0/24 ise Ankara’nın LAN ağı. WireGuard bu ağlara giden trafiği otomatik olarak tünel üzerinden yönlendirecek.

Ankara Şube Sunucusu Konfigürasyonu

# Ankara sunucusunda
cat > /etc/wireguard/wg0.conf << 'EOF'
[Interface]
Address = 10.0.0.2/24
ListenPort = 51820
PrivateKey = <ANKARA_PRIVATE_KEY_BURAYA>

PostUp = iptables -A FORWARD -i %i -j ACCEPT
PostUp = iptables -A FORWARD -o %i -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT
PostDown = iptables -D FORWARD -o %i -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
PublicKey = <ISTANBUL_PUBLIC_KEY_BURAYA>
PresharedKey = <PRESHARED_KEY_BURAYA>

# İstanbul'dan erişilebilecek ağlar
AllowedIPs = 10.0.0.1/32, 192.168.1.0/24

# İstanbul sunucusunun public IP ve portu
Endpoint = 203.0.113.1:51820

PersistentKeepalive = 25
EOF

chmod 600 /etc/wireguard/wg0.conf

IP Forwarding Aktifleştirme

Her iki sunucuda da kernel düzeyinde IP forwarding’i kalıcı olarak açmamız gerekiyor. Aksi takdirde paketler forward edilmez:

# Her iki sunucuda çalıştırın
# Geçici olarak aktifleştir
sysctl -w net.ipv4.ip_forward=1

# Kalıcı olarak aktifleştir
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

# Doğrulama
sysctl net.ipv4.ip_forward
# Çıktı: net.ipv4.ip_forward = 1

IPv6 kullanıyorsanız ek olarak:

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

Güvenlik Duvarı Kuralları

UFW kullanan sistemlerde:

# WireGuard portunu aç
sudo ufw allow 51820/udp

# Forward politikasını ayarla (UFW varsayılan olarak DENY)
# /etc/default/ufw dosyasında DEFAULT_FORWARD_POLICY="ACCEPT" yapın
sed -i 's/DEFAULT_FORWARD_POLICY="DROP"/DEFAULT_FORWARD_POLICY="ACCEPT"/' /etc/default/ufw

# UFW'yi yeniden yükleyin
sudo ufw reload

# Durumu kontrol edin
sudo ufw status verbose

firewalld kullananlar için (CentOS/RHEL):

# WireGuard portunu aç
firewall-cmd --permanent --add-port=51820/udp
firewall-cmd --permanent --add-masquerade

# Servis olarak eklemek isterseniz
firewall-cmd --permanent --add-service=wireguard

# Değişiklikleri uygulayın
firewall-cmd --reload

# Doğrulama
firewall-cmd --list-all

WireGuard Servisini Başlatma

# Her iki sunucuda, servisi başlat ve enable et
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0

# Servis durumunu kontrol et
sudo systemctl status wg-quick@wg0

# WireGuard durumunu detaylı görüntüle
sudo wg show

# Interface bilgilerini görüntüle
sudo wg show wg0

wg show çıktısı şuna benzer görünmeli:

sudo wg show wg0
# Beklenen çıktı:
# interface: wg0
#   public key: <ISTANBUL_PUBLIC_KEY>
#   private key: (hidden)
#   listening port: 51820
#
# peer: <ANKARA_PUBLIC_KEY>
#   preshared key: (hidden)
#   endpoint: 198.51.100.1:51820
#   allowed ips: 10.0.0.2/32, 192.168.2.0/24
#   latest handshake: 5 seconds ago
#   transfer: 1.23 KiB received, 2.45 KiB sent

“latest handshake” satırını görüyorsanız bağlantı kurulmuş demektir. Eğer bu satır yoksa peer henüz bağlanamamış demektir, troubleshooting bölümüne bakın.

Routing Tablosunu Doğrulama

Her iki sunucuda routing tablolarının doğru şekilde oluştuğunu kontrol edin:

# İstanbul sunucusunda
ip route show
# Şu satırı görmelisiniz:
# 192.168.2.0/24 dev wg0 scope link

# Ankara sunucusunda
ip route show
# Şu satırı görmelisiniz:
# 192.168.1.0/24 dev wg0 scope link

# Tünel üzerinden ping testi
ping -c 4 10.0.0.2  # İstanbul'dan Ankara WireGuard IP'sine
ping -c 4 192.168.2.1  # İstanbul'dan Ankara LAN gateway'ine

İstemci Makinelerde Routing Ayarı

WireGuard sunucularınız doğru çalışıyor olsa bile, istemci makinelerin karşı ağa nasıl ulaşacağını bilmesi gerekir. İstemciler için iki yöntem var:

Yöntem 1: Her istemciye statik route eklemek

# İstanbul LAN'ındaki bir istemci makinesinde
# Ankara ağına ulaşmak için route ekle
sudo ip route add 192.168.2.0/24 via 192.168.1.1

# Kalıcı yapmak için (netplan kullanan Ubuntu)
# /etc/netplan/01-network.yaml dosyasına ekleyin:
# routes:
#   - to: 192.168.2.0/24
#     via: 192.168.1.1
sudo netplan apply

Yöntem 2: DHCP üzerinden route dağıtmak (daha pratik)

DHCP sunucunuzda (dnsmasq veya ISC DHCP) classless static route seçeneğini ayarlayın. Bu şekilde tüm istemciler otomatik olarak doğru rotayı alır:

# dnsmasq konfigürasyonu
# /etc/dnsmasq.conf veya /etc/dnsmasq.d/routes.conf
dhcp-option=121,192.168.2.0/24,192.168.1.1
dhcp-option=249,192.168.2.0/24,192.168.1.1  # Windows istemciler için

# Servisi yeniden başlatın
systemctl restart dnsmasq

Troubleshooting

Bağlantı kurulmadıysa sistematik bir şekilde sorunun nerede olduğunu bulalım:

# 1. WireGuard servisinin çalıştığını doğrulayın
systemctl status wg-quick@wg0

# 2. Interface'in ayakta olduğunu kontrol edin
ip addr show wg0

# 3. UDP portuna dışarıdan erişilebiliyor mu?
# Başka bir sunucudan veya lokasyondan test edin
nc -zvu 203.0.113.1 51820

# 4. Kernel loglarında hata var mı?
dmesg | grep -i wireguard
journalctl -u wg-quick@wg0 -f

# 5. iptables kuralları doğru mu?
iptables -L FORWARD -n -v
iptables -t nat -L -n -v

# 6. Gerçek zamanlı trafik izleme
sudo tcpdump -i eth0 udp port 51820 -nn

# 7. WireGuard istatistiklerini sıfırlayıp yeniden test
sudo wg set wg0 peer <PEER_PUBLIC_KEY> endpoint 198.51.100.1:51820
sudo wg show wg0

Yaygın karşılaşılan sorunlar ve çözümleri:

  • Handshake yok: Endpoint IP veya port hatalı olabilir. Her iki tarafın güvenlik duvarını kontrol edin.
  • Handshake var ama ping gitmez: IP forwarding aktif değil veya routing tablosu eksik.
  • Tek yönlü çalışıyor: AllowedIPs ayarları asimetrik, her iki tarafı kontrol edin.
  • Bağlantı kopuyor: PersistentKeepalive değerini 25’ten düşürün veya NAT tablolarını kontrol edin.

Konfigürasyonu Yönetmek

Uzun vadede tüneli yönetmek için birkaç pratik komut:

# Tüneli kapatıp açmak
sudo wg-quick down wg0
sudo wg-quick up wg0

# Konfigürasyon değişikliği sonrası restart gerektirmeden uygulama
sudo wg syncconf wg0 <(wg-quick strip wg0)

# Bant genişliği kullanımını anlık izlemek
watch -n 1 sudo wg show

# Bağlı peer'ların son handshake zamanını görüntüle
sudo wg show wg0 latest-handshakes

# Belirli bir peer'ı geçici olarak devre dışı bırakma
sudo wg set wg0 peer <PUBLIC_KEY> remove

Konfigürasyon dosyasındaki private key’i ayrı bir dosyadan okumak, versiyon kontrolü ve log güvenliği için iyi bir pratiktir:

# Konfigürasyonda direkt key yerine dosya yolu kullanın
# wg0.conf içinde:
# PrivateKey = $(cat /etc/wireguard/istanbul-private.key)
# Bu syntax wg-quick tarafından desteklenmez, bunun yerine:
# PostUp = wg set %i private-key /etc/wireguard/istanbul-private.key

Çoklu Şube Senaryosu

İki şubeyi daha da eklemek isterseniz, hub-and-spoke topolojisi için merkez sunucusuna yeni peer blokları ekleyebilirsiniz:

# İstanbul merkez wg0.conf dosyasına Bursa şubesi için ek peer
cat >> /etc/wireguard/wg0.conf << 'EOF'

[Peer]
# Bursa şubesi
PublicKey = <BURSA_PUBLIC_KEY>
PresharedKey = <BURSA_PRESHARED_KEY>
AllowedIPs = 10.0.0.3/32, 192.168.3.0/24
Endpoint = 85.123.45.67:51820
PersistentKeepalive = 25
EOF

# Konfigürasyonu restart gerektirmeden uygula
sudo wg syncconf wg0 <(wg-quick strip wg0)
sudo wg show wg0

Full-mesh (her şubenin birbirini görmesi) senaryosunda ise her sunucuya diğer tüm peer’ları eklemeniz gerekir. Bu durum yönetim karmaşıklığını artırır. Eğer 5’ten fazla lokasyonunuz varsa, wg-meshconf veya netmaker gibi araçları değerlendirmenizi öneririm.

Performans Optimizasyonu

WireGuard varsayılan ayarlarla bile oldukça performanslıdır, ancak birkaç ince ayarla daha da iyileştirebilirsiniz:

# MTU optimizasyonu
# WireGuard overhead yaklaşık 60 byte, 1500 MTU ethernet için:
# Interface MTU = 1500 - 60 = 1420 (WireGuard varsayılanı zaten bu)
# Ancak VXLAN veya başka overlay network üzerindeyseniz daha düşük ayarlayın

# wg0.conf [Interface] bölümüne ekleyin:
# MTU = 1380

# Çok çekirdekli sistemlerde receive side scaling
ethtool -K eth0 rx-gro-hw off

Sonuç

WireGuard ile site-to-site tünel kurmak, OpenVPN veya IPSec’e kıyasla inanılmaz derecede basit. Tüm konfigürasyon birkaç düzine satırdan ibaret, kod tabanı küçük olduğu için audit edilmesi kolay ve modern kriptografi protokolleri kullanıyor. Üstten baktığınızda süreç şu: her iki tarafta key çifti oluşturursunuz, public key’leri karşılıklı paylaşırsınız, AllowedIPs ile hangi ağların tünelden geçeceğini tanımlarsınız, IP forwarding’i açarsınız ve iptables MASQUERADE kurallarını eklersiniz.

Akılda tutulması gereken en kritik nokta şu: WireGuard’ın AllowedIPs parametresi hem bir routing direktifi hem de bir ACL’dir. Bu ikili rolü anlamadan konfigürasyon yazmak, beklenmedik routing davranışlarına yol açar. Büyük prodüksiyona almadan önce küçük bir test ortamında, tercihen iki VM üzerinde bu senaryoyu mutlaka prova edin.

Ağ topolojiniz büyüdükçe WireGuard’ın yönetim araçlarına bakmanızı öneririm. wg ve wg-quick temel ihtiyaçları karşılar, ancak onlarca peer yönetiyorsanız Ansible playbook’ları veya özel bir konfigürasyon yönetim sistemi hayat kurtarır.

Yorum yapın