免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2077 | 回复: 4
打印 上一主题 下一主题

[网络配置] 利用fail2ban和iptables防止ssh恶意攻止 [复制链接]

求职 : Linux运维
论坛徽章:
203
拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:092015小元宵徽章
日期:2015-03-06 15:58:182015年亚洲杯之约旦
日期:2015-04-05 20:08:292015年亚洲杯之澳大利亚
日期:2015-04-09 09:25:552015年亚洲杯之约旦
日期:2015-04-10 17:34:102015年亚洲杯之巴勒斯坦
日期:2015-04-10 17:35:342015年亚洲杯之日本
日期:2015-04-16 16:28:552015年亚洲杯纪念徽章
日期:2015-04-27 23:29:17操作系统版块每日发帖之星
日期:2015-06-06 22:20:00操作系统版块每日发帖之星
日期:2015-06-09 22:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-01-21 17:00 |只看该作者 |倒序浏览
fail2ban。
安装:yum -y install fail2ban
如果提示找不到的话,先yum -y install epel-release 安装一下这个源。
安装过后,编辑配置文件:
vim /etc/fail2ban/jail.conf
复制代码

找到[ssh-iptables] 这一段
[ssh-iptables]

enabled  = true
filter   = sshd
action   = iptables[name=SSH, port=ssh, protocol=tcp]    #在iptables INPUT 链中的信息
           sendmail-whois[name=SSH, dest=admin@163.com, sender=admin@163.com, sendername="Fail2Ban"]
#dest是配置受到攻击后发送警报邮件的地址,sender配置发送人邮件可以随便写,sendername配置发件人可以不改
logpath  = /var/log/secure   #日志存放位置
maxretry = 5   #尝试登录次数,如果ssh登录错误超过5次,禁止在bantime设置的时间内再次尝试登录了
复制代码

如果登录超过5次都失败的话,在bantime设置的时间内,用户是无法登录的。默认bantime的设置是300秒,也就是5分钟,我设置的是3600秒,也就是1小时。
如果你想让某些IP不受fail2ban的控制,可以修改ignoreip 这个参数。
:wq 保存后。启动服务
service fail2ban start
复制代码
设置服务开机启动
chkconfig fail2ban on
复制代码

在开启服务后你的邮箱就可以收到一封fail2ban服务启动的邮件,相应的停止服务也会收到邮件
开启服务邮件 正文
Hi,
The jail SSH has been started successfully.
Regards,
Fail2Ban
复制代码
停止服务邮件正文
Hi,
The jail SSH has been stopped.
Regards,
Fail2Ban
复制代码
拒绝登录邮件正文
Hi,
The IP 222.186.56.101 has just been banned by Fail2Ban after
5 attempts against SSH.
Here is more information about 222.186.56.101:
missing whois program
Regards,
Fail2Ban
复制代码

如果你仔细的查看配置文件就会发现,fail2ban 不只能防止ssh的恶意攻击,还有好多项目可以配置如:
pop3, nagios,mysql, asterisk, php, vsftp, apache等的登录都可以进行设置,只不过默认的只有ssh的enabled的参数是true,其他项目的都是false
由于我这台机器是跳板机,通过路由器设置对外开放的只是22端口因此默认的就够用了。

用shell脚本提取lastb命令登录失败超过指定次数的IP加入到iptables,来禁止这些IP登录主机,达到防止恶意攻击的目的。后来为了给主机提供更全面的防护,又安装了fail2ban。
        今天早上我收到fail2ban发过来的报警邮件提示我禁止了一个IP登录,IP是219.235.4.22。我登录主机,输入last命令后,结果是这样的
root     ssh:notty    host-219-235-4-2 Thu Apr 23 19:32 - 19:32  (00:00)
root     ssh:notty    host-219-235-4-2 Thu Apr 23 19:32 - 19:32  (00:00)
root     ssh:notty    host-219-235-4-2 Thu Apr 23 19:32 - 19:32  (00:00)
root     ssh:notty    host-219-235-4-2 Thu Apr 23 19:32 - 19:32  (00:00)
root     ssh:notty    host-219-235-4-2 Thu Apr 23 19:32 - 19:32  (00:00)
root     ssh:notty    61.160.247.150   Thu Apr 23 02:18 - 02:18  (00:00)
root     ssh:notty    61.160.247.150   Thu Apr 23 02:18 - 02:18  (00:00)
root     ssh:notty    61.160.247.150   Thu Apr 23 02:18 - 02:18  (00:00)
复制代码

