Паранойя в действии: блокируем потенциально опасные ip-адреса

В интернете множество ресурсов предоставляет списки ip-адресов с которых замечен спам, перебор паролей, вирусная активность. Если по каким-либо объективным причинам (или не объективным) требуется перестраховаться и запретить доступ с таких адресов к своему компьютеру, можно воспользоваться одним из таких ресурсов.

Далее приведу пример скрипта автоматически скачивающего последнюю версию списка «плохих» ip-адресов и блокирующего с таких адресов доступ к вашему компьютеру.

Часть 1. Получаем список потенциально опасных ip-адресов

В качестве источника будем использовать infiltrated.net:

 #!/bin/bash LNAME=iplist WDIR=/tmp DRUN=0 wget -qO - http://infiltrated.net/blacklisted > ${WDIR}/${LNAME} diff -q ${WDIR}/${LNAME}.old ${WDIR}/${LNAME} > /dev/null if [ $? -eq 0 ] then echo "Blocklist has no changes." else echo "Blocklist updated." DRUN=1 cp -f ${WDIR}/${LNAME} ${WDIR}/${LNAME}.old fi if [ $DRUN -eq 1 ] then cat ${WDIR}/${LNAME} | awk '!/#|[a-z]/&&/./{print ""$1""}' > ${WDIR}/${LNAME}.raw fi 

Эта часть скрипта скачивает последнюю версию списка ip с сайта, проверяет, изменился ли список с момента последней загрузки, и, в случае если список изменился, запускается условие по переменной DRUN, преобразующее список в пригодный для обработки через цикл.

Собственно блокировать ip можно через или . Предпочтительным является последний, но приведу оба.

Часть 2.1. Блокируем с помощью iptables.

В случае блокировки посредством iptables скрипт будет выглядеть примерно так (для блокировки создадим отдельную цепочку «dirty_hosts»):

 iptables -D INPUT -i $IFACE -j dirty_hosts iptables -F dirty_hosts iptables -X dirty_hosts iptables -N dirty_hosts iptables -A INPUT -i $IFACE -j dirty_hosts for ip in $( cat ${WDIR}/${LNAME}.raw ) do iptables -A dirty_hosts -s $ip -j DROP done 

Где IFACE — интерфейс смотрящий в интернет.

Часть 2.2. Блокируем с помощью null route.

При блокировке через iproute используется специальный тип роута — черная дыра (), а скрипт будет выглядеть следующим образом:

 ip route flush type blackhole for ip in $( cat ${WDIR}/${LNAME}.raw ) do ip route add blackhole ${ip}/32 done 

В обоих вариантах (iptables и iproute) перед циклом блокировки идет очистка предыдущего списка.

Да процветает ваша паранойя.