UFWとFail2BanでSPAMなアクセスとログファイルのサイズを減らしてみたお話。その2 of 2

このお話は全2本立てでお送りします。
この記事ではFail2Banの設定についてお話してます。
UFWについては、UFWとFail2BanでSPAMなアクセスとログファイルのサイズを減らしてみたお話。その1 of 2をご覧ください。

なお、別にUFWと一緒に使わなければならいわけでもないので、Fail2Banだけの設定を見たい人は、この記事だけ読んでもよいと思います。
はじめに
サーバを建ててると、うんざりするほどたくさんのSPAMなアクセスが来ますよね。
規定されてないポートにやってくる子たちは、UFW(Uncomplicated Firewall)で防げばいいじゃんって言えば、それもそうなんですが、UFWってアクセスをブロックするごとにログをつけてくれるんですよね。
ログをつけることそのものは、当たり前だし大事なことなんですが、とはいうものの、延々と同じIPが並んでたりするわけで。しかも毎秒毎秒ログが記録されてたりするから、めちゃくちゃに肥大化するるわけです。
ログが肥大化するのが厭なら止めちゃえばいいじゃんってのも、1つの解な気はしますが、ちょっとこわい。
いずれにせよ、いざ何かが起こったとなった時に、肥大化したログってのはすごく厄介だし、ログがないのも厭っていうわがままセットをどうにか解決しようと思ったわけです。
というわけで、UFWでブロックしたら、その次のタイミングにアクセス自体を止めちゃうってなそんな感じに設計してみました。
iptablesでアクセス止めちゃえば、UFWのログを連投されないし、かなりすっきりします。
なにはともあれインストール
Ubuntuを想定してるけど、そのほかのOSでも似たようなことはできるはずです。
apt
なんかを読み替えてやってみてね。
Ubuntu24系でFail2Banが動かないってなことがあったみたいですが、今は動くようになったみたいですね。
$ sudo apt install fail2ban
インストールが終わったら、とりあえずバージョンを見てみる。
$ fail2ban-client version
1.0.2
最新バージョンは 1.0.2
でした。
下準備
fail2banをインストールして、まずやるべきは、自分の接続元IPをBANされないようにすることです。
自分がBANされたら、めっちゃ面倒くさいです。だるいです。やる気なくしちゃいます。
なので、真っ先に自分がBANされないようにしましょ。
また、とりあえず触るべき設定ファイルは、jail.conf
なのですが、このファイル自体には直接触れず、jail.local
ってな名前のファイルを用意して、必要なことだけを追記していくのが、fail2banの流儀だそうなので、それに従います。
情報収集
まずは、接続先サーバに接続しているIPアドレス(多くの場合には、自分の手元にあるPCのグローバルIP)をnslookup
なりなんなりで調べましょう。
ifconfig
/ipconfig
で出てくるのはローカルIPなので違うよ。 踏み台サーバを使用してる場合にはそのIPが必要。 自分をBANしないように設定
先に書いた通り、jail.local
に書いていきます。
jail.conf
をコピーしてきてもいいのですが、コメント部分が多くてうざったいので、新規ファイルを作っちゃいましょう。
新しいコンソール開いて、jail.conf
を開いて眺めつつ編集するのもよさそうですね。
$ sudo vim /etc/fail2ban/jail.local
とにもかくにも自分がBANされないことを第一目標にします。
ignoreip
に、サーバのローカルホスト(ループバック)127.0.0.1/8
と、下調べしておいたIPアドレス(例として123.456.78.90
と書いてます)をいれましょう。
[DEFAULT]
ignoreip = 127.0.0.1/8 123.456.78.90
とりあえず保存して、これで一安心ですね。
BAN対象の設定
/etc/fail2ban/jail.d/
の中に設定ファイルを追加していくことで、BAN対象を追加できます。
以下、UFWとNginxでの例を挙げていますが、これら2つのレクチャを見ることで、fail2banの基本的な使い方が理解できると思います。
jail.local
に書いても同じ効果を得られますが、条件が増えてくると見にくくなることがあるあるなので、最初から分けておいた方が無難です。 また、順序としては、
jail.conf
をjail.local
で上書きし、さらにそれをjail.d/*.conf
で上書きするといった仕組みになっているようです。UFW
とりあえず、前回UFWで引っかかった不届き者たちをBAN対象にしてみましょう。

$ sudo vim /etc/fail2ban/jail.d/ufw.conf
開いたら、以下のような感じに書きます。
[ufw]
enabled = true
filter = ufw
action = iptables-allports
logpath = /var/log/ufw.log
findtime = 3d
maxretry = 3
bantime = -1
簡単に説明すると。
logpath
で指定したログを監視し、findtime
の時間内に、maxretry
回失敗したらbantime
の時間(-1
は無限)出禁にするってな感じです。
これら時間などはお好みで変更してみてください。
action = iptables-allports
を指定することで、iptablesでがっつりお断りするようにしています。ファイルを保存したら、再起動してみましょう。
$ sudo systemctl restart fail2ban
そして、ちゃんと起動してるかの確認もしときましょ。
もし、ここでufw
の文字列が出ない場合には、filterがないのかもしれないです。
この下にfilterについての記載を参考に、追加してみてください。
$ sudo fail2ban-client status
Status
|- Number of jail: 1
`- Jail list: ufw
また、ufwのフィルタがどんな感じに動いてるかは、以下コマンドで見れます。
$ sudo fail2ban-client status ufw
Status for the jail: ufw
|- Filter
| |- Currently failed: 43
| |- Total failed: 69
| `- File list: /var/log/ufw.log
`- Actions
|- Currently banned: 838
|- Total banned: 838
`- Banned IP list: ...(ipの羅列)...
滅茶苦茶大量のBANが発生してますね・・。
補足として。
次のnginxでの例で、このフィルターに関しても言及しますが、少しだけ先出し。
このUFWのフィルタリングの実態は、 /etc/fail2ban/filter.d/ufw.conf
にありあます。
sudo fail2ban-client status
で動かなかった人は、vim /etc/fail2ban/filter.d/ufw.conf
をして以下を追加してみてください。
[INCLUDES]
before = common.conf
[Definition]
failregex = UFW BLOCK.* SRC=<HOST> DST
ignoreregex =
failregex
でどんなログが来たら<HOST>
として引っかけるか、みたいなことが書いてます。
このfailregex
に対応するのが、前回もみた、このログに対応してることがわかりますね。
2024-12-24T21:57:10.809000+09:00 serverName kernel: [UFW BLOCK] IN=ens3 OUT= MAC=XX:XX:......:XX SRC=98.76.543.210 DST=123.45.678.90 LEN=40 TOS=0x00 PREC=0x00 TTL=237 ID=54321 PROTO=TCP SPT=49628 DPT=9080 WINDOW=65535 RES=0x00 SYN URGP=0
nginx
ついでに、需要の多そうなnginxも設定しておきましょう。
NGINXでなんだか無限にサーバを叩いてくる輩がいるので、そういった輩を出禁にしましょう。
そして、先ほどは、fail2banをインストールしたらついてきたfilterを使ってみましたが、今度はそのフィルターを作ってみます。
フィルターを追加するには、filter.d
というディレクトリに設定ファイルを追加するのですが、今回はnginx-intruder.conf
という名前で作ってみます。
$ sudo vim /etc/fail2ban/filter.d/nginx-intruder.conf
新しいファイルを作ったら、下記のようなのでよいかと思います。
[Definition]
failregex = ^<HOST>.*"(GET|POST).*" (444|400|405|406|429) .*$
ignoreregex =
444
はnginx独自のステータスコード。お返事しないようなものです。 他のステータスコードについては、適当に調べてもらうとして。403
や404
が含めてないのは、それらステータスコードは普通にサイトを閲覧してたとて、遭遇する(させてしまう)可能性が高いものなので緩めに対応し、逆に今回作っているファイルで挙げているようなものは、普通の人は発生させないようなものなのでキツく対応するといったことを想定しています。このあと、UFWで説明したのと同じ手順で、/jail.d
に設定ファイルを作るのですが、毎回毎回findtime
やmaxretry
なんかを書くのは面倒だし、後で変える時に滅茶苦茶めんどくさくなります。
そうならないために、ここでデフォルト値を設定しておきましょ。
デフォルト値を設定するには、準備段階で自分自身がBANされないために作ったファイルjail.local
を開きます。
$ sudo vim /etc/fail2ban/jail.local
このファイルにfindtime
・maxretry
・maxretry
を追記します。
[DEFAULT]
ignoreip = 127.0.0.1/8 123.456.78.90
findtime = 1d
maxretry = 5
bantime = 1d
がっつり[DEFAULT]
って書いてますよね。
これで、設定ファイルにfindtime
・maxretry
・maxretry
が書かれていない場合にこの値が採用される状態になりました。
ってことで、/jail.d
の設定ファイルを作りましょう。
$ sudo vim /etc/fail2ban/jail.d/nginx.conf
開いたら、以下のような感じに書きます。
先ほど書いたデフォルト値以外がいい場合には、findtime
・maxretry
・maxretry
を記載します。デフォルト値でいいなら、書く必要はないです。
[nginx-intruder]
enabled = true
port = http,https
logpath = /var/log/nginx/access.log
# findtime = 1d # <- デフォルト以外がよければ書く
# maxretry = 5 # <- デフォルト以外がよければ書く
# bantime = 1d # <- デフォルト以外がよければ書く
ファイルを保存したら、再起動してみましょう。
$ sudo systemctl restart fail2ban
そして、ちゃんと起動してるかの確認もしときましょ。
$ sudo fail2ban-client status
Status
|- Number of jail: 2
`- Jail list: ufw, nginx-intruder
Number of jail
の数とJail list
の表記が増えていれば成功です。