Tiga lompatan WireGuard mencapai jaringan yang tidak memiliki alamat publik, lalu mesin tengah berhenti menjawab pada port tempat ia seharusnya mendengarkan. Terowongan ke depan tetap bekerja, host jauh tetap merespons, dan hanya server tengah sendiri yang membisu dari luar. Kombinasi itu membingungkan justru karena disebabkan sendiri: lompatan tengah menuruti tabel peruteannya sendiri, dan tabel itu mengirim balasannya ke arah yang salah.

Rantai yang bekerja sampai Anda berbicara dengan kotak tengah

Ambil rantai ilustratif: klien A mencapai server B pada UDP 500, dan B berlanjut ke server C pada UDP 500. C hanya menerima lalu lintas dari alamat satu-satunya peer-nya, yang membuatnya menjadi daun dan menjaga perilakunya tetap sederhana. B bukan daun, dan segala hal menarik tentang kegagalan ini terjadi di sana.

Perbedaan itu penting karena peran daun dan tengah menarik ke arah berlawanan. Daun dapat mengirim semuanya ke satu terowongan tanpa akibat, karena tidak ada hal lain yang bergantung padanya. Lompatan tengah sekaligus merupakan titik akhir bagi klien dan klien menuju sisi jauh, dan kedua tugas itu menginginkan perutean yang berbeda.

Mengapa balasan keluar lewat terowongan

Pada B, antarmuka yang menghadap C membawa AllowedIPs = 0.0.0.0/0 bersama rute baku yang sesuai. Karena itu setiap paket yang dibuat B masuk ke terowongan tersebut, kecuali sesuatu yang lebih spesifik lebih diutamakan.

Paket dari A yang dialamatkan ke B tiba dan diterima, karena B adalah tujuan dan pengantaran lokal terjadi lebih dulu. Balasannya adalah paket baru sama sekali yang dibuat secara lokal dan ditujukan ke alamat publik A, dan tujuan itu cocok dengan rute baku ke dalam terowongan. C menerimanya, tidak memiliki alamat itu, dan membuangnya.

Gejalanya terbaca seperti masalah tembok api atau ketidakcocokan kunci, dan keduanya tidak benar di sini. Tangkapan pada terowongan menuju C menunjukkan balasan menuju arah yang salah. Satu pengamatan itu menghemat lebih banyak waktu daripada sebanyak apa pun membaca konfigurasi, jadi catatlah sebelum mulai mengganti kunci. Siapa pun yang belum melihat tangkapan itu akan mengira terowongannya sendiri rusak.

Perbaikan sempit: aturan kebijakan yang cocok dengan port sumber

Balasan dari soket pendengar B keluar dengan port sumber 500. Aturan kebijakan dapat mencocokkan itu dan mengembalikan paket tersebut ke tabel biasa:

ip rule add sport 500 table main priority 100
ip rule add sport 8080 table main priority 101

Aturan kebijakan diperiksa menurut urutan prioritas, dan tabel utama berada di 32766, sehingga aturan pada 100 ditanyakan sebelum rute baku terowongan ikut berbicara. Tambahkan satu entri untuk setiap port yang harus tetap dapat dijangkau dari luar dan tidak lebih, agar lalu lintas yang diteruskan tetap memakai terowongan yang untuknya ia dibangun.

Kenali batas trik ini. Pemilih sport cocok dengan paket yang dibuat secara lokal, yang mencakup tepat kasus balasan dan sengaja tidak mencakup lalu lintas yang hanya diteruskan B untuk orang lain. Layanan yang dihosting di belakang B tetap memerlukan balasannya sendiri, dan berpura-pura sebaliknya menghasilkan perbaikan yang bekerja untuk layanan pertama dan gagal untuk yang kedua.

Beri aturan itu pemilik

Aturan yang diketik di prompt akan hilang pada pembangunan ulang antarmuka berikutnya. Pada penyiapan WireGuard, letakkan di tempat antarmuka dibuat dan dihapus:

PostUp = ip rule add sport 500 table main priority 100
PostDown = ip rule del sport 500 table main priority 100

Jika NetworkManager, kait distribusi, atau titik masuk kontainer memiliki antarmuka itu, pasangan tersebut menjadi milik pemilik itu alih-alih berkas yang diedit dengan tangan. Periksa aturan yang berlaku setelah menyambung ulang, bukan hanya setelah mulai pertama kali, karena mulai pertama kali adalah kasus yang selalu berhasil.

Bandingkan alternatifnya dengan jujur

Aturan port sumber adalah salah satu dari empat jalan keluar, dan yang paling sempit di antaranya. Keuntungannya adalah sama sekali tidak menyentuh kebijakan terowongan, itulah sebabnya aturan ini cenderung bertahan terhadap perubahan kemudian. Perbaikan sempit juga gagal dengan nyaring saat berhenti berlaku, sementara pengecualian luas terus bekerja diam-diam jauh setelah alasannya hilang. Perbedaan itu lebih penting daripada keanggunan ketika orang lain memiliki kotak itu dua tahun lagi.

ApproachWhat it costsWhere it breaks
Source-port policy ruleOne rule per exposed portAnything B forwards rather than originates
Destination exception routeA route pinned to specific client addressesClients whose address changes
Stop full-tunnelling on BLoses the catch-all path toward CDesigns that depend on it
Split into two tunnelsMore interfaces and more policyNothing, at the cost of complexity

Verifikasi dari kedua ujung setelah Anda memilih. Dari A, mulai koneksi ke port B dan biarkan sibuk beberapa saat. Pada B, minta kernel membenarkan jalur balasan dengan sesuatu seperti ip route get <address-of-A> sport 500, dan pastikan ia menyebut antarmuka WAN alih-alih terowongan. Setelah itu, periksa bahwa sesuatu di belakang C masih menjawab melalui rantai, yang membuktikan pengecualian tetap sempit alih-alih menjadi jalan pintas. Terakhir, catat port tersebut dalam catatan desain, atau operator berikutnya akan menemukannya lagi pada layanan lain.

Artikel terkait