WireGuard'ın güvenlik modeli
WireGuard, şifreleme algoritması seçimini yöneticiye bırakmaz; tüm bağlantılar aynı, önceden belirlenmiş primitiflerle kurulur. Bu yaklaşım, yanlış yapılandırılmış şifre takımları ya da eski algoritmalara geri düşme gibi sorunları baştan ortadan kaldırır.
| Bileşen | Kullanım amacı |
|---|---|
| Noise protokol çerçevesi (Noise_IKpsk2) | İki mesajlık el sıkışma ve anahtar değişimi |
| Curve25519 | Eliptik eğri tabanlı anahtar anlaşması |
| ChaCha20-Poly1305 | Kimlik doğrulamalı şifreleme |
| BLAKE2s | Özetleme ve mesaj doğrulama kodları |
| HKDF | Anahtar türetme |
| SipHash24 | Hash tablosu anahtarları |
Resmî protokol belgesine göre el sıkışma; mükemmel ileri gizlilik (perfect forward secrecy), tarafların kimliklerinin gizlenmesi ve hizmet dışı bırakma saldırılarına karşı önlem sağlar. Oturum anahtarları yaklaşık 120 saniyede bir yenilenir. Veri paketlerinde geri sarılamayan 64 bitlik bir sayaç ve 2000 paketlik kayan pencere kullanılır; bu sayede UDP'nin sırasız teslimatına izin verilirken tekrar oynatma (replay) saldırıları engellenir.
Güvenlik açısından belki de en önemli özellik sessizliktir: belgelere göre WireGuard, tanımadığı eşlerden gelen paketlere yanıt vermez. Doğru anahtara sahip olmayan bir tarayıcı için UDP portu kapalıymış gibi görünür. Sunucu yük altındayken ise pahalı kriptografik işlemlere geçmeden önce paketin gönderildiği IP'nin sahipliğini kanıtlayan çerez tabanlı doğrulamalar (mac1/mac2) istenir.
Kriptografik anahtar yönlendirme: AllowedIPs
WireGuard'ın erişim kontrolü, "cryptokey routing" adı verilen bir modele dayanır. Her eşin (peer) bir açık anahtarı ve bir AllowedIPs listesi vardır. Bu liste iki görev görür:
- Gönderirken yönlendirme tablosu: Hedef IP hangi eşin AllowedIPs aralığına düşüyorsa paket o eşin anahtarıyla şifrelenip ona gönderilir.
- Alırken erişim kontrol listesi: Bir eşten gelen paketin çözülmüş kaynak IP'si o eşin AllowedIPs aralığında değilse paket arayüze kabul edilmez.
Bu nedenle AllowedIPs, güvenlik açısından en kritik ayardır. Sunucu tarafında her istemciye yalnızca kendi tünel adresini (ör. /32) vermek, bir istemcinin başka bir istemcinin adresini taklit etmesini engeller.
Kurulum ve anahtar üretimi
WireGuard, Linux'un yanı sıra Windows, macOS, BSD, iOS ve Android'de de çalışır. Linux'ta araçlar dağıtımın paket yöneticisinden kurulur (Debian/Ubuntu'da wireguard-tools paketi).
Anahtarlar, dosya izinleri kısıtlanarak üretilmelidir:
CODE TERMINAL
umask 077
wg genkey | tee sunucu.key | wg pubkey > sunucu.pub
wg genkey | tee istemci1.key | wg pubkey > istemci1.pub
wg genpsk > istemci1.pskumask 077 komutu, oluşturulan anahtar dosyalarının yalnızca sahibi tarafından okunabilmesini sağlar. wg genpsk ile üretilen isteğe bağlı ön paylaşımlı anahtar (PresharedKey), wg(8) kılavuzuna göre açık anahtar kriptografisinin üzerine ek bir simetrik katman ekleyerek kuantum sonrası dirence katkı sağlar. Her eş çifti için ayrı bir PSK kullanılması önerilir.
Özel anahtarlar hiçbir zaman e-posta, sohbet ya da sürüm kontrol sistemi üzerinden paylaşılmamalıdır. İdeal yöntem, her cihazın kendi özel anahtarını kendi üzerinde üretmesi ve yalnızca açık anahtarı karşı tarafa iletmesidir.
Sunucu yapılandırması
wg-quick aracı, yapılandırmayı varsayılan olarak /etc/wireguard/ARAYUZ.conf dosyasından okur. Örnek bir sunucu dosyası (/etc/wireguard/wg0.conf):
CODE TERMINAL
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey =
[Peer]
# istemci1 - dizüstü
PublicKey =
PresharedKey =
AllowedIPs = 10.8.0.2/32
[Peer]
# istemci2 - telefon
PublicKey =
PresharedKey =
AllowedIPs = 10.8.0.3/32Dosya özel anahtar içerdiği için izinleri daraltılmalıdır:
CODE TERMINAL
chmod 600 /etc/wireguard/wg0.confArayüzü başlatmak ve açılışta otomatik devreye almak için:
CODE TERMINAL
wg-quick up wg0
systemctl enable wg-quick@wg0ListenPort belirtilmezse port rastgele seçilir; sunucuda sabit bir port kullanılması ve güvenlik duvarında yalnızca bu UDP portunun açılması gerekir.
İstemci yapılandırması
CODE TERMINAL
[Interface]
Address = 10.8.0.2/32
PrivateKey =
DNS = 10.8.0.1
[Peer]
PublicKey =
PresharedKey =
Endpoint = vpn.ornek.com:51820
AllowedIPs = 10.8.0.0/24
PersistentKeepalive = 25Burada iki tasarım kararı önemlidir:
| İstemci AllowedIPs değeri | Sonuç |
|---|---|
| 10.8.0.0/24 (ve gerekirse iç ağ aralıkları) | Bölünmüş tünel: yalnızca kurum ağına giden trafik VPN'den geçer |
| 0.0.0.0/0, ::/0 | Tam tünel: tüm trafik VPN'den geçer, wg-quick varsayılan rotayı ip-rule ile yönetir |
wg-quick kılavuzuna göre bir eşin AllowedIPs değeri 0.0.0.0/0 ya da ::/0 içerdiğinde araç bu eşi otomatik olarak varsayılan ağ geçidi yapar. Kamuya açık Wi-Fi ağlarında tam tünel tercih edilebilir; kurumsal erişimde ise bölünmüş tünel gereksiz trafik yükünü azaltır.
PersistentKeepalive, istemci NAT ya da durum takibi yapan bir güvenlik duvarı arkasındaysa bağlantının açık kalmasını sağlar; wg(8) kılavuzu bu durumda 25 saniyeyi önerir. Sunucu tarafında genellikle gerekmez.
Sunucuyu ağ geçidi yapmak
İstemcilerin sunucu üzerinden iç ağa ya da internete çıkması isteniyorsa IP yönlendirme açılmalı ve güvenlik duvarında gerekli kurallar tanımlanmalıdır:
CODE TERMINAL
sysctl -w net.ipv4.ip_forward=1Kalıcı olması için bu ayar /etc/sysctl.d/ altındaki bir dosyaya yazılmalıdır. wg-quick'in PostUp ve PostDown seçenekleri, arayüz açılırken ve kapanırken bash komutları çalıştırmayı sağlar; %i ifadesi arayüz adına dönüşür. Güvenlik duvarı kurallarını bu kancalarla arayüze bağlamak, kuralların tünelle birlikte açılıp kapanmasını sağlar. Yönlendirme açıldığında FORWARD zincirinde varsayılan reddet politikası uygulanmalı, yalnızca wg0'dan gelen ve izin verilen hedeflere giden trafik kabul edilmelidir.
Sertleştirme kontrol listesi
- Eş başına en dar AllowedIPs: Sunucuda her istemciye yalnızca /32 (IPv6'da /128) tünel adresi verin.
- Eş başına ayrı anahtar ve PSK: Aynı anahtar çiftini birden fazla cihazda kullanmayın; kaybolan bir cihazın [Peer] bölümünü silmek erişimi anında keser.
- Yapılandırma dosyası izinleri: /etc/wireguard dizini ve .conf dosyaları yalnızca root tarafından okunabilir olmalı.
- Tek açık port: Güvenlik duvarında yalnızca WireGuard'ın UDP portunu açın; yönetim servislerini (SSH, panel) internete değil tünel adresine bağlayın.
- SaveConfig kullanımına dikkat: SaveConfig = true, arayüz kapanırken çalışan yapılandırmayı dosyaya yazar ve elle yaptığınız değişikliklerin üzerine yazılmasına yol açabilir.
- Yeni eşleri kesintisiz ekleme: Arayüzü kapatmadan değişiklikleri uygulamak için wg syncconf wg0 <(wg-quick strip wg0) kullanılabilir; wg-quick strip, dosyadaki wg-quick'e özgü seçenekleri ayıklar.
- Güncel tutma: Çekirdek ve wireguard-tools paketlerini dağıtım güncellemeleriyle birlikte güncelleyin.
İzleme ve denetim
Durum kontrolü için wg show komutu kullanılır:
CODE TERMINAL
wg show wg0
wg show wg0 latest-handshakes
wg show wg0 transfer
wg show wg0 dump| Komut | Ne gösterir |
|---|---|
| wg show wg0 | Eşler, uç noktalar, AllowedIPs, son el sıkışma ve aktarım özeti |
| latest-handshakes | Her eşin son başarılı el sıkışma zamanı (Unix zaman damgası) |
| transfer | Eş başına alınan ve gönderilen bayt miktarı |
| dump | Betiklerle işlenmeye uygun, sekmeyle ayrılmış ayrıntılı çıktı |
Güvenlik izleme açısından son el sıkışma zamanı değerli bir göstergedir: normalde çevrimdışı olması beklenen bir cihazın gece yarısı el sıkışması, ya da hiç beklenmeyen bir uç nokta IP'si, anahtarın ele geçirildiğine işaret edebilir. dump çıktısını düzenli aralıklarla toplayıp SIEM'e göndermek, bu tür anormalliklerin fark edilmesini kolaylaştırır. WireGuard'ın dolaşım (roaming) özelliği nedeniyle eşin uç nokta adresi, doğrulanmış son paketin kaynağına göre değişebilir; beklenmeyen ülke ya da ASN'lerden gelen uç noktalar incelenmelidir.
Sık yapılan hatalar
- Sunucuda bir istemciye 0.0.0.0/0 tanımlamak: Bu, tüm trafiğin o istemciye yönlendirilmesine ve diğer eşlerin erişiminin bozulmasına yol açar. Tam tünel ayarı istemci tarafında yapılır.
- İki eşe çakışan AllowedIPs aralıkları vermek: Aynı aralık yalnızca bir eşe ait olabilir; son tanımlanan eş aralığı devralır.
- El sıkışma görülmüyorsa önce UDP portunun güvenlik duvarında açık olduğunu, sonra iki taraftaki açık anahtarların doğru eşleştiğini kontrol edin. WireGuard yanlış anahtarla gelen paketlere yanıt vermediği için hata mesajı almazsınız.
Kaynaklar
- WireGuard resmî sitesi: https://www.wireguard.com/
- WireGuard Quick Start: https://www.wireguard.com/quickstart/
- WireGuard protokol ve kriptografi: https://www.wireguard.com/protocol/
- wg(8) kılavuzu: https://man7.org/linux/man-pages/man8/wg.8.html
- wg-quick(8) kılavuzu: https://man7.org/linux/man-pages/man8/wg-quick.8.html
TR Siber Ekibi