Сен 142013
 

Добрый вечер.
Появилась работенка, сделать скрипт автоматизации блокирования сайтов пришедших от «роскомпозора».
Решил полностью автоматизировать операцию загрузки ип.
Есть почтовый ящик на который приходит списки для блокировки сайтов.
Для начало нам нужно подключится к ящику и забрать файл с блокированными сайтами.
Для этих действий будем использовать.

# yum install fetchmail procmail

Создадим файл в домашней директории пользователя .fetchmailrc. В нем укажим параметры для соединения с внешним почтовым сервером.

$ touch .fetchmailrc
содержимое.
defaults protocol pop3,
 fetchall,
poll pop.mail.ru  protocol pop3 user "boss" password "Qq111111"
# Укажим кто будет сортировать почту.
mda 'procmail -d %T'

После создадим файл в директории пользователя под которым будем запускать чтения почтового ящика.

$ touch .procmailrc
Содержимое такое.
# Директория для почты
DEFAULT=$HOME/.maildir/
# Фильтруем письма пришедшие от ящика root@likeunix.ru после копируем их вложения в директорию /tmp/blok_site/
:0
* ^From.*root@likeunix.ru
# :0 c озночает что все вложенные файлы, если стоит 0: b то только первый вложенный файл будет скопирован
{       :0 c
        | ripmime -i - --no-nameless --paranoid -d /tmp/blok_site/
}
# Все остальное отправляем в /dev/null
:0
* ^From:.*
/dev/null

Теперь дадим права файлу 710 .fetchmailrc

$ chmod 710 .fetchmailrc

Иначе просто ничего не будет работать. )
Теперь запустим просмотр почтового ящика.

$ fetchmail -akv

Ключи:
-a Получаем все сообщения
-k Этот ключ указываем для безопасности, этот ключ запрещает удалять почту с почтового сервера.
-v ну это вывод лога действий на экран.
После этого в директорию /tmp/blok_site/ упадут вложения. теперь будем их парсить.
Так же я это действия добавил в крон, проверку почты раз в сутки.
Теперь создам скрипт по парсингу файла, изначально файл формата .xml

