ipfw geo фильтрация трафика

Дата | 31.08.2018

Добрый день.
Заказчик для своего сервера пожелал доступ только из России и Испании.
Вот что получилось.
Файрвол у меня 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 фильтрация трафика

  1. Pingback: nginx geoip фильтрация | FRYAHA.RU

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *