Nginx 配置屏蔽恶意请求

2021/6/18 nginx安装配置

对于公网环境的服务来说,安全问题很值得重视,一个公网服务器每天要被无数次的扫描,对于部署在公网的 web 服务来说,可能会被各种奇怪的请求不停的访问。这些奇怪的请求不但占用了宝贵的服务器资源(包括无用的日志,请求资源等),任由这些工具扫描更有可能会有某些漏洞被利用从而造成损失(部署在公网的数据库之类的一定要设置好安全的密码,不然再无用的测试库都有可能被人黑)。

如果是通过 nginx 代理的服务,那么可以处理服务本身进行防御外,nginx 服务器也可以配置非法的请求不进行转发。

创建一个 request_deny.conf 来拦截各种爬虫或者奇奇怪怪的 agent 以及自定义不允许内容的请求,根据实际情况进行精细的拦截。

被拦截通过返回 444 表明服务器没有返回信息给客户端并且关闭了连接(在威慑恶意软件的时候比较有用)。

#禁止Scrapy等工具的抓取
if ($http_user_agent ~* (Scrapy|Curl|HttpClient)) {
    return 444;
}

#禁止指定UA及UA为空的访问
if ($http_user_agent ~ "FeedDemon|JikeSpider|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Go-http-client|CPython|python-requests|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|YisouSpider|HttpClient|MJ12bot|heritrix|EasouSpider|LinkpadBot|Ezooms|^$" )
{
    return 444;
}

#禁止非GET|HEAD|POST方式的抓取
if ($request_method !~ ^(GET|HEAD|POST)$) {
    return 444;
}

# 禁用post
if ($request_method ~ "POST") {
    return 444;
}

# 过滤某些请求
if ($request_uri ~* "/%df") {
    return 404;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

在网站相关配置文件中插入代码 include request_deny.conf;,当然也可以在配置文件中直接定义规则。

location / {
    proxy_pass http://xxx.xxx.xxx.xxx;
    include request_deny.conf;
    #禁止非GET方式
    if ($request_method !~ ^(GET)$) {
      return 444;
    }
}

# 假如网站不支持php可以直接全部禁掉
location ~ [^/]\.php(/|$) {
    return 444;
}
1
2
3
4
5
6
7
8
9
10
11
12
13