OpenShift中Nginx如何基于$http_x_forwarded_for限制非10段IP访问
解决方案
你遇到的问题是Nginx默认的allow/deny规则仅基于直连客户端IP(即$remote_addr),此处$remote_addr为OpenShift内部代理IP,因此原有规则无法匹配真实客户端IP。有两种成熟的实现方案:
方案1:使用ngx_http_realip_module(推荐)
该模块可以将$remote_addr替换为X-Forwarded-For头中携带的真实客户端IP,原有allow/deny规则无需修改即可直接生效,兼容性和安全性更好。
操作步骤
- 首先确认Nginx已编译该模块,官方标准镜像默认已包含,可执行以下命令验证:
nginx -V 2>&1 | grep http_realip_module
有输出即为已安装。
2. 修改Nginx配置,在http块中新增realip相关配置:
http { # 原有配置保留 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; # 新增realip配置 set_real_ip_from 10.0.0.0/8; # 配置可信的内部代理IP段,可根据集群实际网段缩小范围 real_ip_header X-Forwarded-For; # 指定从X-Forwarded-For头获取真实IP real_ip_recursive on; # 递归排除所有可信代理IP,取最原始的客户端IP # 原有其他http配置保留 }
- 原有
server块中的allow 10.0.0.0/8; deny all;规则保持不变即可。 - 重载Nginx配置生效:
nginx -s reload
方案2:使用geo模块自定义判断
如果无法使用realip模块,可通过geo模块直接匹配$http_x_forwarded_for的值做访问控制:
配置示例
http { # 原有配置保留 # 新增geo规则判断客户端IP是否属于内网段 geo $http_x_forwarded_for $allow_access { default 0; 10.0.0.0/8 1; } server { listen 8080; server_name app.okd.company.com; # 注释掉原有allow/deny规则,新增访问拦截逻辑 if ($allow_access = 0) { return 403; } # 原有location等配置全部保留 } }
验证效果
配置生效后,公网IP访问会返回403错误,内网10.0.0.0/8段IP访问正常,访问日志中的$remote_addr也会显示为真实客户端IP而非内部代理IP。
内容的提问来源于stack exchange,提问作者Brandon Kauffman
相关产品推荐
相关产品推荐

