Bulan lalu dua orang meminta hasil yang berlawanan kepada saya: yang satu ingin IPv6 tercakup oleh VPN, yang lain ingin printer kantor tetap berfungsi. Satu rute ::/0 tidak bisa memberikan keduanya sendirian. Apakah rute itu berada di dalam terowongan bergantung pada tiga syarat, dan syarat pertama menyingkirkannya untuk sebagian besar ujung keluar komersial. Jika ujung keluar tidak membawa IPv6, mengarahkan rute bawaan ke sana menyembunyikan lalu lintas Anda di terowongan yang tidak punya tempat untuk mengirimnya.

Tiga syarat menentukan jawabannya

Rute bawaan adalah satu baris, ::/0, dan cocok untuk setiap tujuan IPv6 tanpa rute yang lebih spesifik (RFC 4291). Memasangnya mudah. Memutuskan apakah Anda harus melakukannya bermuara pada tiga syarat.

Syarat satu: ujung keluar yang Anda sambungkan memiliki IPv6 yang berfungsi dan bersedia meneruskannya. Syarat dua: klien Anda dapat mempertahankan jalur ke titik akhir terowongan, yang biasanya berada di dalam rentang yang akan Anda rutekan. Syarat tiga: Anda dapat menyebutkan tujuan IPv6 lokal yang harus tetap di luar terowongan.

Setiap syarat gagal dengan caranya sendiri, itulah sebabnya menebak memakan waktu satu malam penuh. Syarat satu yang gagal memberi Anda keheningan dan tabel rute yang tampak benar. Syarat dua yang gagal mematikan jabat tangan beberapa detik setelah dimulai. Syarat tiga yang gagal meninggalkan terowongan yang berfungsi dan rekan kerja yang tidak senang di dekat printer.

What you seeDecision
Exit answers IPv6 probes, no local IPv6 devices to protectRoute ::/0 into the tunnel
Exit answers IPv6 probes, printer or NAS reachable by a global addressRoute ::/0, then give those prefixes a route of their own
Exit is IPv4-only inside the tunnelDo not route ::/0; block IPv6 on the client
Endpoint is reached over IPv6 and sits inside ::/0Install a host route for the endpoint first

Apakah ujung keluar benar-benar membawa IPv6?

Antarmuka terowongan dengan alamat IPv6 tidak membuktikan apa pun tentang sisi seberang. Banyak profil komersial hanya IPv4 di dalam: server memberi Anda alamat v4 dan membuang sisanya. Pasang rute bawaan dari AllowedIPs di atasnya dan kernel akan dengan senang hati mengirim IPv6 ke antarmuka yang pasangannya tidak pernah melihatnya.

Uji dari klien saat terowongan aktif. ping -6 -c 3 2001:4860:4860::8888 dan ip -6 route get 2001:4860:4860::8888 menjawab pertanyaan berbeda: apakah balasan kembali, dan perangkat mana yang dipilih kernel. Ketika yang kedua menyebut terowongan Anda dan yang pertama tidak mengembalikan apa pun, masalahnya ada di ujung keluar, bukan di rute.

Jika Anda mengelola ujung keluar sendiri, uji klien bisa lolos dan jalurnya tetap berakhir buntu. Pastikan net.ipv6.conf.all.forwarding=1 aktif di gateway dan firewall-nya menerima paket yang diteruskan keluar dari terowongan. Paket yang dirutekan dengan benar ke ujung keluar yang menolak meneruskan tampak persis seperti bug perutean dari sisi klien.

Bisakah klien mempertahankan jalurnya ke titik akhir?

Inilah kasus yang menjebak saya di laptop dengan titik akhir WireGuard yang hanya IPv6. Alamat titik akhir adalah alamat global biasa, jadi ia jatuh di dalam ::/0. Rutekan seluruh prefiks ke antarmuka dan paket jabat tangan akan mengejar dirinya sendiri masuk ke terowongan yang masih mereka coba bangun. Terowongan tidak pernah menyala, dan tidak ada apa pun di keluaran klien yang mengatakan mengapa.

