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

Dockerized Zabbix: Server Can't Connect to the Agents by IP

问题:

我正在尝试使用 Zabbix 的 Docker-Compose 存储库 HERE.

在 Ubuntu 20.04 LTS 上配置完全容器化的 Zabbix 6.0 版监控系统

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

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

虽然Agent在故障状态下启动并显示“红色”状态,但当我更改其IP地址时FROM 127.0.0.1 TO 172.16.239.6(默认 IP Docker-Compose 分配给它)Zabbix 服务器现在可以成功连接并建立监控。 HOWEVER:Zabbix 服务器无法连接到 REMOTE 主机上的任何其他 Dockerized Zabbix 代理,这些主机由 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

注意:我查看了其他 Stack 组 post 这个问题,但是 Whosebug 似乎是 -对这些 Docker/Zabbix 个问题进行分组,此类问题超过 30 个。

疑难解答:

对比分析:

代理配置:

与 Zabbix 服务器在同一主机上的工作(“绿色”)代理与不同主机上的代理显示“红色”状态(不是 contactable 通过 Zabbix 服务器)的比较分析使用以下命令显示配置具有奇偶校验。

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

然后执行:

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

端口:

正确的端口在“红色”代理上显示为打开,在“绿色”代理上显示为打开 运行 在与命令输出的 Zabbix 服务器相同的主机上:

ss -luntu

注意:此命令是从主机发出的,而不是代理的 Docker 容器。

防火墙:

使用以下命令从主机(非容器)查看 iptables 规则没有发现任何问题:

iptables -nvx -L --line-numbers

但是为了排除防火墙,我仍然在 Zabbix 服务器和用于测试的“红色”状态的代理上允许 FORWARD table 中 iptables 中的所有内容。

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

路由:

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

AppArmor:

我还停止了 AppArmor 以将其排除在外:

sudo systemctl stop apparmor
sudo systemctl status apparmor

总结:

所以一切都是开放的,Zabbix 服务器可以路由到代理,并且“红色”代理的配置与位于 Zabbix 服务器本身的同一主机上的“绿色”代理的配置相同.

我已经在生产环境中成功安装了非容器化的 Zabbix,所以我对 Zabbix 很熟悉。

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

简答:

Zabbix 配置没有任何问题;这是一个 Docker-induced 问题。

docker logs <hostname of Zabbix server> 显示 Zabbix SERVER 上似乎发生了 NAT,而且确实发生了。

Docker 正在修改主机 运行 上的 iptables NAT table 宁 Zabbix Server 容器导致 Zabbix Server 的源地址呈现为物理主机本身的 IP,而不是 Docker-Compose 分配的 IP 地址 172.16.238.3.

因此,代理不期望此地址并拒绝了连接。我对 Docker 化应用程序的体验是,它们 大部分 擅长修改 IP tables 以创建正确的连接,但在这种特殊情况下不是这样 ;-) .

我现在通过在主机(不是容器)上执行以下命令来查看 NAT table:

iptables -t nat -nvx -L --line-numbers

这表明 Docker 正在,呃,“ 有帮助” 和 NAT'ing Zabbix 服务器的流量

我按规则编号删除了违规规则:

iptables -t nat -D <chain> <rule #>

之后,Zabbix 服务器的 IP 地址现在已正确呈现给现在接受连接的代理,并且它们的状态变为“绿色”。

如果您执行:

,问题会重现
docker-compose -f docker-compose -f docker-compose_v3_ubuntu_pgsql_latest.yaml down

然后 运行 up 命令再次启动容器你会看到有问题的 iptables 规则它恢复到主机的 NAT table 运行使 Zabbix 服务器的容器中断与代理的连接。

更长的答案:

以下是识别和解决 Zabbix 服务器将其流量从主机 IP 转移到 NAT 问题所需的步骤:

确定 Zabbix Server 容器的主机是否为 NAT:

我们需要查看 Zabbix 服务器容器的 IP 如何呈现给代理,因此我们必须获取 Zabbix AGENT 的容器 ID 以查看其日志:

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 地址以确定它是否不是 Zabbix 服务器的 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 服务器的主机本身,而不是代理。这很好,因为我们可以在一个地方解决问题而不是很多地方。

Host 运行ning 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

我们可以看到“POSTROUTING”和“[的计数器正在递增=113=]" 链 - 都在各自的链中规则 #2。 这些规则明确匹配并生效。

删除 Zabbix 服务器容器 HOST 上的违规规则,该容器正在将其流量 NAT 到代理:

sudo iptables -t nat -D POSTROUTING 2
sudo iptables -t nat -D DOCKER 2

稍等片刻,代理现在应该变为“绿色”- 假设没有其他配置或防火墙问题。如果在应用修复后代理仍然是“红色”,那么请完成我在问题部分记录的故障排除步骤。

结论:

我已经测试并重新启动 Zabbix-server 容器不会重新创建已删除的规则。但再次请注意,docker-compose down 后跟 docker-compose up 重新创建已删除的规则并中断代理连接。

希望这可以节省其他人浪费的周期。我既是 Linux 又是网络工程师,这让我很头疼,所以如果您不是网络专家,这几乎不可能解决。