我在网上查阅了大量参考资料,它们告诉我我应该能够设置一个像这样的前端:
frontend http_https
bind 1.2.3.4:443 ssl crt /etc/haproxy/tls/mycert.pem
bind 1.2.3.4:80
mode http
option httplog
option forwardfor
option http-server-close
redirect scheme https code 301 if !{ ssl_fc }
http-request set-header X-Forwarded-Port %[dst_port]
http-request add-header X-Forwarded-Proto https if { ssl_fc }
http-request set-header X-Request-Start t=%Ts%ms
http-response set-header Strict-Transport-Security max-age=15768000
use_backend %[req.hdr(host),lower,map(/etc/haproxy/domains-to-backends.map)]
tcpdump
当我在后端服务器上进行操作时,我看到了所有的add-header
和set-header
标题,但没有看到任何X-Forwarded-For
标题。
如果我添加类似以下内容:
http-request add-header X-Client-IP %[src]
我确实看到了传递的标头,带有正确的客户端 IP。
有人能解释一下为什么这个方法不起作用吗?或者有什么理由我不应该直接使用http-request set-header X-Forwarded-For %[src]
而不是option forwardfor
?
后端部分示例:
backend bk_foo
balance roundrobin
errorfile 502 /etc/haproxy/errorfiles/502.http
errorfile 503 /etc/haproxy/errorfiles/503.http
errorfile 504 /etc/haproxy/errorfiles/504.http
option httpchk
server foo.example.com 10.1.2.3:8080 check
答案1
编辑:您应该将其放在option forwardfor
后端部分。而不是前端部分。
我认为 HAProxy 配置没有任何问题。我已经使用 forwardfor 选项进行了许多配置,没有任何问题。HAProxy 和后端服务器之间是否有设备可能会删除某些标头?此外,我建议使用专注于此标头的简单设置进行测试,以确保其他配置不会导致问题。