问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

NGINX获取客户端真实IP地址的配置指南

创作时间:
作者:
@小白创作中心

NGINX获取客户端真实IP地址的配置指南

引用
1
来源
1.
https://www.alibabacloud.com/help/zh/edge-security-acceleration/esa/user-guide/nginx-obtains-the-real-ip-address-of-the-client

在使用NGINX作为反向代理时,获取客户端的真实IP地址是一个常见的需求。本文将详细介绍如何在NGINX中配置Proxy Protocol,以确保后端服务能够正确获取客户端的真实IP地址。

使用场景

您运营一个电子商务网站,后端服务使用TCP协议。为了进行访问控制、日志记录和地理定位等业务判断,您需要在源站服务器内获取客户端的真实IP地址。NGINX已经支持Proxy Protocol,但您的应用程序需要直接解析Proxy Protocol头以获取客户端真实IP。

前提条件

  • NGINX Plus R3及更高版本或 Nginx Open Source 1.5.12及更高版本支持 proxy protocol v1。
  • NGINX Plus R16及更高版本或 Nginx Open Source 1.13.11及更高版本支持 proxy protocol v2。

安装NGINX

# 安装nginx编译环境依赖
yum -y install gcc gcc-c++ autoconf automake
yum -y install zlib zlib-devel openssl openssl-devel pcre-devel
# 下载安装包
wget http://nginx.org/download/nginx-1.20.0.tar.gz
# 解压源码包
tar -zxvf nginx-1.20.0.tar.gz
# 进入目录
cd nginx-1.20.0
# 设置nginx编译安装配置,带上--with-stream
./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/usr/local/nginx/conf/nginx.conf --with-http_stub_status_module --with-http_gzip_static_module --with-stream
# 编译
make
# 安装
make install

配置NGINX支持 proxy protocol v1/v2

步骤1:修改配置文件

配置NGINX支持 proxy protocol,只需要将参数 proxy_protocol 添加在 server 块中的 listen 指令后,详情请参考Accepting the PROXY Protocol。例如:

http {
    log_format combined '$proxy_protocol_addr - $remote_user [$time_local] '
                        '"$request" $status $body_bytes_sent '
                        '"$http_referer" "$http_user_agent"';
    #...
    server {
        server_name localhost;
        listen 80   proxy_protocol;
        listen 443  ssl proxy_protocol;
        ssl_certificate      /etc/nginx/ssl/public.example.com.pem;
        ssl_certificate_key  /etc/nginx/ssl/public.example.com.key;
        location /app/ {
            proxy_pass       http://backend1;
            proxy_set_header Host            $host;
            proxy_set_header X-Real-IP       $proxy_protocol_addr;
            proxy_set_header X-Forwarded-For $proxy_protocol_addr;
        }
    }
}
stream {
    log_format basic '$proxy_protocol_addr - $remote_user [$time_local] '
                     '$protocol $status $bytes_sent $bytes_received '
                     '$session_time';
    #...
    server {
        listen              8080 ssl proxy_protocol;
        ssl_certificate     /etc/nginx/ssl/cert.pem;
        ssl_certificate_key /etc/nginx/ssl/cert.key;
        proxy_pass          esa.example.com:8080;
        proxy_protocol      on;
    }
}

步骤2:创建四层代理应用

在ESA控制台,选择四层代理,创建四层代理应用,填入对应的参数。选择业务需要的 proxy protocol v1、proxy protocol v2 代理。

测试和验证

  1. 快速搭建一个HTTP服务,提供一个文件浏览的Web服务。
python -m SimpleHTTPServer 8080

  1. 使用Curl 请求来模拟 TCP 请求。
curl -i "https://esa.example.com:8080"
  1. 查看NGINX服务器日志,即可获取到客户端的真实IP地址。

说明

HAProxy对PP的应用支持请参考HAProxy Proxy Protocol

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号