$ cat back_ip
#!/bin/sh
# запускаем загрузку почты.
fetchmail
sleep 10
SOR=`ls /srv/blok_site/*.xml`
DIS="/srv/blok_site/blok"
OLD="/srv/blok_site/old"
DATE=`date +"%Y-%m-%d"` 
# Сохраняем уже имеющиеся блокирвки по ип, это я сделал для себя, вы может сделать без этих двух правил.
ip route show | grep black | egrep -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | sort > $DIS.ip.old
Отсортируем старый список доменов.
sort $DIS.dom.old > $DIS.dom.ol
mv -f $DIS.dom.ol $DIS.dom.old
################START###################
# Удалим файлы с раcширением sig
rm -f /srv/blok_site/*.sig 
# Проверка естли файл с расширением xml
if [ "${SOR}" != "" ]; then
        for f in ${SOR};
do
# отфильтровываем из файла dump.xml домены и ип адреса.
                cat $f | egrep -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | sort -u > $DIS.ip
                cat $f | grep -oe '\in.*\]' | sed 's|.*TA\[||; s/[]]]*$//' | sort -u > $DIS.dom
done
# Включаем проверку на разницу к уже добавленным ип адресам, должно выдавать только новые ип адреса из первого файла $DIS.ip
#               BLOCK=`diff -B $DIS.ip $DIS.ip.old | egrep -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | sort | uniq -u`
                BLOCK_IP=`diff --old-line-format=$'%l\n' --new-line-format='' --unchanged-line-format='' $DIS.ip $DIS.ip.old`
# Добавляем в цикл и блокируем.
        for ip in $BLOCK_IP
do
# решил ип адреса блокировать так, это нулением маршрута.
                ip route add blackhole $ip
done
# Включаем проверку на разницу к уже добавленным доменам, должно выдавать только новые домены из первого файла $DIS.dom
#               BLOCK_DOM=`diff -B $DIS.dom $DIS.dom.old | grep "<" | sed 's/^< //g' | sort -u`
# Еще один способ получить разницу первого файла ко второму. cat ip.block | grep -v --file /home/bagas/ip1.block
                BLOCK_DOM=`diff --old-line-format=$'%l\n' --new-line-format='' --unchanged-line-format='' $DIS.dom $DIS.dom.old`
# Тут же пополняем файл с доменными адресами, в iptablese  они почему-то  распознаются как ип адрес обратной зоны домена.
                echo -e "${BLOCK_DOM}" >> $DIS.dom.old
# тут передаем новые домены в цикл для блокировки.
        for DOMEN in $BLOCK_DOM
do
# А для домена решал создать отдельную цепочку BLOCK_IP в iptables и добавив ее после в цепочку фарвординг, в цепочку BLOCK_IP добавляем домены которые нужно заблокировать.
                iptables -A BLOCK_IP -d "$DOMEN" -j DROP
done
# Подсчет заблокированных ип адресов и доменов.
                NUM_IP=`echo "${BLOCK_IP}" | wc -l`
                NUM_D=`echo "${BLOCK_DOM}" | wc -l`
# отправка на мыло отче о количестве заблокированных адресов.
                echo "Заблокировано новых IP адресов в количестве $NUM_IP штук, заблокированно новых доменов в количестве $NUM_D ! " | mail -s "Blocking sites." user@likeunix.ru
                mv -f /srv/blok_site/*.xml $OLD/dump-$DATE.xml
fi
################END######################
exit 0

Если мы каким-то чудом ошибочно заблокируем доступ к ИП адресу. То делает это.

# ip route del blackhole ИП_Адрес

Для просмотра заблокированных ип адресов делает так.

# ip route show | grep black

Вот и все.

  11 комментариев to “Роскомпозор или строим систему по блокировки сайтов”

  1. Доброго времени суток.
    тоже появилась задача. проблема в том что фаил идет в xml
    стоит ос freebsd. хочу дернуть из файла только url но выдает не то что надо. пример:
    cat dump | grep url . выдает дофига всего. как можно обойти?

    • Ты посмотри внимательно пост мой, там есть решение.
      А если так!
      cat dump | grep -oe ‘\in.*\]’ | sed ‘s|.*TA\[||; s/[]]]*$//’ | sort -u

  2. что то он у меня символы подменяет через putty видимо что то с кодировкой выдал такое cat dump | grep -oe \342\200\230\in.*\]\342\200\231 | sed \342\200\230s|.*TA\[||; s/[]]]*$//\342\200\231 | sort -u

    • Хмм, попробуй локаль выставить оптимальную, у меня стоит utf8 английская.
      Исправь символ ‘ на одинарные ковычки.

  3. все сделал. поставил свежую путти. но в редакторе ее подменяет теперь уже другие символы.
    через VI все норм.вот выдеал при запуске
    sh script
    script: 1: Syntax error: Unterminated quoted string
    script: 1: Syntax error: Error in command substitution

  4. sh 1
    1: 1: Syntax error: «;» unexpected

  5. Все работает скрипт по крайне мере часть которая дергает из xml. респект.
    вопрос как научится пользоваться sed и sort ?)

    • Можно на примерах, их полно в тырнете, а можно по манам, каждой утилите есть инструкция использования.
      У меня кстати затык произошел с парсингом доменов, под кроном не вкакую не хотели домены парсится, пришлось запустить в вечном цикле этот скрипт. Только после этого заработало, но это уже скорее всего изо системы зависит.

      • какая ос стоит? у меня кстати на 9.1 freebsd работает.
        под 8.2 в файле почему только 1 запись выдергивает и все

  6. А, интерстно будетли толк от локировки, или все действия напрасны?
    А кто как блокирует домены в linux?

  7. О спасибо дружище, тоже для местного тырнета такое чудо нужно соорудить.
    Начальство настаивало на виндузе это все сделать, но нашел твою статью и все поменялось, класс.!

 Leave a Reply

(required)

(required)

41 Запросов к базе. 0,441 Генерации страницы, 36MB Использование памяти.
Вы зашли с IP: 54.224.247.42