Пост
Hello :)

Linux

-

GeoIP + Nginx, создаём фильтрацию стран

 

Недавно, месяца 2 назад, возник вопрос на уровне чего, фильтровать трафик, было два решения: 

 

1. GEOIP + Apache

2. GEOIP + NGINX

 

Выбрал NGINX, чтобы не заморачиваться написал небольшой скрипт на баше:

 

cd /etc/nginx   // (переходим в папку никса)
killall nginx     //(насильно убиваем все процессы никса)
wget http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip //(скачиваем базу в CSV формате)
unzip GeoIPCountryCSV.zip   //(распаковываем)
rm GeoIPCountryCSV.zip    //(удаляем архив)
perl geo2nginx.pl <GeoIPCountryWhois.csv> geo.conf //(конвертируем в вид понятных для никса) geo2nginx.pl  найдёте чуть ниже.
rm GeoIPCountryWhois.csv //(Удаляем, так, как  уже не нужен)

 

Открываем конфиг nginx.conf, ищем:

 

http {

 

Заменяем на: 

 

 http {

 

geo $geo {

include geo.conf;

default XX;

}

 

Теперь, смело можем запрещать не нужные страны (делается в разделе-server):

 

server {

if ($geo = US)
{
return 403;
}

...
}

 

Ещё, можно передавать двухсимвольное название страны, через заголовки, и на уровне PHP уже контролировать:

 

proxy_set_header X-Country $geo;


#!/usr/bin/perl -w
 
use warnings;
use strict;
 
while( ){
if (/"[^"]+","[^"]+","([^"]+)","([^"]+)","([^"]+)"/){
print_subnets($1, $2, $3);
}
}
 
sub print_subnets {
my ($a1, $a2, $c) = @_;
my $l;
while ($a1 <= $a2) {
for ($l = 0; ($a1 & (1 << $l)) == 0 && ($a1 + ((1 << ($l + 1)) - 1)) <= $a2; $l++){};
print long2ip($a1) . "/" . (32 - $l) . " " . $c . ";n";
$a1 += (1 << $l);
}
}
 
sub long2ip {
my $ip = shift;
 
my $str = 0;
 
$str = ($ip & 255);
 
$ip >>= 8;
$str = ($ip & 255).".$str";
 
$ip >>= 8;
$str = ($ip & 255).".$str";
 
$ip >>= 8;
$str = ($ip & 255).".$str";
}
  • Serj, 15 ноября 2011
0 комментариев
Avatar

© SERJ.WS 2011-2021