多少なりともDDoS攻撃を防止すべく、導入してみた。
環境
- OS: FreeBSD 14.1
- ファイアウォール: ipfw
設定
postfix再ビルド
postfixをblacklistd対応させるため、portmasterに再コンフィグオプションを付けて再インストール。
# portmaster --force-config mail/postfix
出てきたconfigで、blacklistdオプションをチェック。
ビルドが完了したら、postfixを再起動。
# sudo service postfix restart
/etc/blacklistd.conf
/etc/blacklistd.conf
を編集し、次の変更を加える。
- 変更したSSH用のポート(ここでは12323)の定義を追加
- submissionsの定義を追加
[remote]
ディレクティブに自分のIPアドレスを追加
#
# Blacklist rule
# adr/mask:port type proto owner name nfail disable
[local]
ssh stream * * * 3 24h
12323 stream * * * 3 24h
ftp stream * * * 3 24h
smtp stream * * * 3 24h
submission stream * * * 3 24h
submissions stream * * * 3 24h
#6161 stream tcp6 christos * 2 10m
* * * * * 3 60
# adr/mask:port type proto owner name nfail disable
[remote]
111.112.113.114 * * * = * *
#129.168.0.0/16 * * * = * *
#6161 = = = =/24 = =
#* stream tcp * = = =
/etc/ipfw-blacklist.rc
/etc/ipfw-blacklist.rc
を作成し、次の内容を書き込む。
ipfw_offset=2000
/etc/ssh/sshd_config
/etc/ssh/sshd_config
を編集し、UseBlacklist
の行を編集して有効にする。
UseBlacklist yes
sshdを再起動。
# sudo service sshd restart
/etc/rc.conf
/etc/rc.confを編集し、次の行を追加。
blacklistd_enable="YES"
blacklistd_flags="-r"
blacklistd_flags
を-r
に設定するのは、再起動したときにテーブルをクリアせずに維持させるため。
逆に再起動時にテーブルクリアしたい場合には、blacklistd_flags="-f"
とする。
blacklistd起動
blacklistdを起動する。
# sudo service blacklistd start
運状態確認
ipfw
統計情報
ipfwの運用情報は、次のように表示する。
# sudo ipfw show
次のように統計情報が出力される。
:(略)
02000 0 0 allow udp from fe80::/10 to me 546 in
02025 2627 157214 deny tcp from table(port25) to any 25
02100 10 352 allow icmp from any to any icmptypes 8
02200 0 0 allow ipv6-icmp from any to any icmp6types 128,129
02300 5 720 allow icmp from any to any icmptypes 3,4,11
02400 0 0 allow ipv6-icmp from any to any icmp6types 3
02465 61 3483 deny tcp from table(port465) to any 465
02500 28139 1976008 allow tcp from any to me 12323
02587 32 1791 deny tcp from table(port587) to any 587
:(略)
上記のうち、table(port25)となっている行が、blacklistdによって遮断されたもの。grepするとわかりやすい。
# sudo ipfw show | grep table
遮断中のIP一覧
ipfwで遮断中のIPアドレスは、ポートごとに次のようにコマンドで一覧表示できる。
# sudo ipfw table port25 list
遮断中のものがあれば、次のように一覧表示される。
45.148.10.233/32 0
80.94.95.209/32 0
80.94.95.242/32 0
156.96.56.22/32 0
185.196.9.120/32 0
blacklistctl dump -b
で表示されるものと一緒。ただし、blacklistctl
ではポート別ではなく、一括して表示されるところが違う。
blacklistd
blacklistdの情報は、次のコマンドで表示できる。
# sudo blacklistctl dump -ar
次のように情報が表示される。
address/ma:port id nfail remaining time
80.94.92.152/32:25 1/3 23h51m43s
156.96.56.22/32:25 OK 3/3 23h55m14s
185.208.158.235/32:25 1/3 23h56m58s
80.94.92.153/32:25 1/3 23h34m38s
93.123.39.205/32:25 1/3 22h11m45s
45.148.10.233/32:25 OK 3/3 23h18m44s
80.94.92.146/32:25 1/3 23h53m30s
80.94.92.131/32:25 1/3 23h52m41s
80.94.92.155/32:25 1/3 23h53m27s
80.94.95.209/32:25 OK 3/3 22h7m48s
185.196.9.120/32:25 OK 3/3 23h38m56s
80.94.92.124/32:25 1/3 23h52m50s
80.94.92.156/32:25 2/3 23h56m46s
80.94.95.242/32:25 OK 3/3 22h8m14s
34.228.187.94/32:587 OK 3/3 23h2m43s
80.94.92.157/32:25 2/3 23h54m9s
80.94.92.158/32:25 1/3 23h52m32s
80.94.92.134/32:25 1/3 23h54m42s
80.94.92.159/32:25 1/3 22h9m51s
80.94.92.151/32:25 1/3 23h33m54s
上記のうち、OKがついている行がすでに遮断済みのもの。こうして見ると、デフォルト拒否した方がいいアドレス帯が見えてくるような気がする。
nfailが3/3になっていないものは、保留中のもの。こうしたツールにかかりにくくするために、時間を空けてアクセスしてくる模様。これがあまりにも多いようなら、24hから3dとか7dに変更するなど、時間を調整する必要がありそう。
トラブルシュート
例外設定
うっかり入れちゃいけないIPがブラックリスト入りしちゃった場合。
まずは /etc/blacklistd.conf
を編集して、ホワイトリストに登録する。
:(略)
[remote]
211.212.113.114 * * * = * *
blacklistdを再起動する。
# sudo service blacklistd restart
ipfwのリストから削除する。
# sudo ipfw table port25 delete 211.212.113.114/32
上記のport25の部分には、通信を再開せたいポート番号を指定。
現在のところ、blacklistdのリストから個別にIPを削除する手段は存在しない。/etc/rc.conf
でblacklistd_flags="-f"
を指定してblacklistdを再起動すれば消えるが、すべてのブラックリストが消えて初期化されてしまう。ipfwのリストからその都度削除するのが、運用上はよさそう。