Nginx网站使用CDN之后禁止用户真实IP访问的方法 | 张戈博客

  • 时间:
  • 浏览:0
  • 来源:熊猫辅助网_提供洋葱娱乐网技术_梅花辅助网资讯

做过面向公网WEB运维的苦逼们肯定见识过各种恶意扫描、拉取、注入等图谋不轨行为吧?对于直接对外的WEB服务器,亲戚亲戚大伙儿能非要直接通过 iptables 、 Nginx 的deny指令机会是守护进程池池来ban掉什么恶意请求。

而对于套了一层 CDN 或代理的网站,什么土措施机会就失效了。尤其是此人 网站,机会就一台VPS,为甚让 套1个免费的CDN就行走在互联网了。并全是每个CDN都能精准的拦截各种恶意请求的,更闹心的是所以CDN还不支持用户在CDN加进去去进去BAN规则,比如腾讯云CDN。。。

为甚让 ,全是了本文的折腾分享。

一、真假难辨

何如禁止访问,亲戚亲戚大伙儿先了解下常见的3种网站访问模式:

①、用户直接访问对外服务的普通网站

浏览器 –> DNS解析 –> WEB数据处置 –> 数据吐到浏览器渲染展示

②、用户访问使用了CDN的网站

浏览器 –> DNS解析 –> CDN节点 –> WEB数据处置 –> 数据吐到浏览器渲染展示

③、用户通过代理上网访问了亲戚亲戚大伙儿的网站

浏览器 –> 代理上网 –> DNS解析 –> 上述2种模式均机会

对于第一种生活模式,想要 禁止你这些 用户的访问很简单,能非要直接通过 iptables 机会 Nginx的deny指令来禁止均可:

iptabels:

iptables -I INPUT -s 用户ip -j DROP

Nginx的deny指令:

语    法:     deny address | CIDR | unix: | all;

默认值:     —

配置段:     http, server, location, limit_except

顺   序:从上往下

Demo:

location / {

deny 用户IP或IP段;

}

但对于后面 2种模式就无能为力了,机会iptables 和 deny 都非要针对直连IP,而后面 2种模式中,WEB服务器直连IP是CDN节点机会代理服务器,此时使用 iptable 或 deny 就非要把 CDN节点 或代理IP给封了,机会误杀一大片正常用户了,而真正的罪魁祸首轻轻松松换1个代理IP又能继续请求了。

那该为甚么办?

二、火眼金睛

机会长期关注张戈博客的亲戚亲戚大伙儿,应该还记得之前 转载过一篇分享Nginx在CDN加速之前 ,获取用户真实IP做并发访问限制的土措施。说明Nginx还是能非要实其实在的拿到用户真实IP地址的,那末事情就好办了。

要拿到用户真实IP,若果在Nginx的http模块内加入如下配置:

#获取用户真实IP,并赋值给变量$clientRealIP
map $http_x_forwarded_for  $clientRealIp {
        ""      $remote_addr;
        ~^(?P<firstAddr>[0-9\.]+),?.*$  $firstAddr;
}

那末,$clientRealIP 所以用户真实IP了,其实所以匹配了 $http_x_forwarded_for 的第1个值,具体原理前文也简单分享过:

其实,当1个 CDN 机会透明代理服务器把用户的请求转到后面 服务器的之前 ,你这些 CDN 服务器会在 Http 的头中加入1个记录

X-Forwarded-For :  用户IP, 代理服务器IP

机会后面 经历了不止1个代理服务器,你这些 记录会是1个

X-Forwarded-For :  用户IP, 代理服务器1-IP, 代理服务器2-IP, 代理服务器3-IP, ….

能非要看得人经过好多层代理之前 , 用户的真实IP 在第1个位置, 后面 会跟一串后面 代理服务器的IP地址,从这里取到用户真实的IP地址,针对你这些 IP 地址做限制就能非要了。

为甚让 代码中还配合使用了 $remote_addr,为甚让 $clientRealIP 还能兼容上文中第①种直接访问模式,不像 $http_x_forwarded_for 在直接访问模式中机会是空值!

所以,$clientRealIP 还能配置到 Nginx 日志格式中,替代传统的 $remote_addr 使用,推荐!

三、隔山打牛

既然机会拿到了真实IP,却非要使用 iptables 和 deny 指令,不是无力感油然而生?

哈哈,在强大的 Nginx 身后若果想得到,你就做得到!通过对 $clientRealIP 你这些 变量的判断,Nginx就能实现隔山打牛的目的,为甚让 规则简单易懂:

