LINUX.ORG.RU
ФорумAdmin

fail2ban не резолвить домен

 , ,


0

2

Есть задача парсить лог в риалтайме и выдергивать из строк попадающие под правило домен. Решил сделать это fail2ban'ом. Настроил правило, все хорошо парсит, но домен резолвится в ip. Может кто знает как его отучить это делать. Заранее благодарен.


Ответ на: комментарий от true_admin

По большому счету, мне надо не IP адрес, а имя домена выдергивать, а оно автоматом в ip адрес резолвится, что меня не устраивает. Параметра use_dns сейчас нет, есть usedns, но он лишь позволяет писать или не писать оповещения в лог, что прилетело доменное имя.

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

Я что-то сам уже запутался. У меня на одном ip висит сто доменов. Порой к некоторым из них проявляется повышенная активность и надо заблокировать этот домен. Я предполагал, что fail2ban регулярками ищет и выдергивает нужный фрагмент из лога, в частности домен к которому идет обращение. Далее настраиваю action на добавление этого домена в бан лист для nginx'а. Но в итоге fail2ban отдает все равно ip адрес и банятся все домены которые находятся на нем.

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

А, я думал ты fail2ban натравливаешь на ssh. Тебе нужно сайты («хосты») на _сервере_ блочить? Т.е., ты хочешь отключать сайты которые создают большую нагрузку?

бан лист для nginx'а

Как это реализовано? Покажи кусок конфига.

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

Да. в мапе инклудится файл с домен ключ.

map $host $api_deny {
        default 0;
        include /etc/nginx/map/banlist.conf
}
[\code]

ну и потом где надо вставляется.


if ( $api_deny = 1 ) {
    return 403;
}
[\code]
xkrekx
() автор топика
Ответ на: комментарий от true_admin

jail.conf

[nginx_429]

enabled = true
filter  = nginx_429
logpath = /var/log/nginx/global.access.log
action  = nginx_429
use_dns  = no
#bantime = 600
#findtime = 600
maxretry = 1

filter.conf

[Definition]

failregex = ^{.*"host": "<HOST>".*"status": 429,.*}$

action.conf

actionban = IP=<ip> &&
            printf %%b "$IP <daemon_list>\n" >> <file>

actionunban = echo "/^<ip> <daemon_list>$/<br>d<br>w<br>q" | ed <file>

[Init]

file = /tmp/ngx429.tmp

daemon_list = 1;

Вот там где <HOST> в логе идет домен к которому обращаются, но fail2ban в файл пишет IP домена.

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

А покажи одну строчку из лога на которую должен срабатывать fail2ban. Я сравню с регекспом. Хостнейм и айпишники можешь подставить фэйковые.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin
{"remote_addr": "192.168.1.7","request_time": "0.487","host": "123.qwe.yan.saas","time_local": "23/Sep/2015:16:22:12 +0000","request": "GET /private/api/v2 HTTP/1.1","status": 429,"body_bytes_sent": 4614,"http_referer": "-","http_user_agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36","http_x_forwarded_for": "-","upstream_name": "upstream_account","upstream_addr": "127.2.0.2:9000","upstream_status": "200"}

парсит он нормально. в логе fail2ban

2015-09-23 16:22:13,514 fail2ban.filter         [3412]: WARNING Determined IP using DNS Lookup: 123.qwe.yan.saas = ['0.0.0.17']
2015-09-23 16:22:13,515 fail2ban.filter         [3412]: INFO    [nginx_429] Found 0.0.0.17
2015-09-23 16:22:14,255 fail2ban.actions        [3412]: NOTICE  [nginx_429] 0.0.0.17 already banned
xkrekx
() автор топика
Ответ на: комментарий от xkrekx

Я посмотрел исходники fail2ban, мои самые худшие опасение подтвердились. Это песец :( Если есть желание возиться то ты можешь модифицировать filter.py чтобы usedns = no не резолвил. Но это выставляется глобально.

Вот proof of concept, я не проверял работоспособность:

diff --git a/fail2ban/server/filter.py b/fail2ban/server/filter.py
index e2da5e7..1b4cb0e 100644
--- a/fail2ban/server/filter.py
+++ b/fail2ban/server/filter.py
@@ -845,6 +845,8 @@ class DNSUtils:
                        if ip and useDns == "warn":
                                logSys.warning("Determined IP using DNS Lookup: %s = %s",
                                        text, ipList)
+               elif useDns == "no":
+                       ipList = [text]
 
                return ipList
        textToIp = staticmethod(textToIp)

Рекомендую создать отдельный пакет с другим именем чтобы при обновлении ОС убунта/debian/whatever не затёрла твои изменения.

Возможно, стоит поискать альтернативу fail2ban.

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

Да, так и подозревал. Завтра посмотрю что там в исходниках и проверю твою правку. Отпишусь по результатам. Спасибо.

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

С этой правкой, если ставишь в конфиге usedns = no , то вообще ничего не добавляет в бан. Может кто посоветует альтернативные методы?

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

Да тут тривиальная проблема. Просто у меня нет рабочего fail2ban чтобы проверить..

Вот так должно сработать:

diff --git a/fail2ban/server/filter.py b/fail2ban/server/filter.py
index e2da5e7..fae3665 100644
--- a/fail2ban/server/filter.py
+++ b/fail2ban/server/filter.py
@@ -838,7 +838,9 @@ class DNSUtils:
                                ipList.append(plainIPStr)
 
                # If we are allowed to resolve -- give it a try if nothing was found
-               if useDns in ("yes", "warn") and not ipList:
+               if useDns == "no":
+                       ipList = [text]
+               elif useDns in ("yes", "warn") and not ipList:
                        # Try to get IP from possible DNS
                        ip = DNSUtils.dnsToIp(text)
                        ipList.extend(ip)
@@ -846,6 +848,7 @@ class DNSUtils:
                                logSys.warning("Determined IP using DNS Lookup: %s = %s",
                                        text, ipList)
 
+               logSys.error("I am a couch potato and %s, %s, %s" % (text, useDns, ipList))
                return ipList
        textToIp = staticmethod(textToIp)

Если не сработает то скажи хоть что в лог пишет.

Хотя, чем больше я читаю этот говнокод тем более близок к мысли что твою проблему тупо решит скрипт < 50 строчек. Реально, такому коду не место в продакшене.

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