请选择
边缘加速
  • 站点加速
    • 概述
    • 访问控制
      • Token 鉴权
    • 文件优化
      • 智能压缩
    • 网络优化
      • HTTP/2
      • HTTP/3(QUIC)
        • 概述
        • 启用 HTTP/3
        • QUIC SDK
          • SDK 概览
          • SDK 下载和集成指引
          • 代码示例
            • Android
            • iOS
          • API 文档
            • Android
            • iOS
      • IPv6 访问
      • 最大上传大小
      • WebSocket
      • 携带客户端 IP 头部回源
      • 携带客户端 IP 地理位置头部回源
      • 开启 gRPC
    • URL 重写
      • 访问 URL 重定向
      • 回源 URL 重写
    • 修改头部
      • 修改 HTTP 节点响应头
      • 修改 HTTP 回源请求头
    • 自定义错误页面
    • 请求与响应行为
      • 请求处理顺序
      • EdgeOne 默认 HTTP 回源请求头
      • EdgeOne 默认 HTTP 响应头
  • 智能加速
  • 四层代理
    • 概述
    • 新建四层代理实例
    • 修改四层代理实例配置
    • 停用/删除四层代理实例
    • 批量配置转发规则
    • 获取客户端真实IP
      • 通过 TOA 获取 TCP 协议客户端真实 IP
      • 通过 Proxy Protocol V1/V2 协议获取客户端真实 IP
        • 概述
        • 方式一:通过 Nginx 获取客户端真实 IP
        • 方式二:在业务服务器解析客户端真实 IP
        • Proxy Protocol V1/V2 获取的客户端真实 IP 格式
      • 通过 SPP 协议传递客户端真实 IP
  • 边缘 DNS
    • 托管域名 DNS 解析
      • 修改 DNS 服务器
      • 配置域名 DNS 解析记录
      • DNS 高级配置
    • 接入加速域名
      • 添加加速域名
      • 站点/域名归属权验证
      • 修改 CNAME 解析
    • 别称域名
      • 概述
      • 配置指南
      • 通过别称域名批量接入 SaaS 建站域名
      • 别称域名实现业务的容灾
    • 流量调度
      • 流量调度管理
    • 源站配置
      • 负载均衡
        • 概述
        • 快速创建负载均衡实例
        • 健康检查策略介绍
        • 查看源站健康状态
        • 相关参考
          • 负载均衡相关概念
          • 请求重试策略介绍
      • 源站组操作指引
      • 回源配置
        • 配置回源 HTTPS
        • Host Header 重写
        • 回源请求参数设置
        • 回源跟随重定向
        • HTTP/2 回源
        • 分片回源
      • 相关参考
        • 旧版源站组兼容相关问题
        • VOD 源站相关说明
      • 获取 EdgeOne 回源节点 IP
  • 边缘缓存
    • 概述
    • EdgeOne 缓存规则介绍
      • EdgeOne 内容缓存规则
      • 缓存键(Cache Key)介绍
      • Vary 特性
    • 缓存配置
      • 自定义 Cache Key
      • 节点缓存 TTL
      • 状态码缓存 TTL
      • 浏览器缓存 TTL
      • 离线缓存
      • 缓存预刷新
    • 清除和预热缓存
      • 清除缓存
      • 预热缓存
    • 如何提高 EdgeOne 的缓存命中率
  • 规则引擎
    • 概述
    • 规则引擎支持的匹配类型与操作
    • 规则管理
    • 变量
  • 图片处理

方式一:通过 Nginx 获取客户端真实 IP

使用场景

如果您的源站服务为 TCP 协议,且当前 Nginx 已原生支持 Proxy Protocol 协议,建议在业务服务器前增加已支持 Proxy Protocol V1/V2 协议的 Nginx 服务器,以获取客户端真实 IP。您可以参考以下步骤来进行操作。
说明:
如果您当前源站服务为 TCP 协议,但是不希望部署 Nginx 服务来单独解析客户端真实 IP,希望在业务服务器内直接解析获取客户端真实 IP 以辅助业务判断逻辑,您可以参考:在业务服务器解析客户端真实 IP

部署方式




