SSD Nodes Learn Hosting plans →
Rehberler Matt ConnorYazan Matt Connor · Güncellendi 2026-08-28

Kendi VPS Sunucunuzda WireGuard VPN Kurulumu

Linux VPS üzerinde WireGuard VPN kurulumunu adım adım öğrenin. wg0.conf yapılandırması, IP yönlendirme, NAT kuralları ve el sıkışma hatalarını giderme yöntemlerini inceleyin.

Ne inşa ediyorsunuz

Kendi sunucunuz üzerinde bir WireGuard VPN kurmak yaklaşık kırk satırlık bir yapılandırmadan ibarettir: bir anahtar çifti, bir arayüz dosyası, bir sysctl ayarı, bir NAT kuralı ve bir güvenlik duvarı istisnası. Kurulum oldukça basittir; bu nedenle rehberin büyük bir kısmı nelerin hata verebileceğine, anahtar izinlerine, AllowedIPs, yönlendirme (forwarding) ve DNS ayarlarına odaklanmaktadır.

WireGuard, Linux 5.6 sürümünden beri ana çekirdekte yer alan bir Katman 3 tünelidir; bu nedenle Ubuntu 24.04 ve Debian 13, harici bir modüle ihtiyaç duymadan bu özelliği destekler. Şifreleme algoritması müzakeresi, sertifika yetkilisi veya kullanıcı adı/parola adımı yoktur: bir eş (peer), bir genel anahtar ve bu anahtarın kullanabileceği IP adreslerinden oluşur. MAC kontrolünden geçemeyen paketler yanıt verilmeden düşürülür, bu sayede port taramalarına karşı yanıt üretilmez. Bunun dezavantajı ise bir kimlik doğrulama sunucusunun bulunmamasıdır; dolayısıyla erişimi kaldırmak için sunucudaki ilgili eşin silinmesi gerekir.

Önce sanallaştırma türünü kontrol edin

WireGuard, modül yüklenebilen bir çekirdeğe ihtiyaç duyar; KVM tabanlı bir VPS üzerinde doğrudan çalışır. Ana makinenin çekirdeğini paylaşan OpenVZ veya LXC gibi konteyner sanallaştırma teknolojilerinde ilk komut RTNETLINK answers: Operation not supported hatası verir ve bu durumda wireguard-go kullanıcı alanı (userspace) uygulamasına geçiş yapılması gerekir. Öncelikle sudo modprobe wireguard && echo ok ile kontrol sağlayın.

Anahtarları sızdırmadan oluşturma

Herkesin okuyabildiği bir /etc/wireguard/server.key, hiç VPN olmamasıyla aynı anlama gelir. Yaygın kullanılan umask 077 && wg genkey | sudo tee ... satırı güvenilir değildir; çünkü sudo, tee tarafından oluşturulan dosya üzerinde kendi umask değerini uygular. İzinleri açıkça belirtin.

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 olacak şekilde isteğe bağlı bir ön paylaşımlı 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; dosyanın herkes tarafından erişilebilir olduğuna dair bir başlangıç uyarısı, bu adımı atladığınız anlamına gelir. Address, tünel içindeki sunucu adresidir ve tüm VPN alt ağının maskesini taşır. Dış dünyada karşılaşmayacağınız bir aralık seçin; 192.168.1.0/24, istemcilerinizin arkasında bulunduğu ev yönlendiricilerinin yarısıyla çakışır ve bu durumda tünel, yerel rotaya karşı sessizce devre dışı kalır.

Bir eşin (peer) sunucu tarafındaki AllowedIPs değeri bir /32'dir; yani o istemcinin sahip olduğu tek tünel adresidir. İki eşe aynı izin verilen IP adresini (AllowedIPs) atarsanız, trafik en son yapılandırılan eşe yönlendirilir ve ilki, herhangi bir hata mesajı üretilmeksizin trafik almayı durdurur. SaveConfig değerini boş bırakın; aksi takdirde wg-quick down bu dosyayı canlı durumdan yeniden yazar.

Sunucuyu yönlendiriciye dönüştürme

Bir Linux sunucusu, kendisine gönderilmeyen paketleri düşürür. Varsayılan olarak paket yönlendirme ve kaynak NAT devre dışı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

Ham bir sysctl -w komutu bir sonraki yeniden başlatmaya kadar çalışır ve ardından sessizce durur. NAT işlemi için wg0 değil, internete erişimi sağlayan çıkış arayüzü (egress interface) olan ağ kartı gereklidir. eth0 değerini varsaymayın; güncel imajlar enp1s0 veya ens3 gibi isimler kullandığından, kendi değerinizi ip route show default üzerinden alın.

