Возникла необходимость ограничить доступ к сайтам из российского сегмента сети Internet, работающим под ОС Linux Debian v7.XX. Т.е. сделать так, что бы из России они были недоступны. Хостинг-провайдер .masterhost ежесуточно генерирует и публикует в свободном доступе текстовый файл, содержащий список сетевых префиксов IPv4, выделенных российским операторам Internet: http://noc.masterhost.ru/allrunet/ Насколько я понимаю, генерируется он на основании данных из базы данных RIPE: http://apps.db.ripe.net/ С помощью фильтра пакетов iptables заблокируем весь трафик, идущий с российских IP-адресов. Проблема в том, что на момент написания этих строк количество сетевых префиксов в файле .masterhost насчитывало 7197 штук. Если сгенерировать по отельному правилу iptables на каждое из них, то это создаст существенную нагрузку на сетевую подсистему ОС. Поэтому воспользуемся расширением IP sets для iptables, которое было создано специально для подобных случаев: эффективная обработка больших списков IP-адресов – http://ipset.netfilter.org/
Настройку начинаем с того, что устанавливаем утилиту командной строки для работы с IP sets:
apt-get -y install ipset
Обратите внимание, что функционал, необходимый для работы IP sets, в ядре ОС Linux Debian v7.XX уже есть. В более ранних версиях и других дистрибутивах может потребоваться модифицировать ядро.
Создадим и сделаем исполняемым файл "/etc/cron.daily/runetblock" следующего содержания:
#!/bin/sh
ipset=`which ipset`
ipset=${ipset}' -! -q'
iptables=`which iptables`NETHASHLIST='runet'
NETHASHLISTTEMP='runettmp'${ipset} create ${NETHASHLIST} hash:net
${ipset} create ${NETHASHLISTTEMP} hash:net
${ipset} flush ${NETHASHLISTTEMP}for net in $(curl -s -f http://noc.masterhost.ru/allrunet/runet | sed '/^ *$/d' | sort | uniq);
do
${ipset} add ${NETHASHLISTTEMP} ${net};
done${ipset} swap ${NETHASHLISTTEMP} ${NETHASHLIST}
${ipset} destroy ${NETHASHLISTTEMP}${iptables} -C INPUT -p tcp -m multiport --dports 80,443 -m set --match-set runet src -j DROP || ${iptables} -I INPUT -p tcp -m multiport --dports 80,443 -m set --match-set runet src -j DROP
exit 0
А также "/etc/init.d/runetblock":
#! /bin/bash
### BEGIN INIT INFO
# Provides: iptables-runetblock
# Required-Start: mountkernfs $local_fs
# Required-Stop: mountkernfs $local_fs
# X-Start-Before: networking
# X-Stop-After: networking
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Iptables runet block
# Description: Debian init script for iptables
### END INIT INFO. /lib/lsb/init-functions
function do_start {
/etc/cron.daily/runetblock
log_end_msg $?
}function do_stop {
log_end_msg $?
exit 0
}case "$1" in
start)
do_start
;;
stop)
do_stop
;;
restart)
do_stop
do_start
;;
*)
echo "Usage: /etc/init.d/runetblock {start|stop|restart}"
exit 1
;;
esacexit 0
Настроим автозапуск:
update-rc.d runetblock defaults
Произведем первый запуск вручную:
/etc/init.d/runetblock start
В результате всего лишь одной строкой в правилах iptables мы заблокировали весь трафик, адресованный серверу HTTP с российских IP-адресов, с автоматическим обновлением раз в сутки.
0 Комментарии。