İçeriğe geç
NetDevOps
7 dk okuma Ağ Yönetimi

VyOS WireGuard Mesh VPN ile Site-to-Site ve Remote Access

WireGuard, VyOS üzerinde hem site-to-site hem de road warrior VPN senaryoları için en pratik çözüm. IPsec ile kıyaslandığında çok daha az state, daha az konfigürasyon satırı ve kernel içi çalışan hafif bir implementasyon var. Bu yazıda her iki senaryoyu da gerçek komutlarla ele alıyorum; ayrıca MTU sorunları ve allowed-ips kısıtları gibi sık karşılaşılan problemlere de değineceğim.

Anahtar Üretimi

WireGuard, Curve25519 tabanlı asimetrik bir anahtar çifti gerektirir. VyOS 1.4 ve üzerinde anahtar üretmek için şu komut kullanılır:

generate pki wireguard key-pair

Bu komut anahtar çiftini üretir ve konsola yazdırır, sistemde saklamaz. Direkt arayüze kurulum için:

generate pki wireguard key-pair install interface wg10

Configure modunda run öneki ile çalıştırırsanız, üretilen private-key otomatik olarak arayüze atanır. Karşı tarafa vereceğiniz public keyi görmek için:

show interfaces wireguard wg10 public-key

Ek bir güvenlik katmanı için preshared-key de eklenebilir:

generate pki wireguard preshared-key install interface wg10 peer foo

VyOS 1.3 ve öncesinde komut seti farklı: generate wireguard default-keypair anahtarı sistemde saklar ve show wireguard keypairs pubkey default ile public key gösterilir.

Site-to-Site Tünel

İki VyOS router arasında tünel kurulumu şu mantıkla çalışır: her iki tarafın public key bilgisi karşı tarafta peer olarak tanımlanır, tünel IP aralığı /30 veya /24 verilir, uzak ağın trafiği WireGuard arayüzüne yönlendirilir. Örnek olarak Router A (192.168.1.0/24, public IP 203.0.113.10) ve Router B (192.168.2.0/24, public IP 198.51.100.20) düşünelim.

Router A tarafında:

set interfaces wireguard wg01 address '10.255.254.1/30'
set interfaces wireguard wg01 description 'Site-to-Site B'
set interfaces wireguard wg01 peer site-b allowed-ips '192.168.2.0/24'
set interfaces wireguard wg01 peer site-b public-key '<RouterB-public-key>'
set interfaces wireguard wg01 peer site-b endpoint '198.51.100.20:51820'
set interfaces wireguard wg01 private-key '<RouterA-private-key>'
set interfaces wireguard wg01 port '51820'

set protocols static route 192.168.2.0/24 interface wg01

Router B tarafında aynalar:

set interfaces wireguard wg01 address '10.255.254.2/30'
set interfaces wireguard wg01 description 'Site-to-Site A'
set interfaces wireguard wg01 peer site-a allowed-ips '192.168.1.0/24'
set interfaces wireguard wg01 peer site-a public-key '<RouterA-public-key>'
set interfaces wireguard wg01 peer site-a endpoint '203.0.113.10:51820'
set interfaces wireguard wg01 private-key '<RouterB-private-key>'
set interfaces wireguard wg01 port '51820'

set protocols static route 192.168.1.0/24 interface wg01

Static route yerine OSPF de kullanılabilir. Çin topluluğundaki bir testte iki VyOS arasında tünel üzerinden OSPF çalıştırılmış ve komşuluk Full/DROther olarak kurulmuş, 172.16.200.0/24 ağı OSPF ile öğrenilmiş.

Hub-and-Spoke Topoloji

Üç veya daha fazla site varsa full-mesh yerine hub-and-spoke daha yönetilebilir. Hub routerda her spoke bir peer olarak tanımlanır, her spoke sadece huba bağlanır. Merkez ofis İstanbul, şubeler Ankara ve İzmir olsun:

Hub (İstanbul, public IP 203.0.113.10):

set interfaces wireguard wg0 address '10.255.255.1/24'
set interfaces wireguard wg0 description 'Hub-and-Spoke'
set interfaces wireguard wg0 port '51820'
set interfaces wireguard wg0 private-key '<hub-private-key>'

set interfaces wireguard wg0 peer ankara allowed-ips '10.10.0.0/24'
set interfaces wireguard wg0 peer ankara public-key '<ankara-pubkey>'
set interfaces wireguard wg0 peer ankara endpoint '203.0.113.20:51820'

set interfaces wireguard wg0 peer izmir allowed-ips '10.20.0.0/24'
set interfaces wireguard wg0 peer izmir public-key '<izmir-pubkey>'
set interfaces wireguard wg0 peer izmir endpoint '203.0.113.30:51820'

Ankara spoke tarafında:

