2022
我们一起努力

nginx禁止ip访问网站(nginx只允许指定ip访问)

本文目录:

  • 1、关于nginx禁止访问某IP段
  • 2、如何设置Nginx,使得其可以拒绝某些IP连接
  • 3、如何禁掉nginx恶意访问ip

关于nginx禁止访问某IP段

allow 202.203.0.0/16;

deny all;

这样就OK了啊。。。。。。。。。。。。。。。。

当然你也可以学习一下语法规则:网页链接 一般202.203.0.0/16就代表从202.203.0.1到202.203.255.254的范围。

如何设置Nginx,使得其可以拒绝某些IP连接

nginx拒绝或允许指定IP,是使用模块HTTP访问控制模块(HTTP Access).

控制规则按照声明的顺序进行检查,首条匹配IP的访问规则将被启用。

location / {

deny 192.168.1.11;

allow 192.168.1.22/224;

allow 10.1.1.12/126;

deny all;

}

deny表示拒绝,allow表示允许。

上面的例子中仅允许192.168.1.22/224和10.1.1.12/126网络段访问这个location字段,但192.168.1.11是个例外。

如何禁掉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 tmpCOUNT:

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访问网站】的内容来源于互联网,如引用不当,请联系我们修改。

赞(0)
文章名称:《nginx禁止ip访问网站(nginx只允许指定ip访问)》
文章链接:https://www.fzvps.com/40774.html
本站文章来源于互联网,如有侵权,请联系管理删除,本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
图片版权归属各自创作者所有,图片水印出于防止被无耻之徒盗取劳动成果的目的。

评论 抢沙发

评论前必须登录!