Mengapa cangkuk firewall VPN menambah peraturan yang sama dua kali
Sambungan semula boleh menjalankan cangkuk anda sekali lagi, jadi reka bentuk untuk keadaan yang dikehendaki: rantai milik sendiri, ujian sebelum memasukkan, satu perubahan bersiri dan pembongkaran yang sempit.
Cangkuk berfungsi kali pertama, dan selepas tiga sambungan semula rantai menyimpan tiga salinan peraturan yang sama. Tiada apa yang gagal dengan kuat; skrip hanya melakukan apa yang diberitahu setiap kali ia dijalankan. Cangkuk VPN ialah operasi konfigurasi yang boleh berjalan lebih daripada sekali, jadi ia memerlukan pemilik, keadaan yang dikehendaki dan perubahan bersiri. Ikut urutan itu dan pertindihan berhenti.
Berikan pemilik kepada peraturan sebelum menulis mana-mana
Tentukan rantai atau jadual mana yang dimiliki oleh integrasi ini sebelum anda menulis satu peraturan pun. Rantai khusus yang dicipta dan dikosongkan oleh cangkuk ialah bentuk pemilikan yang paling jelas, kerana pembersihan kemudian boleh membuang rantai itu tanpa menyentuh dasar orang lain. Jika anda perlu menambah peraturan pada rantai kongsi, tandakan dengan komen supaya carian kemudian menemui tepat milik anda. Pemilikan itulah yang menjadikan pembongkaran selamat, dan pembongkaran ialah bahagian yang gagal secara senyap.
iptables -N VPN_HOOK 2>/dev/null || true
iptables -C INPUT -j VPN_HOOK 2>/dev/null || iptables -I INPUT -j VPN_HOOK
iptables -S VPN_HOOK
Komen di sini bukan hiasan. Ia adalah perbezaan antara membuang peraturan anda dan membuang peraturan yang kebetulan kelihatan serupa, dan ia kekal dalam set peraturan yang disimpan. Tulis komen sekali dalam pemboleh ubah dan gunakan rentetan yang sama dalam setiap arahan yang menambah, menguji atau memadam.
Uji keadaan yang dikehendaki dan bukannya menambah lagi
Tuliskan apa yang patut wujud semasa terowong naik: antara muka mana, sumber dan destinasi mana, protokol mana dan port mana. Kemudian nyatakan setiap peraturan sebagai ujian yang diikuti penyisipan, supaya larian kedua menemui peraturan itu dan tidak melakukan apa-apa. Arahan semakan keluar dengan sifar apabila peraturan wujud, dan itulah isyarat yang tepat diperlukan skrip. Rujukan iptables mendokumentasikan bentuk semakan, penambahan dan penyisipan yang digunakan di sini.
iptables -C VPN_HOOK -i tun0 -p tcp --dport 443 -j ACCEPT ||
iptables -A VPN_HOOK -i tun0 -p tcp --dport 443 -j ACCEPT
Berhati-hati dengan kedudukan. Menyemak peraturan dan menyisipkannya di kepala boleh mengalihkan kebenaran ke hadapan penafian sengaja yang dahulunya datang dulu, jadi larian kedua mengubah tingkah laku walaupun tidak menambah apa-apa. Tambah di hujung dalam rantai anda sendiri, dan kawal susunan melalui kedudukan lompatan ke rantai itu. Jika susunan dalam rantai penting, bina semula rantai daripada senarai yang diketahui dan bukannya menampal peraturan demi peraturan.
Berhenti jika peraturan yang diperlukan tidak boleh dinyatakan sebagai ujian yang stabil. Itu biasanya bermakna keadaan yang dikehendaki masih kabur.
Siri perubahan itu dan bukannya berharap ia bertahan
Dua seruan cangkuk boleh bertindih, dan kedua-duanya boleh melihat peraturan yang tiada sebelum salah satu menambahnya. Pilihan tunggu xtables membuat arahan menunggu kunci, tetapi ia tidak menjadikan urutan semak-kemudian-tambah atom merentasi dua arahan. Sirikan seluruh operasi dengan kunci anda sendiri, atau gunakan pengurus yang menggunakan kelompok yang diisytiharkan sebagai satu transaksi. nftables boleh melakukan yang terakhir, dan itulah salah satu sebab untuk mengutamakannya pada hos yang menyediakannya.
flock /run/vpn-hook.lock /usr/local/sbin/vpn-firewall-apply
nft -f /etc/nftables/vpn-hook.nft
Walau apa pun mekanisme yang anda pilih, pastikan bahagian kritikal pendek dan jadikannya boleh dimasuki semula: cangkuk yang gagal di tengah jalan harus selamat dijalankan semula. Log hasilnya supaya larian berulang kelihatan dalam jurnal dan bukannya disimpulkan daripada bilangan peraturan. Jika dua penyelia berbeza boleh memanggil cangkuk, betulkan itu dahulu; tiada kunci membaiki dua pemilik.
Bongkar hanya apa yang anda miliki
Pembongkaran mesti membezakan sambungan pengganti daripada yang telah ia persarakan, dan ia mesti bertahan daripada peristiwa yang tidak pernah mendapat pembersihan yang rapi. Padam dengan pengecam yang sama yang anda gunakan untuk menambah, dan jangan sekali-kali mengosongkan rantai kongsi untuk memudahkan pembersihan. Selepas hentian keras, jalankan pas perdamaian pada permulaan seterusnya dan bukannya menganggap cangkuk bawah telah berjalan.
iptables -D VPN_HOOK -i tun0 -p tcp --dport 443 -j ACCEPT
iptables -F VPN_HOOK
ip -brief link show type tun
Jangka hayat antara muka juga termasuk dalam reka bentuk. Sambungan semula boleh mencipta peranti dengan nama berbeza, jadi peraturan yang mengekod nama terowong kedua menjadi lapuk walaupun masih kelihatan sah. Utamakan identiti yang didedahkan oleh sambungan itu sendiri, dan baca semula pada setiap larian. Uji ketiga-tiga peristiwa secara berasingan: sambungan berulang, sambungan pengganti dan penutupan. Trafik yang dibenarkan harus bertahan melalui ketiga-tiganya tanpa pertindihan, dan perkhidmatan yang tidak berkaitan harus kekal tidak tersentuh.
Perjalanan berakhir apabila cangkuk mempunyai pemilik, ujian untuk setiap peraturan yang ditambahnya, satu laluan bersiri dan pembongkaran yang membuang hanya keadaannya sendiri. Cangkuk yang selamat dijalankan dua kali lebih bernilai daripada cangkuk yang bijak sekali.