SSD Nodes Learn
Rehberler Matt ConnorYazan Matt Connor · Güncellendi 2026-07-24

VPS üzerine WireGuard VPN kurulumu nasıl yapılır

Linux VPS üzerinde WireGuard kurulumu, wg0.conf yapılandırması, IP forwarding ve NAT ayarları ile handshake hatalarının çözümü bu rehberde anlatılmaktadır.

What you are building

A WireGuard VPN on a server you own is about forty lines of config: one key pair, one interface file, one sysctl, one NAT rule, one firewall hole. The install is trivial, so most of this guide covers what breaks — key permissions, AllowedIPs, forwarding and DNS.

WireGuard is a Layer 3 tunnel in the kernel, mainline since Linux 5.6, so Ubuntu 24.04 and Debian 13 ship it with no external module. No cipher negotiation, no certificate authority, no username/password step: a peer is a public key plus the IP addresses that key may use. A packet failing its MAC check is dropped with no reply, so the port does not answer scans. The flip side: no auth server exists, so removing access means deleting a peer on the box.

Önce sanallaştırmayı kontrol edin

WireGuard, içine modül yüklenebilen bir çekirdek gerektirir; KVM VPS üzerinde bu özellik doğrudan çalışır. Host çekirdeğini paylaşan konteyner sanallaştırmalarda —OpenVZ, LXC— ilk komut RTNETLINK answers: Operation not supported hatası verir. Bu durumda yedek yöntem olarak wireguard-go userspace uygulaması kullanılır. Öncelikle sudo modprobe wireguard && echo ok ile kontrol sağlayın.

Anahtarların sızdırılmasını önleyerek oluşturun

Dünya genelinde okunabilir bir /etc/wireguard/server.key, VPN kullanılmaması ile aynı sonucu doğurur. Yaygın olan umask 077 && wg genkey | sudo tee ... yöntemi güvenilir değildir; çünkü sudo, tee tarafından oluşturulan dosyaya kendi umask değerini uygular. Dosya modunu açıkça belirleyin.

sudo apt update && sudo apt install -y wireguard nftables
sudo install -d -m 700 /etc/wireguard
sudo sh -c 'umask 077; wg genkey > /etc/wireguard/server.key'
sudo sh -c 'wg pubkey < /etc/wireguard/server.key > /etc/wireguard/server.pub'
sudo chmod 600 /etc/wireguard/server.key

İstemci çiftini aynı yöntemle oluşturun. wg genpsk, her yapılandırma dosyasında bir satır olmak üzere isteğe bağlı bir önceden paylaşılmış anahtar (pre-shared key) ekler.

Sunucu arayüzü: /etc/wireguard/wg0.conf

