Raspberry Pi yang hanya perlu melindungi lalu lintas keluarnya sendiri punya dua rancangan realistis: biarkan manajer jaringan memiliki tunnel, atau pertahankan skrip yang memilikinya. Keduanya dapat membawa lalu lintas. Keduanya gagal di tempat berbeda, dan kegagalan yang dapat Anda diagnosis dari jarak jauh pada pukul dua pagi adalah yang layak dipilih. Bandingkan keduanya pada kepemilikan, pada apa arti tunnel penuh begitu IPv6 dan DNS terlibat, dan pada apa yang terjadi saat tunnel terputus.

Dua pemilik untuk satu tunnel

Rancangan A adalah profil di dalam manajer jaringan sistem: profil OpenVPN yang diimpor atau koneksi WireGuard asli, diaktifkan saat boot oleh layanan yang sama yang menaikkan Ethernet dan Wi-Fi. Rancangan B adalah unit Anda sendiri yang menjalankan klien secara langsung, menyunting konfigurasi resolver, dan memasang rute serta aturan firewall sendiri. Keduanya sah; keduanya berbeda dalam siapa yang boleh mengubah tabel perutean.

Kegagalannya berbeda karena pemiliknya berbeda. Pada A, profil yang tidak aktif meninggalkan antarmuka naik dan tunnel turun, dan log manajer menyebutkan alasannya. Pada B, skrip yang berhasil separuh meninggalkan rute yang bertahan setelah proses yang membuatnya mati. Menjalankan keduanya adalah hasil terburuk: dua proses menulis rute default, dua penyuntingan resolver berlomba saat boot, dan dua set rahasia untuk dirotasi.

Pilih satu pemilik per tunnel dan nonaktifkan yang lain sebelum Anda menguji apa pun. Dua pemilik juga berarti dua tempat untuk diperiksa ketika tunnel naik dan tidak ada yang teresolusi. Aturan tunggal itu mencegah sebagian besar keadaan membingungkan yang dijelaskan di utas Pi VPN.

Apa yang dibuat oleh impor, dan apa yang tidak

Pada Raspberry Pi OS Bookworm dan setelahnya, alat konfigurasi jaringan bawaan adalah NetworkManager, jadi profil adalah rumah alami bagi tunnel klien. Impor memerlukan plugin yang sesuai terpasang; tanpanya impor gagal dengan pesan tentang jenis koneksi yang tidak didukung, yang merupakan sinyal jujur untuk berhenti dan memasang plugin.

nmcli connection import type openvpn file ./provider.ovpn
nmcli connection show
nmcli --ask connection up id provider-name

Impor menyimpan profil. Itu tidak membuktikan sisi lain dapat dijangkau, dan tidak menjamin setiap direktif dalam berkas selamat dari konversi. Baca kembali koneksi yang dihasilkan dan periksa bagian yang membawa identitas dan kepercayaan: sertifikat, host dan port jarak jauh, dan apakah kata sandi diminta atau disimpan.

Aktivasi dengan --ask menjaga frasa sandi keluar dari riwayat shell pada mesin bersama. Untuk Pi tanpa pengawasan, pada akhirnya Anda ingin profil naik saat boot, yang merupakan keputusan terpisah dari menaikkannya sekali secara manual.

Tunnel penuh, dibandingkan pada kedua rancangan

Tunnel penuh adalah klaim tentang rute, bukan tentang niat, dan kedua rancangan menyatakannya secara berbeda. Pendekatan profil meminta manajer memasang rute default dan pengaturan resolver-nya; pendekatan skrip melakukan apa yang dikatakan skrip, termasuk tidak sama sekali. Tidak ada rancangan yang mencakup IPv6 kecuali diperintahkan, dan rute default IPv6 yang tidak disentuh akan dengan senang hati membawa lalu lintas ke luar tunnel selagi IPv4 tampak sempurna.

ip -4 route get 198.51.100.23
ip -6 route show default
resolvectl query example.org

Gunakan alamat dokumentasi untuk pencarian rute dan ganti dengan host yang boleh Anda periksa. Perintah pertama menunjukkan antarmuka mana yang akan dipakai Pi untuk tujuan biasa; perintah kedua menunjukkan apakah rute default IPv6 masih ada; perintah ketiga membuktikan resolver mana yang menjawab. Baca ketiganya sebelum percaya klaim apa pun tentang tunnel penuh.

Jika instruksi penyedia menjanjikan tunnel penuh tetapi rute default IPv6 bertahan, Pi bocor. Nonaktifkan IPv6 pada uplink atau minta profil mengklaimnya, dan putuskan dengan sengaja alih-alih menemukannya nanti.

Gagal terbuka melawan gagal tertutup

Ketika tunnel terputus, tabel perutean yang kehilangan rute defaultnya langsung kembali ke uplink fisik, dan lalu lintas berlanjut secara terbuka. Itu adalah gagal terbuka, dan itu adalah perilaku bawaan kedua rancangan kecuali ada yang mencegahnya. Kebanyakan orang menemukannya berminggu-minggu kemudian dengan membaca log firewall.

Gagal tertutup membuat Anda kehilangan akses jarak jauh saat tunnel turun, jadi ia memerlukan pengecualian yang disengaja untuk jalur manajemen. Salah satu caranya adalah aturan yang hanya mengizinkan alamat rekan VPN di luar tunnel:

sudo nft add table inet vpnkill
sudo nft 'add chain inet vpnkill out { type filter hook output priority 0; policy accept; }'
sudo nft add rule inet vpnkill out oifname != "tun0" ip daddr != 203.0.113.24 reject

Bandingkan biaya operasional dengan jujur. Profil biasanya tidak dapat menyatakan aturan ini, jadi gagal tertutup mendorong Anda ke rancangan skrip atau ke unit kecil yang memasang aturan secara independen dari tunnel. Bagaimanapun, catat penolakan selama seminggu: penolakan senyap tampak identik dengan layanan rusak, dan Anda akan membutuhkan penghitungnya ketika pengguna melaporkan satu situs berhenti dimuat.

Memilih untuk Pi tanpa layar

Jika image sudah menjalankan NetworkManager, tunnel tidak memerlukan hal eksotis, dan Anda ingin ia mengikuti uplink secara otomatis, ambil profilnya. Jika Anda memerlukan perutean kebijakan, beberapa tunnel yang dipilih per tujuan, atau aturan gagal tertutup yang harus ada sebelum tunnel naik, ambil skripnya dan miliki setiap bagiannya, termasuk urutan boot dan pembersihan. Mencampur kedua rancangan lebih mahal daripada salah satu saja.

Bermigrasi di antara keduanya terutama soal urutan: nonaktifkan pemilik lama, pastikan tidak ada rute atau entri resolver basi yang bertahan, lalu aktifkan yang baru dan boot ulang dua kali. Satu boot ulang dapat menyembunyikan balapan yang diungkap oleh yang kedua. Akhiri dengan menguji Pi, bukan tunnel: resolusikan sebuah nama, ambil sesuatu melalui IPv4, ambil melalui IPv6 jika Anda menyimpannya, lalu jatuhkan tunnel dan pastikan perilaku yang Anda pilih benar-benar terjadi. Antarmuka di ip link adalah awal pengujian, bukan akhir.

Artikel terkait