Автоматизация наше все =)
На одной из моих подработок часто возникала задача заблокировать какой-то из адресов на сервере. Чтобы человеку с этого ip нельзя было зайти ни на один из сайтов.
В принципе, телодвижений минимум, но делать это все равно не очень хотелось - уж очень однообразно. А однообразные задачи несложно автоматизировать. Вот я и задумался над вопросом автоматизации этой операции.
Итак, какие операции мне требуется выполнять программно?
1. Забирать письма из определенного почтового ящика
2. Выбирать из этого письма ip-адрес
3. Добавлять адрес в определенную цепочку файрвола
4. Удалить письмо, как более не нужное
Работа с письмами
Для работы с письмами я выбрал легковесный, но подходящий для моих целей сборщик писем - getmail.
В конфигурационном файле также указал, что собранные письма следует сразу же удалять.
Вот такой конфигурационный файл (getmailrc):
[retriever]
type = SimpleIMAPRetriever
server = mail.v-midas.com
username = xxxx@xxxx.com
password = yyyyyy
[destination]
type = Maildir
path = ~/.maildir/
Для писем, как уже видно из конфига создана директория ~/.maildir. Во время испытаний оказалось, что getmail не умеет создавать поддректории и поэтому их придется создать самостоятельно. В ~/.maildir нужно создать new cur tmp.
Файрвол
Тут все достаточно тривиально. Для блокировки создана отдельная цепочка, в которую и заносятся все записи. В моем случае это цепочка blocked.
Автоматизация
Естественно, автоматизация всех описанных в начале операций выполнена в виде bash-скрипта. Вот он:
#!/bin/bash
export HOME="/home/blocked"
export DISPLAY=":0"
CUR_PATH="$HOME/.getmail"
cd $CUR_PATH
MAIL_DIR="$HOME/.maildir"
export LANG="ru_RU.UTF-8"
export LC_ALL="$LANG"
FPID="/tmp/cc.pid"
date
if [ -s $FPID ]; then
echo "found cc.pid"
cat $FPID
rm $FPID
exit 78
fi
echo $$ >$FPID
getmail -n 1>std.msg 2>err.msg
sleep 2
mailfiles=`ls $HOME/.maildir/new`
for i in $mailfiles
do
iptables -A blocked -s `cat $HOME/.maildir/new/$i | egrep '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$'` -j REJECT
done
rm $FPID
Этот скрипт запускается по крону раз в 10 минут. В него можно добавить еще много разных функций, если вдруг это потребуется.
Комментариев нет:
Отправить комментарий