Настирливих спамерів в black list IP і блокуємо їх в IPFW
Є:
- FreeBSD,
- Postfix,
- Swatch - log analyze.
- MySQL - database
- IPFW - firewall
Отже завдання як тільки в logfile pistfix’s з’явився запис на подобі:
| Code: |
| Jul 10 15:43:52 mail postfix/smtpd[89997]: warning: Connection rate limit exceeded: 10 from unknown[62.213.112.69] for service smtp Jul 10 15:43:52 mail postfix/smtpd[89997]: disconnect from unknown[62.213.112.69] |
Те заносимо IP адресу у тимчасовий чорний список “IP block list”, викорисувуючи правила для firewall - IPWF і дані про адреси що записані у таблиці № 99, а правило з цієї таблиці всіх не пускає.
Реалізація:Обмеження не більше 4 підключень в 2 хвилини, не вважаючи локальні адреси.
postfix, main.cf:
| Code: |
| anvil_rate_time_unit = 240s smtpd_client_connection_rate_limit = 4 smtpd_client_connection_limit_exceptions = 127.0.0.1 172.16.1.0/24 smtpd_client_event_limit_exceptions = 127.0.0.1 172.16.1.0/24 |
Дивимося лог, якщо перевищення 10 раз ліміт підключень, блокуємо адресу IP на 12 годин.
Swatch-postfix-lim:
| Code: |
| watchfor /warning: Connection rate limit exceeded: 10/i echo exec /usr/local/etc/manage_scripts/ipfw-blockip-0.sh 12 ‘$_’ |
Авто запуск swatchrc.conf
| Code: |
| swatch_enable=”YES” swatch_rules=”7” swatch_7_flags=”–tail-file=/var/log/maillog –config-file=/usr/local/etc/swatch/.swatch-postfix-lim –daemon –pid-file=/var/run/swatch_7.pid –restart-time=00:00” swatch_7_pidfile=”/var/run/swatch_7.pid” |
Правило фаєрвола:
ipfw.rules:
| Code: |
| deny log logamount 5 ip from table(99) to any |
Додавання в базу даних, і в таблицю файервола. Виключаючи
IP 111.11.11.111 (Свій, а то при тестірваніі можна гілку обрізати на
якій сидиш Smile) І протоколюючи поштою, причину занесення адреси.
ipfw-blockip-0.sh:
Code:
#!/bin/sh
Block postfix spammers by ip, $1 - hours block duration, $2 - log line
ipfw table 99 - list of ips. ipfw deny from table(99) any
Oleksiy Petrov, 2009, http://lexxai.co.cc
ip=echo $2 | /usr/bin/sed -n 's#.\*\[\([0-9.]\*\)\].\*#\1#p'
ips=echo $ip | /usr/bin/grep -v '^111\.11\.11\.111$'
if [ -n “$ips” ]
then
/sbin/ipfw table 99 add $ips $1
/sbin/ipfw table 99 list > /var/tmp/~blockip
| /usr/bin/tail -n 50 /var/log/maillog | /usr/bin/grep -e “RCPT from.*[$ips]“ » /var/tmp/~blockip |
| cat /var/tmp/~blockip | mail -s “ipfw block [$ips] host $ips” root |
rm /var/tmp/~blockip
export HHH=$HOME
export HOME=/root
echo “replace into blackip VALUES(‘$ips’,DATE_ADD(NOW(), INTERVAL $1 HOUR));” | /usr/local/bin/mysql –defaults-file=~/.my.cnf mailusers
export HOME=$HHH
fi
mysql: table mailusers.blackip
| Code: |
CREATE TABLE IF NOT EXISTS blackip ( ip char(15) CHARACTER SET ascii NOT NULL, time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (ip) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; |
~ /. My.cnf:
| Code: |
| [client] user = mailusers password = fdfjuu3***def |
Очищаємо застарілі IP раз на годину.
ipfw-blockip-release.sh:
| Code: | ||||
| #!/bin/sh # Block postfix spammers by ip, $1 - hours block duration, $2 - log line # ipfw table 99 - list of ips. ipfw deny from table(99) any # Oleksiy Petrov, 2009 http://lexxai.co.cc export HHH=$HOME export HOME=/root echo “SELECT ip FROM blackip WHERE time < now( ) “ | /usr/local/bin/mysql –defaults-file=~/.my.cnf –skip-column-name mailusers | while read str; do \ /sbin/ipfw table 99 delete “$str” | echo “DELETE FROM blackip WHERE (ip=’$str’);” | /usr/local/bin/mysql –defaults-file=~/.my.cnf mailuser done export HOME=$HHH |
crontab:
| Code: |
| @hourly root /usr/local/etc/manage_scripts/ipfw-blockip-release.sh |
При старті системи, таблиця файрвола порожня, заповнимо її з бази даних.
ipfw-blockip-init.sh:
| Code: | ||
| #!/bin/sh # Block postfix spammers by ip, $1 - hours block duration, $2 - log line # ipfw table 99 - list of ips. ipfw deny from table(99) any # Oleksiy Petrov, 2009 http://lexxai.co.cc export HHH=$HOME export HOME=/root echo “SELECT ip FROM blackip WHERE time > now( ) “ | /usr/local/bin/mysql –defaults-file=~/.my.cnf –skip-column-name mailusers | while read str; do \ /sbin/ipfw table 99 flush /sbin/ipfw table 99 add “$str” 999 done export HOME=$HHH |
Обговорювання теми на форумі , Posted: Fri Jul 10, 2009 8:32 pm
Як на додаток, можна ознайомитися з наступними проектами:
Аналізатор лог файлів так блокування за правилами, Fail2ban - FreeBSD: /usr/ports/security/py-fail2ban