SSD Nodes Learn Hosting plans →
Panduan Matt ConnorOleh Matt Connor · Dikemas kini 2026-08-29

Cara Bina WireGuard VPN Sendiri di VPS Linux

Ketahui cara memasang WireGuard VPN pada VPS Linux anda dengan konfigurasi wg0.conf, NAT, dan IP forwarding yang betul. Kami selesaikan masalah handshake yang sering berlaku.

Apa yang anda bina

VPN WireGuard pada pelayan milik anda hanya memerlukan kira-kira empat puluh baris konfigurasi: satu pasangan kunci, satu fail antara muka, satu sysctl, satu peraturan NAT, dan satu lubang firewall. Pemasangannya sangat mudah, jadi kebanyakan panduan ini merangkumi perkara yang sering rosak, kebenaran kunci, AllowedIPs, penghantaran (forwarding) dan DNS.

WireGuard ialah terowong Layer 3 dalam kernel, yang telah menjadi sebahagian daripada aliran utama sejak Linux 5.6, jadi Ubuntu 24.04 dan Debian 13 menyediakannya tanpa modul luaran. Tiada rundingan cipher, tiada pihak berkuasa sijil (certificate authority), tiada langkah nama pengguna/kata laluan: rakan setara (peer) ialah kunci awam berserta alamat IP yang boleh digunakan oleh kunci tersebut. Paket yang gagal dalam pemeriksaan MAC akan digugurkan tanpa balasan, jadi port tersebut tidak akan menjawab imbasan. Sisi sebaliknya: tiada pelayan pengesahan, jadi membuang akses bermakna memadamkan rakan setara pada mesin tersebut.

Semak virtualisasi terlebih dahulu

WireGuard memerlukan kernel yang membolehkan anda memuatkan modul, dan pada VPS KVM ia berfungsi secara terus. Pada virtualisasi kontena yang berkongsi kernel hos, seperti OpenVZ atau LXC, arahan pertama akan gagal dengan RTNETLINK answers: Operation not supported, dan pilihan alternatifnya ialah implementasi userspace wireguard-go. Semak dengan sudo modprobe wireguard && echo ok terlebih dahulu.

Menjana kunci tanpa mendedahkannya

Fail /etc/wireguard/server.key yang boleh dibaca oleh semua orang adalah sama seperti tidak mempunyai VPN langsung. Baris umask 077 && wg genkey | sudo tee ... yang biasa digunakan adalah tidak boleh dipercayai, kerana sudo menggunakan umask sendiri pada fail yang dicipta oleh tee. Tetapkan mod secara eksplisit.

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

Jana pasangan klien dengan cara yang sama. wg genpsk menambah kunci pra-kongsi (pre-shared key) pilihan, satu baris dalam setiap konfigurasi.

Antara muka pelayan: /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 ia; amaran semasa permulaan bahawa fail tersebut boleh diakses oleh semua pengguna bermakna anda terlepas langkah tersebut. Address ialah alamat pelayan di dalam terowong, yang membawa mask bagi keseluruhan subnet VPN. Pilih julat yang tidak akan anda temui di luar, 192.168.1.0/24 akan bertembung dengan separuh daripada penghala rumah yang digunakan oleh klien anda, dan terowong tersebut kemudiannya akan gagal secara senyap kepada laluan tempatan.

AllowedIPs bagi peer pada bahagian pelayan ialah /32, iaitu satu alamat terowong yang dimiliki oleh klien tersebut. Jika anda memberikan IP yang dibenarkan (AllowedIPs) yang sama kepada dua peer, trafik akan beralih kepada peer yang dikonfigurasikan terakhir, dan peer pertama akan berhenti menerima trafik tanpa sebarang ralat dipaparkan. Biarkan SaveConfig tidak ditetapkan, atau wg-quick down akan menulis semula fail ini daripada keadaan semasa (live state).

Tukar pelayan menjadi penghala

Pelayan Linux akan menggugurkan paket yang tidak ditujukan kepadanya. Pemajuan (forwarding) dan NAT sumber kedua-duanya tidak diaktifkan secara lalai.

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

