Blokir Satu Rentang Tujuan untuk Setiap Pool Klien VPN
Satu aturan nftables dapat menolak prefiks tujuan bagi pool VPN yang diizinkan tanpa menyentuh lalu lintas gateway itu sendiri. Cocokkan hook dan posisinya.
Satu aturan dapat menjauhkan pool VPN yang diizinkan dari rentang tujuan tanpa mengganggu hal lain yang dilakukan gateway. Aturannya sendiri singkat; bagian yang menentukan apakah ia bekerja adalah hook tempat ia hidup dan posisinya di rantai. Salah pada keduanya menghasilkan firewall yang tampak benar dan berperilaku tidak konsisten. Mulailah dari apa yang dilakukan paket saat aturan melihatnya.
Apa yang sebenarnya dicocokkan aturan
Aturan mencocokkan tiga hal sekaligus: antarmuka masukan, prefiks sumber, dan prefiks tujuan. Ketiganya harus benar sebelum drop berlaku, dan itulah yang membuatnya sempit. Membacanya sebagai satu ekspresi lebih mudah daripada sebagai tiga kebijakan terpisah.
Pencocokan antarmuka adalah yang membedakan lalu lintas klien yang diteruskan dari koneksi gateway sendiri. Tanpanya, aturan yang hanya menyebut pool sumber juga akan memengaruhi paket yang dihasilkan gateway sendiri dari alamat itu, jika hal itu pernah terjadi. Prefiks sumber membatasi kebijakan pada klien yang diizinkan, dan prefiks tujuan membatasinya pada satu rentang. Bacalah aturan sebagai irisan, bukan sebagai daftar.
Catat ketiga nilai sebelum menyunting apa pun: nama antarmuka tunnel, pool yang dibagikan server, dan prefiks yang hendak Anda tolak. Salah ketik pada salah satunya menghasilkan aturan yang terurai bersih dan tidak melindungi apa pun. Simpan ketiga nilai itu dalam catatan perubahan di samping aturan.
Hook menentukan kepada siapa aturan berlaku
Rantai netfilter dipasang pada sebuah hook, dan hook yang menentukan paket mana yang benar-benar dilihat rantai. Hook forward melihat lalu lintas yang dirutekan melalui gateway, dan itulah lalu lintas dari klien ke tujuan. Semua hal lain di rantai diarahkan ke audiens yang berbeda.
Hook input melihat lalu lintas yang dialamatkan ke gateway itu sendiri, sehingga aturan yang diletakkan di sana mengatur akses ke layanannya sendiri, bukan transit. Hook output melihat lalu lintas yang dihasilkan gateway, kebalikan dari yang dibutuhkan kebijakan pool klien. Nama rantai adalah label sembarang yang dipilih oleh penulis kumpulan aturan, jadi jangan menyimpulkan hook dari namanya. Periksa tempat rantai dipasang sebelum menganggap apa yang dapat dicocokkannya.
| Hook | Traffic it sees | Right for this policy |
|---|---|---|
| input | Addressed to the gateway | No, that is the host's own services |
| forward | Routed through the gateway | Yes, for client-to-destination traffic |
| output | Generated by the gateway | No, that is the opposite direction |
Membaca pemasangan adalah pemeriksaan satu baris yang mencegah aturan mendarat di rantai yang tidak pernah melihat paket.
Letakkan aturan sebelum accept yang luas
Aturan dievaluasi berurutan, dan putusan pertama menang. Accept yang luas lebih awal di rantai mengakhiri evaluasi bagi paket yang dicocokkannya, sehingga drop yang ditambahkan sesudahnya tidak pernah berjalan untuk paket itu. Aturan urutan itulah seluruh alasan aturan yang tampak benar bisa tidak berefek.
Sisipkan aturan sebelum accept alih-alih menambahkannya di akhir. Jika rantai sudah memuat accept umum untuk antarmuka tunnel, aturan baru harus mendahuluinya atau ia sekadar hiasan. Periksa urutan hasilnya, bukan berkas yang Anda sunting, karena kumpulan aturan yang dirakit dari beberapa berkas mungkin tidak cocok dengan satu pun darinya. Lalu pastikan dengan paket uji dari pool.
sudo nft list chain inet filter forward
sudo nft insert rule inet filter forward iifname "tun0" ip saddr 10.90.0.0/24 ip daddr 198.51.100.0/24 drop
sudo nft -c -f /etc/nftables.conf
Perintah ketiga menguraikan berkas tanpa menerapkannya, yang menangkap kesalahan sintaksis sebelum menjadi gangguan. Terapkan dengan rencana pengembalian, karena aturan yang keliru di rantai forward dapat memutus tunnel yang sedang Anda gunakan.
Aliran yang sudah ada tidak peduli pada aturan baru Anda
Entri conntrack yang dibuat sebelum aturan ada tetap cocok dengan penerimaan sebelumnya. Itulah sebabnya drop baru kadang tampak bekerja untuk koneksi baru dan tidak berbuat apa pun bagi koneksi yang sedang diuji.
Baca pencocokan status di bagian atas rantai. Jika ia menerima lalu lintas established dan related sebelum aturan Anda, setiap aliran yang sudah berjalan terus mengalir hingga tertutup. Biasanya itulah perilaku yang Anda inginkan untuk aturan darurat, dan membingungkan ketika Anda mengharapkan pemutusan seketika. Putuskan efek mana yang Anda inginkan sebelum menerapkan. Uji yang memakai ulang koneksi terbuka akan memberi Anda cerita yang salah.
sudo conntrack -L -s 10.90.0.14 -d 198.51.100.20
sudo nft list ruleset | grep -n -A3 'ct state'
Perintah pertama menunjukkan apakah suatu aliran ada, dan yang kedua menunjukkan apakah aturan status awal terus menerimanya. Keduanya hanya-baca dan aman dijalankan saat insiden.
Apa yang bukan aturan ini
Aturan ini bukan daftar hitam domain, kebijakan IPv6, atau pembatasan pada satu akun aplikasi.
Masing-masing membutuhkan mekanismenya sendiri. Pemblokiran domain harus menyelesaikan nama, yang tidak dilakukan penyaring paket. Lalu lintas IPv6 membutuhkan pencocokannya sendiri, karena ekspresi ip tidak mengatakan apa pun tentang paket ip6. Pembatasan tingkat aplikasi menjadi milik layanan atau proksi terautentikasi, bukan pencocokan prefiks. Memisahkan persyaratan itu mencegah satu aturan sempit diminta melakukan empat pekerjaan.
Kontrak yang diberikan aturan ini tepat: lalu lintas dari pool yang diizinkan ke satu prefiks tujuan ditolak, sementara lalu lintas gateway yang tidak terkait mempertahankan kebijakannya. Tuliskan kalimat itu di samping aturan, dan orang berikutnya akan tahu untuk apa aturan itu.