SSD Nodes Learn
Panduan Matt ConnorOleh Matt Connor · Dikemas kini 2026-07-24

Cara pasang WireGuard VPN pada VPS Linux

Panduan lengkap tetapan WireGuard pada VPS Linux termasuk konfigurasi wg0.conf, NAT, IP forwarding dan cara mengatasi masalah handshake yang gagal.

Apa yang anda bina

WireGuard VPN 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. Proses pemasangan adalah mudah, jadi kebanyakan panduan ini membincangkan perkara yang sering gagal — keizinan kunci, AllowedIPs, penghantaran (forwarding) dan DNS.

WireGuard ialah terowong Layer 3 dalam kernel, yang telah menjadi bahagian utama sejak Linux 5.6, jadi Ubuntu 24.04 dan Debian 13 menyediakannya tanpa modul luaran. Tiada rundingan cipher, tiada pihak berkuasa sijil, tiada langkah nama pengguna/kata laluan: sesebuah peer ialah kunci awam ditambah dengan alamat IP yang boleh digunakan oleh kunci tersebut. Paket yang gagal pemeriksaan MAC akan digugurkan tanpa sebarang maklum balas, jadi port tersebut tidak akan menjawab imbasan. Kesan sampingannya: tiada pelayan pengesahan wujud, jadi untuk membatalkan akses bermaksud anda perlu memadam peer pada mesin tersebut.

Semak virtualisasi terlebih dahulu

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

Jana kunci tanpa kebocoran

/etc/wireguard/server.key yang boleh dibaca oleh semua pengguna adalah sama seperti tiada VPN langsung. Baris umask 077 && wg genkey | sudo tee ... yang biasa 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 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 permulaan bahawa fail tersebut boleh diakses oleh semua pengguna bermaksud anda telah melangkau langkah tersebut. Address ialah alamat pelayan di dalam terowong, yang membawa topeng bagi keseluruhan subnet VPN. Pilih julat yang tidak akan bertembung dengan rangkaian lain — 192.168.1.0/24 bertembung dengan separuh daripada penghala rumah yang digunakan oleh klien anda, dan terowong tersebut akan gagal secara senyap kerana laluan tempatan.

AllowedIPs bagi rakan pada bahagian pelayan ialah /32, iaitu satu-satunya alamat terowong yang dimiliki oleh klien tersebut. Jika anda memberikan IP yang dibenarkan yang sama kepada dua rakan, ia akan berpindah ke rakan yang dikonfigurasi terakhir, dan rakan 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.

Tukar kotak menjadi penghala

Pelayan Linux akan membuang paket yang tidak ditujukan kepadanya. Fungsi forwarding dan source NAT 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 yang kosong hanya berfungsi sehingga but semula seterusnya dan kemudian berhenti berfungsi secara senyap. NAT memerlukan antara muka egress — iaitu NIC yang mempunyai akses ke internet, bukan wg0. Jangan andaikan eth0; dapatkan maklumat anda daripada ip route show default, memandangkan imej semasa menggunakan nama seperti enp1s0 atau ens3.

Firewall: port, dan laluan forward

Satu fail nftables merangkumi penapis dan NAT. Tulis /etc/nftables.conf — ia akan memadam set peraturan sedia ada, jadi abaikan langkah ini pada pelayan 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 ia dengan sudo systemctl enable --now nftables, dan pastikan sesi SSH kedua sentiasa terbuka: policy drop ditambah dengan kesilapan taip pada peraturan SSH akan menyebabkan anda terkunci daripada pelayan sendiri. Perhatikan apa yang tidak dibenarkan oleh rantaian forward — wg0 hingga wg0. Rakan rangkaian boleh mengakses internet, tetapi bukan antara satu sama lain; tambah iifname "wg0" oifname "wg0" accept untuk VPN peer-to-peer. Rantaian yang sama mengawal apa yang boleh dicapai oleh rakan rangkaian pada pelayan itu sendiri, yang mana penting apabila pelayan tersebut berfungsi sebagai kotak pembangunan jauh yang menjalankan Claude Code dalam tmux dan anda tidak mahu mendedahkan bahagian tersebut kepada awam.

Pada pelayan 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 diambil daripada AllowedIPs. enable --now adalah bahagian yang penting: wg-quick up wg0 yang dijalankan secara manual akan hilang selepas but semula seterusnya, dan naik taraf kernel memerlukan but semula.

Konfigurasi klien, dan tetapan yang sering disalah anggap

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

