Satu peraturan boleh menjauhkan kolam VPN yang dibenarkan daripada julat destinasi tanpa mengganggu perkara lain yang dilakukan oleh gateway. Peraturannya sendiri pendek; bahagian yang menentukan sama ada ia berfungsi ialah hook tempat ia hidup dan kedudukannya dalam rantai. Tersilap pada kedua-duanya menghasilkan firewall yang kelihatan betul dan berkelakuan tidak konsisten. Mulakan dengan apa yang paket lakukan apabila peraturan melihatnya.

Apa yang sebenarnya dipadankan oleh peraturan

Peraturan memadankan tiga perkara serentak: antara muka input, awalan sumber dan awalan destinasi. Ketiga-tiganya mesti benar sebelum drop dikenakan, dan itulah yang mengekalkannya sempit. Membacanya sebagai satu ungkapan lebih mudah daripada tiga dasar berasingan.

Padanan antara muka ialah yang membezakan trafik klien yang diteruskan daripada sambungan gateway sendiri. Tanpanya, peraturan yang hanya menamakan kolam sumber juga akan menjejaskan paket yang gateway sendiri jana daripada alamat itu, jika ia pernah berlaku. Awalan sumber mengehadkan dasar kepada klien yang dibenarkan, dan awalan destinasi mengehadkannya kepada satu julat. Bacalah peraturan itu sebagai persilangan, bukan sebagai senarai.

Catat ketiga-tiga nilai sebelum mengedit apa-apa: nama antara muka tunel, kolam yang diagihkan oleh pelayan, dan awalan yang anda mahu tolak. Salah taip pada mana-mana satu daripadanya menghasilkan peraturan yang dihuraikan dengan bersih tetapi tidak melindungi apa-apa. Simpan ketiga-tiga nilai itu dalam rekod perubahan di sebelah peraturan.

Hook menentukan siapa yang terlibat dengan peraturan

Rantai netfilter dipasang pada hook, dan hook yang menentukan paket mana yang benar-benar dilihat oleh rantai. Hook forward melihat trafik yang dihalakan melalui gateway, dan itulah trafik daripada klien ke destinasi. Segala-galanya dalam rantai itu ditujukan kepada audiens yang berbeza.

Hook input melihat trafik yang dialamatkan kepada gateway itu sendiri, jadi peraturan yang diletakkan di situ mengawal akses kepada perkhidmatannya sendiri dan bukan transit. Hook output melihat trafik yang dijana oleh gateway, iaitu bertentangan dengan apa yang diperlukan oleh dasar kolam klien. Nama rantai ialah label sewenang-wenangnya yang dipilih oleh penulis set peraturan, jadi jangan simpulkan hook daripada namanya. Semak di mana rantai dipasang sebelum menganggap apa yang boleh dipadankannya.

HookTraffic it seesRight for this policy
inputAddressed to the gatewayNo, that is the host's own services
forwardRouted through the gatewayYes, for client-to-destination traffic
outputGenerated by the gatewayNo, that is the opposite direction

Membaca pemasangan ialah semakan satu baris yang menghalang peraturan daripada mendarat dalam rantai yang tidak pernah melihat paket itu.

Letakkan peraturan sebelum accept yang luas

Peraturan dinilai mengikut urutan, dan keputusan pertama menang. Accept yang luas lebih awal dalam rantai menamatkan penilaian untuk paket yang dipadankannya, jadi drop yang ditambah selepas itu tidak pernah dijalankan untuk paket tersebut. Peraturan urutan itulah keseluruhan sebab mengapa peraturan yang kelihatan betul boleh tidak berkesan.

Sisipkan peraturan sebelum accept dan bukan menambahnya di hujung. Jika rantai sudah mengandungi accept umum untuk antara muka tunel, peraturan baharu mesti mendahuluinya atau ia hanya hiasan. Semak urutan yang terhasil dan bukan fail yang anda edit, kerana set peraturan yang dipasang daripada beberapa fail mungkin tidak sepadan dengan mana-mana satu daripadanya. Kemudian sahkan dengan paket ujian daripada kolam itu.

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 menghuraikan fail tanpa menggunakannya, yang menangkap kesilapan sintaks sebelum ia menjadi gangguan. Gunakan dengan pelan pemulihan, kerana peraturan yang salah dalam rantai forward boleh memutuskan tunel yang anda gunakan untuk bekerja.

Aliran sedia ada tidak peduli tentang peraturan baharu anda

Entri conntrack yang dicipta sebelum peraturan wujud terus sepadan dengan penerimaan terdahulu. Itulah sebabnya drop baharu kadangkala kelihatan berfungsi untuk sambungan baharu dan tidak berbuat apa-apa untuk sambungan yang sedang diuji.

Baca padanan keadaan di bahagian atas rantai. Jika ia menerima trafik established dan related sebelum peraturan anda, setiap aliran yang sedang berjalan terus mengalir sehingga ditutup. Biasanya itulah tingkah laku yang anda mahu untuk peraturan kecemasan, dan ia mengelirukan apabila anda menjangka pemotongan serta-merta. Tentukan kesan mana yang anda mahu sebelum menggunakan. Ujian yang menggunakan semula sambungan terbuka akan memberitahu 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 sama ada aliran wujud, dan yang kedua menunjukkan sama ada peraturan keadaan awal terus menerimanya. Kedua-duanya baca-sahaja dan selamat dijalankan semasa insiden.

Apa yang bukan peraturan ini

Peraturan ini bukan senarai hitam domain, dasar IPv6 atau sekatan ke atas satu akaun aplikasi.

Setiap satu daripadanya memerlukan mekanismenya sendiri. Sekatan domain perlu menyelesaikan nama, yang tidak dilakukan oleh penapis paket. Trafik IPv6 memerlukan padanannya sendiri, kerana ungkapan ip tidak menyatakan apa-apa tentang paket ip6. Sekatan peringkat aplikasi milik perkhidmatan atau proksi yang disahkan, bukan padanan awalan. Memisahkan keperluan itu menghalang satu peraturan sempit daripada diminta melakukan empat kerja.

Kontrak yang diberikan oleh peraturan ini adalah tepat: trafik daripada kolam yang dibenarkan ke satu awalan destinasi ditolak, manakala trafik gateway yang tidak berkaitan mengekalkan dasarnya yang sedia ada. Tulis ayat itu di sebelah peraturan, dan orang seterusnya akan tahu untuk apa ia.

Artikel berkaitan