简短回答:
Zabbix 配置没有任何问题;这是 Docker 引发的问题。
docker logs <hostname of Zabbix server>
据透露,Zabbix 服务器上似乎存在 NAT'ing,而且确实存在。
Docker 正在修改运行 Zabbix Server 容器的主机上的 iptables NAT 表,导致 Zabbix Server 的源地址显示为物理主机本身的 IP,而不是 Docker-Compose 分配的 IP 地址 172.16.238.3。
因此,代理并不期望该地址并拒绝连接。我对 Docker 化应用程序的体验是:mostly擅长修改 IP 表以创建正确的连接,但不适合这种特殊情况;-)。
我现在通过在主机(不是容器)上执行以下命令来查看 NAT 表:
iptables -t nat -nvx -L --line-numbers
这表明 Docker 正在,呃“helpful”并对 Zabbix 服务器的流量进行 NAT
我按规则编号删除了违规规则:
iptables -t nat -D <chain> <rule #>
之后,Zabbix 服务器的 IP 地址现在已正确呈现给接受连接的代理,并且其状态变为“绿色”。
如果执行以下命令,该问题是可以重现的:
docker-compose -f docker-compose -f docker-compose_v3_ubuntu_pgsql_latest.yaml down
然后运行up
命令再次升高容器你会看到有问题的iptables
它恢复到运行 Zabbix Server 容器的主机的 NAT 表,从而破坏与代理的连接。
较长的答案:
以下是识别和解决 Zabbix 服务器将其流量从主机 IP 进行 NAT 处理的问题所需的步骤:
确定 Zabbix Server 容器的主机是否进行 NAT:
我们需要查看 Zabbix Server 容器的 IP 如何呈现给代理,因此我们必须获取 Zabbix 的容器 IDAGENT查看其日志:
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b2fcf38d601f zabbix/zabbix-agent:ubuntu-6.0-latest "/usr/bin/tini -- /u…" 5 hours ago Up 5 hours 0.0.0.0:10050->10050/tcp, :::10050->10050/tcp DockerHost3-zabbix-agent
接下来,将代理的容器 ID 提供给docker logs
命令:
docker logs b2fcf38d601f
然后查看日志输出中被拒绝的 IP 地址以确定它是否是NOTZabbix服务器的IP:
81:20220328:000320.589 failed to accept an incoming connection: connection from "NAT'ed IP" rejected, allowed hosts: "zabbix-server"
您可以看到此错误的事实证明不存在路由或连接问题:连接正在通过,只是被应用程序拒绝 - 而不是防火墙。
如果 NAT'ing 被证明,则继续下一步
在 Zabbix SERVER 的主机上:
修复发生在 Zabbix Server 主机本身,而不是代理上。这很好,因为我们可以在一个地方解决问题,而不是在多个地方解决问题。
在上执行以下命令Host运行 Zabbix Server 的容器:
iptables -t nat -nvx -L --line-numbers
命令输出:
Chain POSTROUTING (policy ACCEPT 88551 packets, 6025269 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 MASQUERADE all -- * !br-abeaa5aad213 192.168.24.128/28 0.0.0.0/0
2 73786 4427208 MASQUERADE all -- * !br-05094e8a67c0 172.16.238.0/24 0.0.0.0/0
Chain DOCKER (2 references)
num pkts bytes target prot opt in out source destination
1 0 0 RETURN all -- br-abeaa5aad213 * 0.0.0.0/0 0.0.0.0/0
2 95 5700 RETURN all -- br-05094e8a67c0 * 0.0.0.0/0 0.0.0.0/0
我们可以看到计数器在“后布线" and "DOCKER“链——在各自的链中都规则#2。
这些规则是明确匹配且有效的。
删除违规规则HOSTZabbix 服务器容器将其流量 NAT 至代理:
sudo iptables -t nat -D POSTROUTING 2
sudo iptables -t nat -D DOCKER 2
稍等片刻,代理现在应该变为“绿色” - 假设没有其他配置或防火墙问题。如果应用修复后代理仍保持“红色”状态,请完成我在“问题”部分中记录的故障排除步骤。
结论:
我已经测试过,重新启动 Zabbix-server 容器不会重新创建已删除的规则。但再次请注意,docker-compose down
随后是一个docker-compose up
WILL重新创建已删除的规则并中断代理连接。
希望这可以节省其他人浪费的周期。我既是一名 Linux 工程师,又是一名网络工程师,这让我很头疼,所以如果你不是网络方面的高手,这几乎是不可能解决的。