我在 HAProxy 服务器后面有一个 Apache 服务器。今天早些时候,该服务器不可用,HAProxy 在前端抛出了 503 错误。经过调查,似乎 iptables 开始阻止来自 HAProxy 的请求,重新启动 Apache 解决了该问题。我需要帮助找出为什么 iptables 会随机开始拒绝这些请求,这样我就可以防止这种情况再次发生。
HAProxy = 10.xxx.xxx.26
Web1 = 10.xxx.xxx.229
iptables 日志条目:
May 16 22:12:27 web1 kernel: [339449.200414] iptables denied: IN=eth1
OUT= MAC=40:40:e9:0d:29:96:40:40:25:5e:3d:74:08:00 SRC=10.xxx.xxx.26 DST=10.xxx.xxx.229
LEN=80 TOS=0x00 PREC=0xC0 TTL=64 ID=9773 PROTO=ICMP TYPE=3 CODE=3 [SRC=10.xxx.xxx.229
DST=10.xxx.xxx.26 LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=15095 DF PROTO=TCP SPT=80 DPT=43176
WINDOW=55 RES=0x00 ACK FIN URGP=0 ]
iptables 配置(为方便阅读,删除了 nagios/ssh 规则):
Web1:/var/log# cat /etc/iptables.test.rules
*filter
:INPUT ACCEPT [5620:459239]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [4375:4238642]
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -i ! lo -j REJECT --reject-with icmp-port-unreachable
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth1 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i eth1 -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -i lo -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i lo -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -j ACCEPT
COMMIT
答案1
此行是日志条目的罪魁祸首:
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
但真正有趣的东西是在输出中。HAProxy 正在向您的 Web1 服务器发送 ICMP 数据包,这就是您在日志中看到的内容。
奇怪的是类型... HAProxy 正在向您的 Web 服务器发送 ICMP 类型 3/代码 3 数据包,这是表明端口无法访问的响应。这是来自您的 Web 服务器(端口 80)到 HAProxy 服务器(Dyn 端口 43176)的早期数据包的响应。似乎发生的事情是,在 Apache 认为对话结束之前,HAProxy 结束了会话并关闭了动态端口。
我不知道上述情况发生的原因。也许可以看看超时?