Güvenlik duvarı: port ve yönlendirme yolu

Tek bir nftables dosyası hem filtreleme hem de NAT işlemlerini kapsar. /etc/nftables.conf komutunu yazmak mevcut kural kümesini sıfırlar; bu nedenle ufw veya Docker tarafından yönetilen bir sunucuda 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 oturumunu açık tutarak sudo systemctl enable --now nftables ile kuralı uygulayın: policy drop komutundaki bir yazım hatası, sunucunuza erişiminizi kaybetmenize neden olur. Yönlendirme zincirinin (forward chain) neleri izinli kılmadığına dikkat edin; wg0 ile wg0 arası buna örnektir. Eşler (peers) birbirine değil, internete erişebilir; eşler arası bir VPN için iifname "wg0" oifname "wg0" accept kuralını ekleyin. Aynı zincir, bir eşin sunucu üzerinde nelere erişebileceğini de denetler; sunucunuz aynı zamanda tmux içinde Claude Code çalıştıran uzak geliştirme ortamı olarak kullanılıyorsa ve bu tarafı herkese açık hale getirmek istemiyorsanız bu durum önem kazanır.

ufw kullanılan bir sunucuda: ufw allow 51820/udp komutunu çalıştırın, /etc/default/ufw dosyasında DEFAULT_FORWARD_POLICY="ACCEPT" ayarını yapın ve /etc/ufw/before.rules dosyasının en üstüne bir *nat POSTROUTING MASQUERADE kuralı ekleyin.

systemd altında ayağa kaldırma

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

wg-quick arayüzü oluşturur, adresleri ekler ve AllowedIPs üzerinden türetilen rotaları kurar. enable --now işin önemli kısmıdır: manuel olarak çalıştırılan bir wg-quick up wg0, bir sonraki yeniden başlatma sonrasında kaybolur; çekirdek güncellemeleri ise yeniden başlatma gerektirir. Bu yeniden başlatmalardan birinin ardından ayağa kalkamayan bir birim, birisi bağlanmaya çalışana kadar sessiz kalır. Bu nedenle, kendi ntfy sunucunuza işaret eden wg-quick@wg0 üzerindeki bir OnFailure= drop-in dosyası, durumu kilitli bir kullanıcıdan öğrenmek yerine telefonunuzdan duymanın en düşük maliyetli yoludur.

İstemci yapılandırması ve herkesin yanlış yaptığı 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ı işi yapar ve bunları birbirine karıştırmak, WireGuard ile ilgili kafa karışıklıklarının çoğunun kaynağıdır.

Giden trafik için bu bir yönlendirme tablosudur. Hedefi bir eşin AllowedIPs değeriyle eşleşen paket şifrelenir ve o eşe gönderilir. 0.0.0.0/0, ::/0 her şeyi tünel üzerinden gönderir; bu tam tüneldir ve sunucuyu varsayılan yol yapar. Ayrık tünel ise daha dar bir listedir: AllowedIPs = 10.8.0.0/24, 10.20.0.0/16 VPN trafiğini ve sunucunun arkasındaki bir özel ağı taşır, diğer her şey yerel yolunu kullanmaya devam eder. Bu dar liste, servisleri genel internetten tamamen uzak tutmanızı sağlar; bir VPS üzerinde özel Nextcloud örneği tünel adresine bağlandığında veya aynı makinede çalışan iç içe sanallaştırma laboratuvarı VM'leri, eşler tarafından erişilebilir kalırken diğer herkes için görünmez olur.

Gelen trafik için bu bir erişim denetim listesidir. Kaynak adresi, eşin AllowedIPs değerinde bulunmayan, eşten gelen şifresi çözülmüş bir paket düşürülür. Sunucunun dizüstü bilgisayar için 10.8.0.2/32 listelemesinin nedeni budur: oradaki bir 0.0.0.0/0 girdisi, istemcinin tünel içindeki herhangi bir adresi taklit etmesine olanak tanırdı.

PersistentKeepalive, yönlendiricinin UDP eşlemesini yalnızca paket akışı olduğunda açık tuttuğu NAT arkasındaki istemciler içindir. Eşleme süresi dolduğunda, sunucu istemciye artık ulaşamaz. PersistentKeepalive = 25 eşlemeyi açık tutar; bunu genel IP'ye sahip bir sunucuda değil, istemcide ayarlayın.

DNS ve kimsenin fark etmediği sızıntı

