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";
}