LINUX.ORG.RU
решено ФорумAdmin

Глобальный geoip и nginx

 , , ,


0

1

Для использования geoip, для каждого виртуального хоста в секциях server нужно прописывать:

server {
...
if ($allowed_country = no) {
   return 444;
}
}

В /etc/nginx/nginx.conf у меня очень много виртуальных хостов, в каждой секции прописывать эти три строчки очень трудоёмко.

Можно ли как-то глобально задать эту команду для всех виртуальных хостов? Или может регулярками как-то добавить?

И ещё вопрос, какие средства защиты есть от брутфорсеров? Пока делаю так:

cat /var/log/nginx/access.log | grep administrator | cut -f1 -d " " | sort | uniq -c | sort -n
...
3520 46.118.124.54
34889 213.60.195.238
Добавляю айпишники в файл вида:
deny ip_addr; allow all;
И инклудю его в секцию http nginx'а. Но опять же, все айпишники добавляю вручную, что затруднительно.

★★★★★

Последнее исправление: Amet13 (всего исправлений: 1)

Для использования geoip, для каждого виртуального хоста в секциях server нужно прописывать

А из секции http разве не работает? Если совсем никак то можно вынести в отдельный файл и делать include, будет вместо трёх строк одна

Но опять же, все айпишники добавляю вручную, что затруднительно.

Кроном же? почти всё, что надо уже готово. Но я в iptables их добавляю, на всякий случай

disarmer ★★★
()
Ответ на: комментарий от disarmer

А из секции http разве не работает?

Нет, не работает.

Amet13 ★★★★★
() автор топика
Ответ на: комментарий от disarmer

Но к каждому виртуальному хосту инклудится этот файл:

# cat /usr/local/ispmgr/etc/nginx.inc
set $mgr_proxy "http://123.123.123.123:1500";
location ^~ /manimg/ {
	alias /usr/local/ispmgr/skins/;
}
location ^~ /manager {
	proxy_pass $mgr_proxy;
	proxy_redirect $mgr_proxy /;
	proxy_set_header Host $host:$server_port;
	proxy_set_header X-Forwarded-For $remote_addr;
	proxy_set_header X-Forwarded-Proto $scheme;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Manager-Path /manager;
	proxy_set_header X-Secret yzyuCICQM8pkQ44eCHghHUry;
	chunked_transfer_encoding off;
}
location ^~ /mancgi/ {
	proxy_pass $mgr_proxy;
	proxy_redirect $mgr_proxy /;
	proxy_set_header Host $host:$server_port;
	proxy_set_header X-Forwarded-For $remote_addr;
	proxy_set_header X-Forwarded-Proto $scheme;
	proxy_set_header X-Real-IP $remote_addr;
	proxy_set_header X-Secret yzyuCICQM84eCHghHUry;
	chunked_transfer_encoding off;
}
Могу ли я просто в этом файле в конце дописать:
if ($allowed_country = no) {
   return 444;
}

Дописал, вроде помогло.

Amet13 ★★★★★
() автор топика
Последнее исправление: Amet13 (всего исправлений: 2)

Пишу скрипт, который по крону будет кидать в бан брутфорсеров админки.

# cat /var/log/nginx/access.log | grep admin | cut -f1 -d " " | sort | uniq -c | sort -n | awk '{ if ($1 > 99) print $2}'
91.224.207.235

188.134.73.194
87.216.167.4
91.200.13.45
66.85.164.86
202.103.141.2
74.208.107.105
Команда выше выводит айпишники, которые более ста раз обращались к administrator/index.php и т.д. В blockips.conf, который инклудится к nginx.conf у меня:
deny 203.217.0.133;
deny 91.211.113.221;
deny 205.134.251.60;
deny 173.252.202.2;
...
allow all;
Каким образом мне записать полученные выше айпишники в файл blockips.conf. Вручную добавлять муторно.

Пробовал:

sed -i 's/allow all;/deny $ip;\nallow all;'
Но команда работает только если на её входе один айпишник, в моём случае их много, каждый в новой строке.

Надеюсь ясно изъяснился. Если не понятно, могу попробовать доступнее пояснить.

Amet13 ★★★★★
() автор топика
Ответ на: комментарий от Amet13

Изменил немного команду:

# cat /var/log/nginx/access.log | grep admin | cut -f1 -d " " | sort | uniq -c | sort -n | awk '{ if ($1 > 99) print $2}'
66.85.164.86
202.103.141.2
74.208.107.105
На:
# cat /var/log/nginx/access.log | grep admin | cut -f1 -d " " | sort | uniq -c | sort -n | awk '{ if ($1 > 99) print $2}'
deny 66.85.164.86;
deny 202.103.141.2;
deny 74.208.107.105;
И последний полученный вариант нужно добавить в blockips.conf перед allow all;

Amet13 ★★★★★
() автор топика
Последнее исправление: Amet13 (всего исправлений: 2)
Ответ на: комментарий от disarmer

Да я уже кое-как с костылями сделал.

#!/bin/bash
command=$(cat /var/log/nginx/access.log | awk '{ if ($1 > 99) print "deny " $2";_"}')
sed -i "s/allow all;/${word}/" /etc/nginx/blockips.conf
IFS='_'
for word in $command; do
   echo $word >> /etc/nginx/blockips.conf
done
echo "allow all;" >> test
sed '/^$/d' test > test.tmp
cat test.tmp > test
rm test.tmp

Amet13 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.