Kaptain.
Telegram /
LinkedIn /
Email /
GIT /
RSS /
GPG /
Заказ печатных плат

№ 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: He was the sort of person whose personality would be greatly improved by a terminal illness.
Leave a Reply