sysctl -w kosong hanya berfungsi sehingga but semula dan kemudian berhenti berfungsi secara senyap. NAT memerlukan antara muka egress, iaitu kad antara muka rangkaian (NIC) yang mencapai internet, bukan wg0. Jangan andaikan eth0; ambil nama antara muka anda daripada ip route show default, kerana imej semasa menggunakan nama seperti enp1s0 atau ens3.

Firewall: port dan laluan penghantaran

Satu fail nftables merangkumi filter dan NAT. Tulis /etc/nftables.conf, ia membersihkan set peraturan sedia ada, jadi langkau langkah ini pada mesin yang sudah diuruskan oleh ufw atau Docker.

#!/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
  }
}

Gunakan peraturan tersebut dengan sudo systemctl enable --now nftables, sambil memastikan sesi SSH kedua dibuka: policy drop berserta kesilapan taip dalam peraturan SSH akan menyebabkan anda terkunci daripada pelayan anda sendiri. Perhatikan perkara yang tidak dibenarkan oleh rantaian forward, wg0 hingga wg0. Rakan setara (peers) boleh mencapai internet, tetapi tidak antara satu sama lain; tambah iifname "wg0" oifname "wg0" accept untuk VPN peer-to-peer. Rantaian yang sama mengawal perkara yang boleh dicapai oleh rakan setara pada pelayan itu sendiri, yang penting apabila mesin tersebut berfungsi sebagai kotak pembangunan jauh yang menjalankan Claude Code dalam tmux dan anda tidak mahu mendedahkan bahagian tersebut kepada umum.

Pada mesin ufw: ufw allow 51820/udp, DEFAULT_FORWARD_POLICY="ACCEPT" dalam /etc/default/ufw, dan peraturan *nat POSTROUTING MASQUERADE di bahagian atas /etc/ufw/before.rules.

Jalankan di bawah systemd

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

wg-quick mencipta antara muka, menambah alamat, dan memasang laluan yang diperoleh daripada AllowedIPs. enable --now merupakan bahagian yang penting: wg-quick up wg0 yang dijalankan secara manual akan hilang selepas but semula, dan naik taraf kernel memerlukan but semula. Unit yang gagal untuk kembali berfungsi selepas but semula akan kekal senyap sehingga seseorang cuba menyambung, jadi drop-in OnFailure= pada wg-quick@wg0 yang dihalakan ke pelayan ntfy anda sendiri ialah cara paling murah untuk mendapatkan pemberitahuan mengenainya pada telefon anda dan bukannya daripada pengguna yang tidak dapat masuk.

Konfigurasi klien, dan tetapan yang sering disalah faham