wg-quick menangani ini di Linux. Ia menurunkan rute dari AllowedIPs, memasangnya di tabelnya sendiri, dan menambahkan aturan kebijakan agar lalu lintas ke titik akhir diselesaikan lebih dulu melalui tabel utama: aturan suppress_prefixlength 0 yang Anda temukan di ip -6 rule. Itulah sebabnya wg-quick up berhasil di tempat ip -6 route add default dev wg0 yang ditulis tangan memutus Anda.

Periksa kedua keadaan dengan ip -6 route get <endpoint-v6>, sebelum dan sesudah menaikkan terowongan. Jika jawabannya berubah ke perangkat terowongan Anda, Anda telah menghapus jalur yang dibutuhkan terowongan. Saat Anda menulis rutenya sendiri, tambahkan rute host ke titik akhir melalui gateway asli, atau sambungkan ke titik akhir lewat IPv4 dan biarkan IPv6 untuk muatan.

Apa yang harus tetap di luar terowongan?

Rute yang lebih spesifik mengalahkan rute bawaan, jadi prefiks on-link atau rentang ULA dengan rutenya sendiri tetap berfungsi tanpa usaha tambahan. Itulah alasan senyap mengapa begitu banyak penyiapan IPv4 terowongan penuh bertahan: prefiks LAN lebih spesifik daripada rute bawaan dan tidak pernah masuk ke terowongan.

Itu rusak ketika perangkat lokal dapat dijangkau melalui alamat global, yang normal bagi printer yang diberi prefiks publik oleh router yang sama, NAS, atau televisi. Alamat-alamat itu cocok dengan ::/0 dan bukan yang lain, jadi mereka pindah ke terowongan bersama yang lain dan menghilang.

Putuskan per tujuan, bukan per protokol. Jika dua atau tiga host lokal penting, beri prefiks mereka rute keluar melalui antarmuka fisik, atau keluarkan dari kumpulan yang dinegosiasikan. Jika daftarnya terus bertambah, jawaban jujurnya adalah split tunneling untuk IPv6 dengan daftar pengecualian tertulis, bukan rute bawaan yang terus Anda tambal.

Jika jawabannya tidak, blokir saja

Membiarkan IPv6 tanpa rute tidak sama dengan membiarkannya sendirian. Host dengan rute bawaan IPv6 yang berfungsi terus memakainya selagi terowongan membawa IPv4, jadi lalu lintas keluar di samping VPN dan setiap layanan yang mengutamakan IPv6 melihat alamat asli Anda. Itu kebocoran, bukan terowongan terpisah.

Pilih satu dan catat mana yang Anda pilih. Rutekan rute bawaannya dan terima kompromi di atas, atau nonaktifkan IPv6 selama terowongan berlangsung. Menghilangkan prefiks dari AllowedIPs saja tidak cukup, karena sistem operasi menyimpan bawaannya sendiri. Di Linux versi kasarnya adalah sysctl -w net.ipv6.conf.all.disable_ipv6=1; versi yang lebih halus menjatuhkan IPv6 di luar terowongan dengan aturan firewall. Klien ponsel memiliki tombol blokir IPv6 eksplisit yang melakukan tugas yang sama.

Verifikasi seperti kebocoran

Nyalakan terowongan dan baca keadaannya alih-alih memercayai tombol. ip -6 route show default seharusnya menunjukkan satu rute bawaan, dan ip -6 route get untuk tujuan di luar LAN Anda seharusnya menyebut perangkat terowongan. Ulangi keduanya setelah pemutusan: rute bawaan yang bertahan melewati terowongan adalah bug yang Anda cari.

Lalu uji arah sebaliknya. Dari host di jaringan lokal, jangkau klien pada alamat IPv6 lokalnya. Jika itu berhenti berfungsi, syarat tiga tidak pernah terpenuhi, apa pun yang diklaim tabel rute saat itu.

Tulis hasilnya di tempat orang berikutnya akan menemukannya: prefiks mana yang tetap lokal, mengapa, dan apa yang dilakukan klien setelah pemutusan. Dua baris di runbook menyelamatkan insinyur berikutnya dari menemukan kembali loop titik akhir tengah malam.

Artikel terkait