Автоматизация обратного DNS-запроса

12 3
D
На сайте с 28.06.2008
Offline
1101
2486

У меня сильно нашпигованный конфиг Nginx ибо я очень не люблю плохих ботов.

одним из условий в конфиге я собираю в отдельный лог запросы от ботов которые косят юзерагеном под поисковых ботов, но таковыми не являются.

Но так как подсети поисковиков могут измениться хотелось бы настроить автоматическую проверку к примеру топ 10 IP из этого лога.

Прошу вас - помогите написать bash скрипт для автоматизации проверки.

К примеру такой командой

cat /var/log/nginx/access.zakos_pod_good_bot.log | awk '{if ($9=="503") {print $1}}' | sort | uniq -c | sort -nr | head

я получаю такой вывод (слева кол-во запросов, справа IP)


100 95.213.246.202
91 95.213.246.204
61 82.202.205.84
56 82.202.205.82
27 13.66.139.0
11 23.103.64.39
8 46.243.173.199
8 178.57.65.193
7 193.93.195.233
7 178.57.65.103

Далее логику работы я вижу такой - каждый из этих IP проверяем командой Host, например

host 95.213.246.202
Host 202.246.213.95.in-addr.arpa. not found: 3(NXDOMAIN)

и т.д. Куда то записываем эти данные, в лог какой-то. Далее сканируем этот лог на наличие в нем

yandex.ru
google.com

Так как IP ботов яндекса и гугла возвращает

host 37.9.113.197
197.113.9.37.in-addr.arpa domain name pointer 37-9-113-197.spider.yandex.com.

host 66.249.76.57
57.76.249.66.in-addr.arpa domain name pointer crawl-66-249-76-57.googlebot.com.

Если при сканировании лога нашли Яндекс или Гугл - шлем уведомление админу.

---------- Добавлено 31.08.2018 в 21:36 ----------

Начало вроде сам написал :))

#!/bin/bash
cat /var/log/nginx/access.zakos_pod_good_bot.log | awk '{if ($9=="503") {print $1}}' | sort | uniq -c | sort -nr | head > dns.txt

только наверное нужно как-то убрать первую цифру (кол-во запросов), чтобы только IP остался

Lazy Badger
На сайте с 14.06.2017
Offline
231
#1

1. Рекомендации по оптимизации неоптимального в существующем принимаются? Потому как число пайпов в показанном однострочнике можно радикально сократить за счет одного вызова sort

| sort -nru

+ я бы не стал резать head а оставил все IP

2. Если написалось то, что написалось, в awk - какая проблема этот лог так же по-простому прогнать опять через еще один скриптец, который будет вызывать host и процессить полученное (ну или просто print и все пайпить в grep - это по вкусу)?

command | getline [var]
Run command piping the output either into $0 or var

+

print expr-list
Prints expressions. Each expression is separated by the value of the OFS variable. The output record is terminated with the value of the ORS variable.

print expr-list >file
Prints expressions on file. Each expression is separated by the value of the OFS variable. The output record is terminated with the value of the ORS variable.

"Что пробовал?" и "Что не получилось" - стандартный вопрос

Производство жести методом непрерывного отжига
D
На сайте с 28.06.2008
Offline
1101
#2

Сегодняшний лог access.zakos_pod_good_bot.log на данный момент содержит 3413 (!!!) записей.

Я не вижу смысла делать столько запросов, мне бы вполне хватило просканировать топ 10

про sort -nru не понял, попробовал запрос с ним, разницы не увидел.

Яж не кодер и 90% написанного вам не понял :((

---------- Добавлено 31.08.2018 в 22:00 ----------

просто запрос

cat /var/log/nginx/access.zakos_pod_good_bot.log | awk '{if ($9=="503") {print $1}}' | sort -nru

вывел непоятные IP не те что изначатльный запрос сортировал

---------- Добавлено 31.08.2018 в 22:16 ----------

пока остановился на этом


#!/bin/bash
cat /var/log/nginx/access.zakos_pod_good_bot.log | awk '{if ($9=="503") {print $1}}' | sort | uniq -c | sort -nr | head | awk '{print $2}' > dns.txt

как теперь проверять то что записалось в dns.txt ?

D
На сайте с 28.06.2008
Offline
1101
#3

пару часов погуглил и продвинулся еще дальше, вот что имею на данный момент

#!/bin/bash
cat /var/log/nginx/access.zakos_pod_good_bot.log | awk '{if ($9=="503") {print $1}}' | sort | uniq -c | sort -nr | head | awk '{print $2}' > dns.txt
cat dns.txt | while read line
do
host $line >> result.txt
done

в файл result.txt получаю вывод

Host 136.3.216.91.in-addr.arpa. not found: 3(NXDOMAIN)
Host 202.246.213.95.in-addr.arpa. not found: 3(NXDOMAIN)
204.246.213.95.in-addr.arpa domain name pointer angry.io.
Host 0.139.66.13.in-addr.arpa. not found: 3(NXDOMAIN)
Host 84.205.202.82.in-addr.arpa. not found: 3(NXDOMAIN)
82.205.202.82.in-addr.arpa domain name pointer as3.angry.io.
Host 53.3.216.91.in-addr.arpa. not found: 3(NXDOMAIN)
Host 31.183.181.95.in-addr.arpa. not found: 3(NXDOMAIN)
Host 183.90.243.91.in-addr.arpa. not found: 3(NXDOMAIN)
Host 13.90.243.91.in-addr.arpa. not found: 3(NXDOMAIN)
Host 136.3.216.91.in-addr.arpa. not found: 3(NXDOMAIN)

теперь пытаюсь понять как его просканировать на наличие слов yandex и google и если нашло - то отправлять админу уведомление

как то так надо..

egrep -w 'yandex|google' result.txt



---------- Добавлено 01.09.2018 в 10:29 ----------

почти дописал :)))

