HAProxy客户端IP地址的透传

HAProxy客户端IP地址的透传

环境准备

server IP
client 172.20.27.10
haproxy 172.20.27.20,192.168.27.10
nginx 192.168.27.21

nginx操作

1.首先对nginx的主配置中的日志做修改

[[email protected] ~]# vim /apps/nginx/conf/nginx.conf

    log_format access_json ‘{"@timestamp":"$time_iso8601",‘
 ? ? ?  ‘"host":"$server_addr",‘
 ? ? ?  ‘"clientip":"$remote_addr",‘
 ? ? ?  ‘"size":$body_bytes_sent,‘
 ? ? ?  ‘"responsetime":$request_time,‘
 ? ? ?  ‘"upstreamtime":"$upstream_response_time",‘
 ? ? ?  ‘"upstreamhost":"$upstream_addr",‘
 ? ? ?  ‘"http_host":"$host",‘
 ? ? ?  ‘"uri":"$uri",‘
 ? ? ?  ‘"domain":"$host",‘
 ? ? ?  ‘"xff":"$http_x_forwarded_for",‘        #使用http透传
 ? ? ?  ‘"referer":"$http_referer",‘
 ? ? ?  ‘"tcp_xff":"$proxy_protocol_addr",‘     #使用tcp透传
 ? ? ?  ‘"http_user_agent":"$http_user_agent",‘
 ? ? ?  ‘"status":"$status"}‘;

2.在配置文件中调用此文件

[[email protected] ~]# vim /apps/nginx/conf/servers/mylinuxops.conf
server {
        server_name www.mylinuxops.com;
        listen 80;
        access_log  /apps/nginx/logs/mylinuxops.log  access_json;
        location / {
                root /data/www;
                index index.html;
        }
}

配置HAProxy(http透传)

未使用http透传前

[[email protected] ~]# tail /apps/nginx/logs/mylinuxops.log
{"@timestamp":"2019-06-04T16:30:47+08:00",???"host":"192.168.27.21",???"clientip":"172.20.27.10",???"size":19,???"responsetime":0.000,???"upstreamtime":"-",???"upstreamhost":"-",???"http_host":"www.mylinuxops.com",???"uri":"/index.html",???"domain":"www.mylinuxops.com",???"xff":"-",???"referer":"-",???"tcp_xff":"",???"http_user_agent":"curl/7.29.0",???"status":"200"}
#xff显示为"-"

修改HAProxy配置文件,使用http模式下的ip透传

[[email protected] ~]# vim /etc/haproxy/haproxy.cfg
listen web
 bind 172.20.27.20:80
 mode http              #模式改为http
 option forwardfor      #开启forwardfor选项
 server web1 www.mylinuxops.com:80 check inter 3000 fall3 rise 5

测试
使用客户端访问

[[email protected] ~]# curl www.mylinuxops.com
www.mylinuxops.com

查看nginx上的日志

[[email protected]inx ~]# tail -f /apps/nginx/logs/mylinuxops.log
{"@timestamp":"2019-06-04T17:29:22+08:00",???"host":"192.168.27.21",???"clientip":"192.168.27.10",???"size":19,???"responsetime":0.000,???"upstreamtime":"-",???"upstreamhost":"-",???"http_host":"www.mylinuxops.com",???"uri":"/index.html",???"domain":"www.mylinuxops.com",???"xff":"172.20.27.10",???"referer":"-",???"tcp_xff":"",???"http_user_agent":"curl/7.29.0",???"status":"200"}
#"xff":"172.20.27.10" 客户端的地址被透传过来了

配置HAProxy(tcp透传)

1.修改HAProxy配置文件

[[email protected] ~]# vim /etc/haproxy/haproxy.cfg
listen web
 bind 172.20.27.20:80
 mode tcp               #将mode改为tcp
 option forwardfor      #开启forwardfor选项
 server web1 www.mylinuxops.com:80 send-proxy check inter 3000 fall 3 rise 5                    #在定义后端服务时加上 send-proxy参数。

2.修改nginx的配置文件

[[email protected] ~]# vim /apps/nginx/conf/servers/mylinuxops.conf
server {
        server_name www.mylinuxops.com;
        listen 80 proxy_protocol;       #在listen选项后添加proxy_protocol选项
        access_log  /apps/nginx/logs/mylinuxops.log  access_json;
        location / {
                root /data/www;
                index index.html;
        }
}

