通过在业务服务器前端部署支持Proxy Protocol V1/V2 的 NGINX 服务器,您可以确保日志记录与审计、访问控制与认证、安全防护和性能优化等关键场景中的客户端真实 IP 地址能够被准确获取和传递,从而提升系统的安全性、可靠性和用户体验。
使用场景
您运营一个电子商务网站,后端服务使用 TCP 协议。为了进行访问控制、日志记录和地理定位等业务判断,您需要在源站服务器内获取客户端的真实 IP 地址。NGINX 已经支持Proxy Protocol,但您的应用程序需要直接解析Proxy Protocol头以获取客户端真实 IP。
前提条件
安装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
代理。
测试和验证
快速搭建一个HTTP服务,提供一个文件浏览的Web服务。
python -m SimpleHTTPServer 8080
使用Curl 请求来模拟 TCP 请求。
curl -i "https://esa.example.com:8080"
查看NGINX服务器日志,即可获取到客户端的真实IP地址。
说明
HAProxy对PP的应用支持请参考HAProxy Proxy Protocol
该文章对您有帮助吗?