如何通过特殊的请求头传递真实的客户端 IP 地址到后端服务器
今天我将演示 OpenResty Edge 的另一项功能。通过特殊的请求头将真实的客户端 IP 地址传递给后端服务器。一般来说,后端服务器或源站看到的客户端 IP 地址不是真实的客户端 IP 地址,而是网关或代理服务器的 IP。如果源站需要真实的客户端 IP 地址,我们需要创建一个新的请求头,并把这个真实的地址放在请求头里。这样一来,后端服务器就可以直接读取请求头。
为应用设置页面规则
让我们进入 OpenResty Edge 的 Admin Web 控制台。这就是我们控制台的样本部署。每个用户都有自己的本地部署。
我们可以继续使用之前的示例应用,test-edge.com。
进入该应用。
在之前的教程中我们已经创建了一个上游。
我们为这个 “my backend” 上游定义了一个后端服务器。
请记住这个后端服务器的 IP 地址是以 “.100” 结尾的。在后面会用到这个 IP 地址。
我们也已经定义好了一个页面规则。
该页面规则设置了一个反向代理到我们刚才看到的上游。
现在我们要添加一个新的页面规则,将客户 IP 设置为 “X-Forwarded-For” 请求头。
首先启用一个规则条件来检查 URI “/test-client-ip/”。
这里列出了所有我们可以选择的变量。
选择 “URI”。
我们选择的运算符是 “字符串等于”。
输入 URI “/test-client-ip/”。
现在添加一个新的动作。
这里可以使用搜索。
搜索 “设置代理头”。
选中它。
输入头的名称,“X-Forwarded-For”。对于这样的需求来说这是一个经常会用到的请求。也可以使用任何你喜欢的其他名称,比如 “X-Real-IP”。
选择值的类型。我们可以为请求指定一个字符串值。
或指定 OpenResty Edge 提供的内置变量。
这是目前支持的几个内置变量,将来会支持更多的内置变量。
这里我们选择 “客户端地址”。
点击这里确保这个规则在任何现有的正常规则之前运行。
保存这个页面规则。
像往常一样,需要发布一个新的版本来推送我们刚才的改动。
点击这个按钮。
发布!
新版本现在已经同步到所有的网关服务器上了。
现在,新的页面规则已经被推送到所有的网关集群和服务器。
这些配置的变化不需要服务器重载、重启或二进制升级。所以它是非常高效和可扩展的。
测试
现在让我们发送测试请求到网关服务器。然后我们检查后端服务器收到的 “X-Forwarded-For” 请求头。
使用终端登录到英国伦敦的一个远程服务器。
请记住这个服务器的IP地址是以 “.240 ” 结尾的。
登录到服务器上。
用 “curl” 命令行工具发送一个 HTTP 请求。
curl http://test-edge.com/test-client-ip/
所以这个请求的真实客户端 IP 也应该是以 “.240” 结尾的。
退出服务器。
现在登录 IP 地址结尾是 “.100” 的后端服务器。
看一下 nginx 配置文件中定义的访问日志格式。
cd /usr/local/openresty/nginx/
显示 nginx 配置文件的前 30 行。
找到 “log format” 指令。
注意 “X-Forwarded-For” 头的值是访问日志信息的最后一个字段。
检查后端服务器的访问日志文件中的最后一行。
clear
tail -1 logs/access.log
转发请求的 “X-Forwarded-For” 头确实是以 “.240” 结尾的 IP 地址。
真正的客户端的 IP 地址就在请求头中。现在登录到另一台位于美国旧金山的服务器。
请记住这个服务器的 IP 地址是以 “.226” 结尾的。
登录到服务器上。
发送一个测试请求。
curl http://test-edge.com/test-client-ip/
所以这个请求的真实客户 IP 应该也是以 “.226” 结尾的。
退出服务器。
检查后端服务器访问日志文件中的最后一行。
不出所料,转发请求的 “X-Forwarded-For” 头确实是以 “226” 结尾的。
真正的客户端的 IP 地址又出现在请求头中。有时,OpenResty Edge 网关服务器本身可能在另一个代理后面。在这种情况下,OpenResty Edge 也需要从一些特殊的请求头中读取真实的客户端 IP 地址。这个话题我们会在另外一个教程里讨论。
关于 OpenResty Edge
OpenResty Edge 是一款专为微服务和分布式流量架构设计的全能型网关软件,由我们自主研发。它集流量管理、私有 CDN 构建、API 网关、安全防护等功能于一体,帮助您轻松构建、管理和保护现代应用程序。OpenResty Edge 拥有业界领先的性能和可扩展性,能够满足高并发、高负载场景下的苛刻需求。它支持调度 K8s 等容器应用流量,并可管理海量域名,轻松满足大型网站和复杂应用的需求。
如果你喜欢这个教程,请订阅这个博客网站和我们的 YouTube 频道 或 B 站频道。谢谢!
关于作者
章亦春是开源 OpenResty® 项目创始人兼 OpenResty Inc. 公司 CEO 和创始人。
章亦春(Github ID: agentzh),生于中国江苏,现定居美国湾区。他是中国早期开源技术和文化的倡导者和领军人物,曾供职于多家国际知名的高科技企业,如 Cloudflare、雅虎、阿里巴巴, 是 “边缘计算“、”动态追踪 “和 “机器编程 “的先驱,拥有超过 22 年的编程及 16 年的开源经验。作为拥有超过 4000 万全球域名用户的开源项目的领导者。他基于其 OpenResty® 开源项目打造的高科技企业 OpenResty Inc. 位于美国硅谷中心。其主打的两个产品 OpenResty XRay(利用动态追踪技术的非侵入式的故障剖析和排除工具)和 OpenResty Edge(最适合微服务和分布式流量的全能型网关软件),广受全球众多上市及大型企业青睐。在 OpenResty 以外,章亦春为多个开源项目贡献了累计超过百万行代码,其中包括,Linux 内核、Nginx、LuaJIT、GDB、SystemTap、LLVM、Perl 等,并编写过 60 多个开源软件库。
关注我们
如果您喜欢本文,欢迎关注我们 OpenResty Inc. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:
翻译
我们提供了英文版原文和中译版(本文) 。我们也欢迎读者提供其他语言的翻译版本,只要是全文翻译不带省略,我们都将会考虑采用,非常感谢!