Назад | Перейти на главную страницу

Ошибки тюрьмы и не запускается

Я создал тюрьму и действие в попытке отловить «DDoS-атаки», однако в файлах журнала отображаются ошибки для этой тюрьмы всякий раз, когда я перезапускаю Fail2Ban. Тюрьма и фильтр кажутся довольно простыми и воспроизводятся в нескольких блогах, но для сравнения я использовал Вот.

Это тюрьма:

[http-get-dos]
enabled = true
filter = http-get-dos
action =  iptables[name=Http-Get-Dos, port="http,https"]
logpath = %(apache_access_log)s
maxretry = 300
findtime = 300
bantime = 300

а это фильтр:

# Fail2Ban configuration file
#
[Definition]

# Option: failregex
# Note: This regex will match any GET entry in your logs
# You should set up in the jail.conf file, the maxretry and findtime carefully

failregex = ^<HOST> -.*"(GET|POST).*

# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#

Все это выглядит просто, но по какой-то причине, если я перезапускаю службу после включения этой тюрьмы, я вижу следующие ошибки в журнале Fail2ban:

2017-11-04 12:48:13,296 fail2ban.jail           [1460]: INFO    Creating new jail 'http-get-dos'
2017-11-04 12:48:13,298 fail2ban.jail           [1460]: INFO    Jail 'http-get-dos' uses poller
2017-11-04 12:48:13,300 fail2ban.filter         [1460]: INFO    Set jail log file encoding to UTF-8
2017-11-04 12:48:13,300 fail2ban.jail           [1460]: INFO    Initiated 'polling' backend
2017-11-04 12:48:13,303 fail2ban.actions        [1460]: INFO    Set banTime = 300
2017-11-04 12:48:13,304 fail2ban.filter         [1460]: INFO    Set findtime = 300
2017-11-04 12:48:13,306 fail2ban.filter         [1460]: INFO    Added logfile = /var/log/apache2/access.log
2017-11-04 12:48:13,308 fail2ban.filter         [1460]: INFO    Added logfile = /var/log/apache2/other_vhosts_access.log
2017-11-04 12:48:13,309 fail2ban.filter         [1460]: INFO    Set jail log file encoding to UTF-8
2017-11-04 12:48:13,310 fail2ban.filter         [1460]: INFO    Set maxRetry = 300

2017-11-04 12:48:14,411 fail2ban.action         [1460]: ERROR   iptables -w -N f2b-Http-Get-Dos
iptables -w -A f2b-Http-Get-Dos -j RETURN
iptables -w -I INPUT -p tcp --dport http,https -j f2b-Http-Get-Dos -- stdout: b''
2017-11-04 12:48:14,441 fail2ban.action         [1460]: ERROR   iptables -w -N f2b-Http-Get-Dos
iptables -w -A f2b-Http-Get-Dos -j RETURN
iptables -w -I INPUT -p tcp --dport http,https -j f2b-Http-Get-Dos -- stderr: b"iptables v1.6.0: invalid port/service `http,https' specified\nTry `iptables -h' or 'iptables --help' for more information.\n"
2017-11-04 12:48:14,458 fail2ban.action         [1460]: ERROR   iptables -w -N f2b-Http-Get-Dos
iptables -w -A f2b-Http-Get-Dos -j RETURN
iptables -w -I INPUT -p tcp --dport http,https -j f2b-Http-Get-Dos -- returned 2
2017-11-04 12:48:14,463 fail2ban.actions        [1460]: ERROR   Failed to start jail 'http-get-dos' action 'iptables': Error starting action
2017-11-04 12:48:20,150 fail2ban.jail           [1460]: INFO    Jail 'http-get-dos' started

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

Есть идеи, как я могу решить эту проблему, чтобы тюрьма работала правильно?

У меня недостаточно репутации, чтобы комментировать, поэтому я опубликую здесь ответ.

Похоже, эта строка:

action = iptables[name=Http-Get-Dos, port="http,https"]

передает переменные в iptables, и в результате port="http,https" вы указываете два порта назначения в одном правиле iptables. Я не смог найти какой-либо конкретной документации по этому поводу, но мне это кажется неправильным - я думаю, что это причина проблемы.

Я думаю, что для HTTP и HTTPS должны быть отдельные действия.

РЕДАКТИРОВАТЬ: Я нашел несколько записей в Google, которые используют port = "http, https", и они указывают iptables-multiport вместо iptables. Действие iptables-multiport, похоже, запускает iptables с --match multiport (описал Вот), позволяя указать более одного порта за раз (см. этот вопрос о сбое сервера). Поэтому я думаю, что другим решением будет использование действия iptables-multiport.