haproxy的Proxy Protocol代理协议如何应用于网络协议中?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1324个文字,预计阅读时间需要6分钟。
目录简介Proxy Protocol的实现细节版本1版本2Proxy Protocol的使用情况总结简介代理家族中的知名成员,如nginx、Apache HTTPD、stunnel等,我们都非常熟悉。我们知道代理就是替代客户端向服务器发送请求,从而实现数据传输。
Proxy Protocol的实现细节Proxy Protocol是一种在代理服务器和后端服务器之间传输客户端IP地址的协议。它定义了如何在代理服务器和目标服务器之间传递原始客户端IP地址,以便目标服务器能够正确识别请求来源。
版本1Proxy Protocol版本1支持传输客户端IP地址,但不支持传输端口号。
版本2Proxy Protocol版本2在版本1的基础上增加了端口号的支持,并且提供了更灵活的配置选项。
Proxy Protocol的使用情况Proxy Protocol主要用于以下几种情况:
1.需要记录客户端IP地址的场景,如日志记录、访问控制等。
2.需要实现负载均衡的场景,如LVS、HAProxy等。
3.需要保护后端服务器免受直接攻击的场景。
总结
Proxy Protocol是一种重要的代理协议,它能够帮助我们在复杂的网络环境中更好地管理和服务请求。了解Proxy Protocol的实现细节和使用场景对于网络管理员来说至关重要。 目录- 简介
- Proxy Protocol的实现细节
- 版本1
- 版本2
- Proxy Protocol的使用情况
- 总结
代理大家应该都很熟悉了,比较出名的像是nginx,apache HTTPD,stunnel等。
我们知道代理就是代替客户端向服务器端进行消息请求,并且希望在代理的过程中保留初始的TCP连接信息,例如源和目标IP和端口等,以提供一些个性化的操作。
一般情况下,为了实现这个目标,有一些现成的解决办法,比如在HTTP协议中,可以使用“X-Forwarded-For”标头,来包含有关原始源地址,还有"X-Original-To"用来携带目的地址的信息。
又比如在SMTP协议中,可以特别使用XCLIENT协议来进行邮件交换。
或者可以通过编译内核,把你的代理作为你服务器的默认网关。
这些方式虽然可用,但是或多或少有一些限制,要么与协议相关,要么修改修改系统架构,从而可扩展性不强。
尤其是在多个代理服务器链式调用的情况下,上述方法几乎是不可能完成的。
这就需要一个统一的代理协议,通过所有的节点都兼容这个代理协议就可以无缝实现代理的链式调用。这个代理协议就是haproxy在2010年提出的proxy Protocol。
这个代理协议的优点是:
- 它与协议无关(可以与任何7层协议一起使用,即使在加密的情况也可用)
- 它不需要任何基础架构更改
- 可以穿透NAT防火墙
- 它是可扩展的
而haproxy本身就是一个非常优秀的开源负载均衡和代理软件,提供了高负载能力和优秀的性能,所以在很多公司得以广泛的使用,比如:GoDaddy, GitHub, Bitbucket,Stack Overflow,Reddit, Slack,Speedtest.net, Tumblr, Twitter等。
今天要介绍的就是haproxy的Proxy Protocol代理协议的底层细节。
Proxy Protocol的实现细节上面我们提到了Proxy Protocol的目的就是可以携带一些可以标记初始的TCP连接信息的字段,比如IP地址和端口等。
如果是客户端和服务器端直连,那么服务器端可以通过getsockname和getpeername获得如下的信息:
- address family: AF_INET for IPv4, AF_INET6 for IPv6, AF_UNIX
- socket protocol: SOCK_STREAM for TCP, SOCK_DGRAM for UDP
- 网络层的源和目标地址
- 传输层的源和目标的端口号
所以Proxy Protocol的目的就是封装上面的这些信息,然后将上述信息放到请求头中去,这样服务器端就可以正确读取客户端的信息。
在Proxy Protocol中,定义了两个版本。
在版本1中,头文件信息是文本形式的,也就是人类可读的,采用这种方式,主要是为了在协议应用的早期保证更好的可调试性,从而快速景修正。
在版本2中,提供了对头文件的二进制编码功能,在版本1的功能已经基本完善的前提下,提供二进制编码,可以有效的提高应用的传输和处理性能。
因为有两个版本,所以在服务器的接收端也需要实现对相应版本的支持。
为了更好的应用Proxy Protocol,Proxy Protocol实际只定义了一个header信息,这个请求头会在连接发起者发起连接的时候放在每个连接的开头。并且该协议是无状态的,因为它不期望发送者在发送标头之前等待接收者,也不期望接收者发送回任何内容。
接下来,我们具体观察一下两个版本协议的实现。
版本1在版本1中,proxy header是由一串US-ASCII编码的字符串组成的。这个proxy header将会在客户端和服务器端建立连接,并且发送任何真实数据之前发送。
先来看一个使用了proxy header的www.flydean.com/20-haproxy-protocol/
最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!
本文共计1324个文字,预计阅读时间需要6分钟。
目录简介Proxy Protocol的实现细节版本1版本2Proxy Protocol的使用情况总结简介代理家族中的知名成员,如nginx、Apache HTTPD、stunnel等,我们都非常熟悉。我们知道代理就是替代客户端向服务器发送请求,从而实现数据传输。
Proxy Protocol的实现细节Proxy Protocol是一种在代理服务器和后端服务器之间传输客户端IP地址的协议。它定义了如何在代理服务器和目标服务器之间传递原始客户端IP地址,以便目标服务器能够正确识别请求来源。
版本1Proxy Protocol版本1支持传输客户端IP地址,但不支持传输端口号。
版本2Proxy Protocol版本2在版本1的基础上增加了端口号的支持,并且提供了更灵活的配置选项。
Proxy Protocol的使用情况Proxy Protocol主要用于以下几种情况:
1.需要记录客户端IP地址的场景,如日志记录、访问控制等。
2.需要实现负载均衡的场景,如LVS、HAProxy等。
3.需要保护后端服务器免受直接攻击的场景。
总结
Proxy Protocol是一种重要的代理协议,它能够帮助我们在复杂的网络环境中更好地管理和服务请求。了解Proxy Protocol的实现细节和使用场景对于网络管理员来说至关重要。 目录- 简介
- Proxy Protocol的实现细节
- 版本1
- 版本2
- Proxy Protocol的使用情况
- 总结
代理大家应该都很熟悉了,比较出名的像是nginx,apache HTTPD,stunnel等。
我们知道代理就是代替客户端向服务器端进行消息请求,并且希望在代理的过程中保留初始的TCP连接信息,例如源和目标IP和端口等,以提供一些个性化的操作。
一般情况下,为了实现这个目标,有一些现成的解决办法,比如在HTTP协议中,可以使用“X-Forwarded-For”标头,来包含有关原始源地址,还有"X-Original-To"用来携带目的地址的信息。
又比如在SMTP协议中,可以特别使用XCLIENT协议来进行邮件交换。
或者可以通过编译内核,把你的代理作为你服务器的默认网关。
这些方式虽然可用,但是或多或少有一些限制,要么与协议相关,要么修改修改系统架构,从而可扩展性不强。
尤其是在多个代理服务器链式调用的情况下,上述方法几乎是不可能完成的。
这就需要一个统一的代理协议,通过所有的节点都兼容这个代理协议就可以无缝实现代理的链式调用。这个代理协议就是haproxy在2010年提出的proxy Protocol。
这个代理协议的优点是:
- 它与协议无关(可以与任何7层协议一起使用,即使在加密的情况也可用)
- 它不需要任何基础架构更改
- 可以穿透NAT防火墙
- 它是可扩展的
而haproxy本身就是一个非常优秀的开源负载均衡和代理软件,提供了高负载能力和优秀的性能,所以在很多公司得以广泛的使用,比如:GoDaddy, GitHub, Bitbucket,Stack Overflow,Reddit, Slack,Speedtest.net, Tumblr, Twitter等。
今天要介绍的就是haproxy的Proxy Protocol代理协议的底层细节。
Proxy Protocol的实现细节上面我们提到了Proxy Protocol的目的就是可以携带一些可以标记初始的TCP连接信息的字段,比如IP地址和端口等。
如果是客户端和服务器端直连,那么服务器端可以通过getsockname和getpeername获得如下的信息:
- address family: AF_INET for IPv4, AF_INET6 for IPv6, AF_UNIX
- socket protocol: SOCK_STREAM for TCP, SOCK_DGRAM for UDP
- 网络层的源和目标地址
- 传输层的源和目标的端口号
所以Proxy Protocol的目的就是封装上面的这些信息,然后将上述信息放到请求头中去,这样服务器端就可以正确读取客户端的信息。
在Proxy Protocol中,定义了两个版本。
在版本1中,头文件信息是文本形式的,也就是人类可读的,采用这种方式,主要是为了在协议应用的早期保证更好的可调试性,从而快速景修正。
在版本2中,提供了对头文件的二进制编码功能,在版本1的功能已经基本完善的前提下,提供二进制编码,可以有效的提高应用的传输和处理性能。
因为有两个版本,所以在服务器的接收端也需要实现对相应版本的支持。
为了更好的应用Proxy Protocol,Proxy Protocol实际只定义了一个header信息,这个请求头会在连接发起者发起连接的时候放在每个连接的开头。并且该协议是无状态的,因为它不期望发送者在发送标头之前等待接收者,也不期望接收者发送回任何内容。
接下来,我们具体观察一下两个版本协议的实现。
版本1在版本1中,proxy header是由一串US-ASCII编码的字符串组成的。这个proxy header将会在客户端和服务器端建立连接,并且发送任何真实数据之前发送。
先来看一个使用了proxy header的www.flydean.com/20-haproxy-protocol/
最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

