☛ 简介

Fail2ban 是一套以 Python 语言所撰写的 GPLv2 授权软件,藉由分析系统纪录文件,并透过设定过滤条件 (filter) 及动作 (action),当符合我们所设定的过滤条件时,将触发相对动作来达到自动化反应的效果 (如封锁来源 IP、寄信通知管理者、查询来源 IP 信息等)。 因其架构相当弹性,我们可以针对自己的需求,设计不同的过滤条件与动作来达到服务器防护的功能,或是及时的反应某些异常信息。 常见应用有:

① 阻挡 SSH、FTP 多次尝试错误连线。

② 阻挡特定的浏览器或网络爬虫。

③ 提供管理者了解異常伺服器服務要求 ( 如 apache、bind、postfix、vsftpd、proftpd… )。

☛ 安装

须安装 epel 的软体套件:

[root@localhost ~ ]# yum install epel-release

再安装 Fail2Ban :

[root@localhost ~ ]# yum install fail2ban

☛ 设定

使用 gedit 编辑器建立 /etc/fail2ban/jail.local 文件,来自订 fail2ban 设置,设置内容如下:

[DEFAULT]
# 禁止時間 (秒)
bantime  = 86400
# 禁止方式
banaction = iptables-multiport

# 要監聽的服務
[postfix-sasl]
enabled = true

[dovecot]
enabled = true

☛ 启用

[root@localhost ~ ]# systemctl start fail2ban
[root@localhost ~ ]# systemctl enable fail2ban

☛ 查看 Ban (禁止)状态

查看 postfix-sasl 服务的状态和被禁止的 IP:

[root@localhost ~ ]# fail2ban-client status postfix-sasl
Status for the jail: postfix-sasl
|- Filter
|  |- Currently failed: 7
|  |- Total failed:     1580
|  `- Journal matches:  _SYSTEMD_UNIT=postfix.service
`- Actions
   |- Currently banned: 2
   |- Total banned:     86
   `- Banned IP list:   181.214.206.170 181.214.206.195

查看 iptables 服务,确实拒绝了上述被禁止的 IP:

[root@localhost ~ ]# iptables -L -n
... 以上省略 ...

# 對應上述 jail.local 自訂的設定,所監聽的服務
Chain f2b-dovecot (1 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0

Chain f2b-postfix-sasl (1 references)
target     prot opt source               destination
# 拒絕的 IP 規則
REJECT     all  --  181.214.206.195      0.0.0.0/0            reject-with icmp-port-unreachable
REJECT     all  --  181.214.206.170      0.0.0.0/0            reject-with icmp-port-unreachable

☛ 查看 Log 文件

状态说明 :

① Unban:之前被禁止的 IP,但禁止时间到了所以解除。

② Ban:被禁止的 IP。

③ Found:登入失败的 IP。

[root@localhost ~ ]# cat /var/log/fail2ban.log
2018-06-20 13:57:47,106 fail2ban.actions        [16338]: NOTICE  [postfix-sasl] Unban 181.214.206.170
2018-06-20 13:59:58,379 fail2ban.actions        [16338]: NOTICE  [postfix-sasl] Ban 181.214.206.170
2018-06-20 14:00:02,993 fail2ban.filter         [16338]: INFO    [postfix-sasl] Found 193.15.218.238

☛ 拦截暴力入侵 WordPress

安装好 Fail2ban 后, 在 Fail2ban 的 filter 目录创建 wordpress 的 filter, 以下会以 /etc/fail2ban/filter.d/wordpress.conf 作为例子:

[root@localhost ~ ]# gedit /etc/fail2ban/filter.d/wordpress.conf

添加以下内容 :

# WordPress brute force auth filter: /etc/fail2ban/filter.d/wordpress.conf:
#
# Block IPs trying to auth wp wordpress
#
#
[Definition]
failregex = ^<HOST> .* "POST .*(wp-login.php|xmlrpc.php)
ignoreregex =

然后打开 Fail2ban 的配置文件 /etc/fail2ban/jail.conf, 加入以下内容:

[wordpress]
enabled  = true
port     = http,https
action   = iptables-multiport[name=wordpress, port="http,https", protocol=tcp]
filter   = wordpress
logpath  = /var/log/httpd/access_log
findtime = 1800
bandtime = 1800
maxretry = 10

上面的设置需要根据主机的环境设置 :

logpath: 这是 Apache 日志文件的位置。
bantime: 封锁 IP 的时间, 单位是秒, 上面例子是封锁 IP 半小时。
maxretry: 最多登录次数, 上面设定了在半小时内有 10 次登录便会被封锁。

修改好 jail.conf 后, 重新启动 Fail2ban 便会生效。

☛ 防止网页被试探路径与 Script

设置参考范例如下:

[apache-noscript]
enabled = true
port = http,https
filter = apache-noscript
action = iptables-multiport[name=apache-noscript, port="http,https"]
ignoreip = 127.0.0.1/8 192.168.0.0/24
logpath = /var/log/httpd/error_log
maxretry = 1
bantime = 36000