set interfaces wireguard wg0 address '10.255.255.20/24'
set interfaces wireguard wg0 peer hub allowed-ips '10.0.0.0/24'
set interfaces wireguard wg0 peer hub allowed-ips '10.20.0.0/24'
set interfaces wireguard wg0 peer hub public-key '<hub-pubkey>'
set interfaces wireguard wg0 peer hub endpoint '203.0.113.10:51820'
set interfaces wireguard wg0 peer hub persistent-keepalive '15'
set interfaces wireguard wg0 private-key '<ankara-private-key>'
set interfaces wireguard wg0 port '51820'

set protocols static route 10.0.0.0/24 interface wg0
set protocols static route 10.20.0.0/24 interface wg0

İzmir için de benzer yapı kurulur. Burada dikkat: spoke-to-spoke trafik her zaman hub üzerinden geçer. Hubın forwarding performansı ve MTU ayarları kritik hale gelir.

Firewall Kuralları

WireGuard UDP 51820 portunda çalışır. WAN arayüzünden gelen bu trafiğe izin vermek için:

set firewall ipv4 name OUTSIDE_LOCAL rule 10 action accept
set firewall ipv4 name OUTSIDE_LOCAL rule 10 description 'Allow established/related'
set firewall ipv4 name OUTSIDE_LOCAL rule 10 state established enable
set firewall ipv4 name OUTSIDE_LOCAL rule 10 state related enable

set firewall ipv4 name OUTSIDE_LOCAL rule 20 action accept
set firewall ipv4 name OUTSIDE_LOCAL rule 20 description 'WireGuard_IN'
set firewall ipv4 name OUTSIDE_LOCAL rule 20 destination port 51820
set firewall ipv4 name OUTSIDE_LOCAL rule 20 protocol udp
set firewall ipv4 name OUTSIDE_LOCAL rule 20 log enable

Bu grubu WAN arayüzüne input yönünde uygulamayı unutmayın:

set firewall ipv4 input filter rule 10 action jump
set firewall ipv4 input filter rule 10 jump-target 'OUTSIDE_LOCAL'
set firewall ipv4 input filter rule 10 inbound-interface name 'eth0'

Allowed-ips Kısıtları

WireGuard tasarım gereği aynı allowed-ips bloğunu birden fazla peere atayamazsınız. Bu, routing tablosu karmaşasını önler ama bazen sorun yaratır. Örneğin road warrior senaryoda iki kullanıcıya aynı /24 ağını tanımlamak isterseniz hata alırsınız. Çözüm her peer için /32 (veya /128) kullanmak ve gerekli ağları ayrı ayrı eklemek.

Road Warrior: Mobil ve Uzak Kullanıcılar

Site-to-site yapısından tek farkı endpoint tanımlanmaması. Peerlar NAT arkasından geldiği için endpoint sabit değil. Her peerın allowed-ips olarak /32 alması gerekir:

set interfaces wireguard wg01 address '10.172.24.1/24'
set interfaces wireguard wg01 description 'RoadWarrior'
set interfaces wireguard wg01 port '2224'
set interfaces wireguard wg01 private-key '<server-private-key>'

set interfaces wireguard wg01 peer MacBook allowed-ips '10.172.24.30/32'
set interfaces wireguard wg01 peer MacBook persistent-keepalive '15'
set interfaces wireguard wg01 peer MacBook public-key 'F5MbW7ye7DsoxdOaixjdrudshjjxN5UdNV+pGFHqehc='

set interfaces wireguard wg01 peer iPhone allowed-ips '10.172.24.20/32'
set interfaces wireguard wg01 peer iPhone persistent-keepalive '15'
set interfaces wireguard wg01 peer iPhone public-key 'BknHcLFo8nOo8Dwq2CjaC/TedchKQ0ebxC7GYn7Al00='

Client tarafında örnek konfigürasyon:

[Interface]
PrivateKey = <client-private-key>
Address = 10.172.24.20/24
DNS = 10.0.0.53, 10.0.0.54

[Peer]
PublicKey = <server-public-key>
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = 203.0.113.10:2224
PersistentKeepalive = 15

AllowedIPs = 0.0.0.0/0 tüm trafiği tünele yönlendirir. Split tunneling için sadece uzak ağları yazın:

AllowedIPs = 10.172.24.0/24, 192.168.1.0/24

VyOS CLI üzerinden hazır client konfigürasyonu da üretilebilir:

generate wireguard client-config MacBook interface wg01 server 203.0.113.10 address 10.172.24.30/32

Bu komut hem client config dosyasını hem de VyOS tarafında peer tanımlamak için gerekli CLI snippetını üretir. Güvenlik uyarısı: private keyi kendiniz üretin, üçüncü taraf üretimine güvenmeyin.

MTU ve Performans Sorunları

WireGuard her pakete 60 byte ekler (20 IP + 8 UDP + 32 WireGuard header). Standart 1500 byte Ethernet MTU kullanıyorsanız, WireGuard arayüzünü 1420 olarak ayarlamak fragmentationı önler:

set interfaces wireguard wg0 mtu '1420'