前面多了一个host,而且IP的分隔是用“-”,最后一位的IP地址无法显示出来。
我马上想到了查看fail2ban的日志,该日志默认是/var/log/secure
输入命令:
grep 'Failed password for root from' /var/log/secure|grep '219.235.4.22'
复制代码
执行结果为:
Apr 23 19:32:27 localhost sshd[17856]: Failed password for root from 219.235.4.22 port 4993 ssh2
Apr 23 19:32:30 localhost sshd[17856]: Failed password for root from 219.235.4.22 port 4993 ssh2
Apr 23 19:32:31 localhost sshd[17856]: Failed password for root from 219.235.4.22 port 4993 ssh2
Apr 23 19:32:34 localhost sshd[17856]: Failed password for root from 219.235.4.22 port 4993 ssh2
Apr 23 19:32:36 localhost sshd[17856]: Failed password for root from 219.235.4.22 port 4993 ssh2
复制代码

这时IP地址还有对方的端口都显示出来了,比lastb命令要详细的多。
这时我就把之前写的脚本修改了一下,直接读取/var/log/secure :

#!/bin/bash

bad_ip=` grep 'Failed password for root from' /var/log/secure|awk '{print $11,$1,$2}'|sort|uniq -c|awk '$1>4 {print $2}'|xargs`

for ip in $bad_ip; do
    in_iptables=`iptables -nvL|grep $ip |wc -l`
    if [ $in_iptables -eq 0 ]; then
        iptables -I INPUT -s $ip -j REJECT
        service iptables save
    fi
done
复制代码
执行一下,成功!

论坛徽章:
9
操作系统版块每日发帖之星
日期:2016-01-08 06:20:00操作系统版块每日发帖之星
日期:2016-01-28 06:20:0015-16赛季CBA联赛之四川
日期:2016-05-17 17:50:32操作系统版块每日发帖之星
日期:2016-08-01 06:20:0015-16赛季CBA联赛之广东
日期:2016-08-01 16:01:57操作系统版块每日发帖之星
日期:2016-08-04 06:20:00IT运维版块每日发帖之星
日期:2016-08-07 06:20:00操作系统版块每日发帖之星
日期:2016-08-07 06:20:0015-16赛季CBA联赛之福建
日期:2017-03-07 17:14:27
2 [报告]
发表于 2016-01-25 10:14 |只看该作者
直接用 iptables 的 recent。

求职 : Linux运维
论坛徽章:
203
拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:092015小元宵徽章
日期:2015-03-06 15:58:182015年亚洲杯之约旦
日期:2015-04-05 20:08:292015年亚洲杯之澳大利亚
日期:2015-04-09 09:25:552015年亚洲杯之约旦
日期:2015-04-10 17:34:102015年亚洲杯之巴勒斯坦
日期:2015-04-10 17:35:342015年亚洲杯之日本
日期:2015-04-16 16:28:552015年亚洲杯纪念徽章
日期:2015-04-27 23:29:17操作系统版块每日发帖之星
日期:2015-06-06 22:20:00操作系统版块每日发帖之星
日期:2015-06-09 22:20:00
3 [报告]
发表于 2016-01-25 10:56 |只看该作者
本帖最后由 lyhabc 于 2016-01-25 10:57 编辑

--@Riet
http://blog.chinaunix.net/uid-26963748-id-3267172.html
也可以的,其实fail2ban也是调用iptables
本文只是利用iptables的recent模块来抵御简单的DOS攻击。下面以限制ssh远程连接为例,具体步骤如下:
  (1)#iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
  (2)#iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
  (3)#iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds  300 --hitcount 3 --name SSH -j DROP
  以上三条规则的解释如下:
  1.利用connlimit模块将单IP的并发设置为3;会误杀使用NAT上网的用户,可以根据实际情况增大该值;
  2.利用recent和state模块限制单IP在300s内只能与本机建立3个新连接。被限制一分钟后即可恢复访问。
  3.第一句是记录访问tcp 22端口的新连接,记录名称为SSH
   --set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目
  4.第三句是指SSH记录中的IP,300s内发起超过3次连接则拒绝此IP的连接。
   --update 是指每次建立连接都更新列表;
   --seconds必须与--update同时使用
   --hitcount必须与--update同时使用
  5.可以使用下面的这句记录日志:
   iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 300 --hitcount 3 -j LOG --log-prefix "SSH Attack"

求职 : Linux运维
论坛徽章:
203
拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:57:092015小元宵徽章
日期:2015-03-06 15:58:182015年亚洲杯之约旦
日期:2015-04-05 20:08:292015年亚洲杯之澳大利亚
日期:2015-04-09 09:25:552015年亚洲杯之约旦
日期:2015-04-10 17:34:102015年亚洲杯之巴勒斯坦
日期:2015-04-10 17:35:342015年亚洲杯之日本
日期:2015-04-16 16:28:552015年亚洲杯纪念徽章
日期:2015-04-27 23:29:17操作系统版块每日发帖之星
日期:2015-06-06 22:20:00操作系统版块每日发帖之星
日期:2015-06-09 22:20:00
4 [报告]
发表于 2016-01-25 10:57 |只看该作者
本帖最后由 lyhabc 于 2016-01-25 10:58 编辑