#机会真实IP为 121.42.0.18、121.42.0.19,那末返回403
if ($clientRealIp ~* "121.42.0.18|121.42.0.19") {
        #机会你的nginx安装了echo模块,还能如下输出语言,狠狠的发泄你的不满(但不兼容返回403,试试400吧)!
        #add_header Content-Type text/plain;
        #echo "son of a bitch,you mother fucker,go fuck yourself!";
        return 403;
        break;
}

把你这些 保存为 deny_ip.conf ,上传到 Nginx 的 conf 文件夹,为甚让 在要生效的网站 server 模块中引入你这些 配置文件,并 Reload 重载 Nginx 即可生效:

#禁止有些用户访问
include deny_ip.conf;

机会再想加进去去有些要禁止的IP,只须要编辑你这些 文件,插入要禁止的IP,使用分隔符 | 隔开即可,记得每次修改都须要 reload 重载 Nginx不可以生效。

四、奇淫巧计

为了更方便的加进去去和删除什么黑名单IP,昨晚熬夜写了1个小脚本,一键加进去去和删除,懒人有福了!

#!/bin/bash
###################################################################
#  Deny Real IP for Nginx;  Author: Jager <[email protected]>        #
# For more information please visit https://zhang.ge/40096.html #
#-----------------------------------------------------------------#
#  Copyright ©2016 zhang.ge. All rights reserved.              #
###################################################################

NGINX_BIN=/usr/local/nginx/sbin/nginx
DENY_CONF=/usr/local/nginx/conf/deny_ip.conf

COLOR_RED=$(    echo -e "\e[31;49m" )
COLOR_GREEN=$(  echo -e "\e[32;49m" )
COLOR_RESET=$(  echo -e "\e[0m"     )

rep_info() { echo;echo -e "${COLOR_GREEN}$*${COLOR_RESET}";echo; }
rep_error(){ echo;echo -e "${COLOR_RED}$*${COLOR_RESET}";echo;exit 1; }

show_help()
{
printf "
###################################################################
#  Deny Real IP for Nginx;  Author: Jager <[email protected]>        #
# For more information please visit https://zhang.ge/40096.html #
#-----------------------------------------------------------------#
#  Copyright ©2016 zhang.ge. All rights reserved.              #
###################################################################

Usage: $0 [OPTIONS]

OPTIONS:
-h | --help   : Show help of this script
-a | --add    : Add a deny ip to nginx, for example: ./$0 -a 192.168.1.1
-c | --create : Create deny config file($DENY_CONF) for Nginx
-d | --del    : Delete a ip from deny list, for example: ./$0 -d 192.168.1.1
-s | --show   : Show current deny list

"
}

reload_nginx()
{
    $NGINX_BIN -t >/dev/null 2>&1 && \
    $NGINX_BIN -s reload && \
    return 0
}

show_list()
{
   awk -F '["){|]' '/if/ {for(i=2;i<=NF;i++) if ($i!="") printf $i"\n"}' $DENY_CONF 
}

pre_check()
{
    test -f $NGINX_BIN || rep_error "$NGINX_BIN not found,Plz check and edit."
    test -f $DENY_CONF || rep_error "$DENY_CONF not found,Plz check and edit." 
    MATCH_COUNT=$(show_list | grep -w $1 | wc -l)
    return $MATCH_COUNT
}

create_rule()
{
test -f $DENY_CONF && \
rep_error "$DENY_CONF already exist!."
cat >$DENY_CONF<<EOF
if (\$clientRealIp ~* "8.8.8.8") {
    #add_header Content-Type text/plain;
    #echo "son of a bitch,you mother fucker,go fuck yourself!"; 
    return 403;
    break;
}
EOF
test -f $DENY_CONF && \
rep_info "$DENY_CONF create success!" && \
cat $DENY_CONF && \
exit 0

rep_error "$DENY_CONF create failed!" && \
exit 1

}

add_ip()
{
    pre_check $1
    if [[ $? -eq 0 ]];then
        sed -i "s/\")/|$1&/g" $DENY_CONF && \
        reload_nginx && \
        rep_info "add $1 to deny_list success." || \
        rep_error "add $1 to deny_list failed."
    else
        rep_error "$1 has been in deny list!"
        exit
    fi
}

del_ip()
{
    pre_check $1
    if [[ $? -ne 0 ]];then
        sed -ie "s/\(|$1\|$1|\)//g" $DENY_CONF && \
        reload_nginx && \
        rep_info "del $1 from deny_list success." || \
        rep_error "del $1 from deny_list failed."
    else
        rep_error "$1 not found in deny list!"
        exit
    fi
}

