发现有个IP不断的猜测路径、试图往服务器上传文件(木马)。于是查看了之前的日志,无奈鄙站被攻击者盯上了,不断的有不同的IP试图上传木马。看来坏人还是有的。由于不想让鄙站沦为肉鸡,所以就想写个简单的脚本,来阻止攻击者的IP访问。
攻击者:
|
195.154.216.165--[28/Nov/2015:23:10:40+0800]"POST /wp-content/themes/twentyten/404.php HTTP/1.1"40427"http://www.z-dig.com/11m.php""Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)""-"
195.154.216.165--[28/Nov/2015:23:10:40+0800]"POST /wp-content/themes/twentythirteen/404.php HTTP/1.1"40427"http://www.z-dig.com/11m.php""Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)""-"
195.154.216.165--[28/Nov/2015:23:10:40+0800]"POST /wp-content/themes/twentytwelve/404.php HTTP/1.1"40427"http://www.z-dig.com/11m.php""Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)""-"
195.154.216.165--[28/Nov/2015:23:10:40+0800]"POST /wp-content/uploads/phptest.php HTTP/1.1"40427"http://www.z-dig.com/11m.php""Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)""-"
195.154.216.165--[28/Nov/2015:23:10:41+0800]"POST /xyr/confings.asp HTTP/1.1"4041569"http://www.z-dig.com/11m.php""Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)""-"
195.154.216.165--[28/Nov/2015:23:10:41+0800]"POST /xz.asp;.jpg HTTP/1.1"404564"http://www.z-dig.com/11m.php""Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)""-"
195.154.216.165--[28/Nov/2015:23:10:41+0800]"POST /yanyu/?q={${eval%28$_POST[u]%29}} HTTP/1.1"4041569"http://www.z-dig.com/11m.php""Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)""-"
195.154.216.165--[28/Nov/2015:23:10:42+0800]"POST /ztxxw/Images/images.asp HTTP/1.1"4041569"http://www.z-dig.com/11m.php""Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)""-"
|
|
[root@z-dig www]# grep '195.154.216.165' 2015-11-28.access.log|wc -l
289
[root@z-dig www]#
|
|
[root@z-dig www]# curl ipinfo.io/195.154.216.165;echo''
{
"ip":"195.154.216.165",
"hostname":"fr.07.gs",
"city":"",
"region":"",
"country":"FR",
"loc":"48.8600,2.3500",
"org":"AS12876 ONLINE S.A.S."
}
[root@z-dig www]#
|
法国的哥们竟然试了180多次!辛苦了。
用 shell 和定时任务来实现吧。>_<
网站跑在 Nginx 上,所以可以使用 Nginx 的 Deny 来拒绝攻击者的IP访问。
那么思路就出来了,定期(五分钟或十分钟)获取攻击者的IP,将IP放入到黑名单(Nginx 配置文件),并 reload 使其生效。
由于前期规划的比较好,网站的访问日志放在了一个指定的目录,Nginx 的错误日志也放在了一个指定的目录。网站的访问日志每日进行切割。Nginx 的错误日志没有进行切割。
下面就是我的思路和操作步骤:
通过 Nginx 的错误日志(为什么不使用访问日志)来获取攻击者的IP。之前没有对 Nginx 的错误日志进行定时切割,为了方便统计攻击者的IP所以,编写脚本并加入定时任务,使错误日志每小时切割一次,并且每小时对黑名单文件进行清空。
错误日志切割、清空黑名单脚本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
[root@z-dig scripts]# cat rotate-nginx-error-logs.sh
#!/bin/bash
# Rotate nginx error logs and clean block ip 's configure file
# Nginx pid file : /application/nginx/logs/nginx.pid
# Nginx error logs directory : /data/logs/nginx
# Block Ip 's configure file : /application/nginx/conf/website/blockip.conf
# Default log name : error.log
# Author : Mr.Zhou
# E-mail : zhou@z-dig.com
NGX_PID=/application/nginx/logs/nginx.pid
NGINX_CMD=/application/nginx/sbin/nginx
LOGS_DIR=/data/logs/nginx
LOG_NAME=error.log
BLOCK_IP_FILE=/application/nginx/conf/website/blockip.conf
cd$LOGS_DIR&&
/usr/bin/rename$LOG_NAME$(/bin/date+%F-%H-d"last hour").$LOG_NAME$LOG_NAME&&
/bin/kill-USR1$(cat$NGX_PID)
>$BLOCK_IP_FILE&&
$($NGINX_CMD-sreload)
[root@z-dig scripts]#
|
获取攻击者IP脚本:
该脚本从 Nginx 的错误日志中统计出超过20次试图猜测路径或上传文件的IP,并将这些IP加入到 Nginx 的配置文件。若有新增加的IP则 reload Nginx 使配置文件生效,若没有新增IP则不进行reload。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
[root@z-dig scripts]# cat block-ip.sh
#!/bin/bash
# Author : Mr.Zhou
# Email : zhou@z-dig.com
# Website : http://www.z-dig.com
# block ip
ERR_LOG=/data/logs/nginx/error.log
BLOCK_IP_FILE=/application/nginx/conf/website/blockip.conf
BLOCKED_IP=/dev/shm/blocked-ip.txt
BLOCK_IP=/dev/shm/block-ip.txt
NGINX_CMD=/application/nginx/sbin/nginx
/bin/cp$BLOCK_IP_FILE$BLOCKED_IP&&
/bin/sed-nr's#.*[^0-9](([0-9]+\.){3}[0-9]+).*#\1#p'$ERR_LOG|/bin/awk'{IP[$1]++}END{for (i in IP) print IP[i],i}'|/bin/awk'{if($1>20)print "deny "$2";"}'>$BLOCK_IP&&
/bin/grep-v-f$BLOCK_IP_FILE$BLOCK_IP>>$BLOCK_IP_FILE&&
$($NGINX_CMD-sreload)
[root@z-dig scripts]#
|
将拒绝指定IP访问的配置文件(黑名单)单独存放,并在 nginx 主配置文件中 include 进去。
|
[root@z-dig conf]# grep blockip.conf nginx.conf
include website/blockip.conf;
[root@z-dig conf]#
|
blockip.conf 文件格式如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
[root@z-dig website]# cat blockip.conf
deny195.154.211.220;
deny195.154.188.28;
deny195.154.188.186;
deny180.97.106.161;
deny180.97.106.162;
deny180.97.106.36;
deny195.154.180.69;
deny195.154.211.26;
deny221.229.166.247;
deny180.97.106.37;
deny195.154.216.164;
deny195.154.216.165;
[root@z-dig website]#
|
将脚本放入定时任务执行:
每小时对 Nginx 的错误日志进行切割并且清空一次被拒绝访问IP的配置文件,若不清空的话,此IP将终生不能访问,若它再次攻击则会再次进入黑名单,>_<。 清空命令放在了切割脚本的尾部。
可以自己决定统计频率,根据指定的频率执行脚本,获取攻击者的IP,若此IP已经在黑名单中,则会忽略掉(由于错误日志一小时切割一次,所以在一小时内会出现重复的IP)。然后把剩下的新攻击者的IP追加到黑名单。并 reload Nginx 。若没有新增的攻击者IP则什么都不做。
|
[root@z-dig~]# crontab -l
# rotate nginx log everyday
0000***/bin/bash/application/scripts/rotate-nginx-logs.sh&>/dev/null
# rotate nginx error log every hour and clean the block ip file
00*/1*** /bin/bash/application/scripts/rotate-nginx-error-logs.sh&>/dev/null
# check hacker's ip every ten minutes
*/10****/bin/bash/application/scripts/block-ip.sh&>/dev/null
[root@z-dig~]#
|
以下是脚本运行一段时间的攻击者IP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
[root@z-dig~]# cat /application/nginx/conf/website/blockip.conf
deny195.154.211.220;
deny195.154.188.28;
deny195.154.188.186;
deny180.97.106.161;
deny180.97.106.162;
deny180.97.106.36;
deny195.154.180.69;
deny195.154.211.26;
deny221.229.166.247;
deny180.97.106.37;
deny195.154.216.164;
deny195.154.216.165;
[root@z-dig~]#
|
过段时间,再列出一份黑名单IP,看是否有变化。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
[root@z-dig~]# cat /application/nginx/conf/website/blockip.conf
deny195.154.188.224;
[root@z-dig~]# curl ipinfo.io/195.154.188.224;echo ''
{
"ip":"195.154.188.224",
"hostname":"195-154-188-224.rev.poneytelecom.eu",
"city":"",
"region":"",
"country":"FR",
"loc":"48.8600,2.3500",
"org":"AS12876 ONLINE S.A.S."
}
[root@z-dig~]# grep '195.154.188.224' /data/logs/nginx/error.log |wc -l
102
[root@z-dig~]# grep '195.154.188.224' /data/logs/nginx/error.log |grep -v 'access forbidden' |wc -l
24
[root@z-dig~]#
[root@z-dig~]# tail -n 1 /data/logs/nginx/error.log
2015/11/3010:47:53[error]30754#0: *37828 access forbidden by rule, client: 195.154.188.224, server: www.z-dig.com, request: "GET / HTTP/1.1", host: "www.z-dig.com", referrer: "http://www.z-dig.com"
[root@z-dig~]#
|
看来多少还是管点用的。一共 access forbidden by rule 了 102-24=78 次。
适当的改改脚本,保存黑名单的历史数据,定期将大于1000的IP直接放入iptables!
分享到:
相关推荐
主要介绍了Nginx服务器限制IP访问的各种情况全解析,包括限制同一IP在一段时间内的访问次数和全局限IP访问以及限制IP访问指定目录等情况,需要的朋友可以参考下
nginx实现请求的负载均衡 + keepalived实现nginx的高可用的shell脚本,在liunx下跑就可以
最近的一个项目,需要特定的IP访问某专题页面的时候跳转到网站首页,思考了下,直接使用NGINX实现,分享给大家。
Nginx 配置TCP代理转发 使用Nginx 新版的 stream方式,实现TCP/UDP代理转发。
python脚本 从nginx的访问log,获取访问IP,记录到redis,根据IP访问数量判断是否存在安全问题,记录不正常IP,(写入到防火墙过滤-待完成)
将其复制到/etc/init.d下。 就可以通过service nginx start | restart | stop 管理nginx了
nginx自动化安装shell脚本
nginx一键部署,包含shell脚本及nginx安装包
实验环境: 一台Liunx服务器(内网可也以) ...执行命令: docker pull nginx //从docker自带的源把...docker run -itd --name nginx -p 5555:80 nginx //运行刚刚下载nginx的镜像,现在这个镜像是一个容器。修改name为
2、只允许指定的ip访问a1.htm a2.htm a3.htm这个三个页面,其他IP的访问都拒绝 location ~* /(a1.htm|a2.htm|a3.htm)$ { allow 10.0.0.2; deny all; condition………; } 这种设置只有ip地址为10.0.0.2的主机可以...
首先建立下面的配置文件放在nginx的conf目录下面,... blocksip.conf:的格式还有许多种,可以配置只允许的IP访问或者IP段访问: deny IP; allow IP; # block all ips deny all; # allow all ips allow all; 其中网段的
里面 1.7.4 的nginx https 的配置 下载下来后 需要配置一下 nginx 的配置文件即可
Nginx日志自动归档备份shell脚本log
nginx 限制ip、并发量、连接数等配置
主要介绍了Nginx如何封禁IP和IP段的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
对于nginx做ip限制一些总结。
Nginx: PV、UV、独立IP 做网站的都知道,平常经常要查询下网站PV、UV等网站的访问数据,当然如果网站做了CDN的话,nginx本地的日志就没什么意义了,下面就对nginx网站的日志访问数据做下统计; 概念: UV(Unique ...
对nginx进行详细的访问数量,日志请求头配置,多域名分发,反向代理等配置,可以对手机访问进行判断重定向手机域名
linux系统上 nginx自动安装的shell脚本 能自动适配系统版本