iptables模块介绍:recent
时间:2015-05-11 03:37来源:linux.it.net.cn 作者:IT
recent模块可以看作iptables里面维护了一个地址列表,这个地址列表可以通过”–set”、”–update”、”–rcheck”、”–remove”四种方法来修改列表,每次使用时只能选用一种。还可附带”–name”参数来指 定列表的名字(默认为DEFAULT),“–rsource”、“–rdest”指示当前方法应用到数据包的源地址还是目的地址(默认是前者)。

recent语句都带有布尔型返回值,每次执行若结果为真,则会执行后续的语句,比如“-j ACCEPT”之类的。

对于实现前面提到的功能,还需要额外的参数。“–second”限制包地址被记录进列表的时间要小于等于后面的时间。另外,还有”–hitcount”、”–rttl”,显然是可以有其他高级的play。
基于上面的说明,现在来看四个基本方法的作用:

–set将地址添加进列表,并更新信息,包含地址加入的时间戳。–rcheck检查地址是否在列表。–update跟rcheck一样,但会刷新时间戳。–remove就是在列表里删除地址,如果要删除的地址不存在就会返回假。

例:

#限制无法ssh直接连接服务器,需先用较大包ping一下,此时在15秒内才可以连接上:
iptables -P INPUT DROP
iptables -A INPUT -s 127.0.0.1/32 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -m length --length 128 -m recent --set --name SSHOPEN --rsource -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --rcheck --seconds 15 --name SSHOPEN --rsource -j ACCEPT


说明:
1. 将INPUT链默认策略置为DROP,当包走完INPUT链而没被拿走时就会丢弃掉;
2. 本地localhost的包全部接受;
3. 对于已建立连接或是与已连接相关的包都接受,服务器对外连接回来的包一般都走这条;基本环境已经配好了,现在开始要为连接到服务器的ssh打开通路。
4. icmp类型8是ping包;指定包大小为128字节;recent用的列表名称为SSHOPEN,列表记录源地址。符合上述条件的数据包都接收。如果ping包内容为100字节,则加上IP头、ICMP头的28字节,总共128字节。
5. 接受一般的ping包;
6. 对连接ssh 22端口的连接进行处理,来源于SSHOPEN源地址列表并且在列表时间小于等于15秒的才放行。


测试:
无法ssh直接连接服务器,使用“ping -l 100 服务器ip ”后,15秒内就可以ssh连接服务器了。
#限制每ip在一分钟内最多对服务器只能有8个http连接
iptables -I INPUT -p tcp --dport 80 -d 199.15.25.116 -m state --state NEW -m recent --name httpuser --set
iptables -A INPUT -m recent --update --name httpuser --seconds 60 --hitcount 9 -j LOG --log-prefix 'HTTP attack: '
iptables -A INPUT -m recent --update --name httpuser --seconds 60 --hitcount 9 -j DROP


说明:

199.15.25.116是服务器ip

1. -I,将本规则插入到 INPUT 链里头的最上头。只要是 TCP连接,目标端口是80,目标 IP是我们服务器的IP,刚刚新被建立起来时,我们就将这个联机列入 httpuser 这分清单中;

2. -A,将本规则附在 INPUT 链的最尾端。只要是60秒内,同一个来源连续产生多个联机,到达第9个联机时,我们对此联机留下Log记录。记录行会以 HTTP attack 开头。每一次的本规则比对, –update 均会更新httpuser清单中的列表;

3. -A,将本规则附在 INPUT 链的最尾端。同样的比对条件,但是本次的动作则是将此连接丢掉;

4. 所以,这三行规则表示,我们允许一个客户端,每一分钟内可以接上服务器8个。具体数值可以看管理者决定。这些规则另外也可以用在其它对外开放的网络服务上,例如 port 22 (SSH), port 25 (smtp email)。

#对连接到本机的SSH连接进行限制,每个IP每小时只限连接5次
-A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --rcheck --seconds 3600 --hitcount 5 -j DROP
-A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --set -j ACCEPT


http://linux.it.net.cn/e/server/iptables/2015/0511/15326.html

论坛徽章:
9
操作系统版块每日发帖之星
日期:2016-01-08 06:20:00操作系统版块每日发帖之星
日期:2016-01-28 06:20:0015-16赛季CBA联赛之四川
日期:2016-05-17 17:50:32操作系统版块每日发帖之星
日期:2016-08-01 06:20:0015-16赛季CBA联赛之广东
日期:2016-08-01 16:01:57操作系统版块每日发帖之星
日期:2016-08-04 06:20:00IT运维版块每日发帖之星
日期:2016-08-07 06:20:00操作系统版块每日发帖之星
日期:2016-08-07 06:20:0015-16赛季CBA联赛之福建
日期:2017-03-07 17:14:27
5 [报告]
发表于 2016-01-25 11:01 |只看该作者
很详细,受教了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP