Apa yang dibangun
Satu instance yang menjalankan WireGuard, memberikan setiap klien alamat IPv4 privat, alamat IPv6 yang dirutekan dari /48 Anda sendiri, dan resolver yang berada di dalam tunnel sehingga kueri DNS tidak pernah mengambil jalur yang berbeda dari lalu lintas lainnya. Firewall diatur ke default-drop di kedua arah. Forwarding hanya diaktifkan untuk antarmuka tunnel, dan hanya untuk lalu lintas keluar.
Diuji pada R-4 di AMS-01 dengan Debian 13. WireGuard adalah aliran tunggal dan berbasis kernel, jadi lebih banyak inti tidak memberi Anda keuntungan sampai Anda mendorong beberapa gigabit melaluinya. Yang jauh lebih penting adalah situsnya: pilih yang paling dekat dengan lokasi Anda sebenarnya, karena setiap milidetik yang Anda tambahkan di sini akan ditambahkan ke setiap paket.
Sebelum memulai
- Instance yang sudah digunakan dan root melalui SSH.
- Add-on /48 IPv6 diaktifkan di panel. /64 yang disertakan berfungsi untuk satu klien, tetapi subnet per-klien dari satu /64 berarti memproksi neighbour discovery, dan itu adalah hobi, bukan konfigurasi.
- Nama host yang menunjuk ke instance. Semua yang ada di bawah menggunakan
vpn.example.com. - Setiap alamat
2001:db8:di sini adalah ruang dokumentasi. Ganti prefixnya dengan yang ditampilkan di halaman instance Anda.
1. Paket dan pengaturan kernel
apt update && apt full-upgrade -y
apt install -y wireguard-tools nftables unbound qrencode
ip -br linkPerintah terakhir itu mencetak nama antarmuka yang menghadap ke luar. Pada citra KVM kami, namanya ens3; jika milik Anda berbeda, ganti di semua tempat di bawah. Sekarang kernel:
cat > /etc/sysctl.d/99-wireguard.conf <<EOF
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.ens3.accept_ra = 2
net.ipv4.conf.all.rp_filter = 1
EOF
sysctl --systemBaris accept_ra = 2 adalah yang sering dilupakan orang. Mengaktifkan forwarding IPv6 membuat kernel berhenti menerima router advertisement, rute default hilang dalam sepuluh menit, dan mesin menjadi gelap melalui v6 sementara masih menjawab melalui v4. Menyetelnya ke dua membuat mesin tetap menerima advertisement pada host yang melakukan forwarding.
2. Kunci
install -d -m 700 /etc/wireguard
umask 077
wg genkey | tee /etc/wireguard/server.key | wg pubkey > /etc/wireguard/server.pub
wg genkey | tee /etc/wireguard/laptop.key | wg pubkey > /etc/wireguard/laptop.pub
wg genpsk > /etc/wireguard/laptop.pskPre-shared key tidak opsional dalam pembangunan ini. Tidak ada biayanya, hanya satu baris di setiap konfigurasi, dan itulah perbedaan antara tunnel yang sekadar aman hari ini dan yang tetap aman terhadap penyerang yang merekam lalu lintas sekarang untuk mendekripsinya nanti.
3. Antarmuka server
Tulis /etc/wireguard/wg0.conf, tempel isi kunci di tempat yang ditandai:
[Interface]
Address = 10.7.0.1/24, 2001:db8:1a2b:7::1/64
ListenPort = 51820
PrivateKey = <contents of /etc/wireguard/server.key>
MTU = 1420
[Peer]
# laptop
PublicKey = <contents of /etc/wireguard/laptop.pub>
PresharedKey = <contents of /etc/wireguard/laptop.psk>
AllowedIPs = 10.7.0.2/32, 2001:db8:1a2b:7::2/128Di sisi server, AllowedIPs adalah tabel routing, bukan daftar izin. Berikan setiap peer tepat alamat yang dimilikinya dan tidak lebih luas, atau dua klien akan berebut rute yang sama dan yang kalah akan berhenti menerima paket.
chmod 600 /etc/wireguard/wg0.conf4. Resolver di dalam tunnel
Menunjuk klien ke resolver publik mengurangi sebagian besar tujuan. Unbound sudah terinstal; berikan file /etc/unbound/unbound.conf.d/tunnel.conf:
server:
interface: 10.7.0.1
interface: 2001:db8:1a2b:7::1
access-control: 10.7.0.0/24 allow
access-control: 2001:db8:1a2b:7::/64 allow
do-ip6: yes
prefetch: yes
hide-identity: yes
hide-version: yes
qname-minimisation: yesUnbound akan gagal dimulai sebelum tunnel ada, karena alamat-alamat itu belum aktif. Urutkan dengan benar daripada melawannya:
systemctl edit unbound[Unit]
[email protected]
[email protected]5. Firewall
Ganti /etc/nftables.conf seluruhnya:
flush ruleset
table inet filter {
chain input {
type filter hook input priority filter; policy drop;
ct state established,related accept
ct state invalid drop
iif lo accept
ip protocol icmp accept
ip6 nexthdr icmpv6 accept
tcp dport 22 accept
udp dport 51820 accept
iifname "wg0" udp dport 53 accept
iifname "wg0" tcp dport 53 accept
}
chain forward {
type filter hook forward priority filter; policy drop;
ct state established,related accept
iifname "wg0" oifname "ens3" accept
iifname "wg0" oifname "wg0" drop
}
chain output {
type filter hook output priority filter; policy accept;
}
}
table ip nat {
chain postrouting {
type nat hook postrouting priority srcnat; policy accept;
ip saddr 10.7.0.0/24 oifname "ens3" masquerade
}
}Perhatikan apa yang tidak ada: tidak ada tabel NAT untuk IPv6. Klien keluar dengan alamat mereka sendiri dari /48 Anda, yang merupakan alasan utama mengambil /48 itu. Baris iifname "wg0" oifname "wg0" drop menghentikan peer agar tidak saling menjangkau, yang Anda inginkan kecuali Anda memang membangun mesh.
systemctl enable --now nftables
nft list ruleset | head -206. Mulai
systemctl enable --now wg-quick@wg0
systemctl restart unbound
wg show wg07. Klien
[Interface]
PrivateKey = <contents of /etc/wireguard/laptop.key>
Address = 10.7.0.2/24, 2001:db8:1a2b:7::2/64
DNS = 10.7.0.1
MTU = 1420
[Peer]
PublicKey = <contents of /etc/wireguard/server.pub>
PresharedKey = <contents of /etc/wireguard/laptop.psk>
Endpoint = vpn.example.com:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25Untuk ponsel, ubah itu menjadi kode QR di server dan foto terminal:
qrencode -t ansiutf8 < /root/laptop.confDi klien Debian atau Ubuntu, baris DNS = membutuhkan openresolv terinstal, jika tidak wg-quick mencetak peringatan dan diam-diam membiarkan resolver lama Anda tetap aktif. Itu penyebab paling umum tunnel yang bekerja sempurna tetapi membocorkan semua pencarian.
Verifikasi
Empat pemeriksaan, secara berurutan. Jika ada yang gagal, itu memberi tahu Anda langkah mana yang harus kembali.
# on the server, after connecting the client
wg show wg0 latest-handshakes
wg show wg0 transferTimestamp handshake dalam dua menit terakhir dan penghitung non-nol di kedua arah berarti kriptografi dan routing sama-sama baik.
# on the client
ping -c3 10.7.0.1
ping -c3 2001:db8:1a2b:7::1
dig @10.7.0.1 paragonvps.com AAAA +shortPerintah ketiga membuktikan bahwa resolver tunnel menjawab. Jika waktu habis, unbound dimulai sebelum wg0 ada; mulai ulang.
Pemeriksaan terakhir adalah satu-satunya yang membuktikan lalu lintas Anda keluar dari tempat yang Anda kira, dan itu membutuhkan mesin kedua. Instance lain di armada bisa digunakan, di kota mana pun:
# on the second instance
nc -lv 9101
# on the client, tunnel up
curl -m5 -4 http://second.example.com:9101/
curl -m5 -6 http://second.example.com:9101/Pendengar mencetak alamat sumber setiap koneksi. Percobaan v4 Anda harus tiba dari server WireGuard, karena telah disamarkan. Percobaan v6 harus tiba dari alamat tunnel klien di dalam /48 Anda, tanpa diubah, yang merupakan arti routed dan bukan proxied.
Saat terjadi kesalahan
| Gejala | Penyebab | Perbaikan |
|---|---|---|
| Handshake berhasil, tidak ada lalu lintas yang lewat | Forwarding mati, atau forward chain menjatuhkan | sysctl net.ipv4.ip_forward, lalu baca ulang forward chain |
| Permintaan kecil baik-baik saja, unduhan besar menggantung | MTU dan path discovery | Turunkan kedua konfigurasi ke MTU = 1380 dan coba lagi |
| IPv6 mati sekitar sepuluh menit setelah boot | Forwarding mematikan router advertisement | accept_ra = 2 pada antarmuka keluar |
| DNS meresolusi di luar tunnel | Klien mengabaikan DNS = | Instal openresolv di klien |
| Semuanya hilang setelah reboot | Unit tidak pernah diaktifkan | systemctl enable wg-quick@wg0 nftables unbound |
Dari sini, langkah berikutnya yang masuk akal adalah endpoint kedua di region lain dan stack monitoring yang memberi tahu Anda ketika salah satunya berhenti menjawab. Keduanya dibahas di tempat lain di panduan; halaman jaringan menjelaskan apa yang dilakukan edge dengan lalu lintas Anda sebelum mencapai Anda.