Bagi trafik keluar (outbound), ia adalah jadual penghalaan (routing table). Paket yang destinasi pemadanan dengan AllowedIPs bagi sesuatu peer akan disulitkan dan dihantar ke peer tersebut. 0.0.0.0/0, ::/0 menghantar semua trafik melalui terowong — terowong penuh, dengan pelayan sebagai laluan lalai (default route). Terowong terbahagi (split tunnel) mempunyai 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 semua trafik lain mengekalkan laluan tempatan. Senarai terhad tersebut membolehkan anda mengasingkan perkhidmatan daripada internet awam sepenuhnya — contohnya instans Nextcloud peribadi pada VPS yang terikat pada alamat terowong, atau VM makmal nested-virtualisation yang berjalan pada mesin yang sama, kekal boleh dicapai oleh peer dan tidak kelihatan oleh orang lain.

Bagi trafik masuk (inbound), ia adalah senarai kawalan akses (access-control list). Paket yang telah dinyahsulid daripada peer yang alamat sumbernya tiada dalam AllowedIPs peer tersebut akan digugurkan. Itulah sebabnya pelayan menyenaraikan 10.8.0.2/32 untuk komputer riba: entri 0.0.0.0/0 di situ akan membolehkan klien tersebut memalsukan mana-mana alamat dalam terowong.

PersistentKeepalive adalah untuk klien di belakang NAT, di mana penghala hanya mengekalkan pemetaan UDP selagi paket mengalir. Apabila ia tamat tempoh, pelayan tidak lagi dapat menghubungi klien. PersistentKeepalive = 25 mengekalkan pemetaan tersebut — tetapkan pada klien, bukan pada pelayan dengan IP awam.

DNS, dan kebocoran yang tidak disedari sesiapa

Dengan AllowedIPs = 0.0.0.0/0 dan tanpa baris DNS =, klien akan terus menggunakan resolver yang diperoleh daripada rangkaian tempatan — penghala kafe pada 192.168.1.1. Laluan tersebut lebih spesifik daripada laluan lalai, jadi pertanyaan DNS keluar melalui pautan tempatan dalam bentuk teks biasa manakala semua perkara lain melalui terowong. Trafik adalah peribadi; senarai nama tidak.

Dua pilihan yang jujur. Halakan DNS ke resolver awam (DNS = 9.9.9.9) dan pertanyaan akan melalui terowong serta keluar dari pelayan anda, walaupun resolver tersebut masih dapat 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 ke rantaian input — tetapkan baris tersebut dan abaikan resolver, maka tiada apa pun dapat diselesaikan.

Pada klien Linux, wg-quick melaksanakan 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 terowong

Memulakan semula antara muka untuk menambah pengguna akan memutuskan semua sambungan. Tambahkan blok [Peer] ke dalam wg0.conf, kemudian muat semula set peer di lokasi tersebut.

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

wg-quick strip mencetak konfigurasi tanpa kunci wg-quick-only (Address, DNS, PostUp), dan syncconf melaksanakan perubahan tersebut sementara sesi aktif kekal berjalan. 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 padam blok tersebut daripada fail atau ia akan muncul semula pada muat semula seterusnya.

Mod kegagalan, bersama 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 diterima, atau tiada data diterima. Semak perkara berikut: adakah UDP 51820 dibuka pada firewall VPS dan pada firewall rangkaian pembekal anda (kawalan berasingan pada kebanyakan panel); adakah alamat dan port Endpoint adalah betul; adakah kunci telah tertukar. Kunci dalam blok [Peer] klien mestilah kunci awam pelayan, dan sebaliknya — menampal kunci peribadi, atau kunci awam klien sendiri, akan menyebabkan simptom ini. sudo tcpdump -ni any udp port 51820 pada pelayan menunjukkan sama ada paket tiba atau tidak. Modul kernel tidak mencatat apa-apa secara lalai; mesej WireGuard hanya muncul dalam dmesg selepas anda mengaktifkan dynamic debug (echo module wireguard +p | sudo tee /sys/kernel/debug/dynamic_debug/control), dan apabila diaktifkan, ketidakpadanan kunci akan muncul sebagai invalid-MAC drop.

Handshake berjaya, tiada internet. ping 10.8.0.1 berjaya tetapi ping 1.1.1.1 mengalami timeout: forwarding atau NAT tidak tersedia. Semak jika sysctl net.ipv4.ip_forward membaca 1, kemudian perhatikan pemasa (counters) semasa klien melakukan ping, menggunakan sudo nft list ruleset atau sudo iptables -t nat -L POSTROUTING -n -v. Sifar paket pada peraturan masquerade bermaksud nama antara muka egress adalah salah; pemasa yang meningkat tanpa balasan menunjukkan masalah pada polisi forward chain.

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

Beberapa laman HTTPS tergantung. SSH dan ping berfungsi dengan baik; halaman besar terhenti. Itu adalah masalah path MTU: terowong menambah overhead, dan salah satu pautan di tengah menjatuhkan paket bersaiz besar tanpa menghantar mesej ICMP kembali. Rendahkan MTU pada [Interface] klien — cuba 1420, kemudian 1380, kemudian 1280.

