6、Haproxy高级功能
6.5、IP地址透传
web服务器中记录客户端的真实IP地址,主要用于访问统计、安全防护、行为分析、区域排行等场景
6.5.1、七层负载地址透传
Haproxy工作于反向代理模式,其发往服务器的请求中的客户端IP均为Haproxy主机的地址而非真正客户端的地址,这会使得服务器的日志信息记录不了真正的请求来源,X-Forwarded-For首部则可用于解决此问题
Haproxy可以向每个发往服务器的请求上添加此首部,并以客户端IP为其value
option forwardfor语法:option forwardfor [ except <network> ] [ header <name> ] [ if-none ]
<network>:可选参数,当指定时,源地址为匹配至此网络中的请求都禁用此功能
<name>:可选参数,可自定义一个首部,如x-client来代替X-Forwarded-For
if-none:仅在此首部不存在时才将其添加至请求报文中
option forwardfor示例:
vim /etc/haproxy/haproxy.cfg
defaults
option forwardfor #此为默认值,首部字段默认为:X-Forwarded-For
frontend main
bind *:80
mode http
default_backend app
backend app
balance roundrobin
server web1 172.16.1.7:80 check
server web2 172.16.1.8:80 check
#检查后端nginx日志
172.16.1.5 - - [25/Dec/2022:11:18:36] "GET / HTTP/1.1" 200 18 "-" "curl/7.29.0" "10.0.0.1"
6.5.2、四层负载地址透传
1、配置Haproxy基于TCP协议访问
vim /etc/haproxy/haproxy.cfg
frontend main
bind *:80
mode tcp # tcp
default_backend app
backend app
balance roundrobin
server web1 172.16.1.7:80 check send-proxy #send-proxy: HA将proxy protocol协议发送到后端节点
2、配置后端web节点
#Nginx配置:变量$proxy_protocol_addr记录透传过来的客户端IP
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" "$proxy_protocol_addr"';
server {
listen 80 proxy_protocol; #启用此项,将无法直接访问此网站,只能通过四层代理访问
server_name proxy.qingchen.com;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
}
3、检查后端节点日志
标签:Haproxy,首部,透传,proxy,IP地址,80,server,客户端
From: https://blog.51cto.com/u_13236892/6681064