• 【原】k8s ingress-nginx 针对指定 User-Agent 爬虫进行限速


    针对指定 User-Agent 进行限速

    修改模板

    将 ingress-nginx 模板nginx.tmpl提取出来,设置成 configmap 挂载到 ingress-nginx 中去使用

    添加 map

    添加如下内容到模板中

     533     map $http_user_agent $agent {
     534         default "";
     535         #~curl $http_user_agent;
     536         ~*apachebench $http_user_agent;
     537         ~*spider $http_user_agent;
     538         ~*bot  $http_user_agent;
     539         ~*slurp $http_user_agent;
     540         ~*hello $http_user_agent;
     541         ~*chrome $http_user_agent;
     542     }
     543
     544     limit_conn_zone $agent zone=conn_lyj_com:10m;
     545     limit_req_zone $agent zone=req_lyj_com:10m rate=1r/s;
     546
     547     limit_req zone=req_lyj_com burst=1 nodelay;
    

    第一种:返回错误页面

    添加错误页面

    针对指定 UA 添加错误页面

    添加 598-603 行内容到模板中

     594     ## start server {{ $server.Hostname }}
     595     server {
     596         server_name {{ buildServerName $server.Hostname }} {{range $server.Aliases }}{{ . }} {{ end }};
     597
     598         recursive_error_pages on;
     599         proxy_intercept_errors on;
     600         if ($http_user_agent !~ "(hello|chrome)"){
     601              set $err_page "https://www.qq.com/404/";
     602         }
     603         error_page  503 $err_page;
     604
     605         {{ if gt (len $cfg.BlockUserAgents) 0 }}
     606         if ($block_ua) {
     607            return 403;
     608         }
     609         {{ end }}
     610         {{ if gt (len $cfg.BlockReferers) 0 }}
     611         if ($block_ref) {
     612            return 403;
     613         }
     614         {{ end }}
     615
     616         {{ template "SERVER" serverConfig $all $server }}
     617
     618         {{ if not (empty $cfg.ServerSnippet) }}
     619         # Custom code snippet configured in the configuration configmap
     620         {{ $cfg.ServerSnippet }}
     621         {{ end }}
    

    实际文件

    容器中的文件内容如下

       481		## start server lyj.5179.top
       482		server {
       483			server_name lyj.5179.top ;
       484
       485			recursive_error_pages on;
       486			proxy_intercept_errors on;
       487			if ($http_user_agent !~ "(hello|chrome)"){
       488				set $err_page "https://www.qq.com/404/";
       489			}
       490			error_page  503 $err_page;
       491
       492			listen 80  ;
       493			listen 443  ssl http2 ;
    

    测试

    指定 UA 为 hello

    ➜ liyongjiandeMBP.lan [/Users/liyongjian] for i in {1..100};do curl -H "Host:lyj.5179.top" 192.168.101.201:30080   -I -s -w '%{http_code}' -A"hello" -o /dev/null ;echo;done
    200
    200
    302
    302
    302
    302
    302
    302
    302
    302
    302
    302
    302
    

    报错日志

    10.32.0.1 - - [11/Dec/2020:09:24:15 +0000] "GET / HTTP/1.1" 503 592 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36" 486 0.000 [default-nginx-80] [] - - - - 621293a69b12f4b2f552ddefcfe677d5
    2020/12/11 09:24:15 [error] 123#123: *1597 limiting requests, excess: 1.332 by zone "req_lyj_com", client: 10.32.0.1, server: lyj.5179.top, request: "GET / HTTP/1.1", host: "lyj.5179.top:30080"
    

    不指定 UA

    ➜ liyongjiandeMBP.lan [/Users/liyongjian] for i in {1..100};do curl -H "Host:lyj.5179.top" 192.168.101.201:30080   -I -s -w '%{http_code}'  -o /dev/null ;echo;done
    200
    200
    200
    200
    200
    200
    200
    200
    200
    

    第二种:不返回错误页面,返回 444

    添加错误码

    添加 598 行

     594     ## start server {{ $server.Hostname }}
     595     server {
     596         server_name {{ buildServerName $server.Hostname }} {{range $server.Aliases }}{{ . }} {{ end }};
     597
     598         limit_req_status 444;
     599
     600         {{ if gt (len $cfg.BlockUserAgents) 0 }}
     601         if ($block_ua) {
     602            return 403;
     603         }
     604         {{ end }}
     605         {{ if gt (len $cfg.BlockReferers) 0 }}
     606         if ($block_ref) {
     607            return 403;
     608         }
    

    测试

    指定 ua

    ➜ liyongjiandeMBP.lan [/Users/liyongjian] for i in {1..100};do curl -H "Host:lyj.5179.top" 192.168.101.201:30080   -I -s -w '%{http_code}' -A"hello" -o /dev/null ;echo;done
    200
    200
    000
    000
    000
    000
    000
    000
    ...
    ➜ liyongjiandeMBP.lan [/Users/liyongjian] for i in {1..100};do curl -H "Host:lyj.5179.top" 192.168.101.201:30080   -I  -A"hello"  ;echo;done
    HTTP/1.1 200 OK
    Date: Fri, 11 Dec 2020 11:59:17 GMT
    Content-Type: text/html
    Content-Length: 612
    Connection: keep-alive
    Last-Modified: Tue, 24 Nov 2020 13:02:03 GMT
    ETag: "5fbd044b-264"
    Accept-Ranges: bytes
    
    
    HTTP/1.1 200 OK
    Date: Fri, 11 Dec 2020 11:59:17 GMT
    Content-Type: text/html
    Content-Length: 612
    Connection: keep-alive
    Last-Modified: Tue, 24 Nov 2020 13:02:03 GMT
    ETag: "5fbd044b-264"
    Accept-Ranges: bytes
    
    
    curl: (56) Recv failure: Connection reset by peer
    
    curl: (56) Recv failure: Connection reset by peer
    
    
    

    如果指定其他的状态码就不是 000 了

    报连接被重置

    日志:

    10.44.0.0 - - [11/Dec/2020:12:01:03 +0000] "HEAD / HTTP/1.1" 444 0 "-" "hello" 70 0.000 [default-nginx-80] [] - - - - 5e431fb99cf77d32bc39d3657f6fc3ca
    2020/12/11 12:01:03 [error] 38#38: *5185 limiting requests, excess: 1.896 by zone "req_lyj_com", client: 10.44.0.0, server: lyj.5179.top, request: "HEAD / HTTP/1.1", host: "lyj.5179.top"
    10.44.0.0 - - [11/Dec/2020:12:01:03 +0000] "HEAD / HTTP/1.1" 444 0 "-" "hello" 70 0.000 [default-nginx-80] [] - - - - f58bc7feaa516f39cc9a4103fdb87ca5
    2020/12/11 12:01:03 [error] 38#38: *5186 limiting requests, excess: 1.884 by zone "req_lyj_com", client: 10.44.0.0, server: lyj.5179.top, request: "HEAD / HTTP/1.1", host: "lyj.5179.top"
    10.44.0.0 - - [11/Dec/2020:12:01:03 +0000] "HEAD / HTTP/1.1" 444 0 "-" "hello" 70 0.000 [default-nginx-80] [] - - - - f4d43616589ab93e4ae28c9815dd1d33
    2020/12/11 12:01:03 [error] 37#37: *5187 limiting requests, excess: 1.872 by zone "req_lyj_com", client: 10.44.0.0, server: lyj.5179.top, request: "HEAD / HTTP/1.1", host: "lyj.5179.top"
    10.44.0.0 - - [11/Dec/2020:12:01:03 +0000] "HEAD / HTTP/1.1" 444 0 "-" "hello" 70 0.000 [default-nginx-80] [] - - - - b68eaaa44f8ebdcaa406c651b8b0f2ad
    

    不指定 UA

    ➜ liyongjiandeMBP.lan [/Users/liyongjian] for i in {1..100};do curl -H "Host:lyj.5179.top" 192.168.101.201:30080   -I -s -w '%{http_code}'  -o /dev/null ;echo;done
    200
    200
    200
    200
    200
    200
    200
    200
    
  • 相关阅读:
    php_sphinx安装使用
    获取数据库中所有表名
    总结thinkphp快捷查询getBy、getField、getFieldBy用法及场景
    打印机复印身份证方法
    svn 删除、移动和改名
    MySQL中REGEXP正则表达式使用大全
    高铁在高速运行时的电力是如何提供的?
    2016亚洲大学排名
    Mac下安装HBase及详解
    HBase Mac OSX 安装笔记
  • 原文地址:https://www.cnblogs.com/liyongjian5179/p/14122624.html
Copyright © 2020-2023  润新知