我有一个相当标准的 HAProxy / Web Cluster 设置,它运行得非常好 - 只要我不在 Web 集群服务器上启用 Shorewall 防火墙。
我一这样做,HAProxy 服务器的系统日志中就会出现错误消息,并且通过 HAProxy 提供服务的网站会返回 503。
以 HAProxy 服务器和其中一个 Web 服务器为例。
HAProxy 配置如下:
global
daemon
maxconn 8192
log 127.0.0.1 local5 info
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
log global
option httplog
option dontlognull
option http-server-close
option tcplog clf
option httplog clf
stats enable
stats refresh 10s
stats uri /haprsts
listen http-in
bind *:80
mode http
option forwardfor
default_backend www_servers
backend www_servers
balance leastconn
cookie SERVERID insert indirect nocache
server server1 XXX.XXX.XXX.XXX:9009 maxconn 128 check cookie server1
server server2 YYY.YYY.YYY.YYY:9009 maxconn 128 check cookie server2
listen https-in
mode http
bind *:443 ssl crt /etc/haproxy/certs/cert.pem
option forwardfor
reqadd X-Forwarded-Proto:\ https
default_backend www_servers_ssl
backend www_servers_ssl
balance leastconn
cookie SERVERID insert indirect nocache
server server1 XXX.XXX.XXX.XXX:9009 maxconn 128 check inter 3000 fall 2 rise 2 cookie server1
server server2 YYY.YYY.YYY.YYY:9009 maxconn 128 check inter 3000 fall 2 rise 2 cookie server2
XXX.XXX.XXX.XXX 和 YYY.YYY.YYY.YYY 是公共 IP 地址。
根据 HAProxy 配置,Apache 和 Web 服务器上的 vhosts 配置已配置为监听端口 9009。到目前为止,一切运行正常。
现在,我在 Web 服务器上打开 Shorewall 防火墙,防火墙规则文件如下:
#全部部分
#部分已建立
#相关部分
新部分
接受网络:ZZZ.ZZZ.ZZZ.ZZZ $FW:XXX.XXX.XXX.XXX TCP 9009
接受网络:WWW.WWW.WWW.WWW $FW:XXX.XXX.XXX.XXX TCP 9009
# 将 Ping 从“坏”网络区域中删除..并防止您的日志被淹没..
Ping(DROP) 净 $FW
# 允许所有 ICMP 流量从防火墙到网络区域
接受 $FW net icmp
ZZZ.ZZZ.ZZZ.ZZZ 是主 HAProxy 服务器,而 WWW.WWW.WWW.WWW 是辅助 HAProxy 服务器(目前与此问题无关)。
当 Web 服务器上启用防火墙时,所有 Web 流量都会中断。
HAProxy 服务器开始向 syslog 发送如下文件:来自 syslogd@localhost 的消息,发送时间:9 月 30 日 12:59:38...haproxy[14631]: 后端 www_servers 没有可用的服务器!
并且 Web 服务器返回 503 错误。
规则文件中还有其他规则,例如允许从特定 IP 地址在某个端口上使用 SSH,这些规则都有效,所以我假设(虽然我可能错了)它与 Shorewall 防火墙规则关系不大。
是否如此,HAProxy 需要在 Web 服务器上打开额外的端口(这是我怀疑的)?如果是这样,那些未记录的端口是什么?或者有人知道这里可能出了什么问题?
任何帮助将非常感激。
干杯,/j。
答案1
可能是健康检查触发了禁令,因为它们没有发送主机名。您可以尝试使用“httpchk”或“ssl-hello-chk”,这可能会解决问题并允许您重新启用 fail2ban。