测试
使用客户端访问

[[email protected] ~]# curl www.mylinuxops.com
www.mylinuxops.com

在nginx上查看日志

[[email protected] ~]# tail -f /apps/nginx/logs/mylinuxops.log
{"@timestamp":"2019-06-04T17:43:57+08:00",???"host":"192.168.27.21",???"clientip":"192.168.27.10",???"size":19,???"responsetime":0.000,???"upstreamtime":"-",???"upstreamhost":"-",???"http_host":"www.mylinuxops.com",???"uri":"/index.html",???"domain":"www.mylinuxops.com",???"xff":"-",???"referer":"-",???"tcp_xff":"172.20.27.10",???"http_user_agent":"curl/7.29.0",???"status":"200"}
#"tcp_xff":"172.20.27.10"  客户端的地址在tcp的模式下被传送过来

原文地址:https://blog.51cto.com/11886307/2406608

时间: 2024-11-07 18:49:56

HAProxy客户端IP地址的透传的相关文章

java struts2入门学习实例--将客户端IP地址和访问方式输出到浏览器

实例1:实现客户端IP地址和访问方式输出到浏览器. IpAction.java package com.amos.web.action; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSup

ASP.NET获取真正的客户端IP地址的6种方法

Request.ServerVariables("REMOTE_ADDR") 来取得客户端的IP地址,但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的IP地址,而不是真正的客户端IP地址,本文将介绍解决方法,需要的朋友可以参考下 在ASP中使用 Request.ServerVariables("REMOTE_ADDR") 来取得客户端的IP地址,但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的IP地址,而不是真正的客户端IP地址. 要想透过代

再论 ASP.NET 中获取客户端IP地址

说到IP获取无非是我们常见的以下几种方式,但是具体获取的值具体区别在哪?网上不乏相关文章,说的也是很详细,但是真正使用起来,还有很多不太对的地方.IP在不同系统中,应用相当广泛,常见的日志记录.广告分区域投放等. 1: HttpContext.Current.Request.ServerVariables["HTTP_VIA"]; 2: HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"

性能优化之——.NET(C#)调用webService获取客户端IP地址所属区域(异步回调)(二)

朋友们这次分享的是异步回调不是异步调用哦! 请注意喽! 功能描述,接口地址,方法名称以及参数说明,同上篇:.NET(C#)调用webService获取客户端IP地址所属区域(非异步)(一)(LZ比较懒,不想写太多哦!(⊙0⊙)) 实现代码如下: 1 namespace main 2 { 3 class Program 4 { 5 public static string Result = string.Empty; 6 7 static void Main(string[] args) 8 {

.net 获取客户端Ip地址

Request.ServerVariables["REMOTE_ADDR"]来取得客户端的IP地址,但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的IP地址,而不是真正的客户端IP地址. 要想透过代理服务器取得客户端的真实IP地址,就要使用 Request.ServerVariables["HTTP_X_FORWARDED_FOR"]来读取. 不过要注意的事,并不是每个代理服务器都能用 Request.ServerVariables["HTTP

Mina获取客户端IP地址问题

使用Mina做Socket通信时,服务器端获取客户端IP地址,其实很简单,代码如下: @Override public void messageReceived(IoSession session, Object message) throws Exception { String clientIP = ((InetSocketAddress)session.getRemoteAddress()).getAddress().getHostAddress(); } 但是有时候却发现,session

java获取客户端IP地址和MAC地址

最近项目中要获得客户端的mac地址.服务端是移植的centos系统,arm架构的盒子.客户端是手机和移动设备.(其它场景应该也是类似的) 首先要获得ip地址: 根据客户端的http请求,利用request.getRemoteAddr()获取客户端Ip地址.在局域网内getRemoteAddr()和getRemoteHost()获得的结果相同.request.getRemoteAddr()是获得客户端的ip地址 .getRemoteHost()是获得客户端的主机名 .在有些场景中,可能有Squid

php 获取客户端IP地址经纬度所在城市

1. [代码]获取客户端IP地址经纬度所在城市 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 <?php   $getIp=$_SERVER["REMOTE_ADDR"];   echo 'IP:',$getIp;   echo '<br/>';   $content = file_get_contents("http://api.map.baidu.com/location/ip?ak=7IZ6fgGEGohCrRKUE9Rj4TSQ&a

通过新浪IP服务器获得的当前客户端IP地址对应的国家、省份或直辖市、城市信息

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getS