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

Поэтому я взял вашу шестнадцатеричную строку и распечатал ее в байтах, но поменял NUL на <пространства> (в основном потому, что не могу понять, как получить NUL в шаблоне grep):

time \
    (  set      x58 x5e x20 x20 xfe x5a x1e xda \
                x48 x20 x20 x20 x0d x20 x03 x20 \
                x07 x20 x20 x20 xcd x01 x20 x20
        export  grep="$(shift;IFS=\\;printf "\\$*")"    \
                tr='\0\1\3\a\r\36HXZ^\315\332\376'      \
                LC_ALL=C i=0
        while [ "$((i+=1))" -lt 1000 ]
        do    cat 0002.raw; done     |
        tr -cd "$tr" |tr 'X\0' '\n ' |
        cut -c-23    |grep -xFc "$grep"
    )

Переменная tr там состоит из восьмеричных escapes/ASCII chars для значений байтов вашей шестнадцатеричной строки, потому что я хотел tr, чтобы -d-выбросить ее дополнение. Затем я убедился, что самая длинная строка grep могла бы попытаться сравниться с -c-23 байтами с - cut, и что строка всегда будет возглавлять строку с помощью tr-ответа X символов на \n-wwlines, одновременно меняя NUL на <пробелы>.

Здесь я cating сырой двоичный файл на трубопроводе 999 раз. Так как в файле есть 10 совпадений, результаты:

9990
1.06s user 0.94s system 65% cpu 3.054 total

Теперь я также протестировал...

time \
    (  set      x58 x5e x20 x20 xfe x5a x1e xda \
                x48 x20 x20 x20 x0d x20 x03 x20 \
                x07 x20 x20 x20 xcd x01 x20 x20
        export  LC_ALL=C i=0 grep="$(IFS=\\;printf "\\$*")"
        while [ "$((i+=1))" -lt 1000 ]
        do    cat 0002.raw;  done    |
        tr '\0 ' ' \0'   |
        grep -aFo "$grep"| wc -l
    )

Я использую wc -l там, но в моих тестах не было никакой разницы во времени выполнения, чтобы использовать -caFo и сбросить wc вообще. В любом случае, подсчеты были одинаковы. Результаты для этого:

9990
1.56s user 1.46s system 82% cpu 3.648 total

Теперь эти два набора команд не эквивалентны. Хотя, похоже, что сначала нужно выжать ненужные байты w/ tr, но пока вы можете получить счет, вы не можете получить смещения, как вы могли бы получить, добавив переключатель -b в grep во втором примере....

time \
   (    set     x58 x5e x20 x20 xfe x5a x1e xda \
                x48 x20 x20 x20 x0d x20 x03 x20 \
                x07 x20 x20 x20 xcd x01 x20 x20
        export  LC_ALL=C i=0 grep="$(IFS=\\;printf "\\$*")"
        while [ "$((i+=1))" -lt 1000 ]
        do    cat 0002.raw;  done    |
        tr '\0 ' ' \0'     |
        grep -baFo "$grep" | sed -n l
   )

...

241133568:X^  \376Z\036\332H   \r \003 \a   \315\001  $
241157720:X^  \376Z\036\332H   \r \003 \a   \315\001  $
241181872:X^  \376Z\036\332H   \r \003 \a   \315\001  $
241206024:X^  \376Z\036\332H   \r \003 \a   \315\001  $
241230176:X^  \376Z\036\332H   \r \003 \a   \315\001  $
241254328:X^  \376Z\036\332H   \r \003 \a   \315\001  $

1.59s user 1.41s system 85% cpu 3.496 total

И то, что вы выберете, наверное, будет зависеть от того, чего вы хотите. Для подсчета, вероятно, -cd будет лучше - он надежно выполняется на полсекунды быстрее, чем другой каждый раз - но он не настолько универсален, и поэтому, возможно, если ваш grep будет его поддерживать, то grep -baFo может быть тем, что вам нужно вместо него.

5
31.12.2017, 23:54
1 ответ

Вот как я это сделал..

Я добавил это в jail.local:

[manban]
enabled  = true
filter   = manban
action   = iptables[name=HTTP, port="80,443,110,995,25,465,143,585,993,587,21,22", protocol=tcp]
logpath  = /var/log/manban.log
maxretry = 1
# 1 month
bantime  = 2592000
findtime = 3600

Затем я добавил файл /etc/fail2ban/filter.d/manban.conf:

[Definition]
failregex = ^\[\w{1,3}.\w{1,3}.\d{1,2}.\d{1,2}:\d{1,2}:\d{1,2} \d{1,4}. \[error] \[client.<HOST>].File does not exist:.{1,40}roundcube.{1,200}
ignoreregex =

Я скопировал протокол фильтра другого фильтра, но указал его на несуществующий файл, после чего создал фиктивный файл:

touch /var/log/manban.log

, затем выполните команду:

fail2ban-client reload

Теперь, чтобы вручную заблокировать IP-адрес на один месяц, введите:

fail2ban-client set manban banip <IP>

Это помогло.

Теперь есть клиенты, которые «узнают» ваше время блокировки fail2ban и будут автоматически настраивать свои системные проверки, чтобы не получить бан. Но когда вы смотрите на журналы, становится очевидным, что это системные зонды. Вы можете испортить их системы, создав необычайно долгое время бана. Вы также можете написать скрипт, который мог бы сбрасывать IP-адреса, соответствующие определенным критериям, в ваш специальный журнал банов, и fail2ban блокировал бы их на длительный период времени.

7
27.01.2020, 20:38

Теги

Похожие вопросы