Перейти к содержимому

Блокировка доступа к web серверу по странам с помощью IPSet и iptables

Нужно было срочно сделать блокировку по странам для одного проекта, мне было лень собирать nginx c nginx-module-geoip2 и я не чего лучше не придумал чем сделать блокировку через ipset.

Установка IPSet

Для установки IPSet особо ничего не требуется. Ставим просто из репозитория.

yum install -y ipset ipset-service

Запускаем и добавляем в автозагрузку

systemctl daemon-reload
systemctl start ipset
systemctl enable ipset

Скачиваем файлы тех стран, что нас интересуют и сразу объединяем в единый файл/список.

Доступ сейчас заблокирован из России я скачивал через vpn в штатах.

cd /opt/scripts
wget -O netwhite http://www.ipdeny.com/ipblocks/data/countries/{ru,by}.zone 

Через запятую можно добавлять станы {ru,by,kz,by,uz,kg,am,az,tj}

Теперь ip адреса из файла netwhite

ipset restore < /opt/scripts/netwhite

Добавляем правила iptables с ключом —match-set whitelist:

iptables -A INPUT -i <имя интерфейса> -p tcp --dport 80 -m set --match-set whitelist src -j ACCEPT
iptables -A INPUT -i <имя интерфейса> -p tcp --dport 443 -m set --match-set whitelist src -j ACCEPT

Смотрим что получилось в правилах командой:

iptables -L INPUT -v -n | grep whitelist

А можно это все не делать и просто запустить скрипт.

mcedit /opt/scripts/ipset.sh

И добавляем следующее содержимое:

#!/bin/bash

# Скачиваем список тех стран, что нас интересуют и сразу объединяем в единый файл
# Доступ заблокирован из России закачал через vpn usa
# Через запятую можно добавлять станы ru,by,...
# cd /opt/scripts
# wget -O netwhite http://www.ipdeny.com/ipblocks/data/countries/{ru,by}.zone 

# Путь до файла
NETWHITE_FILE="/opt/scripts/netwhite"
# Имя листа для IPSet
IPSET_NAME="whitelist"

# Проверка установки ipset, ipset-service и iptables-service.
if ! command -v ipset &> /dev/null
then
    # если нет ставим
    yum install -y ipset
fi

if ! rpm -q ipset-service &> /dev/null
then
    # если нет ставим
    yum install -y ipset-service
fi

if ! rpm -q iptables-services &> /dev/null
then
    # если нет ставим :)
    yum install -y iptables-services
fi

# Добавляем IP из файла /opt/scripts/netwhite.
while read ip; do
  ipset add $IPSET_NAME $ip
done < $NETWHITE_FILE

# Добавляем/Заменяем правила в iptables для итересующих нас портов например: 80,443
# скрипт находиться в директории /opt/scripts/iptables.sh
# $IPT -A INPUT -i $WAN -p tcp --dport 80 -m set --match-set whitelist src -j ACCEPT
# $IPT -A INPUT -i $WAN -p tcp --dport 443 -m set --match-set whitelist src -j ACCEPT

# Скрипт делал для Centos 7 и версии ipset:
# ipset -v
# ipset v7.1, protocol version: 7

# Проверить цепочку входящих
# iptables -L INPUT -v -n | grep whitelist

# Удалить старые списки
# ipset -X whitelist

Делаем файл исполняемым:

chmod +x /opt/scripts/ipset.sh