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

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

做过面向公网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分飞艇棋牌_快速美白的方法 5大偏方赶走色斑【星保养】

  原文标题:快速美1分飞艇棋牌白的妙招5大偏方赶走色斑【星保养】--来源:明星保健养生分享网站-STAR星贝网;本文责任编辑/Hoda--更多独家明星健康,养生保健,生活饮食

2019-11-15

1.5分飞艇信誉网_【有意思】 美白方法 让你白起来的技巧

来源:STAR星贝网2016-06-2219:03:05  文章来源:明星颜值高分享平台-STAR星贝1.5分飞艇信誉网,更多关于明星颜值高独家爆料,3090时尚抗衰老产品、穿

2019-11-15

5分彩网址_法国前总统萨科齐因涉嫌接受政治献金被传讯

法国媒体20日援引警方消息报道说,因涉嫌非法接受利比亚前领导人卡扎菲的政治献金,法国前总统萨科齐当天被司法部门拘留传讯,接受相关调查。据法国媒体报道,巴黎互近楠泰尔的反腐败及金

2019-11-15

好运时时彩官方_急性腰扭伤不用怕,按摩四穴位可舒缓

朋友平时做家务、弯腰拿东西时,常常会一不小心已经一个劲 性体位改变,而引发急性腰扭伤。今天《生活土依据 网》小编就来分享通过按摩几次穴位来舒缓疼痛。那此人最容易位于腰扭伤?

2019-11-15

极速10分快3_10分快3APP下载_比达咨询:移动医疗细分市场开展差异化发展

中国移动医极速10分快3_10分快3APP下载疗市场已进入启动期,极速10分快3_10分快3APP下载在资本市场持续关注加剧的背景下,市场呈现出问诊、挂号、健康管理等多个垂直细

2019-11-15