Tiada apa-apa dalam fail2ban menjatuhkan paket dengan sendirinya: ia memanggil tindakan, dan tindakan itulah yang menamakan protokol dan port. Apabila jail melaporkan ban sementara daemon terus menerima log masuk, ban itu biasanya benar dan lebih sempit daripada yang disiratkan log. Klien yang menyambung semula melalui pengangkutan lain tidak pernah menemui peraturan yang dipasang. Bandingkan apa yang dipasang tindakan dengan apa yang didengar daemon sebelum anda mengubah apa-apa, kerana buktinya ada dalam rantai firewall yang ditulis tindakan, bukan dalam senarai jail.

Baca rantai, bukan ringkasan jail

fail2ban menyisipkan rantainya sendiri di hadapan rantai perkhidmatan, jadi senarai pembilang menunjukkan dengan tepat apa yang wujud. Rantai yang dinamakan sempena jail, yang memegang satu peraturan dengan lajur protokolnya membaca udp, ialah penjelasan lengkap bagi log masuk TCP yang terus tiba. Hanya paket UDP daripada sumber yang disekat ditolak. Perkhidmatan mempunyai pendengar TCP, dan tiada apa-apa dalam rantai itu menyentuhnya.

Perhatikan juga kesan jail jiran. Satu hos boleh kelihatan dikonfigurasikan dengan sempurna hanya kerana jail lain membekalkan separuh yang hilang, dan binaan yang sama tidak melakukan apa-apa di tempat jail itu tidak dipasang.

Tindakan menamakan satu protokol, dan di situlah ia patah

Setiap banaction ialah templat arahan firewall, dan protokolnya terletak dalam salah satu pemegang tempatnya. Kesempitan itu disengajakan, kerana jail web dan jail DNS tidak ada urusan menyekat port yang sama. Ia menjadi perangkap apabila perkhidmatan mendengar lebih daripada satu pengangkutan, yang biasa dilakukan daemon VPN. Penapis boleh memerhati log masuk gagal daripada kedua-dua pengangkutan sementara tindakan hanya meliputi satu.

Pemasangan SoftEther dan OpenVPN biasanya mendengar pada UDP dan TCP serentak, dan kerana baris log kelihatan sama dalam kedua-dua keadaan penapis memerhati kedua-duanya. Asimetri itu tidak pernah muncul dalam laporan jail itu sendiri. fail2ban mengira kegagalan dengan betul dan kemudian memasang peraturan yang terpakai kepada separuh trafik yang membawa kegagalan itu.

Jadikan ban meliputi kedua-dua pengangkutan

Betulkan dalam definisi jail sebaliknya; peraturan yang ditulis tangan akan dikocok oleh muat semula seterusnya. Nyatakan dua tindakan, satu untuk setiap protokol:

action = %(banaction)s[name=%(__name__)s-tcp, actionname=%(__name__)s-tcp, protocol="tcp", port="%(port)s", chain="%(chain)s"]
         %(banaction)s[name=%(__name__)s-udp, actionname=%(__name__)s-udp, protocol="udp", port="%(port)s", chain="%(chain)s"]

Jangan cuba memendekkannya dengan protocol = all. banaction lalai ialah tindakan multiport, dan ia mengembang menjadi -p <protocol> -m multiport --dports <port>; tanpa protokol L4 tiada apa untuk dipadankan oleh padanan port, jadi iptables menolak peraturan itu sementara jail masih melaporkan ban yang berjaya. Tindakan semua port seperti iptables-allports atau nftables-allports menerima satu entri, tetapi menyekat setiap port pada sumber itu, yang merupakan keputusan berbeza dan memerlukan justifikasinya sendiri. Biarkan protocol pada tcp atau udp dan terima kedua-dua entri itu.

Buktikan peraturan itu wujud daripada mempercayai tetapan, kerana tetapan menggambarkan niat sehingga rantai memegangnya:

iptables -S f2b-vpn-tcp
iptables -S f2b-vpn-udp

Setiap rantai patut menyenaraikan satu peraturan, dengan -p tcp dalam yang pertama dan -p udp dalam yang kedua, kedua-duanya menamakan alamat yang disekat. Kemudian sahkan alamat yang sama ditolak pada kedua-dua pengangkutan. Ban yang belum anda lihat dalam rantai hanyalah harapan, dan laporan seterusnya tentang gejala yang sama akan memakan jam yang sama lagi.

Apa yang masih terlepas oleh ban, dan kes seterusnya

Apa yang dilakukan tindakan ialah menolak satu sumber, dan hanya pada port yang disenaraikan di dalamnya. Ia tidak berbuat apa-apa terhadap penyerang yang memutar alamat, dan ia tidak dapat memisahkan mesin bermusuhan daripada pintu keluar NAT peringkat pembawa yang dikongsi ratusan pengguna, di mana satu ban mengunci orang yang tidak melakukan apa-apa. Pastikan penapis membaca alamat yang benar-benar dimiliki klien, bukan pengepala yang dimajukan atau alamat proksi. Pastikan tetingkap cukup singkat supaya kesilapan luput dengan sendirinya.

Tiada satu pun daripada itu menghujahkan supaya pembaikan protokol dilangkau; ia menghujahkan supaya dua idea dipegang serentak. Ban lebih sempit daripada yang disiratkan ringkasan jail, dan ban yang lengkap pun lebih sempit daripada ancaman. Letakkan rantai firewall di sebelah senarai pendengar daemon dan bandingkan protokol demi protokol, kerana kedua-dua senarai itulah yang menentukan sama ada ban boleh mencapai perkhidmatan itu.

Simpan arahan muat semula dan senarai rantai dalam runbook di sebelah jail. Orang seterusnya akan memerlukan kedua-duanya, dan ringkasan jail tidak akan memberitahunya mana-mana satu.

Artikel berkaitan