Dockerized Zabbix:服务器无法通过 IP 连接到代理

2023-12-09

Problem:

我正在尝试使用 Zabbix 的 Docker-Compose 存储库在 Ubuntu 20.04 LTS 上配置完全容器化的 Zabbix 6.0 版监控系统HERE.

我用来启动 Zabbix 服务器和 Zabbix 代理的命令是:

docker-compose -f docker-compose_v3_ubuntu_pgsql_latest.yaml --profile all up -d

虽然代理在损坏状态下启动并显示“红色”状态,但当我更改其 IP 地址时FROM127.0.0.1TO 172.16.239.6(Docker-Compose 分配给它的默认 IP)Zabbix Server 现在可以成功连接并建立监控。HOWEVER:Zabbix Server 无法连接到任何其他 Dockerized Zabbix AgentREMOTE与养育的主机docker run命令:

docker run --add-host=zabbix-server:172.16.238.3 -p 10050:10050 -d --privileged --name DockerHost3-zabbix-agent -e ZBX_SERVER_HOST="zabbix-server" -e ZBX_PASSIVE_ALLOW="true" zabbix/zabbix-agent:ubuntu-6.0-latest

NOTE:我查看了其他堆栈组来发布这个问题,但是堆栈溢出似乎是这些 Docker/Zabbix 问题的首选小组,有超过 30 个此类问题。

故障排除:

对比分析:

代理配置:

使用以下命令对与 Zabbix Server 位于同一主机上的工作(“绿色”)代理与显示“红色”状态(Zabbix 服务器无法联系)的不同主机上的代理进行比较分析,显示配置具有奇偶校验。

docker exec -u root -it (ID of agent container returned from "docker ps") bash

然后执行:

grep -Ev ^'(#|$)' /etc/zabbix/zabbix_agentd.conf

Ports:

从命令的输出来看,正确的端口在“红色”代理上显示为打开,就像在与 Zabbix Server 运行在同一主机上的“绿色”代理上打开一样:

ss -luntu

NOTE:此命令是从 HOST 发出的,而不是从 Agent 的 Docker 容器发出的。

防火墙:

审查iptables使用以下命令从主机(而不是容器)发出的规则没有显示任何值得关注的内容:

iptables -nvx -L --line-numbers

但为了排除防火墙,我仍然允许一切进入iptables在 Zabbix 服务器和用于测试的“红色”状态的 Agent 上的 FORWARD 表中。

我还允许 MikroTik GW 路由器上的所有内容将 Zabbix Server 连接到运行 Zabbix Agent 的不同物理主机。

Routing:

Zabbix 服务器可以 ping 远程代理接口,证明存在到代理的路由。

应用程序装甲:

我还停止了 AppArmor 以将其排除为因果关系:

sudo systemctl stop apparmor
sudo systemctl status apparmor

Summary:

因此,一切都是开放的,Zabbix Server 可以路由到代理,并且“红色”代理的配置与位于 Zabbix Server 本身同一主机上的“绿色”代理的配置具有奇偶性。

我已经在生产环境中成功设置了非容器化 Zabbix 安装,因此我对 Zabbix 很熟悉。

为什么容器化Zabbix Server无法连接到不同主机上的容器化Zabbix Agent?


简短回答:

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 工程师,又是一名网络工程师,这让我很头疼,所以如果你不是网络方面的高手,这几乎是不可能解决的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dockerized Zabbix:服务器无法通过 IP 连接到代理 的相关文章

随机推荐