- 1. 概要
- 2. フィルタ
- 3. 設定
- 4. 参考サイト
1. 概要
「rspamd」で、頻繁に「spam」を送りつけてくる送信者を監視対象とします。
2. フィルタ
まずは、「rspamd」のログのチェック方法を定義。
「root」ユーザ権限で。
vi /usr/local/etc/fail2ban/filter.d/rspamd.conf
下記を記述します。
[Definition]
failregex = ^.* \[(?:[^\]]+)\] <[^>]+>; lua; (?:[^:]+): result: reject; .* \(IP: <HOST>\)$
ignoreregex =
2行目で、「rspamd」のログから「result: reject」となった行の「IP」アドレスを抽出するパターンを定義しています。
とまぁ、これは通常のもので。
わたしは、「spam」と判断したものは、「subject」を変えております。
/usr/local/etc/rspamd/local.d/actions.conf
reject = null;
greylist = null;
add_header = null;
rewrite_subject = 6;
subject = "*****spam***** %s";
となっており、「spam」判定時のログには、下記のように出力されます(1行です)。
2026-02-27 15:59:42 #33117(normal) <687a58>; task; rspamd_task_write_log: id: <fPP2ceHUk@hantzacha.com>, qid: <35E8219CB73D>, ip: 34.104.178.223, from: <server@hantzacha.com>, (default: F (soft reject): [17.90/6.00] [DBL_SPAM(6.50){sousouxinfang.com:url;hantzacha.com:rdns;hantzacha.com:mid;hantzacha.com:helo;hantzacha.com:from_smtp;},ABUSE_SURBL(5.00){sousouxinfang.com:url;},RBL_SPAMHAUS_CSS(2.00){34.104.178.223:from;},DMARC_POLICY_QUARANTINE(1.50){saisoncard.co.jp : SPF not aligned (relaxed), No valid DKIM;quarantine;},TO_EXCESS_QP(1.20){},PH_SURBL_MULTI(1.00){sousouxinfang.com:url;},FORGED_SENDER(0.30){point@saisoncard.co.jp;server@hantzacha.com;},MIME_HTML_ONLY(0.20){},BAD_REP_POLICIES(0.10){},ONCE_RECEIVED(0.10){},ARC_NA(0.00){},ASN(0.00){asn:396982, ipnet:34.104.176.0/20, country:US;},FROM_HAS_DN(0.00){},FROM_NEQ_ENVFROM(0.00){point@saisoncard.co.jp;server@hantzacha.com;},GREYLIST(0.00){greylisted;Fri, 27 Feb 2026 07:04:42 GMT;new record;},HAS_X_PRIO_THREE(0.00){3;},MIME_TRACE(0.00){0:~;},MISSING_XM_UA(0.00){},RCPT_COUNT_ONE(0.00){1;},RCVD_COUNT_ZERO(0.00){0;},R_DKIM_NA(0.00){},R_SPF_ALLOW(0.00){+ip4:34.104.178.223;},SURBL_MULTI_FAIL(0.00){saisoncard.co.jp:server fail;},TO_DN_ALL(0.00){},TO_MATCH_ENVRCPT_ALL(0.00){}]), len: 12257, time: 5382.965ms, dns req: 37, digest: <515c5a0f094a2453490b1461a041849c>, rcpts: <any@sing.ne.jp>, mime_rcpts: <any@sing.ne.jp>, forced: soft reject "Try again later"; score=nan (set by greylist)
なので、実際の「failregex」の定義は。
「rspamd_task_write_log」の行を狙い撃ちし、前方の複雑な部分はスルーして、「ip:」以降を確実に捕まえます。
failregex = ^.* rspamd_task_write_log:.* ip: <HOST>,.* \(default: [F|S] \(
現在のログで、ヒットするか、チェックします。
fail2ban-regex /var/log/rspamd/rspamd.log /usr/local/etc/fail2ban/filter.d/rspamd.conf
Running tests
=============
Use filter file : rspamd, basedir: /usr/local/etc/fail2ban
Use log file : /var/log/rspamd/rspamd.log
Use encoding : UTF-8
Results
=======
Failregex: 9 total
|- #) [# of hits] regular expression
| 1) [9] ^.* rspamd_task_write_log:.* ip: <HOST>,.* \(default: [F|S] \(
'-
Ignoreregex: 0 total
Date template hits:
|- [# of hits] date format
| [1086] {^LN-BEG}ExYear(?P<_sep>[-/.])Month(?P=_sep)Day(?:T| ?)24hour:Minute:Second(?:[.,]Microseconds)?(?:\s*Zone offset)?
'-
Lines: 1086 lines, 0 ignored, 9 matched, 1077 missed
[processed in 0.07 sec]
Missed line(s): too many to print. Use --print-all-missed to print all 1077 lines
「9 matched」で、9個捕まえたようです。
3. 設定
vi /usr/local/etc/fail2ban/jail.local
最下部あたりに下記を記述します。
[rspamd]
enabled = true
filter = rspamd
logpath = /var/log/rspamd/rspamd.log
banaction = ipfw
findtime = 3600
maxretry = 2
bantime = 604800
1時間以内に 2回「Spam」判定されたらアウト、とりあえず 1週間「BAN」としています。
設定をチェック。
fail2ban-client -d
良さそうであれば、再読み込みして有効化します。
service fail2ban reload
3. 参考サイト
本ページは、「Gemini」伍長を参考にさせていただきました。
|