迷惑メール送信元をブロックする

procmail + smapassassinでスパムを迷惑メールに分類してるが、たまにとりこぼす。で、Mail.appで迷惑メールに分類した時にも自動的にメールのヘッダからIPアドレスを抜き出してドロップしたいので、そのドロップするスクリプトとプライマリ・セカンダリ・CohoHaのサーバのfirewall設定を同期させるスクリプトを呼び出すようにした。これを&付きで実行させておけばよし。

#!/bin/bash

watch_dir=/home/rio/Maildir/.Junk/cur/

while inotifywait -e CLOSE_NOWRITE $watch_dir; do
  /root/bin/block-spam-ip
  /root/bin/sync-fw
done

block-spam-ipはこんなスクリプト。mail2.rio.stはConoHaで立ててあるもう一つのMX。

#!/usr/bin/env python3

import glob
import sys
import re
import os
import subprocess

path = '/home/rio/Maildir/.Junk/cur/'

fromre = re.compile(r'Received: from ([^ ]+) .+\[([0-9\.]+)\]')
byre = re.compile(r'\tby ([^ ]+) ')
for p in glob.iglob(path + "*"):
    if os.path.isfile(p):
        with open(p) as f:
            for line in f:
                m = fromre.search(line)
                if m != None:
                    fromhost = m.groups()[0]
                    fromip = m.groups()[1]
                m = byre.search(line)
                if m != None:
                    byhost = m.groups()[0]
                    if fromhost != 'mail2.rio.st' and not ('google.com' in fromhost):
                        if byhost == 'mail.rio.st' or byhost == 'mail2.rio.st':
                            subprocess.run(['/root/bin/add-ip-to-drop', fromip])

add-ip-to-dropは以下のような内容。

#!/usr/bin/env python3

import sys
import subprocess
from ipaddress import IPv4Address as ip, IPv4Network as net
from firewall.client import FirewallClient

try:
    fw = FirewallClient()
except FirewallError as msg:
    code = FirewallError.get_code(str(msg))
    cmd.print_and_exit("Error: %s" % msg, code)

ipaddress=sys.argv[1]
existing = False
for nw in fw.getSources('drop'):
    existing |= ip(ipaddress) in net(nw)

if existing == True:
    sys.exit("This IP address is included in existing network segments.")
else:
    res = fw.addSource('drop', "{}/32".format(ipaddress))
    if res == 'drop':
        fw.runtimeToPermanent()

args = ['/usr/bin/firewall-cmd', '--reload']
res = subprocess.call(args)

print('successfully added')
タイトルとURLをコピーしました