Antara muka enggan bermula. Address already in use bermaksud proses lain sedang menggunakan UDP 51820. Cannot find device wg0 selepas up yang gagal biasanya bermaksud 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 telah ditinggalkan akan menyebabkan masalah keselamatan jangka panjang. Tiada proses naik taraf secara langsung, dan PKI OpenVPN tidak boleh ditukar: WireGuard tidak menggunakan sijil, CA, atau tarikh luput, jadi setiap klien akan menerima pasangan kunci yang baharu.

Lakukan migrasi secara selari — WireGuard pada UDP 51820 boleh berfungsi bersama OpenVPN pada 1194 pada mesin yang sama. Pasang wg0, pindahkan klien satu demi satu, kemudian hentikan perkhidmatan lama. Model nama pengguna/kata laluan dan pembatalan (revocation) OpenVPN tidak boleh dipindahkan; jika anda memerlukan akaun atau jejak audit, bina lapisan tersebut di atas WireGuard.

Sandaran, naik taraf, dan kekangan pada skala besar

/etc/wireguard adalah pelayan tersebut. Buat sandaran (sudo tar czf wg-backup.tgz -C /etc wireguard, mod 600, simpan di luar mesin) supaya anda boleh membina semula pada VPS baharu dalam masa beberapa minit. Jika kunci peribadi pelayan hilang, setiap konfigurasi klien mesti dikeluarkan semula kerana klien mengunci kunci awam pelayan. Naik taraf hanyalah apt upgrade biasa ditambah dengan but semula untuk kemas kini kernel, dan wg-quick@wg0 akan kembali secara automatik jika anda mengaktifkannya.

Keadaan setiap peer adalah kecil dan kriptografi dijalankan dalam kernel. Oleh itu, had prestasi adalah CPU dan had jalur lebar VPS anda, bukannya sebarang tetapan dalam konfigurasi ini — ukur prestasi dengan iperf3 merentasi terowong berbanding mempercayai angka yang diterbitkan. Kekangan pada skala besar adalah operasi. Setiap peer memerlukan IP terowong yang unik, dan menyunting manual enam puluh blok [Peer] akan menyebabkan AllowedIPs bertindih tersilap masuk: jana konfigurasi menggunakan skrip. Satu pelayan adalah satu titik akhir UDP dan satu titik kegagalan, dan WireGuard tidak mempunyai pengelompokan (clustering): redundansi bermaksud pelayan kedua dengan kunci sendiri. Putaran kunci kekal secara manual, jadi catat siapa yang memegang kunci tersebut dan cara anda membatalkannya.

Semua ini memerlukan mesin Linux yang anda kawal — IP awam, kernel yang boleh dimuatkan modul, dan tembok api yang anda miliki sepenuhnya.

FAQ

Mengapa WireGuard handshake tidak pernah selesai?

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

Terowong bersambung tetapi tiada internet. Apa yang hilang?

ping 10.8.0.1 berfungsi manakala ping 1.1.1.1 mengalami timeout menunjukkan masalah forwarding atau NAT. Sahkan sysctl net.ipv4.ip_forward membaca 1 dan ia telah ditetapkan dalam /etc/sysctl.d/, bukan sekadar menggunakan sysctl -w yang hilang selepas reboot. Kemudian periksa nama peraturan masquerade bagi interface egress sebenar anda daripada ip route show defaultenp1s0 atau ens3, jarang sekali eth0.

Adakah saya memerlukan baris DNS = dalam konfigurasi klien saya?

Dengan full tunnel tanpa baris DNS =, klien akan mengekalkan resolver yang diperoleh daripada rangkaian tempatan, dan pertanyaan tersebut dihantar dalam bentuk cleartext melalui pautan tempatan manakala semua perkara lain melalui terowong. Halakan DNS ke resolver awam, atau jalankan unbound/dnsmasq yang terikat pada 10.8.0.1 dan buka udp dport 53 iifname "wg0" dalam input chain.

Apa yang dikawal oleh AllowedIPs sebenarnya?

Ia mempunyai dua fungsi. Untuk trafik keluar, ia adalah jadual routing: trafik yang sepadan dengan AllowedIPs peer akan disulitkan dan dihantar ke peer tersebut. Untuk trafik masuk, ia adalah senarai kawalan akses: paket yang telah dinyahsulit yang sumbernya berada di luar AllowedIPs peer tersebut akan dibuang. Itulah sebabnya bahagian pelayan menyenaraikan /32 bagi setiap klien manakala bahagian klien mungkin menyenaraikan 0.0.0.0/0.

Adakah WireGuard boleh berjalan pada mana-mana VPS?

Pada VPS KVM, ia berfungsi dengan modul in-kernel tanpa tetapan tambahan. Pada virtualisasi kontena yang berkongsi kernel hos, seperti OpenVZ atau LXC, modprobe wireguard gagal dengan Operation not supported dan pilihan alternatif adalah implementasi userspace wireguard-go. Jalankan sudo modprobe wireguard && echo ok sebelum perkara lain.

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