nginxip过滤
Ⅰ 如何禁掉nginx恶意访问ip
自己写的网站,不知道为啥总是有很多恶意访问的ip,根本不是正常的用户访问之前也有想过是否可能是运营商的代理服务器出口ip,但是看起来好像也不像,先不管,ban掉再说
那如何来ban呢,规则比较简单,就是超过一个阈值之后,就用下面的iptables命令
iptables -I INPUT -s <ip-to-ban> -j DROP
service iptables save
service iptables restart
那如何统计nginx的访问ip呢,目前来说比较简单就是读取nginx的access.log文件,然后分析一下,如果一天超过阈值,我们就执行上面的命令,ban掉ip。
有个问题是我们需要的是一直监视access.log 文件,而不是读一次,当然可以在每天快结束的时候事后来封住ip,但是这样不能给爬虫嚣张的气焰,所以
我觉得立即封掉是比较OK的。
之前写过一个类似tail读取一个文件的功能,就是打开的时候先定位到文件大小的位置,然后就开始循环读行来处理,这次的处理有点不一样,我是直接使用tail 把那个文件的流定位到我的程序的 sys.stdin ,这样就简单的可以读到所有的流了
tail /var/log/nginx/access.log | python <your_python_script>.py
但是nginx的access.log每天都会做一次logrotate,它是怎么做的呢,nginx官网的推荐方式
mv access.log access.log.0
kill -USR1 `cat master.nginx.pid`
sleep 1
gzip access.log.0 # do something with access.log.0
我的vps上面使用的是logrotated来处理的,可以在/etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 640 nginx adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
这里表示的create表示文件会重新创建。其实这样老的文件就没有新数据了,但是因为使用的是tail,也没有eof, 这样直接读的时候会发现 file.readline() 的函数会卡住,导致程序假死,这样程序就不能主动退出了,后面选择了用select来处理,加了一个10秒的超时,从目前的流量来看,基本上每秒都好多的请求,10秒都没有数据就是出问题了。
while sys.stdin in select.select([sys.stdin], [], [], 10)[0]:
然后如果没有select上的话,说明基本上是nginx log文件rotate掉了,所以遇到这样的情况,我就直接跳出程序,然后把程序终结掉。终结掉怎么办呢,本来想在程序里面重新启动一下程序,但是感觉可能不妥,所以使用crontab来处理了,每隔2分钟检查一下,为了防止多次启动就用了flock来防止程序重新启动
*/2 * * * * flock -xn /dev/shm/blocker.lock -c "sh /srv/www/beauty/daemon/nginx_ip_blocker.sh"
这里附上代码
#coding=utf-8
import sys
import re
import os
import urllib
import urllib2
import datetime
import time, os
import logging
import json
import select
logging.basicConfig(level=logging.DEBUG, datefmt='%Y%m%d %H:%M:%S', format='[%(asctime)s] %(message)s')
"""
iptables -I INPUT -s <your_ip> -j DROP
service iptables save
service iptables restart
本脚本主要是用来把恶意访问nginx的ip ban掉的脚本
"""
MAX_IP=7000
def get_date():
return time.strftime("%Y%m%d")
def ban_one_ip(ip):
os.system("iptables -I INPUT -s %s -j DROP ; service iptables save ; service iptables restart"%ip)
def find_ip_and_ban():
for ip in ip_map:
if ip_map.get(ip)>MAX_IP:
print "ban ip, count %s:%s"%(ip_map.get(ip),ip)
ip_map[ip] = 0
ban_one_ip(ip)
today = None
ip_map = {}
def process_log(lines):
global ip_map;
global today;
now = get_date()
if now != today:
today = now
ip_map = {}
for line in lines:
ip = line.split(" ")[0]
count = ip_map.get(ip,0)
count += 1
ip_map[ip]=count;
find_ip_and_ban()
COUNT=50
def main():
brk=False
while True:
tmp = 0;
lines =[]
brk=False
while sys.stdin in select.select([sys.stdin], [], [], 10)[0]:
line = sys.stdin.readline()
if not line:
brk=True
print 'read to eof'
break
lines.append(line)
tmp+=1
if tmp>COUNT:
break
else:
brk=True
print 'read time out'
break
process_log(lines)
print "read lines:%s"%len(lines)
if brk:
break
if brk:
print "break out"
if __name__ == "__main__":
main()
Ⅱ 如何突破nginx后台ip访问限制
一、服务器全局限IP
#vi nginx.conf
allow 10.115.0.116; #允许的IP
deny all;
二、站点限IP
#vi vhosts.conf
站点全局限IP:
location / {
index index.html index.htm index.php;
allow 10.115.0.116;
deny all;
站点目录限制
location ^~ /test/ {
allow 10.115.0.116;
deny all;
注意事项:
1. deny 一定要加一个ip,否则直接跳转到403,不往下执行了;如果403默认页是同一域名下,会造成死循环访问;
2. allow的ip段
从允许访问的段位从小到大排列,如127.0.0.0/24 下面才能是10.10.0.0/16
24表示子网掩码:255.255.255.0
16表示子网掩码:255.255.0.0
8表示子网掩码:255.0.0.0
3. deny all;结尾 表示除了上面allow的其他都禁止
如:
deny 192.168.1.1;
allow 127.0.0.0/24;
allo w 192.168.0.0/16;
allow 10.10.0.0/16;
deny all;
Ⅲ nginx只允许某IP段访问,如何设置
是的 添的是你不能上网的IP 你用的什么路由器?命令行模式的你就要写一条ACL如下access-list 1 deny host 192.168.1.7-192.168.1.254 any any
Ⅳ 如何设置nginx可以让ip可以直接访问网站
设置你监听的端口,设置server_name为ip+端口
server {
listen 9000;
charset utf-8;
server_name xx.xx.xx.xx:9000;
......
}
重启,然后就内可以使用该IP访问了容
Ⅳ nginx怎么设置指定目录ip访问限制
nginx中针对目录进行IP限制 ,这里以phpmyadmin目录只能让内网IP访问,而外网不能访问的配置方法。
nginxphpmyadmin针对内网ip用户开放、外网ip用户关闭(在前面的配置中,location ~ ^/目录/使用正则, 优先级高于location /的配置,所以nginx无法对首页进行解析)
代码如下:
server{
listen80;
server_nameexample.com;
access_loglogs/access.logmain;
location/{
roothtml;
indexindex.phpindex.htmlindex.htm;
}
location~^/phpmyadmin/{
allow192.168.1.0/24;
denyall;
location~.*.(php|php5)?${
root/var/mailapp/nginx/html;
fastcgi_pass127.0.0.1:9000;
fastcgi_indexindex.php;
includefastcgi_params;
}
}
location~.*.(php|php5)?${
root/opt/nginx/html;
fastcgi_pass127.0.0.1:9000;
fastcgi_indexindex.php;
includefastcgi_params;
}
}
Ⅵ nginx如何禁止代理IP访问
nginx有禁止ip访问的功能,比如你想禁止的代理ip是2.2.2.2,那么配置可以写:
location / {
deny 2.2.2.2;
}当然nginx非常的灵活,他内也可以禁止某个url,或者容是正则匹配的规则。黑白名单都可以做,功能很强大。我只给你举了一个简单的例子。
Ⅶ 如何配置nginx达到只允许域名访问网址,禁止ip
Nginx 禁止IP访问
我们在使用的时候会遇到很多的恶意IP攻击,这个时候就要用到Nginx 禁止IP访问了。版下面我们就先看权看Nginx的默认虚拟主机在用户通过IP访问,或者通过未设置的域名访问(比如有人把他自己的域名指向了你的ip)的时候生效最关键的一点是,在server的设置里面添加这一行:
listen 80 default;
后面的default参数表示这个是默认虚拟主机。
Nginx 禁止IP访问这个设置非常有用。
比如别人通过ip或者未知域名访问你的网站的时候,你希望禁止显示任何有效内容,可以给他返回500.目前国内很多机房都要求网站主关闭空主机头,防止未备案的域名指向过来造成麻烦。就可以这样设置:
server {
listen 80 default;
return 500;
}
Ⅷ nginx 怎么屏蔽通过ip访问
我的服务器也在阿里云 按照你的说 接入阿里云的waf对网站进行防护,但是如果回直接通过IP地址访问网站即答可绕过阿里云waf,于是希望禁止通过ip访问网站
打开Nginx的配置文件nginx.conf
在server段里插入如下内容即可
if ($host != 'chaodiquan.com' ) {
return 403;
}
解释一下,这段的意思是,如果访问请求不是上面指定的域名,就返回403错误。
Ⅸ nginx怎么配置IP和域名都能访问
一个nginx服务器只能有一个虚拟主机允许IP访问
只要在server_name最后面添加一个default,就可以在其他专nginx没有定义的属域名下,使用当前server解析(例如,其他server都没有定义ip地址作为server_name则用IP访问会被打到default主机上)
Ⅹ nginx 怎么配置 ip
工具原料:电脑+nginx
nginx 配置 ip方法如下:
一、将a和b两个网站部署在同一台服务器上专,两个域名解析属到同一个IP地址,但是用户通过两个域名却可以打开两个完全不同的网站,互相不影响,就像访问两个服务器一样,所以叫两个虚拟主机。
二、配置代码如下:
三、在服务器8080和8081分别开了一个应用,客户端通过不同的域名访问,根据server_name可以反向代理到对应的应用服务器。
四、server_name配置还可以过滤有人恶意将某些域名指向主机服务器。