blacklistd導入

多少なりとも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.confblacklistd_flags="-f"を指定してblacklistdを再起動すれば消えるが、すべてのブラックリストが消えて初期化されてしまう。ipfwのリストからその都度削除するのが、運用上はよさそう。

タイトルとURLをコピーしました