NGINX 域名及IP白名单拦截,Referer防盗链设置

本文详细介绍了如何通过NGINX配置实现域名和IP白名单拦截非法请求,以及利用Referer防盗链保护资源安全。内容包括四种方法:主机名正则匹配、default_server定义、Referer防盗链模块以及白名单和防盗链的组合限制,通过实例展示了配置效果。

        针对线上对外NGINX代理服务安全非常重要,接下来针对域名IP白名单配置来拦截非法请求,同时通过Referer防盗链设置判断该请求是否为合法请求,具体看本文测试操作结果。

方式一:通过http_Host来源判断主机名正则匹配:

         server_name   www.test.com 172.17.80.104;

        if ($http_Host !~* ^www.test.com|172.17.80.104$)

        {

            return 500;

        }

域名和IP都可以访问:

        

        

IP172.17.80.104访问失败

server_name   www.test.com;

        if ($http_Host !~* ^www.test.com$)

        {

            return 500;

        }

IP访问结果:

         通过IP访问被限制并跳转到错误500

                

                 

方式二:通过default_server 定义及匹配规则:

server {

  listen 172.17.80.104:80 default_server;

  server_name _;

  return 500;

}

    server {

        listen       172.17.80.104:80;

        server_name   www.test.com 172.17.80.104;

名单中域名正常访问:

                

未加入域名访问失败:

                

IP地址访问正常:

                

方法三:Nginx-利用Referer防盗链

        nginx的referer防盗链模块,利用http请求头中的 referer 信息进行校验,判断该请求是否为合法请求,是则放行,否则可以自定义返回一个结果,可防止大部分网址引用自己的资源,但是referer是可以伪造的,伪造后可以继续访问资源

1、ngx_http_referer_module模块:

用来阻止Referer首部无有效值的请求访问,可防止盗链

2、valid_referers none|blocked|server_names|string ...;

定义referer首部的合法可用值,不能匹配的将是非法值

none:请求报文首部没有referer首部

blocked:请求报文有referer首部,但无有效值

server_names:referer首部中包含本主机名

arbitrary_string:任意字符串,但可使用*作通配符

regular expression:被指定的正则表达式模式匹配到的字符串,要使用~开头,例如: ~.*.baidu.com

         server_name   www.test.com www.test2.com 172.17.80.104;

        # 拦截非法referer ,none  和 blocked 的区别看以上说明

        valid_referers blocked www.test.com 172.17.80.104 ;

        if ($invalid_referer) {

                return 403 ;

                #rewrite ^.*$ http://www.baidu.com/403.jpg;

        }

方法四:白名单加防盗链组合限制

         server {

        listen 172.17.200.234:80 default;

        server_name _;

        return 403;

}

         server_name  172.17.200.234 121.52.218.104 abc.longdundata.com;

         #拦截非法referer

         valid_referers none blocked  www.test.com;

        if ($invalid_referer) {

                return 403 ;

         }

         通过abc.longdundata.com访问显示异常,虽然白名单添加可以访问但referer未添加域名导致访问失败:

                

<think>首先,用户的问题是:“我想查找nginx进行匹配并设置白名单的方法 请问nginx如何进行匹配并设置白名单”。这基于之前的引用和系统指令。 系统指令包括: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户提供了几个引用: - [1]: Nginx白名单设置,通过设置域名白名单解决Host注入问题。 - [2]: nginx域名访问的白名单配置梳理,涉及iptables白名单限制。 - [3]: NGINX 域名IP白名单拦截Referer防盗链设置。 - [4]: nginx设置IP白名单/黑名单,涉及allow/deny指令顺序。 - [5]: 用自带的Nginx为gitlab做白名单(访问控制)。 用户说这些引用仅供参考,我需要参考用户上一次的问题和我的回答。但在这个对话中,这是第一条消息,用户直接提供了引用和问题。所以,我应该基于这些引用回答问题。 用户的问题是:“nginx如何进行匹配并设置白名单”。我需要解释Nginx中如何设置白名单,包括匹配规则。 关键点从引用中提取: - 从[1]:通过server_name设置域名白名单,使用default_server返回444拒绝无效域名。 - 从[2]:使用iptables限制IP访问端口,但这不直接在Nginx中。 - 从[3]:通过http_Host来源判断主机名正则匹配。 - 从[4]:使用allow和deny指令设置IP白名单,顺序很重要。 - 从[5]:在location块中使用deny和allow设置IP访问控制。 核心是Nginx设置方法: - IP白名单:使用allow和deny指令在server或location块中。 - 域名白名单:使用server_name匹配特定域名,并使用default_server处理无效请求。 - 匹配:可以使用正则表达式在server_name或基于Host头。 我的回答需要结构清晰: 1. **介绍**:简要解释Nginx白名单的概念。 2. **方法**:分点说明如何设置IP白名单域名白名单。 - IP白名单:使用allow/deny。 - 域名白名单:使用server_name和default_server。 - 其他方法:如基于Host头匹配。 3. **示例**:提供配置示例代码块。 4. **注意事项**:如指令顺序的重要性。 5. **相关问题**:生成相关问题用于进一步学习。 确保使用中文。 生成相关问题:基于主题,如优化配置、常见问题等。 引用标识:在回答中引用相关部分时添加[^1]等。 例如: - 参考引用[1],域名白名单设置... - 参考引用[4],allow/deny顺序... 现在,整理回答结构: - **标题**:Nginx如何设置白名单 - **正文**: 1. 什么是白名单?为什么需要? 2. IP白名单设置方法。 3. 域名白名单设置方法。 4. 其他匹配方法(如基于Host)。 5. 注意事项。 - **代码示例**:展示配置。 - **相关问题** 代码块格式:像指令中示例,使用```包围。 数学表达式:用户问题没有数学相关内容,所以可能不需要。但如果涉及,确保使用$...$。例如,没有数学,所以忽略。 回答真实可靠:基于标准Nginx配置。 最终回答草稿: - 介绍:nginx可以通过多种方式设置白名单,如允许特定IP域名访问。 - IP白名单:在server或location块中使用allow和deny指令。顺序很重要:先允许白名单IP,再拒绝所有。[^4] - 域名白名单:通过server_name列出允许的域名,并定义一个default_server返回错误码如444来拒绝其他域名。[^1] - 基于Host匹配:在location块中检查$http_host变量,使用正则匹配允许的域名。[^3] - 示例配置:展示IP白名单域名白名单的代码。 - 相关问题:1. 如何优化nginx白名单配置?2. 白名单设置中的常见错误?3. nginx白名单在实际应用中的例子? </think>### Nginx如何匹配并设置白名单方法 在Nginx中,设置白名单是一种常见的安全措施,用于仅允许特定IP地址、域名或请求访问服务,从而防止未授权访问(如Host注入攻击)。白名单设置主要通过配置文件的`server`或`location`块实现,核心方法是基于匹配规则使用指令如`allow`、`deny`、`server_name`或正则表达式。以下是详细步骤和方法,结合引用中的最佳实践。 #### 1. **IP白名单设置(基于IP地址匹配)** - **方法**:在`server`或`location`块中使用`allow`和`deny`指令,顺序至关重要——必须先允许白名单IP,再拒绝其他所有流量。 - **匹配规则**:Nginx按指令顺序从上到下执行匹配。如果允许规则匹配成功,则停止后续检查;否则拒绝。 - **示例配置**: ```nginx server { listen 80; location / { # 允许特定IP或网段 allow 192.168.1.0/24; # 允许192.168.1.x网段 allow 10.0.0.5; # 允许单个IP deny all; # 拒绝其他所有IP root /var/www/html; index index.html; } } ``` - **注意事项**:指令顺序错误会导致白名单失效。例如,如果先`deny all`再`allow`,则所有请求都会被拒绝[^4]。 - **引用说明**:此方法通过iptables端口限制虽可行,但直接在Nginx配置更灵活(如引用[2]所述),避免全局限制[^2]。 #### 2. **域名白名单设置(基于域名匹配)** - **方法**:使用`server_name`指令定义允许的域名,并添加`default_server`处理无效域名(如返回444错误)。 - **匹配规则**:Nginx根据请求的Host头匹配`server_name`。未匹配的域名由`default_server`处理。 - **示例配置**: ```nginx http { server_tokens off; # 隐藏版本号,提升安全性 # 允许的域名 server { listen 80; server_name www.example.com example.com; # 白名单域名 root /var/www/example; ... # 其他配置 } # 默认服务器拒绝无效域名 server { listen 80 default_server; server_name _; # 通配符匹配所有未定义域名 return 444; # 返回444错误,断开连接 } } ``` - **注意事项**:`default_server`确保非法域名无法访问,有效解决Host注入问题[^1]。 - **高级匹配**:使用正则表达式基于`$http_host`变量匹配Host头(如引用[3]所述)。例如: ```nginx location / { if ($http_host !~* (www\.allowed-domain\.com|allowed\.com)) { return 403; # 拒绝非白名单域名 } ... # 其他配置 } ``` #### 3. **其他匹配方法** - **基于Referer防盗链**:在`location`块中检查`$http_referer`,允许特定来源请求。 ```nginx location ~* \.(jpg|png)$ { valid_referers none blocked www.trusted.com *.trusted-domain.net; if ($invalid_referer) { return 403; # 拒绝非法Referer } } ``` - **引用说明**:此方法结合Host匹配可增强安全(如引用[3]所示)[^3]。 - **组合IP域名白名单**:在同一个配置中整合两者,例如: ```nginx server { listen 80; server_name www.example.com; location / { allow 192.168.1.100; # 仅允许特定IP访问该域名 deny all; ... # 其他配置 } } ``` #### 注意事项 - **顺序优先规则**:Nginx配置中,指令顺序决定匹配优先级(如`allow`必须在`deny`前)。测试时使用`nginx -t`验证配置。 - **性能影响**:正则匹配(如`if`语句)可能降低性能,建议在核心路径避免使用。 - **安全强化**:隐藏版本号(`server_tokens off;`)和结合防火墙(如iptables)可提供多层防护,但Nginx级配置更精确[^1][^2]。 - **动态更新**:IP域名变更时需reload配置(`nginx -s reload`),对于频繁变化场景,可集成Lua脚本或第三方模块。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值