Dua belas build

Server WireGuard yang diperkuat dengan IPv6 yang benar-benar dirutekan

Bangun titik akhir WireGuard yang memberikan klien alamat v4 privat dan prefiks IPv6 yang benar-benar dirutekan, di balik kebijakan nftables yang menjatuhkan semua yang tidak diminta.

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 link

Perintah 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 --system

Baris 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.psk

Pre-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/128

Di 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.conf

4. 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: yes

Unbound 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 -20

6. Mulai

systemctl enable --now wg-quick@wg0
systemctl restart unbound
wg show wg0

7. 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 = 25

Untuk ponsel, ubah itu menjadi kode QR di server dan foto terminal:

qrencode -t ansiutf8 < /root/laptop.conf

Di 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 transfer

Timestamp 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 +short

Perintah 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

GejalaPenyebabPerbaikan
Handshake berhasil, tidak ada lalu lintas yang lewatForwarding mati, atau forward chain menjatuhkansysctl net.ipv4.ip_forward, lalu baca ulang forward chain
Permintaan kecil baik-baik saja, unduhan besar menggantungMTU dan path discoveryTurunkan kedua konfigurasi ke MTU = 1380 dan coba lagi
IPv6 mati sekitar sepuluh menit setelah bootForwarding mematikan router advertisementaccept_ra = 2 pada antarmuka keluar
DNS meresolusi di luar tunnelKlien mengabaikan DNS =Instal openresolv di klien
Semuanya hilang setelah rebootUnit tidak pernah diaktifkansystemctl 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.

Siap saat Anda siap

Pilih kota. Pilih ukuran. Bayar dengan koin.

Tanpa formulir tentang siapa Anda, tanpa menunggu manusia untuk menyetujui, tanpa panggilan telepon untuk memverifikasi apa pun. Invoice dibersihkan dan kredensial masuk ke kotak masuk Anda.