[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 melakukan dua tugas berbeza serentak, dan mencampuradukkan kedua-duanya adalah punca utama kekeliruan WireGuard.

Untuk trafik keluar, ia berfungsi sebagai jadual penghalaan (routing table). Paket yang destinasi alamatnya sepadan dengan AllowedIPs rakan setara (peer) akan disulitkan dan dihantar kepada rakan setara tersebut. 0.0.0.0/0, ::/0 menghantar segala trafik melalui terowong, iaitu terowong penuh (full tunnel), menjadikan pelayan sebagai laluan lalai (default route). Terowong berpecah (split tunnel) pula menggunakan senarai yang lebih terhad: AllowedIPs = 10.8.0.0/24, 10.20.0.0/16 membawa trafik VPN serta satu rangkaian peribadi di belakang pelayan, manakala trafik lain kekal menggunakan laluan tempatan. Senarai terhad inilah yang membolehkan anda memastikan servis tidak terdedah kepada internet awam sepenuhnya, seperti instans Nextcloud peribadi pada VPS yang terikat dengan alamat terowong, atau VM makmal virtualisasi bersarang yang berjalan pada mesin yang sama, kekal boleh dicapai oleh rakan setara dan tidak kelihatan kepada pihak lain.

Untuk trafik masuk, ia berfungsi sebagai senarai kawalan capaian (access-control list). Paket yang telah dinyahsulit daripada rakan setara yang alamat sumbernya tiada dalam AllowedIPs rakan setara tersebut akan digugurkan. Itulah sebabnya pelayan menyenaraikan 10.8.0.2/32 untuk komputer riba: entri 0.0.0.0/0 di situ akan membenarkan klien tersebut melakukan spoofing terhadap mana-mana alamat dalam terowong.

PersistentKeepalive adalah untuk klien yang berada di belakang NAT, di mana penghala (router) hanya mengekalkan pemetaan UDP selagi paket mengalir. Apabila ia tamat tempoh, pelayan tidak lagi dapat mencapai klien. PersistentKeepalive = 25 mengekalkan pemetaan tersebut agar sentiasa terbuka; tetapkan ia pada klien, bukan pada pelayan yang mempunyai IP awam.

DNS, dan kebocoran yang tidak disedari sesiapa

Dengan AllowedIPs = 0.0.0.0/0 dan tiada baris DNS =, klien mengekalkan resolver yang diperoleh daripada rangkaian setempat, iaitu penghala kafe pada 192.168.1.1. Laluan tersebut adalah lebih khusus daripada laluan lalai (default route), jadi pertanyaan DNS keluar melalui pautan setempat dalam teks jelas (cleartext) manakala trafik lain disalurkan melalui terowong. Trafik tersebut adalah peribadi; senarai nama domain tidak.

Terdapat dua pilihan yang jujur. Halakan DNS kepada resolver awam (DNS = 9.9.9.9) supaya pertanyaan tersebut melalui terowong dan keluar dari pelayan anda, walaupun resolver tersebut masih boleh melihatnya. Atau jalankan unbound atau dnsmasq yang terikat pada 10.8.0.1, tetapkan DNS = 10.8.0.1, dan tambah udp dport 53 iifname "wg0" accept pada rantaian input, tetapkan baris tersebut dan abaikan resolver, maka tiada apa-apa yang akan diselesaikan (resolve).

Pada klien Linux, wg-quick menggunakan DNS melalui resolvconf; jika ia tiada, anda akan mendapat resolvconf: command not found. Pasang openresolv, atau tetapkan PostUp = resolvectl dns %i 10.8.0.1 pada klien systemd-resolved.

Menambah dan membuang peer tanpa memutuskan tunnel

Memulakan semula antaramuka untuk menambah pengguna akan memutuskan sambungan semua orang yang sedang bersambung. Tambahkan blok [Peer] ke dalam wg0.conf, kemudian muat semula set peer secara terus.

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

wg-quick strip mencetak konfigurasi tanpa kunci khusus wg-quick (Address, DNS, PostUp), dan syncconf menggunakan perbezaan tersebut semasa sesi masih aktif. Ia hanya mengemas kini peer: perubahan pada Address masih memerlukan proses down/up sepenuhnya. Batalkan dengan sudo wg set wg0 peer <public key> remove, kemudian padamkan blok tersebut daripada fail atau ia akan kembali pada muat semula seterusnya.

Mod kegagalan, berserta rentetan yang akan anda lihat

Handshake tidak pernah selesai. wg show menyenaraikan peer tanpa latest handshake, dan log klien menunjukkan:

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

Tiada data yang sampai, atau tiada data yang diterima. Ikut urutan ini: adakah UDP 51820 dibuka pada firewall VPS dan pada firewall rangkaian pembekal anda (kawalan berasingan pada kebanyakan panel); adakah alamat dan port Endpoint betul; adakah kunci tertukar. Kunci dalam blok [Peer] klien mestilah kunci awam pelayan, dan sebaliknya. Melekatkan kunci peribadi, atau kunci awam klien itu sendiri, akan memberikan simptom yang tepat ini. sudo tcpdump -ni any udp port 51820 pada pelayan menunjukkan sama ada paket sampai atau tidak. Modul kernel tidak mencatat apa-apa secara lalai; mesej WireGuard hanya muncul dalam dmesg selepas anda mendayakan debug dinamik (echo module wireguard +p | sudo tee /sys/kernel/debug/dynamic_debug/control), dan apabila ia diaktifkan, ketidakpadanan kunci akan dipaparkan sebagai pengguguran invalid-MAC.

Handshake berjaya, tiada internet. ping 10.8.0.1 berjaya tetapi ping 1.1.1.1 tamat masa: forwarding atau NAT tiada. Semak sysctl net.ipv4.ip_forward membaca 1, kemudian perhatikan pembilang semasa klien melakukan ping, dengan sudo nft list ruleset atau sudo iptables -t nat -L POSTROUTING -n -v. Sifar paket pada peraturan masquerade bermakna nama antara muka egress salah; pembilang yang meningkat tanpa balasan menunjukkan masalah pada polisi rantaian forward.

Internet berfungsi, nama tidak. ping 1.1.1.1 berjaya dan curl https://example.com mengembalikan Could not resolve host. Baris DNS tiada, atau ia menamakan resolver yang tidak boleh dicapai dari dalam terowong.

Sesetengah laman HTTPS tergantung. SSH dan ping berfungsi dengan baik; halaman besar terhenti. Ini adalah masalah path MTU: terowong menambah overhead, dan sesetengah pautan di tengah menggugurkan paket yang terlalu besar tanpa mesej ICMP dikembalikan. Rendahkan MTU pada [Interface] klien, cuba 1420, kemudian 1380, kemudian 1280. Jika menurunkan MTU menyelesaikan masalah terhenti tetapi throughput masih mengecewakan, berhenti meneka nombor bulat dan selesaikan melalui mencari path MTU sebenar melalui bisection dan clamping TCP MSS, yang juga menolak punca yang bukan disebabkan oleh terowong.

Antara muka enggan bermula. Address already in use bermakna proses lain memegang UDP 51820. Cannot find device wg0 selepas up yang gagal biasanya bermakna konfigurasi ditolak; baca journalctl -u wg-quick@wg0 -n 50.

Migrasi daripada Streisand atau OpenVPN

Streisand tidak lagi diselenggara dan repositorinya telah diarkibkan. Menjalankan VPN menggunakan automasi yang ditinggalkan merupakan risiko keselamatan yang perlahan. Tiada naik taraf secara terus (in-place upgrade) dan PKI OpenVPN tidak boleh ditukar: WireGuard tidak mempunyai sijil, tiada CA dan tiada tarikh luput, jadi setiap klien mendapat pasangan kunci yang baharu.

Lakukan migrasi secara selari; WireGuard pada UDP 51820 boleh wujud bersama OpenVPN pada 1194 di pelayan yang sama. Sediakan wg0, pindahkan klien satu demi satu, kemudian hentikan servis lama tersebut. Model nama pengguna/kata laluan dan pembatalan (revocation) OpenVPN tidak boleh dibawa bersama; jika anda memerlukan akaun atau jejak audit, lapiskan fungsi tersebut di atas WireGuard.

Sandaran, naik taraf, dan beban pada skala besar

/etc/wireguard adalah pelayan tersebut. Lakukan sandaran (sudo tar czf wg-backup.tgz -C /etc wireguard, mod 600, disimpan di luar pelayan) supaya anda boleh membina semula pada VPS baharu dalam beberapa minit. Jika kunci peribadi pelayan hilang, setiap konfigurasi klien perlu dikeluarkan semula kerana klien melakukan pinning pada kunci awam pelayan. Naik taraf adalah apt upgrade biasa ditambah dengan but semula untuk kemas kini kernel, dan wg-quick@wg0 akan kembali berjalan dengan sendiri jika anda telah mendayakannya.

Keadaan bagi setiap peer adalah kecil dan kriptografi berjalan di dalam kernel, jadi hadnya adalah CPU dan peruntukan lebar jalur VPS anda, bukannya konfigurasi ini. Ukur prestasi dengan iperf3 merentasi terowong dan jangan hanya mempercayai angka yang diterbitkan. Perkara yang membebankan pada skala besar ialah operasi. Setiap peer memerlukan IP terowong yang unik, dan menyunting enam puluh blok [Peer] secara manual adalah punca AllowedIPs pendua menyelinap masuk: jana konfigurasi daripada skrip. Satu pelayan adalah satu titik akhir UDP dan satu titik kegagalan, dan WireGuard tidak mempunyai clustering: redundansi bermaksud pelayan kedua dengan kuncinya sendiri. Putaran kunci kekal manual, jadi catatkan siapa yang memegang kunci yang mana dan cara anda membatalkannya. Apabila pengurusan rekod tersebut melebihi kapasiti fail teks, jawapan lazimnya ialah menggunakan control plane di atas data plane kernel yang sama, dan pelayan NetBird yang dihoskan sendiri mengendalikan peruntukan alamat, pengagihan peer dan kunci persediaan yang sebaliknya anda lakukan secara manual. Jika menjalankan control plane itu sendiri adalah beban tambahan, Tailscale akan menghoskannya untuk anda, dan pelan percuma mereka meliputi enam pengguna dengan peranti tanpa had, cukup untuk kebanyakan armada peribadi tidak perlu membayar. Melepasi tahap itu, caj dikira berdasarkan orang bukannya mesin, jadi apa yang dibayar oleh isi rumah atau pasukan kecil bergantung pada berapa ramai manusia yang memegang log masuk, bukan pada berapa banyak peer yang anda perlu sunting secara manual ke dalam wg0.conf. Dari sudut itu, pengurusan rekod split-tunnel AllowedIPs menjadi pengiklanan julat peribadi anda daripada subnet router, yang diumumkan sekali daripada satu VPS dan diluluskan secara berpusat dan bukannya ditampal ke dalam setiap fail klien. Sama ada pertukaran itu berbaloi bergantung pada apa yang boleh dicapai oleh control plane yang dihoskan, dan ia tidak pernah memegang kunci yang menyulitkan trafik anda, walaupun ia menentukan peer mana yang mengetahui tentang satu sama lain.

Semua ini memerlukan kotak Linux yang anda kawal, IP awam, kernel yang boleh dimuatkan modul, dan firewall yang anda miliki sepenuhnya.

FAQ

Mengapa jabat tangan (handshake) WireGuard tidak pernah selesai?

wg show menyenaraikan peer tanpa latest handshake bermakna paket tidak sampai atau tidak diterima. Semak UDP 51820 pada firewall VPS dan firewall rangkaian berasingan pembekal anda, sahkan hos dan port Endpoint, kemudian pastikan kunci tidak tertukar; blok [Peer] klien mesti mengandungi kunci awam pelayan. sudo tcpdump -ni any udp port 51820 pada pelayan menunjukkan sama ada paket sampai atau tidak; dmesg hanya melaporkan kegagalan jabat tangan WireGuard selepas anda mendayakan debug dinamik (echo module wireguard +p | sudo tee /sys/kernel/debug/dynamic_debug/control), dan kemudian ketidakpadanan kunci akan muncul sebagai pengguguran invalid-MAC.

Terowong bersambung tetapi saya tiada akses internet. Apa yang kurang?

ping 10.8.0.1 berfungsi manakala ping 1.1.1.1 tamat masa menunjukkan masalah pada forwarding atau NAT. Sahkan sysctl net.ipv4.ip_forward membaca 1 dan ia ditetapkan dalam /etc/sysctl.d/, bukan sekadar dengan sysctl -w yang hilang selepas but semula. Kemudian semak peraturan masquerade yang menamakan antara muka egress sebenar anda daripada ip route show default, enp1s0 atau ens3, jarang sekali eth0.

Adakah saya perlukan baris DNS = dalam konfigurasi klien saya?

Dengan terowong penuh dan tanpa baris DNS =, klien mengekalkan resolver yang diperoleh daripada rangkaian tempatan, dan pertanyaan tersebut keluar dalam teks jelas melalui pautan tempatan sementara trafik lain melalui terowong. Halakan DNS kepada resolver awam, atau jalankan unbound/dnsmasq yang terikat pada 10.8.0.1 dan buka udp dport 53 iifname "wg0" dalam rantaian input.

Apakah yang sebenarnya dikawal oleh AllowedIPs?

Ia melakukan dua tugas. Untuk trafik keluar, ia adalah jadual penghalaan: trafik yang sepadan dengan AllowedIPs peer akan disulitkan dan dihantar kepada peer tersebut. Untuk trafik masuk, ia adalah senarai kawalan capaian: paket yang dinyahsulit yang sumbernya berada di luar AllowedIPs peer tersebut akan digugurkan. Itulah sebabnya bahagian pelayan menyenaraikan satu /32 bagi setiap klien manakala bahagian klien mungkin menyenaraikan 0.0.0.0/0.

Adakah WireGuard akan berjalan pada mana-mana VPS?

Pada VPS KVM, ia berfungsi dengan modul dalam-kernel tanpa tetapan tambahan. Pada virtualisasi kontena yang berkongsi kernel hos, seperti OpenVZ atau LXC, modprobe wireguard gagal dengan Operation not supported dan pilihan terakhir ialah pelaksanaan ruang pengguna wireguard-go. Jalankan sudo modprobe wireguard && echo ok sebelum melakukan perkara lain.