№ 11772 В разделе
Sysadmin
от June 30th, 2022,
В подшивках: Linux, Nginx
Допустим, вы хотите ввести ответных санкций против свободного и демократичного мира, но не против всех, т.к. далеко не все там свободные и демократичные. Например, Телеграм.
Первым что нужно сделать это установить базу данных GeoIP. Как это сделать любой сисадмин в курсе, здесь это писать не нужно. Также хотелось бы сделать отдельный лог файл для всех заблокированных запросов.
Заранее добавим в nginx.conf описание формата лог файла. Я его предпочитаю держать в формате CSV для более легкого парсинга.
log_format csv '"$server_name","$remote_addr","$time_iso8601","$status","$request","$request_time","$upstream_response_time","$http_user_agent","$http_referer","$geoip_country_code3"';
Создаем 2 файла, в первом описываем правила и исключения, второй будем инклудить в секции server.
Назовем первый файл /etc/nginx/geoip.conf и заинклудим его в секцию http. В нем лежат мапы и исключения.
# тут и так все понятно, сами разберетесь geoip_country /usr/share/GeoIP/GeoIP.dat; geo $ex { default 0; 149.154.160.0/22 1; #telegram 95.217.176.215 1; #кто-то еще } map $geoip_country_code3 $allowed_country { default yes; EUE no; JPN no; USA no; UKR no; CAN no; GBR no; TUR no; ISL no; GRL no; DEU no; POL no; FRA no; EST no; BGR no; AUT no; AUS no; CZE no; DNK no; FIN no; HRV no; HUN no; ITA no; LTU no; LVA no; NLD no; ROU no; SVN no; UMI no; VGB no; VIR no; XKX no; CYP no; FLK no; CYM no; SHN no; AZE no; KOR no; } # мапаем ошибку 410 так, чтобы переменной geolog передалось значение. map $status $geolog { 410 1; default 0; } # здесь собираем лог файл, если переменная geolog получила значение. access_log /var/log/nginx/geoblock.log csv if=$geolog; # ошибка 410 передается когда условия блокировки выполнены и сразу же посетителя отправляем смотреть на банан. error_page 410 http://7829.selcdn.ru/page-errors/geo.html;
Второй файл geoip_check.conf размещается рядом, он будет инклудиться уже в секции server
# чисто для удобства отладки, не обязательно add_header X-GEO $geoip_country_code3 always; # а вот и проверочки. Если IP оказался в списках исключений мы сразу же ставим # allowed_country в yes и пропускаем запрос дальше в обход второй проверки. # В противном случае будет выполнена вторая проверка, которая уже выдаст ошибку 410. if ($ex = 1) { set $allowed_country yes; } if ($allowed_country = no) { return 410; }
Да вот собственно и вся хитрость. Многие поисковики (например, bing) сканят только из штатов, сайт может быть понижен или удален в их выдаче. Но наши яндексы и другие отличненько работают. Даже гугол пробивается сквозь эти блокировки.
Fortune cookie: Today's spam: Cure impotence , by improving those weak erections.
Leave a Reply