AllowedIPs = 0.0.0.0/0 ile ve hiçbir DNS = satırı olmadan, istemci yerel ağdan öğrendiği çözümleyiciyi, yani 192.168.1.1 adresindeki kafe yönlendiricisini kullanmaya devam eder. Bu rota varsayılan rotadan daha spesifik olduğu için, diğer her şey tünellenirken DNS sorguları yerel bağlantı üzerinden şifrelenmemiş halde çıkar. Trafik gizlidir; ancak sorgulanan isimlerin listesi gizli değildir.

İki dürüst seçenek mevcuttur. DNS değerini genel bir çözümleyiciye (DNS = 9.9.9.9) yönlendirdiğinizde sorgular tünel üzerinden geçer ve sunucunuzdan çıkar; ancak bu durumda çözümleyici sorgularınızı görmeye devam eder. Alternatif olarak, 10.8.0.1 adresine bağlı bir unbound veya dnsmasq çalıştırabilir, DNS = 10.8.0.1 ayarını yapabilir ve giriş zincirine udp dport 53 iifname "wg0" accept ekleyebilirsiniz; bu satırı ayarlayıp çözümleyiciyi devre dışı bıraktığınızda hiçbir şey çözümlenmeyecektir.

Linux istemcilerinde wg-quick, DNS üzerinden resolvconf uygular; bu mevcut değilse resolvconf: command not found alırsınız. openresolv paketini kurun veya systemd-resolved kullanan bir istemcide PostUp = resolvectl dns %i 10.8.0.1 ayarını yapın.

Tüneli düşürmeden eş ekleme ve kaldırma

Arayüzü yeniden başlatmak, bağlı olan herkesin bağlantısını keser. [Peer] bloğunu wg0.conf dosyasına ekleyin ve ardından eş kümesini mevcut oturumu bozmadan yeniden yükleyin.

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

wg-quick strip komutu, yapılandırmayı wg-quick-only anahtarları (Address, DNS, PostUp) olmadan yazdırır; syncconf ise mevcut oturumları koruyarak aradaki farkı uygular. Bu komut yalnızca eşleri günceller: değiştirilen bir Address parametresi hala tam bir down/up işlemi gerektirir. Bir eşi kaldırmak için sudo wg set wg0 peer <public key> remove komutunu kullanın, ardından ilgili bloğu dosyadan silin; aksi takdirde bir sonraki yeniden yüklemede eş geri dönecektir.

Hata modları ve karşılaşacağınız dizeler

El sıkışma (handshake) asla tamamlanmıyor. wg show, eşi herhangi bir latest handshake olmadan listeler ve istemci günlüklerinde şu ifade yer alır:

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

Hiçbir veri ulaşmıyor veya hiçbir veri kabul edilmiyor. Sırasıyla kontrol edin: UDP 51820 portu VPS güvenlik duvarında ve çoğu panelde ayrı bir denetim mekanizması olan sağlayıcınızın ağ güvenlik duvarında açık mı; Endpoint adresi ve portu doğru mu; anahtarlar yanlış yerleştirilmiş mi. İstemcinin [Peer] bloğundaki anahtar, sunucunun genel (public) anahtarı olmalıdır; bunun tersi de geçerlidir. Özel (private) anahtarı veya istemcinin kendi genel anahtarını yapıştırmak tam olarak bu belirtiye yol açar. Sunucudaki sudo tcpdump -ni any udp port 51820, paketlerin ulaşıp ulaşmadığını gösterir. Çekirdek modülü varsayılan olarak hiçbir şey günlüğe kaydetmez; WireGuard mesajları ancak dinamik hata ayıklamayı (echo module wireguard +p | sudo tee /sys/kernel/debug/dynamic_debug/control) etkinleştirdikten sonra dmesg içinde görünür. Bu özellik açıkken, anahtar uyuşmazlığı geçersiz MAC düşüşü (invalid-MAC drop) olarak görünür.

El sıkışma çalışıyor, internet yok. ping 10.8.0.1 başarılı oluyor ancak ping 1.1.1.1 zaman aşımına uğruyor: yönlendirme (forwarding) veya NAT eksik. sysctl net.ipv4.ip_forward dosyasının 1 değerini içerdiğini doğrulayın, 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 görünmesi, çıkış arayüzü adının yanlış olduğu anlamına gelir; yanıt almadan artan bir sayaç ise forward zinciri politikasını işaret eder.

İnternet çalışıyor, isim çözümleme (DNS) çalışmıyor. ping 1.1.1.1 başarılı oluyor ancak curl https://example.com komutu Could not resolve host döndürüyor. DNS satırı eksik veya tünel içinden ulaşılamayan bir çözümleyiciye işaret ediyor.

