Haproxy -- IP透传
IP透传
web服务器中需要记录客户端的真实IP地址,用于做访问统计、安全防护、行为分析、区域排行等场景。
layer 4 与 layer 7
四层:IP+PORT转发
七层:协议+内容交换
四层负载
在四层负载设备中,把client发送的报文目标地址(原来是负载均衡设备的IP地址),根据均衡设备设置的选择web服务器的规则选择对应的web服务器IP地址,这样client就可以直接跟此服务器建立TCP连接并发送数据,而四层负载自身不参与建立连接,而和LVS不同,haproxy是伪四层负载均衡,因为haproxy 需要分别和前端客户端及后端服务器建立连接
七层代理
七层负载均衡服务器起了一个反向代理服务器的作用,服务器建立一次TCP连接要三次握手,而client要访问webserver要先与七层负载设备进行三次握手后建立TCP连接,把要访问的报文信息发送给七层负载均衡;然后七层负载均衡再根据设置的均衡规则选择特定的webserver,然后通过三次握手与此台webserver建立TCP连接,然后webserver把需要的数据发送给七层负载均衡设备,负载均衡设备再把数据发送给client;所以,七层负载均衡设备起到了代理服务器的作用,七层代理需要和Client和后端服务器分别建立连接
二 四层IP透传
send-proxy ,发送到代理意思,四层代理使用(IP透传),注意此时mode tcp
listen zzhz bind 192.168.80.110:81 mode tcp log global balance roundrobin server web1 www.abc.com.cn:80 send-proxy check inter 3000 fall 2 rise 5 #注意,域名要添加hosts解析,否则会出现 haproxy[77553]: proxy zzhz has no server available! #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 www.abc.com; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" "$proxy_add_x_forwarded_for" "$proxy_protocol_addr"'
测试日志结果:
tail -f /var/log/nginx.access.conf 192.168.80.110 - - [23/Jul/2022:20:55:29 +0800] "GET /favicon.ico HTTP/1.1" 404 3650 "http://192.168.80.110:81/"
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36" "-" "192.168.80.110" "192.168.80.1"
三. 七层IP透传:当haproxy工作在七层的时候,如何透传客户端真实IP至后端服务器
在由haproxy发往后端主机的请求报文中添加“X-Forwarded-For”首部,其值为前端客户端的地址;用于向后端主发送真实的客户端IP option forwardfor [ except <network> ] [ header <name> ] [ if-none ] [ except <network> ]:请求报请来自此处指定的网络时不予添加此首部,如haproxy自身所在网络 [ header <name> ]:使用自定义的首部名称,而非“X-Forwarded-For”,示例:X-client [ if-none ] 如果没有首部才添加首部,如果有使用默认值 例: option forwardfor header X-Forwarded-xxx #自定义传递首部参数,后端web服务器写X-Forwarded-xxx, option forwardfor except 127.0.0.0/8 header X-client haproxy 配置: option forwardfor #此为默认值,首部字段默为:X-Forwarded-For listen web_host bind 192.168.80.110:81 mode http log global balance random server web1 192.168.80.110:80 weight 1 check inter 3000 fall 2 rise 5
$proxy_add_x_forwarded_for:包括客户端IP和中间经过的所有代理的IP $http_x_forwarded_For:只有客户端IP web服务器日志格式配置: 配置web服务器,记录负载均衡透传的客户端IP地址 #apache 配置: LogFormat "%{X-Forwarded-For}i %a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User- Agent}i\"" combined #tomcat 配置: pattern='%{X-Forwarded-For}i %l %T %t "%r" %s %b "%{User-Agent}i"'/> #nginx 日志格式: log_format main ' - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent""$http_x_forwarded_For""$proxy_add_x_forwarded_for" ';
tail -f /var/log/nginx/access.log nginx和haproxy同台服务器
192.168.80.110 - - [23/Jul/2022:20:01:12 +0800] "GET / HTTP/1.1" 200 15 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36" "192.168.80.1" "192.168.80.1, 192.168.80.110