龙空技术网

Linux Nginx 进阶配置? nginx map

MacLex 269

前言:

而今姐妹们对“nginx自定义状态码”大体比较讲究,我们都想要知道一些“nginx自定义状态码”的相关文章。那么小编同时在网络上收集了一些对于“nginx自定义状态码””的相关知识,希望同学们能喜欢,姐妹们一起来了解一下吧!

很多人也配置Nginx,我觉得下面这段配置有点意思,所以单独拉出来学习下.

1. **客户端证书验证**:通过检查 SSL 客户端证书的公用名称(CN),以确保只有具有有效证书的客户端可以访问服务。这是通过在 `$ssl_client_s_dn`(客户端证书的主题名称)和 `$ssl_client_s_dn_cn`(从证书中提取的CN)之间使用 `map` 指令实现的。

2. **IP白名单验证**:使用 `geo` 指令基于客户端的 IP 地址进行验证,只有在白名单中的 IP 地址才被允许访问。

3. **访问控制**:通过结合客户端证书的公用名称和来源 IP 地址的验证,来决定是否允许访问。如果客户端不在IP白名单中,或者其证书的CN不在允许的列表中,Nginx 将返回错误状态码(406或409),从而拒绝访问。

4. **请求转发**:对于通过验证的请求,Nginx 将重写请求的 URL 并将其代理转发到内部服务器地址(如 ``)。

这种配置在保护敏感服务时非常有用,因为它确保了只有经过严格验证的客户端才能访问这些服务,从而提供了双重的安全措施:证书验证和源IP验证。此外,这种配置支持将安全规则集中管理,便于维护和更新。

将创建三个配置文件:

1. `nginx.conf`:主配置文件。

2. `geo.txt`:独立的IP白名单配置文件。

3. `dev-sgpoet-client.domain.aibang.conf`:独立的客户端证书公用名称映射配置文件。

1 主配置文件

```nginxhttp {    # 主配置文件中已存在的映射    map $ssl_client_s_dn $ssl_client_s_dn_cn {        default "";        ~(^|,)CN=(?<CN>[^,]+) $CN;    }    # 包含其他配置文件    include /etc/nginx/conf.d/*.conf;    include /etc/nginx/geo.txt;    include /etc/nginx/dev-sgpoet-client.domain.aibang.conf;    # 服务器配置    server {        listen 80;        listen 443 ssl;        # 其他通用配置        # ...                # 特定URL路径的配置        include /etc/nginx/conf.d/urlpath-v1.conf;    }}```
2. IP白名单配置文件 (`geo.txt`)
```nginx# IP白名单配置geo $proxy_protocol_addr $urlpath-v1 {                                                                                                                 default 0;    119.112.80.0/20 1; ## AIBANG Global External IP Range    27.110.72.0/21 1; ## AIBANG Global External IP Range    # 更多允许的IP地址或CIDR}```
3. 客户端证书公用名称映射配置文件 (`dev-sgpoet-client.domain.aibang.conf`)
```nginx# 客户端证书公用名称映射配置map $ssl_client_s_dn_cn $urlpath-v1-CN {                                                                                                                 default 0;    dev-sgpoet-client.domain.aibang 1; # 允许特定客户端证书    # 更多允许的客户端证书公用名称}```
4 特定URL路径的配置 (`/etc/nginx/conf.d/urlpath-v1.conf`)
```nginxlocation /urlpath/v1/ {  sendfile        on;  tcp_nopush      on;  client_max_body_size 5M; # 限制上传文件大小  if ($ssl_client_verify != SUCCESS) {    return 403; # SSL证书验证不成功时返回403  }  # 客户端证书公用名称验证  if ($urlpath-v1-CN = 0 ) {    return 406; # 不允许的客户端证书公用名称返回406  }  # IP白名单验证  if ($urlpath-v1 = 0 ) {    return 409; # 不在IP白名单内返回409  }   rewrite ^(.*)$ "://dev.domain.aibang$1";  rewrite ^(.*)$ "https$1" break;  proxy_pass ; # 内部代理配置}```