Bazı HTTPS siteleri yanıt vermiyor. SSH ve ping sorunsuz; büyük sayfalar takılıyor. Bu durum path MTU ile ilgilidir: tünel ek yük getirir ve aradaki bir bağlantı noktası, ICMP mesajı geri dönmeden büyük paketleri düşürür. İstemci [Interface] dosyasındaki MTU değerini düşürün; sırasıyla 1420, 1380 ve 1280 değerlerini deneyin. MTU değerini düşürmek takılmaları çözüyor ancak veri aktarım hızı hala düşükse, rastgele sayılarla uğraşmayı bırakın ve ikiye bölme yöntemiyle gerçek path MTU değerini bulma ve TCP MSS sabitleme adımlarını izleyin; bu yöntem tünelden kaynaklanmayan diğer olası nedenleri de eleyecektir.

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 komutundan sonra alınan Cannot find device wg0 hatası genellikle yapılandırmanın reddedildiğini gösterir; journalctl -u wg-quick@wg0 -n 50 dosyasını okuyun.

Streisand veya OpenVPN'den Geçiş

Streisand artık desteklenmemektedir ve deposu arşivlenmiştir; terk edilmiş otomasyon araçları üzerinde VPN çalıştırmak, zamanla büyüyen bir güvenlik sorunudur. Yerinde yükseltme seçeneği bulunmamaktadır ve OpenVPN'in PKI yapısı dönüştürülemez: WireGuard sertifika, CA veya son kullanma tarihi içermez; bu nedenle her istemci için yeni bir anahtar çifti oluşturulmalıdır.

Geçişi paralel olarak gerçekleştirin; UDP 51820 üzerindeki WireGuard, aynı sunucuda 1194 portundaki OpenVPN ile birlikte çalışabilir. wg0 kurulumunu yapın, istemcileri tek tek taşıyın ve ardından eski servisi durdurun. OpenVPN'in kullanıcı adı/parola ve iptal (revocation) modeli WireGuard'a aktarılamaz; hesap yönetimine veya denetim izine ihtiyacınız varsa, bu katmanı WireGuard'ın üzerinde yapılandırın.

Yedeklemeler, yükseltmeler ve ölçeklendirme zorlukları

/etc/wireguard sunucunun kendisidir. Yedeğini alın (sudo tar czf wg-backup.tgz -C /etc wireguard, 600 modu, sunucu dışında saklayın) ve dakikalar içinde yeni bir VPS üzerinde sistemi yeniden kurun. Sunucunun özel anahtarını kaybederseniz, istemciler sunucunun açık anahtarını doğruladığı için tüm istemci yapılandırmalarını yeniden oluşturmanız gerekir. Yükseltmeler olağan bir apt upgrade işlemidir; çekirdek güncellemeleri için yeniden başlatma gerekir ve wg-quick@wg0 etkinleştirilmişse kendiliğinden geri döner.

Eş bazlı durum bilgisi küçüktür ve kriptografi çekirdek seviyesinde çalışır; bu nedenle sınır, yapılandırmadan ziyade VPS'nizin CPU ve bant genişliği kapasitesidir. Yayınlanan rakamlara güvenmek yerine iperf3 ile tünel üzerinden ölçüm yapın. Ölçeklendirmede zorlayan kısım operasyonel süreçlerdir. Her eşin benzersiz bir tünel IP'sine ihtiyacı vardır ve altmış adet [Peer] bloğunu elle düzenlemek, AllowedIPs çakışmalarının sızmasına neden olur: yapılandırmaları bir betik ile oluşturun. Tek bir sunucu, tek bir UDP uç noktası ve tek bir hata noktasıdır; WireGuard'da kümeleme özelliği yoktur: yedeklilik, kendi anahtarlarına sahip ikinci bir sunucu anlamına gelir. Anahtar rotasyonu manueldir; bu nedenle kimin hangi anahtara sahip olduğunu ve bir anahtarı nasıl iptal edeceğinizi not edin. Bu kayıt tutma süreci bir metin dosyasını aştığında, genellikle aynı çekirdek veri düzlemi üzerinde bir kontrol düzlemi kullanılır ve kendi kendine barındırılan bir NetBird sunucusu, aksi takdirde elle yapacağınız adres tahsisini, eş dağıtımını ve kurulum anahtarlarını yönetir. Bu kontrol düzlemini kendiniz çalıştırmak bir sunucu fazlalığı yaratıyorsa, Tailscale sizin yerinize barındırır ve ücretsiz planı altı kullanıcıya kadar sınırsız cihazı kapsar; bu, çoğu kişisel ağ için yeterlidir. Bu noktadan sonra ücretlendirme makine sayısına değil kişi sayısına göre yapılır; dolayısıyla bir hane veya küçük bir ekibin ödeyeceği tutar, wg0.conf dosyalarına elle ekleyeceğiniz eş sayısına değil, kaç kişinin oturum açtığına bağlıdır. Bu tarafta, split-tunnel AllowedIPs kayıt tutma süreci, özel IP aralıklarınızı bir subnet router üzerinden duyurmaya dönüşür; bu, her istemci dosyasına yapıştırmak yerine tek bir VPS'den bir kez duyurulur ve merkezi olarak onaylanır. Bu değişimin yapılıp yapılmayacağı, barındırılan bir kontrol düzleminin neye erişebileceğine bağlıdır ve trafiğinizi şifreleyen anahtarları asla tutmaz, ancak hangi eşlerin birbirini öğreneceğine karar verir.

