协议诞生背景

  在Web分布式系统中,一般会搭建复杂的load blance系统来提供高性能的web服务。

  7层的SLB 有基于nginx/淘宝变种tengine的。后端RS会无法获取真实客户端IP。

为了解决此问题,HAProxy的作者Willy Tarreau于2010年开发和设计的一个Internet协议,通过为tcp添加一个很小的头信息,来方便的传递客户端信息(协议栈、源IP、目的IP、源端口、目的端口等),在网络情况复杂又需要获取用户真实IP时非常有用。其本质是在三次握手结束后由代理在连接中插入了一个携带了原始连接四元组信息的数据包。

截止2018年10月份 proxy protocol有两个版本,v1仅支持human-readable报头格式(ASCIII码),v2需同时支持human-readable和二进制格式,即需要兼容v1格式。

proxy protocol的接收端必须在接收到完整有效的 proxy protocol 头部后才能开始处理连接数据。因此对于服务器的同一个监听端口,不存在兼容带proxy protocol包的连接和不带proxy protocol包的连接。如果服务器接收到的第一个数据包不符合proxy protocol的格式,那么服务器会直接终止连接。

协议实现

在三次握手之后,会增加一个TCP payload包,包payload长度48字节。如图:

示例,如下图所示的第四个包就是proxy protocol的包。

proxy protocol 格式

version 1 header

    • 每个字段中间为空格(\x20)
// PROXY AF L3_SADDR L3_DADDR L4_SADDR L4_DADDR\r\n
PROXY TCP4 202.112.144.236 10.210.12.10 5678 80\r\n
PROXY TCP6 2001:da8:205::100 2400:89c0:2110:1::21 6324 80\r\n
PROXY UKNOWN\r\n

version 2 header

    • 12字节的固定signature
    • \x0D\x0A\x0D\x0A\x00\x0D\x0A\x51\x55\x49\x54\x0A
    • 4bits 协议版本号
    • \x2 // v2
    • 4bits
    • \x0 // LOCAL
      \x1 // PROXY
    • 4bits 地址族
    • \x0 // AF_UNSPEC
      \x1 // AF_INET
      \x2 // AF_INET6
      \x3 // AF_UNIX
    • 4bits transport protocol
    • \x0 // UNSPEC
      \x1 // STREAM
      \x2 // DGRAM
    • 2字节地址长度字段(网络字节序),指接下来剩余的报头长度

    • L3 S_ADDR

    • L3 D_ADDR

    • L4 S_ADDR (如果有)

    • L4 D_ADDR (如果有)

Tips

    • 目前nginx的v2版本的读取只支持 cmd 为 PROXY,transport protocol 为 STREAM
    • v2版本支持了很多新特性,详情可参考官方文档(见reference)

nginx proxy protocol 配置

  • 1.5.12 support accept for http
  • 1.9.3 support TCP write
  • 1.11.4 support accept for tcp
  • 1.13.11 support v2 read

proxy protocol 插入配置

stream {

    server {
listen 12345; proxy_pass backend.example.com:8080;
proxy_protocol on;
} }

proxy protocol 接收配置

http {
log_format elb_log '$proxy_protocol_addr'; server { listen 8080 proxy_protocol;
root /usr/local/nginx/html;
index index.html index.htm; server_name hello-world.com;
set_real_ip_from 192.168.10.0/24;
real_ip_header proxy_protocol;
} location / {
try_files $uri $uri/ /index.html; proxy_pass http://backend.example2.com:8088;
proxy_set_header X-Forwarded-For $proxy_protocol_addr;
} access_log /usr/local/nginx/stream.log elb_log;
}

参考协议发布者:https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt

参考NGINX:https://docs.nginx.com/nginx/admin-guide/load-balancer/using-proxy-protocol/
参考简书:https://www.jianshu.com/p/cc8d592582c9

参考:https://www.cnblogs.com/hugetong/p/10901359.html

