如何使用 HAproxy 剥离代理协议?
How to strip Proxy protocol with HAproxy?
考虑以下情况:
Internet
||
||
.------''------.
| HTTPS (:443) |
'------..------'
||
.-----------------------'|
| \/
| 3rd party HAproxy service
| ||
| ||
optional .-----------''-----------.
route | PROXY Protocol (:5443) |
| '-----------..-----------'
| || ________
___________|_______________________||________________________________| SERVER |____
| | \/ |
| | local HAproxy |
| | || |
| | || |
| | .------''------. |
| | | HTTPS (:443) | |
| | '------..------' |
| | || |
| | || |
| | \/ |
| '---------------> local webserver |
|___________________________________________________________________________________|
后端服务器在本地 运行 端口 5443 和 443 上分别有 HAproxy 和 Apache httpd。
我的本地网络服务器不支持 PROXY 协议。所以我希望 HAproxy 从第 3 方服务捕获代理协议,并通过 HTTPS 或简单的 TCP pass-through.
将数据传递到本地网络服务器
在 HTTPS 的情况下,我想它应该使用正确的 SSL-certificate 来操作 HTTP 数据包,以在 X-Forwarded-For
HTTP headers 中添加原始发件人 IP(应该提供通过 PROXY 协议)。
然而,documentation of HAproxy is awful if you are new to HAproxy, and I could not find examples that explain how to do this. I know it has to be possible since HAproxy is listed as "Proxy-protocol ready software",却如何?
是的,您需要使用给定的“第 3 方 HAproxy 服务”中使用的 accept-proxy
keyword after bind
in the frontend declaration. It will also be good to read about the related send-proxy
keyword。
可以使用以下 HAproxy 配置将 PROXY 协议剥离回其原始状态:
frontend app-proxy
bind *:5443 accept-proxy
mode tcp
option tcplog
default_backend app-httpd
backend app-httpd
mode tcp
server app1 127.0.0.1:443 check
这将在端口 5443 上接受代理协议,剥离它,并将 TCP 数据发送到 443
。
如果您想操纵 SSL-encrypted TCP 数据中的 HTTP 数据包,您需要有权访问正确的 SSL 证书(您的网络服务器应该已经可以访问)。这就是您可能想要做的。
frontend app-proxy
bind *:5443 accept-proxy ssl crt /path/to/certnkey-file.pem
mode http
option httplog
default_backend app-httpd
backend app-httpd
mode http
server app1 127.0.0.1:443 check ssl verify none
后一种方法的优点是在通过代理时保留了原始客户端数据,因此您知道访问者的原始 IP 是什么。这就是首先使用 PROXY 协议的整个想法! HAproxy 将使用使用 PROXY 协议传输的正确 IP-address 自动更新 X-Forwarded-For
header。
考虑以下情况:
Internet
||
||
.------''------.
| HTTPS (:443) |
'------..------'
||
.-----------------------'|
| \/
| 3rd party HAproxy service
| ||
| ||
optional .-----------''-----------.
route | PROXY Protocol (:5443) |
| '-----------..-----------'
| || ________
___________|_______________________||________________________________| SERVER |____
| | \/ |
| | local HAproxy |
| | || |
| | || |
| | .------''------. |
| | | HTTPS (:443) | |
| | '------..------' |
| | || |
| | || |
| | \/ |
| '---------------> local webserver |
|___________________________________________________________________________________|
后端服务器在本地 运行 端口 5443 和 443 上分别有 HAproxy 和 Apache httpd。
我的本地网络服务器不支持 PROXY 协议。所以我希望 HAproxy 从第 3 方服务捕获代理协议,并通过 HTTPS 或简单的 TCP pass-through.
将数据传递到本地网络服务器在 HTTPS 的情况下,我想它应该使用正确的 SSL-certificate 来操作 HTTP 数据包,以在 X-Forwarded-For
HTTP headers 中添加原始发件人 IP(应该提供通过 PROXY 协议)。
然而,documentation of HAproxy is awful if you are new to HAproxy, and I could not find examples that explain how to do this. I know it has to be possible since HAproxy is listed as "Proxy-protocol ready software",却如何?
是的,您需要使用给定的“第 3 方 HAproxy 服务”中使用的 accept-proxy
keyword after bind
in the frontend declaration. It will also be good to read about the related send-proxy
keyword。
可以使用以下 HAproxy 配置将 PROXY 协议剥离回其原始状态:
frontend app-proxy
bind *:5443 accept-proxy
mode tcp
option tcplog
default_backend app-httpd
backend app-httpd
mode tcp
server app1 127.0.0.1:443 check
这将在端口 5443 上接受代理协议,剥离它,并将 TCP 数据发送到 443
。
如果您想操纵 SSL-encrypted TCP 数据中的 HTTP 数据包,您需要有权访问正确的 SSL 证书(您的网络服务器应该已经可以访问)。这就是您可能想要做的。
frontend app-proxy
bind *:5443 accept-proxy ssl crt /path/to/certnkey-file.pem
mode http
option httplog
default_backend app-httpd
backend app-httpd
mode http
server app1 127.0.0.1:443 check ssl verify none
后一种方法的优点是在通过代理时保留了原始客户端数据,因此您知道访问者的原始 IP 是什么。这就是首先使用 PROXY 协议的整个想法! HAproxy 将使用使用 PROXY 协议传输的正确 IP-address 自动更新 X-Forwarded-For
header。