HAProxy配置send-proxy后SSH连接失败,后端OpenSSH如何启用代理协议?
问题:HAProxy配置send-proxy后SSH转发失败,无法获取客户端真实IP
问题详情
使用以下HAProxy配置实现SSH连接转发,目的是通过send-proxy让后端SSH服务器获取客户端真实IP,但添加该选项后连接无法到达后端,移除则正常连接。HAProxy版本为1.8,日志中终止码为SD,后端运行OpenSSH_7.4p1。
HAProxy配置:
global log 127.0.0.1 local0 daemon maxconn 2048 defaults log global timeout connect 500000ms timeout client 86400s timeout server 86400s listen stats bind :1936 mode http stats enable stats realm Haproxy\ Statistics stats uri / frontend front-ssh-servers mode tcp option tcplog bind *:22 default_backend back-ssh-servers timeout client 8h backend back-ssh-servers mode tcp balance leastconn stick-table type ip size 1m expire 8h stick on src server server1 X.X.X.X:22 check send-proxy server server2 X.X.X.X:22 check send-proxy server server3 X.X.X.X:22 backup send-proxy
相关日志:
2023-02-09T10:27:59-08:00 127.0.0.1 haproxy[3190902]: X.X.X.X:36730 [09/Feb/2023:10:27:59.175] front-ssh-servers back-ssh-servers/X.X.X.X 1/0/8 21 SD 2/1/0/0/0 0/0
原因分析
日志中的SD代表Server Disconnect,即后端SSH服务器主动断开连接。原因是HAProxy通过send-proxy发送了代理协议头,但后端OpenSSH默认未开启代理协议支持,无法识别该头部信息,因此拒绝连接。
解决方案
OpenSSH 6.7及以上版本支持代理协议,需修改后端SSH服务器的sshd_config配置,启用代理协议支持。为避免影响直接连接后端SSH的场景,建议配置双端口监听:
- 修改后端服务器的
/etc/ssh/sshd_config:
# 保留原有正常SSH端口,不启用代理协议 ListenAddress 0.0.0.0:22 # 新增专门接收HAProxy转发的端口,启用代理协议 ListenAddress 0.0.0.0:2222 ProxyProtocol yes
- 修改HAProxy后端配置,将服务器端口改为新增的2222:
backend back-ssh-servers mode tcp balance leastconn stick-table type ip size 1m expire 8h stick on src server server1 X.X.X.X:2222 check send-proxy server server2 X.X.X.X:2222 check send-proxy server server3 X.X.X.X:2222 backup send-proxy
- 重启后端SSH服务:
# CentOS/RHEL系统 systemctl restart sshd # Ubuntu/Debian系统 service ssh restart
- 重启HAProxy使配置生效:
systemctl restart haproxy
这样配置后,HAProxy转发的连接会通过2222端口发送带代理协议头的请求,后端sshd能正确解析并获取客户端真实IP;直接连接后端22端口的请求不受影响。
内容的提问来源于stack exchange,提问作者Dipu H
相关产品推荐
相关产品推荐

