Паранойя в действии: блокируем потенциально опасные 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 можно через iptables или iproute. Предпочтительным является последний, но приведу оба.

Часть 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 используется специальный тип роута — черная дыра (blackhole), а скрипт будет выглядеть следующим образом:

ip route flush type blackhole

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

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

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