配置说明:

nginx.conf 是Nginx的主配置文件,用于定义全局设置,并通过 include 指令包含其他配置文件。geo.txt 配置文件定义了一个 geo 指令块,它根据客户端的IP地址设置 $urlpath-v1 变量。如果客户端IP不在指定的范围内,则变量值为0,否则为1。dev-sgpoet-client.domain.aibang.conf 定义了一个 map 指令块,用于将SSL客户端证书的公用名称映射到 $urlpath-v1-CN 变量。如果证书公用名称不匹配,则变量值为0。/etc/nginx/conf.d/urlpath-v1.conf 是针对特定URL路径 /urlpath/v1/的配置。在这里,我们进行SSL客户端验证和IP白名单验证,并根据验证结果决定是否允许访问。 请根据您的实际环境更新上述配置文件中的IP地址、CIDR和证书公用名称,并确保文件路径与您的Nginx环境一致。此外,您需要确保 sslclientverify 和 sslclientsdncn 等变量在您的Nginx版本中可用。

当然,我将为您详细解释每一段 map 指令的配置:

第一段:map $ssl_client_s_dn $ssl_client_s_dn_cn

map $ssl_client_s_dn $ssl_client_s_dn_cn {    default "";    ~(^|,)CN=(?<CN>[^,]+) $CN;}

解释:

这段配置定义了一个变量 $ssl_client_s_dn_cn,它基于另一个变量 $ssl_client_s_dn 的值来设定。$ssl_client_s_dn 通常包含SSL客户端证书的主题名称,即客户端证书中定义的 subjectDN 字段。这段 map 块使用正则表达式来匹配 $ssl_client_s_dn 中的公用名称(Common Name,简称CN)。正则表达式 ~(^|,)CN=(?<CN>[^,]+) 查找以CN=开始的字符串,并捕获等号后面的内容到一个命名捕获组 CN如果找到匹配的CN,$ssl_client_s_dn_cn 将被设定为该CN值;如果没有找到,$ssl_client_s_dn_cn 默认为空字符串("")。第二段:geo $proxy_protocol_addr $urlpath-v1

geo $proxy_protocol_addr $urlpath-v1 {                                                                                                                 default 0;    119.112.80.0/20 1; ## AIBANG Global External IP Range    27.110.72.0/21 1; ## AIBANG Global External IP Range    # 更多允许的IP地址或CIDR}

解释:

geo 指令块用于基于客户端IP地址设定一个新变量 $urlpath-v1$proxy_protocol_addr 是一个内置变量,它包含客户端的IP地址,通常在使用了PROXY协议的连接中可用。如果客户端IP地址位于指定的CIDR范围内,则 $urlpath-v1 被设定为 1,表示允许访问。如果客户端IP不在任何指定的范围内,$urlpath-v1 的默认值是 0,表示访问被拒绝。第三段:map $ssl_client_s_dn_cn $urlpath-v1-CN

map $ssl_client_s_dn_cn $urlpath-v1-CN {                                                                                                                 default 0;    dev-sgpoet-client.domain.aibang 1; # 允许特定客户端证书    # 更多允许的客户端证书公用名称}

解释:

这是另一个 map 指令块,它创建了一个新变量 $urlpath-v1-CN 来基于客户端证书的公用名称进行映射。$ssl_client_s_dn_cn 变量(之前通过第一段 map 配置设置)包含了从客户端SSL证书中提取的公用名称。如果 $ssl_client_s_dn_cn 的值匹配 map 块中定义的任何公用名称,则 $urlpath-v1-CN 被设定为 1,表示允许访问。如果没有找到匹配项,$urlpath-v1-CN 的默认值是 0,表示访问被拒绝。

这些 map 指令块为后续的访问控制提供基础,允许nginx在处理请求时根据客户端的IP地址和SSL证书的公用名称来做出决策。

标签: #nginx自定义状态码