Как реализовать такую блокировку в Nginx?

12
D
На сайте с 28.06.2008
Offline
976
1973

По нужным мне критериям я собираю в таблицу айпи ботов, теперь хочу блокировать тех ботов которых находит такой запрос

SELECT ip_start FROM `xyfq1_blacklist_items` WHERE `c` > 50 ORDER BY `c` DESC

но проблема в том, что кодер сделавший это решение - решил записывать IP в базу в десятичном формате.

В результате я по запросу выше получаю вот что

ip_start
2959342749
3275804920
1381037115
775271378
3118050064
3642140770
1307169886
3119219212
3279977642

подскажите плиз как имея эти данные добавить в конфиг Nginx подключаемый файл, куда бы добавлялись эти IP в понятном для Nginx формате?

Я так понимаю нужно в конфиг добавить например

include blockip.conf; #Drop IP

в котором уже и будут перечислены IP, например так

deny 192.168.0.1;

Теперь вопрос - что нужно написать в bash скрипте чтобы все это реализовать?

J
На сайте с 20.02.2014
Offline
94
jkm
#1

Если средствами PHP, то http://php.net/manual/ru/function.long2ip.php

Или средствами MySQL INET_NTOA().

J
На сайте с 20.02.2014
Offline
94
jkm
#2

SELECT CONCAT('deny  ', INET_NTOA(ip_start), ';') FROM `xyfq1_blacklist_items` WHERE `c` > 50 ORDER BY `c` DESC 

Ну и bash скрипт примерно такой:

#!/bin/bash

user=user
pass=xxxxx
mydb=dbname

query="SELECT CONCAT('deny ', INET_NTOA(ip_start), ';') FROM \`xyfq1_blacklist_items\` WHERE \`c\` > 50 ORDER BY \`c\` DESC "

mysql --skip-column-names --user="$user" --password="$pass" --database="$mydb" --execute="$query" > blockip.conf
D
На сайте с 28.06.2008
Offline
976
#3

jkm, спаисбо большое! А я тут подумал... а нужно ли делать релоад Nginx после каждой новой записи ?

Можно так?

#!/bin/bash
query="SELECT CONCAT('deny ', INET_NTOA(ip_start), ';') FROM \`xyfq1_blacklist_items\` WHERE \`c\` > 20 ORDER BY \`c\` DESC "
mysql --skip-column-names --user="root" --password="Пароль" --database="База2" --execute="$query" > /etc/nginx/sites-conf/blockip.conf;
var='/etc/init.d/nginx reload';

но мне выдает

blockip.sh: line 3: $'\r': command not found
J
На сайте с 20.02.2014
Offline
94
jkm
#4
Dram:
но мне выдает
blockip.sh: line 3: $'\r': command not found

В Window конец строки это последовательность из двух символов \r\n, а в Unix конец строки только один символ \n.

D
На сайте с 28.06.2008
Offline
976
#5

Записал в одну строку, ошибок нет, но и релоад Nginx не работает. Может я его не так записал?

...... ery" > /etc/nginx/sites-conf/blockip.conf;var="/etc/init.d/ngi ..................
J
На сайте с 20.02.2014
Offline
94
jkm
#6

Просто удалить \r

tr -d '\r' < blockip.sh > blockip_fix.sh
D
На сайте с 28.06.2008
Offline
976
#7

jkm, спасибо большое за помощь. Опять разнес по разным строкам, сделал ваш запрос.

Ошибки пропали - но и релоад Nginx не работает. Я его как-то не так прописал?

P.S. посмотрел файл - ваш запрос объединил две последние строки..... Ну да, я это уже догнал попробовать...

J
На сайте с 20.02.2014
Offline
94
jkm
#8
Dram:
var='/etc/init.d/nginx reload';

Там нужно не кавычки, а обратные апострофы

var=`/etc/init.d/nginx reload`; 
D
На сайте с 28.06.2008
Offline
976
#9

все разобрался - там вообще не нужно var

прописал так

....ites-conf/blockip.conf;/etc/init.d/nginx reload

и все заработало!!!

Спасибо!

D
На сайте с 28.06.2008
Offline
976
#10

А можно еще вопрос?

Я попробовал добавить еще запросы, но запрос query2, пишет в файл blockip.conf поверх инфы запроса query

Как правильно объединить запросы?


#!/bin/bash
query="SELECT CONCAT('deny ', INET_NTOA(ip_start), ';') FROM \`blacklist_items\` WHERE \`c\` > 20 ORDER BY \`c\` DESC ";
query2="SELECT CONCAT('deny ', INET_NTOA(ip_start), ';') FROM \`blacklist_items\` WHERE \`a\` > 30 ORDER BY \`a\` DESC ";
mysql --skip-column-names --user="root" --password="PASSWORD" --database="NAME" --execute="$query" > /etc/nginx/sites-conf/blockip.conf;
mysql --skip-column-names --user="root" --password="PASSWORD" --database="NAME" --execute="$query2" > /etc/nginx/sites-conf/blockip.conf;
/etc/init.d/nginx reload


12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий