WireGuard bersarang: lonjakan tengah tidak boleh menjawab portnya sendiri
Apabila lonjakan tengah menghantar semuanya ke satu terowong, balasan kepada perkhidmatan masuknya keluar melalui laluan yang salah. Peraturan port sumber pada antara muka membetulkannya.
Tiga lonjakan WireGuard sampai ke rangkaian yang tidak mempunyai alamat awam, dan kemudian mesin tengah berhenti menjawab pada port yang sepatutnya didengarnya. Terowong ke hadapan masih berfungsi, hos jauh masih bertindak balas, dan hanya pelayan tengah sendiri menjadi senyap dari luar. Gabungan itu mengelirukan semata-mata kerana ia disebabkan sendiri: lonjakan tengah mematuhi jadual penghalaannya sendiri, dan jadual itu menghantar balasannya ke arah yang salah.
Rantaian yang berfungsi sehingga anda bercakap dengan kotak tengah
Ambil rantaian ilustrasi: klien A sampai ke pelayan B pada UDP 500, dan B meneruskan ke pelayan C pada UDP 500. C hanya menerima trafik daripada alamat rakan sejawatnya yang tunggal, yang menjadikannya daun dan memastikan tingkah lakunya kekal mudah. B bukan daun, dan segala yang menarik tentang kegagalan ini berlaku di situ.
Perbezaan ini penting kerana peranan daun dan tengah menarik ke arah yang bertentangan. Daun boleh menghantar semuanya ke satu terowong tanpa akibat, kerana tiada apa-apa lain bergantung padanya. Lonjakan tengah secara serentak merupakan titik akhir untuk klien dan klien ke arah sisi jauh, dan kedua-dua tugas itu mahu penghalaan yang berbeza.
Mengapa balasan keluar melalui terowong
Pada B, antara muka yang menghadap C membawa AllowedIPs = 0.0.0.0/0 bersama laluan lalai yang sepadan. Oleh itu setiap paket yang dihasilkan B masuk ke terowong itu, kecuali sesuatu yang lebih khusus diberi keutamaan.
Paket dari A yang dialamatkan ke B tiba dan diterima, kerana B ialah destinasi dan penghantaran setempat berlaku dahulu. Balasannya ialah paket baharu yang dijana secara setempat dan ditujukan ke alamat awam A, dan destinasi itu sepadan dengan laluan lalai ke dalam terowong. C menerimanya, tidak memiliki alamat itu, dan menggugurkannya.
Gejalanya dibaca seperti masalah tembok api atau ketidakpadanan kunci, dan kedua-duanya tidak benar di sini. Tangkapan pada terowong ke arah C menunjukkan balasan menuju arah yang salah. Satu pemerhatian itu menjimatkan lebih banyak masa daripada berapa banyak pun pembacaan konfigurasi, jadi catatkannya sebelum mula menukar kunci. Sesiapa yang belum melihat tangkapan itu akan menganggap terowong itu sendiri rosak.
Pembaikan sempit: peraturan dasar yang sepadan dengan port sumber
Balasan daripada soket pendengar B keluar dengan port sumber 500. Peraturan dasar boleh memadankannya dan menghantar paket itu kembali ke jadual biasa:
ip rule add sport 500 table main priority 100
ip rule add sport 8080 table main priority 101
Peraturan dasar dirujuk mengikut susunan keutamaan, dan jadual utama terletak pada 32766, jadi peraturan pada 100 ditanya sebelum laluan lalai terowong berpeluang bercakap. Tambah satu entri bagi setiap port yang mesti kekal boleh dicapai dari luar dan tidak lebih, supaya trafik yang dimajukan terus menggunakan terowong yang dibina untuknya.
Kenali had helah ini. Pemilih sport sepadan dengan paket yang dijana secara setempat, yang meliputi tepat kes balasan dan sengaja tidak meliputi trafik yang B hanya memajukan untuk orang lain. Perkhidmatan yang dihoskan di belakang B masih memerlukan balasannya sendiri, dan berpura-pura sebaliknya menghasilkan pembaikan yang berfungsi untuk perkhidmatan pertama dan gagal untuk yang kedua.
Berikan peraturan itu pemilik
Peraturan yang ditaip pada prompt hilang pada kali seterusnya antara muka dibina semula. Dalam persediaan WireGuard, letakkan di tempat antara muka dicipta dan dialihkan:
PostUp = ip rule add sport 500 table main priority 100
PostDown = ip rule del sport 500 table main priority 100
Jika NetworkManager, cangkuk pengedaran atau titik masuk kontena memiliki antara muka itu, pasangan itu milik pemilik tersebut dan bukan fail yang disunting dengan tangan. Periksa peraturan berkesan selepas sambung semula, bukan hanya selepas permulaan pertama, kerana permulaan pertama ialah kes yang sentiasa berfungsi.
Bandingkan alternatif dengan jujur
Peraturan port sumber ialah salah satu daripada empat jalan keluar, dan yang paling sempit antaranya. Ia mempunyai kelebihan tidak menyentuh dasar terowong sama sekali, dan itulah sebabnya ia cenderung bertahan daripada perubahan kemudian. Pembaikan sempit juga gagal dengan kuat apabila ia berhenti terpakai, manakala pengecualian luas terus berfungsi secara senyap lama selepas alasannya hilang. Perbezaan itu lebih penting daripada keanggunan apabila orang lain memiliki kotak itu dua tahun dari sekarang.
| Approach | What it costs | Where it breaks |
|---|---|---|
| Source-port policy rule | One rule per exposed port | Anything B forwards rather than originates |
| Destination exception route | A route pinned to specific client addresses | Clients whose address changes |
| Stop full-tunnelling on B | Loses the catch-all path toward C | Designs that depend on it |
| Split into two tunnels | More interfaces and more policy | Nothing, at the cost of complexity |
Sahkan dari kedua-dua hujung setelah anda memilih. Dari A, mulakan sambungan ke port B dan biarkan ia sibuk seketika. Pada B, minta kernel mewajarkan laluan balasan dengan sesuatu seperti ip route get <address-of-A> sport 500, dan sahkan ia menamakan antara muka WAN dan bukan terowong. Selepas itu, periksa bahawa sesuatu di belakang C masih menjawab melalui rantaian, yang membuktikan pengecualian itu kekal sempit dan bukan menjadi jalan pintas. Akhir sekali, catat port itu dalam nota reka bentuk, atau pengendali seterusnya akan menemukannya semula pada perkhidmatan lain.