Tüm bunlar; kontrol edebileceğiniz bir Linux sunucusu, genel bir IP adresi, modül yükleyebileceğiniz bir çekirdek ve uçtan uca yönetebileceğiniz bir güvenlik duvarı gerektirir.

FAQ

WireGuard el sıkışması neden hiçbir zaman tamamlanmıyor?

wg show bir eşi latest handshake olmadan listelemek, paketlerin ulaşmadığı veya kabul edilmediği anlamına gelir. Hem VPS güvenlik duvarında hem de sağlayıcınızın ayrı ağ güvenlik duvarında UDP 51820 portunu kontrol edin, Endpoint ana bilgisayarını ve portunu doğrulayın, ardından anahtarların karışmadığından emin olun; istemcinin [Peer] bloğu sunucunun açık anahtarını içermelidir. Sunucudaki sudo tcpdump -ni any udp port 51820, paketlerin ulaşıp ulaşmadığını gösterir; dmesg ise yalnızca dinamik hata ayıklamayı (echo module wireguard +p | sudo tee /sys/kernel/debug/dynamic_debug/control) etkinleştirdikten sonra WireGuard'ın el sıkışma hatalarını raporlar; bu durumda bir anahtar uyuşmazlığı geçersiz-MAC düşüşü olarak görünür.

Tünel bağlanıyor ancak internete erişemiyorum. Eksik olan nedir?

ping 10.8.0.1 çalışırken ping 1.1.1.1 zaman aşımına uğruyorsa, sorun yönlendirme veya NAT kaynaklıdır. sysctl net.ipv4.ip_forward dosyasının 1 değerini okuduğunu ve bunun sadece yeniden başlatmada kaybolan bir sysctl -w ile değil, /etc/sysctl.d/ içinde kalıcı olarak ayarlandığını doğrulayın. Ardından, gerçek çıkış arayüzünüzü ip route show default, enp1s0 veya ens3 (nadir durumlarda eth0) üzerinden maskeleme kuralı ile kontrol edin.

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

Tam tünel kullanımında ve DNS = satırı olmadığında, istemci yerel ağdan öğrendiği çözümleyiciyi tutmaya devam eder; bu durumda diğer her şey tünellenirken sorgular yerel bağlantı üzerinden şifresiz olarak gönderilir. DNS değerini genel bir çözümleyiciye yönlendirin veya 10.8.0.1 üzerinde dinlenen unbound/dnsmasq çalıştırıp giriş zincirinde udp dport 53 iifname "wg0" portunu açın.

AllowedIPs tam olarak neyi kontrol eder?

İki işlevi vardır. Giden trafikte bir yönlendirme tablosudur: bir eşin AllowedIPs değeriyle eşleşen trafik şifrelenir ve o eşe gönderilir. Gelen trafikte ise bir erişim denetim listesidir: kaynağı o eşin AllowedIPs değerinin dışında olan şifresi çözülmüş bir paket düşürülür. Sunucu tarafının istemci başına bir /32 listelemesinin, istemci tarafının ise 0.0.0.0/0 listelemesinin nedeni budur.

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

KVM tabanlı bir VPS üzerinde, çekirdek içi modül ile ek bir kurulum gerektirmeden çalışır. OpenVZ veya LXC gibi ana makine çekirdeğini paylaşan kapsayıcı sanallaştırmalarında, modprobe wireguard komutu Operation not supported hatasıyla başarısız olur ve bu durumda yedek çözüm wireguard-go kullanıcı alanı uygulamasıdır. Başka bir işlem yapmadan önce sudo modprobe wireguard && echo ok komutunu çalıştırın.