case $1 in
    "-s"|"--show" )
        show_list
        exit
        ;;
    "-h"|"--help" )
        show_help
        exit
        ;;
    "-c"|"--create" )
        create_rule
    ;;
esac

while [ $2 ];do
    case $1 in
        "-a"|"--add" )
            add_ip $2;
            ;;
        "-d"|"--del" )
            del_ip $2
            ;;
        * )
            show_help
            ;; 
    esac
    exit
done
show_help

使用土措施:

①、根据实际情形修改第9、10行 Nginx 二进制文件及其deny配置文件路径

②、为甚让 将此脚本保存为 deny_ctrl.sh 上传到服务器任意目录,比如塞进 /root

③、给脚本赋予可执行权限:chmod +x deny_ctrl.sh 即可使用

④、使用参数:

Usage: deny_ctrl.sh [OPTIONS]

OPTIONS:

-h | –help : 显示帮助信息

-a | –add : 加进去去1个黑名单IP, 类式于: ./deny_ctrl.sh -a 192.168.1.1

-c | –create : 初始化创建1个禁止IP的配置文件,须要自行include 到须要的网站server模块

-d | –del : 删除1个黑名单IP,类式于: ./deny_ctrl.sh -d 192.168.1.1

-s | –show : 显示当前已拉黑IP清单

初次使用,先执行  ./deny_ctrl.sh -c 创建一下 Nginx 相关配置文件:deny_ip.conf,默认内容如下:

if ($clientRealIp ~* "8.8.8.8") {
    #add_header Content-Type text/plain;
    #echo "son of a bitch,you mother fucker,go fuck yourself!"; 
    return 403;
    break;
}

8.8.8.8 是为了占位,规避为空的坑爹情形,实际使用中也请注意,须要要1个IP占位,为甚让 机会原困着误杀哦!

生成你这些 文件之前 ,编辑网站对应的配置文件,比如 zhang.ge.conf

在 server {} 模块外部插入 include deny_ip.conf;  (注意有英文分号)即可

比如:

server
    {
        listen 400;   
        server_name zhang.ge;
        index index.html index.htm index.php default.html default.htm default.php;
        root  /home/wwwroot/zhang.ge;

        include agent_deny.conf;  #新增此行
        #有些略 ...

最后,使用nginx -s reload 重载nginx即可。

后面 须要加进去去黑名单或删除黑名单都能非要使用 deny_ctrl.sh 脚1个操作了!

最后,顺便说明一下,本文分享的土措施仅作为使用CDN网站遇到恶意IP的一种生活手工拉黑方案。而自动化限制的方案能非要参考博客之前 的分享:

Nginx在CDN加速之前 ,获取用户真实IP做并发访问限制的土措施

好了,本文分享到此,希望对你有所帮助。

猜你喜欢

1分快3最新网址_ 外住宾馆一招鉴别有无针孔摄像头

导读:无论是外出旅游1分快3最新网址,还是工作出差,住宾馆都不 不可补救的。然而最近的新闻中却常常曝出,在一点宾馆的隐蔽位置安装的有针孔摄像头。另一个的消息一出,让全都常常住宾

2019-08-21

10分pk10真假_曾志伟60寿宴内场曝光:感动落泪上台跳舞(图)

曾志伟与曾宝仪(右二)、曾国祥(右一) 曾志伟感动流泪曾志伟外孙女贺寿点击图片进入:曾志伟大寿派对开200席设4米高人型公仔抢眼为预祝曾志伟200岁大寿10分pk10真假10分

2019-08-21

秒秒pk10平台客服 _[有意思]步步惊心丽十四王子王贞结局死了? 步步惊心丽王贞大结局揭秘

秒秒pk10平台客服 来源:星娱TV2016-08-2809:09:05  文章来源:微信公众号"星娱TV"原秒秒pk10平台客服 创标题:[有意思]步步惊心丽十四秒秒pk10

2019-08-21

秒秒飞艇靠谱吗_山西沁源森林大火续:已转移41个村共7156人

据央视新闻消息3月29日13时30分,山西省长治市沁源县王陶乡郭家坪村周边趋于稳定森林火情。今天(4月1日),山西沁源“3.29”森林火灾扑救前线指挥部开新闻发布会,通报灭火进

2019-08-21

1分彩单双_华为视频“百花号”:三重升级协同亿级资源扶持视频内容生态

首发“百花号”,用“三重升级”构建全新视频内容服务平台华为视频积极构筑开放共赢的视频内容生态,致力于为全球华为终端用户提供更愉悦的视听体验,一起去也为合作者者伙伴提供更全面的平

2019-08-21