Filter Fail2ban untuk OpenVPN Access Server: real_ip dan jail
Access Server menulis format lognya sendiri, jadi filter bawaan tidak menemukan apa pun. Jangkar pada real_ip, pisahkan jail per permukaan, dan periksa bahwa alamatnya bukan proxy.
Anda menyalin OpenVPN jail dari sebuah pos komunitas, memulai ulang fail2ban, dan tidak ada satu pun alamat yang pernah diblokir. Penyebabnya hampir selalu format log: Access Server tidak menulis baris kegagalan autentikasi yang diharapkan filter bawaan. Sebelum menyentuh filter, pastikan rekamannya benar-benar ada, karena pola tidak bisa mencocokkan apa yang tidak pernah dicatat layanan.
Ini runbook yang saya ikuti di host Access Server: pastikan bentuk rekamannya, tulis satu ekspresi berjangkar, ujilah pada log sebenarnya, lalu pisahkan jail menurut permukaan yang diserang dan pastikan blokirannya sampai ke firewall.
Pastikan rekaman kegagalan itu ada
Access Server menulis baris terstrukturnya sendiri ke /var/log/openvpnas.log, dan alamat klien berada di kolom real_ip di dalam tanda kutip, bukan di awal baris syslog. Cari login gagal yang Anda tahu pernah terjadi sebelum menulis pola apa pun:
grep -i 'LOG ERR' /var/log/openvpnas.log | tail -20Jika tidak ada yang muncul, level log adalah tersangka berikutnya. Access Server punya sakelar debug basis data log di /usr/local/openvpn_as/etc/as.conf (DEBUG_LOGDB=1), dan layanan harus dimulai ulang setelah mengubahnya. Perlakukan sakelar itu sebagai pengaturan diagnostik yang harus diturunkan lagi setelah pola Anda siap, bukan sebagai konfigurasi permanen.
Selagi Anda di berkas itu, perhatikan permukaan mana yang menulis ke dalamnya. Kegagalan portal klien, antarmuka admin, dan autentikasi tunnel mendarat di berkas yang sama dengan penanda berbeda, dan detail itulah yang nanti menentukan tata letak jail.
Jangkar satu filter pada real_ip
Jaga ekspresinya tetap sempit. Filter yang mengklaim setiap baris berisi alamat IP akan memblokir orang karena pemutusan koneksi biasa, dan di server sibuk satu-satunya gejala adalah pengguna mengeluh terkunci karena menutup laptop. Klaim rekaman galat itu dan tangkap alamat di dalam tanda kutip:
# /etc/fail2ban/filter.d/openvpnaccess.local
[Definition]
failregex = ^ .*LOG ERR.*"real_ip": "<HOST>".*
ignoreregex =Spasi di awal bukan hiasan. Access Server menjorokkan rekamannya, dan berjangkar pada spasi itu mencegah pola ikut mengklaim baris yang ditulis layanan tak terkait ke berkas yang sama. Jika rekaman Anda justru diawali stempel waktu, cocokkan prefiks itu, tetapi berjangkar pada sesuatu yang benar-benar ada di setiap rekaman yang hendak Anda klaim.
Saat butuh presisi per permukaan, persempit lagi dengan mewajibkan penanda permukaan (WEB_CLIENT, WEB_ADMIN, atau VPN) di baris yang sama. Satu filter dengan tiga pola lebih mudah diaudit daripada tiga filter yang berbeda satu kata.
Uji ekspresinya sebelum mengaktifkan jail
Jangan pernah mengaktifkan filter yang belum Anda jalankan pada log produksi. Uji terdokumentasi melewatkan filter dua kali, sekali untuk memuat dan sekali untuk menerapkan, dan laporan baris yang terlewat adalah bagian yang layak dibaca:
fail2ban-regex --print-all-missed /var/log/openvpnas.log \
/etc/fail2ban/filter.d/openvpnaccess.local \
/etc/fail2ban/filter.d/openvpnaccess.local > missed.txtBandingkan jumlah kecocokan dengan kegagalan yang Anda pastikan pada langkah pertama. Nol kecocokan berarti polanya salah; kecocokan pada baris yang bukan kegagalan autentikasi berarti polanya terlalu lebar. Baca missed.txt sampai Anda bisa menjelaskan setiap baris yang Anda pilih untuk tidak diklaim.
Lakukan uji ini pada salinan jika lognya besar, dan ulangi setelah setiap peningkatan Access Server. Format log adalah antarmuka yang Anda cocokkan, dan itu bukan API yang stabil.
Pisahkan jail menurut permukaan, bukan menurut daemon
Satu Access Server menyajikan beberapa permukaan autentikasi: antarmuka web klien dan admin pada 943/tcp, serta tunnel pada 1194/udp atau 443/tcp di sebagian besar penerapan. Satu jail yang menutupi semuanya memungkinkan percobaan menebak di tunnel memblokir alamat yang juga jalur admin Anda, dan menyembunyikan permukaan mana yang sebenarnya diserang. Beri setiap permukaan jail sendiri dengan port dan ambangnya sendiri:
# /etc/fail2ban/jail.d/openvpnaccess.local
[openvpnas-web-client]
enabled = true
port = 943
protocol = tcp
filter = openvpnaccess
logpath = /var/log/openvpnas.log
maxretry = 3
findtime = 10m
bantime = 1h
[openvpnas-tunnel]
enabled = true
port = 443
protocol = udp
filter = openvpnaccess
logpath = /var/log/openvpnas.log
maxretry = 5
findtime = 10m
bantime = 1hMulailah dengan penghitung kecil dan blokir singkat, lalu naikkan setelah Anda mengamati seminggu lalu lintas nyata. Ambang yang longgar pada alamat kantor bersama menghukum setiap pengguna di balik satu NAT, dan blokir agresif pada permukaan tunnel memutus klien sah yang kredensial tersimpannya kedaluwarsa semalam.
Periksa blokirannya, backend-nya, dan kerugian sampingannya
Setelah mulai ulang, keluaran status adalah konfirmasi tercepat bahwa jail ada dan menghitung:
fail2ban-client status
fail2ban-client status openvpnas-tunnelLalu pastikan blokirannya sampai ke firewall yang benar-benar Anda jalankan, karena jail yang dikonfigurasi untuk backend yang tidak ditegakkan siapa pun tidak melindungi apa pun. Dengan aksi iptables alamatnya muncul di rantai bernama sesuai jail (f2b-openvpnas-tunnel); dengan aksi nftables alamatnya masuk ke sebuah set di tabel milik fail2ban sendiri. Periksa yang dipakai host Anda alih-alih mengasumsikannya.
Dua pemeriksaan sampingan lebih penting daripada blokirannya sendiri. Pertama, pastikan real_ip adalah alamat klien dan bukan penyeimbang beban atau proxy balik; di balik proxy setiap blokiran jatuh pada proxy dan menyeret seluruh layanan bersamanya. Kedua, tuliskan prosedur membuka blokir, karena alamat yang melewati ambang pada 02:00 biasanya milik insinyur jaga: fail2ban-client set openvpnas-tunnel unbanip 203.0.113.24.
Ingat batasnya saat menyetel. Fail2ban adalah pembatas laju pada satu permukaan autentikasi, bukan lapisan kendali akses. Ia tidak menggantikan MFA, pembatasan per akun, atau menjaga antarmuka admin di luar internet publik, dan Access Server punya pengaturan autoban sendiri yang layak diperiksa sebelum Anda menumpuk dua pembatas laju pada port yang sama.