#!/bin/bash
cat /var/log/nginx/access.zakos_pod_good_bot.log | awk '{if ($9=="503") {print $1}}' | sort | uniq -c | sort -nr | head | awk '{print $2}' > dns.txt
cat dns.txt | while read line
do
host $line >> result.txt
done
FILEPATH=gootbot.log
egrep -w 'yandex|google' result.txt > $FILEPATH
if [ -s $FILEPATH ]
then
mail -s 'Возможно хороший бот' 444@gmail.com < $FILEPATH
fi

Но почему то письмо не приходит :( (я там специально добавил строку с яндексом для проверки, лог gootbot.log создался)

---------- Добавлено 01.09.2018 в 10:58 ----------

Понял на сервере не настроена почта, тут ошибка /var/log/exim4

SMTP error from remote mail server after end of data: 451 4.7.1 Sorry, the service is currently unavailable. Please come back later. 1535788455-L6m2Q984CN-sFVmqsvO
info@site.ru R=dnslookup_relay_to_domains T=remote_smtp defer (-46) H=mx.yandex.net [213.180.193.89]: SMTP error from remote mail server after end of data: 451 4.7.1 Sorry, the service is currently unavailable. Please come back later. 1535788431-W37gQEU4Nr-rp74xrmp
Оптимизайка
На сайте с 11.03.2012
Offline
396
#4

Если не хочется пользоваться специализированным сервисом для защиты от ботов, типа BotGuard, а клепать свое "на коленке", есть модуль для nginx который решает эту задачу:

https://www.nginx.com/resources/wiki/modules/rdns/

⭐ BotGuard (https://botguard.net) ⭐ — защита вашего сайта от вредоносных ботов, воровства контента, клонирования, спама и хакерских атак!
D
На сайте с 28.06.2008
Offline
1101
#5

Если у кого-то из читающих тоже будет проблема с почтой, мне помогло это решение http://blog.asidorov.name/2013/10/gmail-debian-exim4.html

Необходимо запретить exim'у общаться по протоколу IPv6:
# vim /etc/exim4/exim4.conf.template

Над строкой begin acl необходимо добавить такую запись:
disable_ipv6 = true

И все, перезагружаем почтовый сервер:
# service exim4 restart

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

...
cp /dev/null result.txt
cat dns.txt | while read line
do
host $line >> result.txt
done
...
unixadm
На сайте с 24.09.2010
Offline
110
#6
Dram:
Если у кого-то из читающих тоже будет проблема с почтой, мне помогло это решение http://blog.asidorov.name/2013/10/gmail-debian-exim4.html

Если ошибка была именно такая как по ссылке, значит у Вас на сервере включен и работает IPv6. В таком случае лучше попросить хостера прописать для v6-адреса реверсное имя в DNS и почтовый сервер будет работать одновременно по двум протоколам.

Host4Biz: NVMe Хостинг в Европе ( https://host4.biz/ru/hosting/shared-hosting ) | Windows/Linux NVMe VPS в Европе ( https://host4.biz/ru/vps ) | Выделенные серверы в Европе, США и Азии ( https://host4.biz/ru/servers/dedicated )
suffix
На сайте с 26.08.2010
Offline
325
#7
unixadm:
Если ошибка была именно такая как по ссылке, значит у Вас на сервере включен и работает IPv6. В таком случае лучше попросить хостера прописать для v6-адреса реверсное имя в DNS и почтовый сервер будет работать одновременно по двум протоколам.

И затем почтовый сервер будет атакован по ipv6 тысячами в час коннектами нехороших людей а fail2ban стабильной версии ipv6 банить не умеет.

Клуб любителей хрюш (https://www.babai.ru)
D
На сайте с 28.06.2008
Offline
1101
#8

Возможно кому-то будет полезно.

Это улов всего 1 дня.

1000 IP которые использовали юзер агенты поисковых ботов, сканировали страницы не загружая стили и картинки, но поисковыми ботами не являются.

P.S. среди этих говноботов нашелся всего 1 нормальный (его я убрал из списка) бот майл ру.

txt dns.txt
baas
На сайте с 17.09.2012
Offline
161
#9
Dram:
Возможно кому-то будет полезно.
Это улов всего 1 дня.
1000 IP которые использовали юзер агенты поисковых ботов, сканировали страницы не загружая стили и картинки, но поисковыми ботами не являются.

P.S. среди этих говноботов нашелся всего 1 нормальный (его я убрал из списка) бот майл ру.

Не хотите написать понятную инструкцию по этому поводу?

Какие скрипты были использованы, какие настройки, выборки и т.д.

Настройка BSD систем. (https://www.fryaha.ru) Знание сила, незнание Рабочая сила!
D
На сайте с 28.06.2008
Offline
1101
#10

baas, дык все выше написано

12 3

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