Добрый день, решил написать заметку про ipfw geo фильтрация трафика на сервере FreeBSD.
Заказчик для своего сервера пожелал доступ только из России и Испании.
Вот что получилось.
Файрвол у меня ipfw.
Качаем архив с сетями по странам.
wget http://www.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
Распаковываем.
unzip GeoIPCountryCSV.zip
нам нужен файл GeoIPCountryWhois.csv
Он такого содержимого.
$ egrep 'Spain|Russia' GeoIPCountryWhois.csv | tail -n 20 "217.182.235.0","217.182.235.63","3652643584","3652643647","ES","Spain" "217.182.237.104","217.182.237.119","3652644200","3652644215","ES","Spain" "217.182.237.152","217.182.237.159","3652644248","3652644255","ES","Spain" "217.182.244.128","217.182.244.191","3652646016","3652646079","ES","Spain" "217.182.247.0","217.182.247.63","3652646656","3652646719","ES","Spain" "217.194.240.0","217.194.255.255","3653431296","3653435391","RU","Russian Federation" "217.195.64.0","217.195.111.255","3653451776","3653464063","RU","Russian Federation" "217.195.208.0","217.195.223.255","3653488640","3653492735","RU","Russian Federation" "217.196.96.0","217.196.111.255","3653525504","3653529599","RU","Russian Federation" "217.197.0.0","217.197.15.255","3653566464","3653570559","RU","Russian Federation" "217.197.16.0","217.197.31.255","3653570560","3653574655","ES","Spain" "217.197.112.0","217.197.127.255","3653595136","3653599231","RU","Russian Federation" "217.197.192.0","217.197.207.255","3653615616","3653619711","RU","Russian Federation" "217.197.224.0","217.198.15.255","3653623808","3653636095","RU","Russian Federation" "217.198.80.0","217.198.95.255","3653652480","3653656575","RU","Russian Federation" "217.198.160.0","217.198.191.255","3653672960","3653681151","RU","Russian Federation" "217.198.192.0","217.198.207.255","3653681152","3653685247","ES","Spain" "217.199.208.0","217.199.223.255","3653750784","3653754879","RU","Russian Federation" "217.199.240.0","217.199.255.255","3653758976","3653763071","RU","Russian Federation" "217.216.0.0","217.217.255.255","3654811648","3654942719","ES","Spain"
Первым делом я вытянул нужную информацию из файла.
awk ‘BEGIN{FS=»,»}{print $1″-«$2}’ — меняем разделитель между ип адресами, запятая мне не понравилась.
sed ‘s/»//g’ — Убираем кавычки
egrep 'Spain|Russia' GeoIPCountryWhois.csv | awk 'BEGIN{FS=","}{print $1"-"$2}' | sed 's/"//g' 217.197.16.0-217.197.31.255 217.197.112.0-217.197.127.255 217.197.192.0-217.197.207.255 217.197.224.0-217.198.15.255 217.198.80.0-217.198.95.255 217.198.160.0-217.198.191.255 217.198.192.0-217.198.207.255 217.199.208.0-217.199.223.255 217.199.240.0-217.199.255.255 217.216.0.0-217.217.255.255
Тут я понимаю, а как же высчитать под сеть у этих диапазонов.
В ручную это монотонно и не к чему, подсказали уже готовый велосипед.
Готовый скрипт по вычислению под сетей находится в архиве вэб сервера nginx.
Скачиваем с официального сайта nginx исходники, распаковываем и смотрим в корневую директорию contrib, там будит файл geo2nginx.pl.
Вот он нам и нужен.
Проверяем.
sed ‘s/\(RU\|ES\);//g’ — Убираем RU; ES;
$ egrep 'Spain|Russia' GeoIPCountryWhois.csv | perl nginx/geo2nginx.pl | sed 's/\(RU\|ES\);//g' 217.197.16.0/20 217.197.112.0/20 217.197.192.0/20 217.197.224.0/19 217.198.0.0/20 217.198.80.0/20 217.198.160.0/19 217.198.192.0/20 217.199.208.0/20 217.199.240.0/20 217.216.0.0/15
Создаем список под сетей.
$ egrep 'Spain|Russia' GeoIPCountryWhois.csv | perl nginx/geo2nginx.pl | sed 's/\(RU\|ES\);//g' > /tmp/geo_ip_RU_ES
Создаем таблицу.
ipfw add allow all from table\(1\) to me
Все остальное блокируем.
Добавляем наш отсортированный список в таблицу файрвола через скрипт.
#!/bin/sh ip=`cat ip.txt` for a in ${ip} do geo_ip=$a /sbin/ipfw table 1 add $geo_ip done exit 0
Вот и все.
Но учтите эти данные меняются и может создаться ситуация когда российский провайдер покупает ip сеть у зарубежного провайдера, а geoip не знает об этом, то есть шанс заблокировать и часть России.
Вот и вся настройка ipfw geo фильтрация трафика у сервера.
Настройка файрвола ipfw в системе FreeBSD
Настройка ipfw.
Pingback: nginx geoip фильтрация | FRYAHA.RU