协议诞生背景

  在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. C# Pechkin初始化一次后被锁住的问题

    Pechkin.dll可用于pdf的生成,常规用法网上都有介绍:https://www.cnblogs.com/felixnet/p/5143934.html 但是当在一个页面上执行过一次之后,再次就 ...

  2. 使用protobuf-java-format包 JsonFormat转Json部分默认值字段消失问题

    使用protobuf-java-format包 JsonFormat转Json部分默认值字段消失问题 1.产生的bug XXXXXXXXRequest.Builder request = XXXXXX ...

  3. Glib 对 C 函数进行单元测试

    1. Glib 单元测试框架 Glib 为单元测试提供了一套完整的测试框架,每个测试运行包括以下几个部分 测试数据结构 测试 setup 与 teardown 函数 测试函数 2. 单元测试数据结构 ...

  4. C++ and OO Num. Comp. Sci. Eng. - Part 4.

    命名空间与文件(Namespaces and Files) 在 C++ 中,命名空间为包含相关声明与定义的逻辑单元. 将一个大程序分割为不同部分并且将其储存在不同的文件中可以实现模块化编程. 未命名的 ...

  5. 关于单倍型和Phasing

    单倍型,即单倍体基因型,概念很好理解. 单倍型分型的过程就称之Phasing,定相或基因分型. Phasing的意义,在人类疾病遗传和动植物群体遗传中非常重要.也是imputation的必经过程. v ...

  6. zabbix-磁盘状态脚本

    #/bin/sh Device=$1 DISK=$2 case $DISK in tps) iostat -dmt 1 2|grep "\b$Device\b"|tail -1|a ...

  7. 如何利用nrfjprog.exe读写nrf51的flash

    版权声明:本文为博主原创文章,未经博主允许不得转载.   1.目的 为了方便平时在开发中的调试,验证一些想法是否正确. 2.平台: Jlink version:v5.02c nrf51822硬件板等. ...

  8. jQuery ajax常用示例

    总结一下jQuery ajax常用示例 $.ajax({ type: "post", //类型get,post url: urls, //链接地址 data:{"id&q ...

  9. SpringBoot整合Shiro 三:整合Mybatis

    搭建环境见: SpringBoot整合Shiro 一:搭建环境 shiro配置类见: SpringBoot整合Shiro 二:Shiro配置类 整合Mybatis 添加Maven依赖 mysql.dr ...

  10. 假期对html,css,前端的再学习

    1.观看了相关教学视频40分钟. 2.学习内容: 一 HTML 介绍 1. 什么是 HTML? 超文本标记语言: 超文本:比普通文本功能更加强大 标记语言:使用一组标签对内容进行描述的一门语言,它不是 ...