Bir hub-and-spoke topolojide asimetrik throughput sorunu yaşanmış: Site2 ile Site3 arasında tünel üzerinden 10-50 Mbps, aynı yolun direct WAN üzerinden 800+ Mbps çıkması. Wiresharkta BoundErrorUnreassembled hataları ve TCP retransmit görülmüş. Sorun VyOS konfigürasyonunda değil, VPS sağlayıcısının altyapısındaki MTU tutarsızlığında çıkmış. TSO (TCP Segmentation Offload) bu hatayı geçici olarak maskeleyebilir, kalıcı çözüm için path MTU discoverynin düzgün çalışması gerekir.

Path MTU discoverynin çalışmadığı durumlarda TCP-MSS clamping kullanılabilir:

set firewall options interface wg0 adjust-mss 1350

Ping çalışıyor ama veri geçmiyorsa ilk bakılacak yer burası. Ayrıca ICMP type 3 code 4 paketlerinin firewall tarafından filtrelenmediğinden emin olun.

İzleme ve Doğrulama

Tünelin çalışıp çalışmadığını kontrol etmek için:

show interfaces wireguard wg01 summary

Bu komut son handshake zamanını, transfer istatistiklerini ve peer bilgilerini gösterir. Handshake 2-3 dakikadan eskiyse tünel aktif demektir. WireGuard stateless olduğu için handshake periyodik yenilenir.

Daha detaylı bilgi için:

show interfaces wireguard wg01

Sorun giderme için tcpdump en güçlü araç:

tcpdump -i any icmp
tcpdump -i wg0 -n udp port 51820

WireGuardın kendi loglama sistemi zayıf. Connectivity sorunlarını çözmek için ağ tecrübesi ve paket yakalama birlikte kullanılmalı.

Güvenlik Notları

Remote access senaryosunda her kullanıcı için ayrı peer tanımlayın. Tek bir peerı birden fazla cihaz arasında paylaştırmayın. Preshared-key eklemek quantum-resistant bir katman sağlar (symmetric key üzerine). Private keyleri asla üçüncü taraflarla paylaşmayın; public keyleri ise serbestçe dağıtabilirsiniz.

VyOS üzerinde WireGuard, IPsec kadar esnek protokol desteği sunmasa da hız, sadelik ve bakım kolaylığı açısından çoğu senaryoda tercih sebebi. Kernel-space çalışması, userspace VPN çözümlerine göre çok daha düşük latency sağlar.

Laravel-NDFirewall

Laravel için geliştirilmiş; panelsiz, route tabanlı ve hafif bir WAF (Web Application Firewall) kütüphanesidir. RCE, SQLi, XSS ve SSRF saldırılarını tespit eder; girdileri asla çalıştırmaz ve olası ha…

PHP

ctCertWatch

SSL sertifika yayınlarını gerçek zamanlı takip eden bir izleme servisi. Regex filtreleme, DNS çözümleme ve webhook uyarıları ile phishing domainlerini, marka taklidini ve yetkisiz sertifikaları anında…

Rust

ipReconary

IP aralıkları, alt ağlar ve ASN bilgilerine dayalı olarak host, domain ve servis keşfi yapan bir ağ keşif (recon) aracı. Güvenlik uzmanları ve OSINT araştırmacıları için ağ altyapısını hızlı ve güveni…

Rust

Wireguard-Server-Panel

Web arayüzüne sahip, kendi sunucunuzda barındırılan bir WireGuard VPN servisi. İstemci yönetimi, mobil bağlantı için QR kod desteği, gerçek zamanlı trafik istatistikleri ve bağlantı kayıtları sunar. T…

LoadAlertTracker

Sistem yükünü neredeyse hiç kaynak tüketmeden izleyen, hafif bir servis. Belirlenen eşikler aşıldığında Telegram, Discord ve Mattermost gibi platformlara gerçek zamanlı uyarı gönderir.

Rust

Trustsslroot

Tek komutla eksiksiz bir özel PKI yapısı (Kök CA → Ara CA → sunucu ve istemci sertifikaları) oluşturan araç. Farklı formatlarda (p12/bks/jks) paketler üretir ve kullanıma hazır çıktı klasörleri sunar.

Go

DDNS-FW

Değişken IP adresini DDNS üzerinden gerçek zamanlı takip eden, hafif ve güvenilir bir araç. İzin verilen IP listelerini otomatik güncelleyerek kesintisiz erişim ve güvenlik sağlar. Tek dosyadan çalışı…

Rust

Cloudfiltred

Sunucu üzerinde 80/443 portlarına erişimi yalnızca Cloudflare IP aralıklarıyla sınırlandıran, tek dosyadan çalışan bir Linux servisi. Kendini kurar, sistem servisi olarak çalışır ve IP listelerini düz…

Rust

node_exporter

Linux için geliştirilmiş, hafif ve tek dosyadan çalışan, güvenli erişim kontrollü bir sistem metrikleri servisi.

Rust