七层LB-NGINX 客户端获取协议Proxy Protocol介绍的更多相关文章

  1. OSI 七层模型和 TCP/IP 协议比较

      OSI (Open System Interconnection), 开放式系统互联参考模型.从下到上七层模型功能及其代表协议: 物理层(Physical) :规定了激活.维持.关闭通信端点之间的 ...

  2. 四层LB和七层LB

    总结: 基于MAC地址玩的是二层(虚拟MAC地址接收请求,然后再分配到真实的MAC地址),      基于IP地址玩的是三层(虚拟IP地址接收请求,然后再分配到真实的IP地址),      基于IP地 ...

  3. 网络基础七层模型与TCP/IP协议

    1.网络基础 1.1 什么是网络 网络就是计算机网络是一组计算机或网络设备通过有形 的线缆或无形的媒介如无线,连接起来,按照一定的 规则,进行通信的集合. 网络通信就是指终端设备之间通过计算机网络进行 ...

  4. 计算机网络中七层,五层,四层协议;IP 地址子网划分

    七层协议: 7 应用层(http) 6 表示层(上层用户可以相互识别的数据:jpg) 5 会话层(不同主机不同线程间的通信) 4 运输层(tcp/ip:传输层提供端到端的透明数据服务)/差错控制和流量 ...

  5. OSI七层模型对应功能及协议

    前言 OSI七层模型:纯理论模型,所有实际设备和协议都不能对应理论模型. 每一层对应着实际的设备 物理层:中继器.集线器.双绞线 数据链路层:网桥.以太网交换机.网卡 网路层:路由器.三层交换机 传输 ...

  6. OSI七层模型与TCP/IP协议

    作者:菘蓝 时间:2022/9/1 ================================================================================== ...

  7. OSI七层网络模型分别是哪七层?各运行那些协议?

    本文摘自:https://blog.csdn.net/JeremyZJM/article/details/78184775 应用层 DHCP · DNS · FTP · Gopher · HTTP · ...

  8. OSI 七层,TCP 四层 , TCP 五层模型介绍

    以 TCP 四层模型为例,介绍对应的物理设备 传输层: 四层交换机,四层路由器 网络层: 路由器,三层交换机 数据链路层: 网桥,以太网交换机,网卡 物理层: 中继器,集线器,双绞线 各层功能介绍 物 ...

  9. LVS 原理(调度算法、四种模式、四层负载均衡和七层 的区别)

    参考文档:http://blog.csdn.net/ioy84737634/article/details/44916241 目录 lvs的调度算法 lvs的四种模式 四层均衡负载和七层的区别 1.l ...

随机推荐

  1. Hi3516开发笔记(五):通过HiTools使用网口将uboot、kernel、roofts和userdata按照分区表烧写镜像

    前言   前面生成了uboot,kernel,sample,userdata(我们实际修改了ip的),rootfs,现在需要烧写进入核心板.   使用网口烧写镜像(海思烧写必须占用调试串口) 步骤一: ...

  2. 【POJ1961 Period】【KMP】

    题面 一个字符串的前缀是从第一个字符开始的连续若干个字符,例如"abaab"共有5个前缀,分别是a, ab, aba, abaa, abaab. 我们希望知道一个N位字符串S的前缀 ...

  3. Atcoder Grand Contest 021 F - Trinity(dp+NTT)

    Atcoder 题面传送门 & 洛谷题面传送门 首先我们考虑设 \(dp_{i,j}\) 表示对于一个 \(i\times j\) 的网格,其每行都至少有一个黑格的合法的三元组 \((A,B, ...

  4. wget 命令用法

    wget 命令用法 1. 用法/命令格式 wget [OPTION]... [URL]... wget [参数列表] [目标软件.网页的网址] 长选项所必须的参数在使用短选项时也是必须的 2. 常用参 ...

  5. 【豆科基因组】大豆(Soybean, Glycine max)泛基因组2020Cell

    目录 一.前沿概述 二.主要结果 重测序.组装与注释 泛基因组 SV特征 PAV与古多倍化,WGD事件 基因SV与基因融合 SV与大豆驯化 SV影响基因表达及其与性状关联 一.前沿概述 Pan-Gen ...

  6. NextPolish对基因组进行polish

    NextPolish由未来组开发对基因组序列进行polish的工具,对三代以及二代均可进行polish. gituhp地址:https://github.com/Nextomics/NextPolis ...

  7. python-django-请求响应对象

    用户请求终端的信息: 包括使用的ip地址,浏览器类型等 cookie: 测试测试: def print_request(request): print(request) print("!!! ...

  8. micropython1.16官方文档转PDF

    折腾了一天,终于把micropython1.16的官方文档给转成了pdf格式. 不过转换成PDF格式以后存在两点问题: 1.PDF文档有些地方的排版中有些行距没有调整好: 2.使用latex编译tex ...

  9. R语言hist重叠图作法

    set.seed(1) h1<-hist(rnorm(1000,100,5)) h2<-hist(rnorm(1000,99,5)) plot(h2,col=rgb(255,0,0,50, ...

  10. 25-ZigZag Conversion

    The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...