如上图所示,您需要在业务服务器前部署 Nginx 服务器,由 Nginx 服务器来完成 Proxy Protocol 字段的卸载,对真实客户端的 IP 地址收集可以通过在 Nginx 服务器上分析 Nginx 日志来完成,而业务服务器不用去关心真实客户端地址。此时,在 EdgeOne 四层代理服务中配置源站地址时,可将源站地址指向该 Nginx 服务即可。

操作步骤

步骤一:部署 Nginx 服务

请根据您所需使用的 Proxy Protocol 协议版本,选择对应的 Nginx 版本进行部署:
支持 Proxy Protocol V1:Nginx Plus R11 及以后,Nginx Open Source 1.11.4及以后。
支持 Proxy Protocol V2:Nginx Plus R16 及以后,Nginx Open Source 1.13.11及以后。
如需了解其他 Nginx 版本对 Proxy Protocol 协议的支持,请参考 Nginx 文档:Accepting the PROXY Protocol
为了在 Nginx 上启用四层代理服务,您需要安装 Nginx-1.18.0 版本及其 stream 模块。以下是安装步骤:
# 安装nginx编译环境依赖
yum -y install gcc gcc-c++ autoconf automake
yum -y install zlib zlib-devel openssl openssl-devel pcre-devel

# 解压源码包
tar -zxvf nginx-1.18.0.tar.gz
# 进入目录
cd nginx-1.18.0
# 设置nginx编译安装配置,带上--with-stream
./configure --prefix=/opt/nginx --sbin-path=/opt/nginx/sbin/nginx --conf-path=/opt/nginx/conf/nginx.conf --with-http_stub_status_module --with-http_gzip_static_module --with-stream
# 编译
make
# 安装
make install

步骤二:配置 Nginx 内 Stream 模块

以 Nginx-1.18.0版本为例,可以执行以下命令来打开 Nginx 的配置文件 nginx.conf:
vi /opt/nginx/conf/nginx.conf
Stream 模块配置内容参考如下:
stream {
# 设置日志格式,其中proxy_protocol_addr为解析PP协议拿到的客户端地址, remote_addr为上一跳的地址
log_format basic '$proxy_protocol_addr -$remote_addr [$time_local] '
'$protocol $bytes_sent $bytes_received '
'$session_time';

access_log logs/stream.access.log basic;
# upstream配置
upstream RealServer {
hash $remote_addr consistent;
# 其中127.0.0.1:8888为业务服务器的地址和端口
server 127.0.0.1:8888 max_fails=3 fail_timeout=30s;
}
# server配置
server{
# 四层监听端口,对应着四层代理配置的源站端口,需配置proxy_protocol支持对入包的PP协议解析
listen 10000 proxy_protocol;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass RealServer;
}
}

步骤三:配置四层代理转发规则

配置完 Nginx 服务后,您可以前往控制台的四层代理服务,修改四层代理转发规则。将源站地址修改为当前 Nginx 服务的 IP,源站端口为 步骤二 内配置的四层监听端口。传递客户端 IP 时,根据您当前使用的 Nginx 版本支持情况,选择 Proxy Protocol V1 或 Proxy Protocol V2。




步骤四:模拟客户端请求,验证结果

可以通过搭建 TCP 服务,然后使用另一台服务器模拟客户端请求进行验证。具体示例如下:
1. 可以使用 Python 在当前服务器上创建一个 HTTP 服务,来模拟 TCP 服务。
# 基于python2
python2 -m SimpleHTTPServer 8888

# 基于python3
python3 -m http.server 8888
2. 用另一台服务器充当客户端,构造客户端请求,以 Curl 请求来模拟 TCP 请求:
# 利用curl发起http请求, 其中域名为四层代理域名,8888为四层代理转发端口
curl -i "http://d42f15b7a9b47488.davidjli.xyz.acc.edgeonedy1.com:8888/"
3. 在 Nginx 服务器上查看 Nginx 日志,如下展示:



您可以在 Nginx 服务器上进行抓包,并通过 Wireshark 分析数据包。在 TCP 握手完成后,第一个业务数据包的前面会添加 Proxy Protocol 字段。下面是 Proxy Protocol V1 版本的示例:①四层代理出口 IP、②Nginx 服务器 IP、③协议版本、④真实客户端 IP 地址。