在 OpenResty Edge 中精准还原真实的客户端 IP 地址
今天,我想演示 OpenResty Edge 的另一个功能:如何在请求经过第三方代理时,从 OpenResty Edge 获取真实的客户端 IP 地址。
在大多数情况下,如果请求经过第三方代理,OpenResty Edge 接收到的客户端地址将是代理服务器的地址。
有时,我们需要获取真实的客户端 IP 地址,用于条件判断、请求频率限制或日志记录等场景。
在全局配置中设置 “真实来源 IP 信任地址” 和 “真实 IP 来源”
让我们进入 OpenResty Edge 的 Admin Web 控制台。这是我们的控制台的样例部署。每个用户都有自己的本地部署。
首先,进入 “Global Config” 页面。
这里需要进行多项配置。
首先我们要设置 Trusted hosts to set real IP
。
Trusted hosts to set real IP
是允许设置 Real IP header
的 IP 地址列表。如果请求来自不受信任的主机,Real IP header
将被忽略。
输入 IP 地址 52.53.251.226
。
接下来,我们需要指定带有代理真实 IP 的请求头。一般情况下,是 X_Forwarded_For
。
在请求头中如果存在多个 IP 地址,系统将采用列表中最后一个 IP 地址。
保存。
我们需要发布来推送这个新改动。
点击这个按钮。
发布!
改动现在已经同步到所有的网关服务器。现在,刚才的改动已经被推送到所有的网关集群和服务器。
我们的配置变化不需要服务器重载、重启或二进制升级。所以它是非常高效和可扩展的。
配置应用使其输出客户端地址
现在我们来设置应用,使其能够输出客户端地址。
我们可以继续使用之前的示例应用,test-edge.com。
进入该应用。
转到 “Page Rules” 页面。
我们已经定义了一个页面规则。这个页面规则设置了一个反向代理到某个上游。
我们将使用 EdgeLang 创建一个页面规则,来输出客户端地址。我们已经在一个专门的视频中对 EdgeLang 进行了介绍。
点击 “Edit” 按钮。
条件设置为真,表示接下来的部分将在任何情况下都会执行。
输出客户端地址。
保存。
像往常一样,我们需要发布来推送这个新改动。
点击这个按钮。
发布!
改动现在已经同步到所有的网关服务器。
验证在 OpenResty Edge 中接收到的客户端地址
我们将对网关服务器发出请求,并验证在 OpenResty Edge 上接收到的客户端地址。
我们通过终端登录到位于美国的远程服务器,将其作为代理使用。
使用 curl
命令行工具发送 HTTP 请求。
curl http://test-edge.com/
可以看到,输出的客户端地址是代理的地址。
接下来,我们将发送一个带有 X-Forwarded-For
头部的 HTTP 请求,其中包含了真实的客户端地址。
curl http://test-edge.com/ -H "X-Forwarded-For: 104.28.243.40"
可以看到,输出的客户端地址是真实的地址:104.28.243.40。
现在来看一下 X-Forwarded-For
头包含多个 IP 地址的情况。
curl http://test-edge.com/ -H "X-Forwarded-For: 104.28.243.40, 105.56.18.52"
可以看到输出的是头部的最后一个 IP 地址。
退出该服务器。
我们登录到另一个服务器,该服务器不在受信任的主机列表中。
同样发送带有 X-Forwarded-For
头的请求。
curl http://test-edge.com/ -H "X-Forwarded-For: 104.28.243.40"
可以看到,输出的客户端地址是代理的地址。
真实 IP 会影响所有与客户端 IP 相关的事务。
来看一些例子。Client city
和 Client address
将会受到影响。
Limit request rate
动作也会受到影响。
然而,限制 HTTPS 请求的 SSL 或 TLS 握手速率的功能不会受影响,因为在握手过程中没有重写客户端地址。
关于 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. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:
翻译
我们提供了英文版原文和中译版(本文)。我们也欢迎读者提供其他语言的翻译版本,只要是全文翻译不带省略,我们都将会考虑采用,非常感谢!