Tidak ada apa pun di fail2ban yang menjatuhkan paket dengan sendirinya: ia memanggil sebuah aksi, dan aksi itulah yang menyebut protokol dan port. Ketika jail melaporkan ban sementara daemon terus menerima login, ban itu biasanya nyata dan lebih sempit daripada yang disiratkan log. Klien yang menyambung ulang lewat transport lain tidak pernah menemui aturan yang dipasang. Bandingkan apa yang dipasang aksi dengan apa yang didengarkan daemon sebelum Anda mengubah apa pun, karena buktinya ada di rantai firewall yang ditulis aksi, bukan di daftar jail.

Baca rantainya, bukan ringkasan jail

fail2ban menyisipkan rantainya sendiri di depan rantai layanan, sehingga daftar penghitung menunjukkan tepat apa yang ada. Rantai yang dinamai menurut jail, berisi satu aturan yang kolom protokolnya terbaca udp, adalah penjelasan lengkap bagi login TCP yang terus datang. Hanya paket UDP dari sumber yang diblokir yang ditolak. Layanan memiliki pendengar TCP, dan tidak ada apa pun di rantai itu yang menyentuhnya.

Perhatikan juga efek jail tetangga. Satu host bisa tampak terkonfigurasi sempurna hanya karena jail lain memasok separuh yang hilang, dan build yang sama tidak melakukan apa pun di tempat jail itu tidak terpasang.

Aksi menyebut satu protokol, dan di situlah ia patah

Setiap banaction adalah templat perintah firewall, dan protokolnya berada di salah satu placeholder-nya. Kesempitan itu disengaja, karena jail web dan jail DNS tidak ada urusannya memblokir port yang sama. Ia menjadi jebakan ketika layanan mendengarkan lebih dari satu transport, yang rutin dilakukan daemon VPN. Filter dapat memantau login gagal dari kedua transport sementara aksi hanya mencakup satu.

Penerapan SoftEther dan OpenVPN biasanya mendengarkan UDP dan TCP sekaligus, dan karena baris log terlihat sama pada kedua kasus filter memantau keduanya. Asimetri itu tidak pernah muncul di laporan jail sendiri. fail2ban menghitung kegagalan dengan benar lalu memasang aturan yang berlaku untuk separuh lalu lintas tempat kegagalan itu tiba.

Buat ban mencakup kedua transport

Perbaiki di definisi jail saja; aturan yang ditulis tangan akan diacak oleh pemuatan ulang berikutnya. Tuliskan dua aksi, satu untuk tiap 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 mencoba mempersingkatnya dengan protocol = all. banaction bawaan adalah aksi multiport, dan ia berkembang menjadi -p <protocol> -m multiport --dports <port>; tanpa protokol L4 tidak ada yang bisa diuji oleh pencocokan port, jadi iptables menolak aturan itu sementara jail tetap melaporkan ban yang berhasil. Aksi semua port seperti iptables-allports atau nftables-allports menerima satu entri, tetapi memblokir setiap port pada sumber itu, yang merupakan keputusan berbeda dan membutuhkan pembenarannya sendiri. Biarkan protocol pada tcp atau udp dan terima kedua entri itu.

Buktikan aturannya ada alih-alih memercayai pengaturan, karena pengaturan menggambarkan niat sampai sebuah rantai memegangnya:

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

Setiap rantai harus mencantumkan satu aturan, dengan -p tcp di rantai pertama dan -p udp di rantai kedua, keduanya menyebut alamat yang diblokir. Lalu pastikan alamat yang sama ditolak pada kedua transport. Ban yang belum Anda lihat di rantai hanyalah harapan, dan laporan berikutnya atas gejala yang sama akan memakan jam yang sama lagi.

Apa yang masih dilewatkan ban, dan kasus berikutnya

Yang dilakukan aksi adalah menolak satu sumber, dan hanya pada port yang tercantum di dalamnya. Ia tidak berbuat apa pun terhadap penyerang yang merotasi alamat, dan ia tidak dapat memisahkan mesin bermusuhan dari pintu keluar NAT tingkat operator yang dipakai bersama ratusan pengguna, tempat satu ban mengunci orang yang tidak melakukan apa pun. Pastikan filter membaca alamat yang benar-benar dimiliki klien, bukan header yang diteruskan atau alamat proxy. Jaga jendelanya cukup singkat agar kesalahan kedaluwarsa dengan sendirinya.

Tidak satu pun dari itu menjadi alasan untuk melewati perbaikan protokol; itu menjadi alasan untuk memegang dua gagasan sekaligus. Ban lebih sempit daripada yang disiratkan ringkasan jail, dan bahkan ban yang lengkap pun lebih sempit daripada ancamannya. Letakkan rantai firewall di samping daftar pendengar daemon dan bandingkan protokol demi protokol, karena kedua daftar itulah yang menentukan apakah sebuah ban bisa mencapai layanan sama sekali.

Simpan perintah pemuatan ulang dan daftar rantai di runbook di samping jail. Orang berikutnya akan membutuhkan keduanya, dan ringkasan jail tidak akan memberi tahu keduanya.

Artikel terkait