[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <contents of /etc/wireguard/server.key>

[Peer]
PublicKey = <laptop public key>
PresharedKey = <psk, optional>
AllowedIPs = 10.8.0.2/32

chmod 600 bu uyarı, dosyanın tüm kullanıcılar tarafından erişilebilir olduğunu belirtir; bu uyarıyı atladıysanız dosya izinleri hatalıdır. Address, tüm VPN alt ağının maskesini taşıyan, tünel içindeki sunucu adresidir. Gerçek ağlarda karşılaşmayacağınız bir aralık seçin — 192.168.1.0/24, istemcilerin arkasında bulunduğu ev routerlarının yarısıyla çakışır; bu durumda tünel, yerel rota nedeniyle sessizce bağlantıyı kaybeder.

Sunucu tarafındaki bir peer'ın AllowedIPs değeri bir /32 değeridir; bu, istemcinin sahip olduğu tek tünel adresidir. İki peer'a aynı allowed IP değerini verirseniz, sistem en son yapılandırılan adrese geçer ve ilki hiçbir hata mesajı vermeden trafiği almayı durdurur. SaveConfig değerini boş bırakın veya wg-quick down bu dosyayı canlı durumdan (live state) yeniden yazar.

Cihazı yönlendiriciye dönüştürün

Bir Linux sunucu, kendisine yönelik olmayan paketleri düşürür. Varsayılan olarak yönlendirme (forwarding) ve kaynak NAT (source NAT) kapalıdır.

printf 'net.ipv4.ip_forward = 1\nnet.ipv6.conf.all.forwarding = 1\n' \
  | sudo tee /etc/sysctl.d/99-wireguard.conf
sudo sysctl --system
sysctl net.ipv4.ip_forward

Temel bir sysctl -w, bir sonraki yeniden başlatmaya kadar çalışır ve ardından sessizce işlevini yitirir. NAT için egress arayüzüne ihtiyaç vardır; bu, wg0 değil, internete erişen NIC'tir. eth0 olduğunu varsaymayın; güncel imajlar enp1s0 veya ens3 gibi isimler kullandığından, kendi arayüz isminizi ip route show default üzerinden belirleyin.

Firewall: port ve yönlendirme yolu

Bir nftables dosyası hem filtreleme hem de NAT işlemlerini kapsar. /etc/nftables.conf komutunu çalıştırın; bu komut mevcut kural setini temizler. Eğer sistem halihazırda ufw veya Docker tarafından yönetiliyorsa bu adımı atlayın.

#!/usr/sbin/nft -f
flush ruleset

table inet filter {
  chain input {
    type filter hook input priority filter; policy drop;
    ct state established,related accept
    iif lo accept
    tcp dport 22 accept
    udp dport 51820 accept
  }
  chain forward {
    type filter hook forward priority filter; policy drop;
    ct state established,related accept
    iifname "wg0" oifname "enp1s0" accept
  }
}

table ip nat {
  chain postrouting {
    type nat hook postrouting priority srcnat; policy accept;
    ip saddr 10.8.0.0/24 oifname "enp1s0" masquerade
  }
}

İkinci bir SSH oturumu açık tutarak sudo systemctl enable --now nftables ile uygulayın: policy drop komutuna SSH kuralında yapılan bir yazım hatası eklemek, sunucu erişiminin tamamen kesilmesine neden olur. Forward zincirinin neleri engellediğine dikkat edin: wg0 ile wg0 arası. Peer'lar birbirine değil, internete erişebilir; peer-to-peer VPN için iifname "wg0" oifname "wg0" accept eklenmelidir. Aynı zincir, bir peer'ın sunucu üzerinde neleri değiştirebileceğini belirler. Bu durum, sunucunun aynı zamanda bir tmux içinde Claude Code çalıştıran uzak geliştirme kutusu olarak kullanıldığı ve bu kısmın halka açık hale getirilmesinin istenmediği durumlarda önemlidir.

ufw yüklü bir sistemde: ufw allow 51820/udp, /etc/default/ufw içinde DEFAULT_FORWARD_POLICY="ACCEPT" ve /etc/ufw/before.rules dosyasının en başında bir *nat POSTROUTING MASQUERADE kuralı gereklidir.

systemd altında başlatın

sudo systemctl enable --now wg-quick@wg0
sudo wg show

wg-quick arayüzü oluşturur, adresleri ekler ve AllowedIPs üzerinden türetilen rotaları yükler. enable --now kritik kısımdır: manuel olarak çalıştırılan wg-quick up wg0 bir sonraki yeniden başlatmadan sonra silinir; çekirdek güncellemeleri de yeniden başlatma gerektirir.

İstemci yapılandırması ve herkesin yanlış anladığı ayar

[Interface]
PrivateKey = <laptop private key>
Address = 10.8.0.2/32
DNS = 10.8.0.1

[Peer]
PublicKey = <server public key>
Endpoint = vpn.example.com:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25

AllowedIPs aynı anda iki farklı görev yürütür; bu görevlerin karıştırılması, WireGuard ile ilgili çoğu karmaşanın kaynağıdır.

Dışa gidiş (outbound) yönünde bu bir yönlendirme tablosudur. Hedefi bir peer'ın AllowedIPs değeriyle eşleşen paketler şifrelenir ve o peer'a gönderilir. 0.0.0.0/0, ::/0 tünel üzerinden her şeyi gönderir; yani sunucu varsayılan rota (default route) olarak ayarlanmış tam bir tünel oluşturur. Bölünmüş tünel (split tunnel) ise daha dar bir listedir: AllowedIPs = 10.8.0.0/24, 10.20.0.0/16 VPN trafiğini ve sunucunun arkasındaki tek bir özel ağı taşır, geri kalan her şey yerel rotasını kullanmaya devam eder. Bu dar liste, servisleri tamamen genel internetten uzak tutmanıza olanak tanır; tünel adresine bağlı bir VPS üzerindeki özel Nextcloud örneği veya aynı makinede çalışan nested-virtualisation lab VM'leri, peer'lar için erişilebilir kalırken diğer herkes için görünmez olur.

İçe geliş (inbound) yönünde bu bir erişim kontrol listesidir (ACL). Kaynak adresi ilgili peer'ın AllowedIPs listesinde bulunmayan bir peer'dan gelen şifresi çözülmüş paket düşürülür. Sunucunun dizüstü bilgisayar için 10.8.0.2/32 listesini tutmasının sebebi budur: oradaki bir 0.0.0.0/0 girişi, o istemcinin tünel içindeki herhangi bir adresi taklit etmesine (spoofing) izin verir.

PersistentKeepalive, yönlendiricinin UDP eşlemesini yalnızca paket akışı olduğu sürece açık tuttuğu NAT arkasındaki istemciler içindir. Zaman aşımına uğradığında, sunucu artık istemciye ulaşamaz. PersistentKeepalive = 25 eşleşmeyi açık tutar; bu ayarı sunucu üzerinde değil, istemci üzerinde yapılandırın.

DNS ve fark edilmeyen sızıntı

AllowedIPs = 0.0.0.0/0 kullanıldığında ve DNS = satırı olmadığında, istemci yerel ağdan öğrendiği çözücüyü kullanmaya devam eder; bu, 192.168.1.1 adresindeki kafe yönlendiricisidir. Bu rota varsayılan rotadan daha spesifiktir; bu nedenle DNS sorguları, diğer tüm veriler tünel üzerinden gönderilirken yerel bağlantı üzerinden açık metin olarak iletilir. Trafik gizlidir; ancak isim listesi değildir.

İki güvenilir seçenek mevcuttur. DNS ayarını halka açık bir çözücüye (DNS = 9.9.9.9) yönlendirin; sorgular tünel üzerinden geçer ve sunucunuzdan çıkar, ancak o çözücü sorguları görmeye devam eder. Alternatif olarak, 10.8.0.1 adresine bağlı unbound veya dnsmasq çalıştırın, DNS = 10.8.0.1 ayarını yapın ve input zincirine udp dport 53 iifname "wg0" accept ekleyin; bu satırı ayarlayıp çözücüyü devre dışı bırakırsanız, hiçbir sorgu çözümlenemez.

Linux istemcilerde wg-quick, resolvconf aracılığıyla DNS uygular; eğer bu mevcut değilse resolvconf: command not found hatası alınır. openresolv paketini yükleyin veya systemd-resolved kullanan bir istemcide PostUp = resolvectl dns %i 10.8.0.1 ayarını yapın.

Tüneli koparmadan peer ekleme ve kaldırma

Bir kullanıcı eklemek için arayüzü yeniden başlatmak, bağlı olan tüm kullanıcıların bağlantısını keser. [Peer] bloğunu wg0.conf bloğuna ekleyin ve ardından peer setini yerinde yeniden yükleyin.

sudo bash -c 'wg syncconf wg0 <(wg-quick strip wg0)'

wg-quick strip, konfigürasyonu wg-quick-only anahtarları (Address, DNS, PostUp) olmadan yazdırır; syncconf ise mevcut oturumlar korunurken farkları uygular. Sadece peer bilgilerini günceller: değiştirilen bir Address için hala tam bir down/up işlemi gereklidir. sudo wg set wg0 peer <public key> remove ile yetkiyi iptal edin, ardından bloğu dosyadan silin; aksi takdirde bir sonraki yüklemede geri gelecektir.

Hata modları ve görülecek dizeler

Handshake hiçbir zaman tamamlanmaz. wg show, latest handshake olmayan peer listeler ve istemci günlükleri şöyledir:

Handshake for peer 1 (10.0.0.10:51820) did not complete after 5 seconds, retrying (try 2)

Veri gelmiyor veya kabul edilmiyor. Sırasıyla kontrol edin: UDP 51820 portu VPS güvenlik duvarında ve sağlayıcının ağ güvenlik duvarında (çoğu panelde ayrı bir kontroldür) açık mı; Endpoint adresi ve portu doğru mu; anahtarlar çapraz mı girilmiş. İstemcinin [Peer] bloğundaki anahtar, sunucunun genel anahtarı olmalıdır ve tersi geçerlidir; özel bir anahtar veya istemcinin kendi genel anahtarını yapıştırmak tam olarak bu soruna yol açar. Sunucudaki sudo tcpdump -ni any udp port 51820, paketlerin gelip gelmediğini gösterir. Çekirdek modülü varsayılan olarak hiçbir şey kaydetmez; WireGuard mesajları dmesg içinde yalnızca dynamic debug (echo module wireguard +p | sudo tee /sys/kernel/debug/dynamic_debug/control) etkinleştirildikten sonra görünür ve bu açıkken, anahtar uyuşmazlığı invalid-MAC drop olarak görünür.

Handshake başarılı, internet yok. ping 10.8.0.1 başarılı olur ancak ping 1.1.1.1 zaman aşımına uğrar: yönlendirme (forwarding) veya NAT eksiktir. sysctl net.ipv4.ip_forward'in 1 okuduğunu kontrol edin, ardından istemci ping atarken sudo nft list ruleset veya sudo iptables -t nat -L POSTROUTING -n -v ile sayaçları izleyin. Masquerade kuralında sıfır paket, çıkış arayüz adının yanlış olduğunu gösterir; yanıt alınamayan artan bir sayaç, forward chain politikasını işaret eder.

İnternet çalışıyor, isimler çözülmüyor. ping 1.1.1.1 başarılı olur ve curl https://example.com Could not resolve host döndürür. DNS satırı eksiktir veya tünel içerisinden ulaşılamayan bir çözücü (resolver) ismi belirtilmiştir.

Bazı HTTPS siteleri donuyor. SSH ve ping sorunsuzdur; büyük sayfalar takılır. Bu durum path MTU kaynaklıdır: tünel ek yük (overhead) ekler ve aradaki bir bağlantı, ICMP mesajı geri dönmeden aşırı büyük paketleri düşürür. İstemci tarafında [Interface] üzerindeki MTU değerini düşürün — sırasıyla 1420, 1380 ve 1280 değerlerini deneyin.

Arayüz başlatılamıyor. Address already in use, başka bir sürecin UDP 51820 portunu kullandığı anlamına gelir. Başarısız bir up sonrası Cannot find device wg0, genellikle yapılandırmanın reddedildiği anlamına gelir; journalctl -u wg-quick@wg0 -n 50 kayıtlarını okuyın.

Streisand veya OpenVPN'den Geçiş

Streisand artık desteklenmemektedir ve deposu arşivlenmiştir. Terk edilmiş bir otomasyon üzerinde VPN çalıştırmak, zamanla oluşacak bir güvenlik sorunudur. Yerinde yükseltme (in-place upgrade) imkanı yoktur. OpenVPN'in PKI yapısı dönüştürülemez; WireGuard sertifika, CA veya son kullanma tarihi kullanmaz, bu nedenle her istemci yeni bir anahtar çifti alır.

Paralel geçiş yapın — UDP 51820 portundaki WireGuard, aynı makinede 1194 portundaki OpenVPN ile eşzamanlı çalışabilir. wg0 kurulumunu yapın, istemcileri sırayla taşıyın ve ardından eski servisi durdurun. OpenVPN'in kullanıcı adı/parola ve iptal (revocation) modeli aktarılamaz; hesap yönetimi veya denetim izi gerekiyorsa, bu yapıyı WireGuard üzerinde ek bir katman olarak kurgulayın.

Yedeklemeler, yükseltmeler ve ölçeklendirmede zorlayan unsurlar

/etc/wireguard sunucunun kendisidir. Sunucuyu yedekleyin (sudo tar czf wg-backup.tgz -C /etc wireguard, mode 600, sunucu dışında tutulmalıdır); bu sayede yeni bir VPS üzerinde dakikalar içinde yeniden kurulum yapabilirsiniz. Sunucunun private key verisi kaybedilirse, istemciler sunucunun public key verisine güvendiği için her bir istemci konfigürasyonu yeniden düzenlenmelidir. Yükseltmeler standart bir apt upgrade işlemidir; kernel güncellemeleri için yeniden başlatma gereklidir ve wg-quick@wg0 etkinleştirildiyse kendi kendine geri döner.

Peer başına düşen durum verisi küçüktür ve kriptografi kernel içinde çalışır. Bu nedenle üst sınır, bu konfigürasyondaki bir parametreden ziyade VPS'in CPU ve bant genişliği limitidir; yayınlanmış bir rakama güvenmek yerine tünel üzerinden iperf3 ile ölçüm yapın. Ölçeklendirmede zorlayan unsur operasyonel süreçlerdir. Her peer için benzersiz bir tünel IP adresi gereklidir; altmış adet [Peer] bloğunu manuel olarak düzenlemek, mükerrer AllowedIPs hatalarının oluşmasına neden olur; konfigürasyonları bir script ile oluşturun. Tek bir sunucu, tek bir UDP uç noktası ve tek bir hata noktasıdır; WireGuard kümeleme özelliğine sahip değildir; yedeklilik, kendi anahtarları olan ikinci bir sunucu anlamına gelir. Anahtar rotasyonu manuel olarak yapılır; bu nedenle hangi anahtarın kimde olduğunu ve bir anahtarın nasıl iptal edileceğini not edin.

Tüm bunlar kontrolünüz altında olan bir Linux makinesi gerektirir: bir public IP, modül yüklenebilen bir kernel ve uçtan uca yönetilen bir firewall.

FAQ

WireGuard handshake neden asla tamamlanmıyor?

wg show içerisinde latest handshake bilgisi bulunmayan bir peer listelenmesi, paketlerin ulaşmadığı veya kabul edilmediği anlamına gelir. Hem VPS firewall ayarlarında hem de sağlayıcının ağ firewall ayarlarında UDP 51820 portunu kontrol edin; Endpoint host ve port bilgilerini doğrulayın ve anahtarların karışmadığından emin olun — istemci tarafındaki [Peer] bloğu, sunucunun public anahtarını içermelidir. sudo tcpdump -ni any udp port 51820 komutu paketlerin ulaşıp ulaşmadığını gösterir; dmesg ise yalnızca dinamik debug (echo module wireguard +p | sudo tee /sys/kernel/debug/dynamic_debug/control) etkinleştirildikten sonra WireGuard handshake hatalarını raporlar; bu durumda anahtar uyuşmazlığı invalid-MAC drop olarak görünür.

Tünel bağlanıyor ancak internet erişimi yok. Eksik olan nedir?

ping 10.8.0.1 çalışırken ping 1.1.1.1 zaman aşımına uğruyorsa sorun forwarding veya NAT ayarlarındadır. sysctl net.ipv4.ip_forward çıktısında 1 değerinin görüldüğünü ve bu değerin sadece yeniden başlatmada kaybolan bir sysctl -w yerine /etc/sysctl.d/ içerisinde tanımlandığını doğrulayın. Ardından masquerade kuralı isimlerini kontrol edin; gerçek egress arayüzünüz ip route show default üzerinde enp1s0, ens3 veya nadiren eth0 olabilir.

İstemci yapılandırmasında DNS = satırına ihtiyacım var mı?

Tam tünel (full tunnel) kullanıldığında ve DNS = satırı bulunmadığında, istemci yerel ağdan öğrendiği resolver'ı kullanmaya devam eder; bu durumda diğer tüm trafik tünel üzerinden geçerken, DNS sorguları yerel bağlantı üzerinden açık metin (cleartext) olarak gönderilir. DNS değerini halka açık bir resolver'a yönlendirin veya 10.8.0.1 adresine bağlı unbound/dnsmasq çalıştırarak input chain üzerinde udp dport 53 iifname "wg0" portunu açın.

AllowedIPs tam olarak neyi kontrol eder?

İki görevi vardır. Giden trafik için bir yönlendirme tablosudur: bir peer'ın AllowedIPs bilgisiyle eşleşen trafik şifrelenir ve o peer'a gönderilir. Gelen trafik için bir erişim kontrol listesidir (ACL): kaynağı o peer'ın AllowedIPs aralığının dışında olan şifresi çözülmüş paketler düşürülür (drop). Sunucu tarafı her istemci için bir /32 listelerken, istemci tarafının 0.0.0.0/0 listelemesinin sebebi budur.

WireGuard her VPS üzerinde çalışır mı?

KVM VPS üzerinde, çekirdek modülü (in-kernel module) ile ek bir kurulum gerektirmeden çalışır. OpenVZ veya LXC gibi host çekirdeğini paylaşan konteyner sanallaştırmalarında, modprobe wireguard işlemi Operation not supported hatası verir; bu durumda yedek yöntem olarak wireguard-go userspace implementasyonu kullanılır. Her şeyden önce sudo modprobe wireguard && echo ok komutunu çalıştırın.

#wireguard#vpn#linux-networking#nftables#systemd#self-hosting