首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Dockerized :服务器无法通过IP连接到代理

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

Stack Overflow用户
提问于 2022-03-28 12:58:20
回答 1查看 1.9K关注 0票数 1

问题:

我试图在Ubuntu20.04LTS上配置一个完全容器化的ZabbixVersion6.0监控系统,使用的是Zabbix的Docker找到的这里

我用来引发Zabbix服务器和Zabbix代理的命令是:

代码语言:javascript
运行
复制
docker-compose -f docker-compose_v3_ubuntu_pgsql_latest.yaml --profile all up -d

虽然代理处于中断状态并显示“红色”状态,但当我将其‘IP地址’从 127.0.0.1 更改为 172.16.239.6 (默认IP Docker-组合分配给它)时,Zabbix服务器现在可以成功地连接和监视。然而,:Zabbix无法连接到远程主机上的任何其他Dockerized代理,这些代理是通过docker run命令引发的:

代码语言:javascript
运行
复制
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组来发布这个问题,但是Stackoverflow似乎是这些Docker/Zabbix问题的转到组,有超过30个这样的问题。

故障排除:

比较分析:

代理配置:

使用以下命令对与Zabbix服务器相同主机上的工作(“绿色”)代理与显示“红色”状态( Zabbix服务器不可接触)的不同主机上的代理进行比较分析,结果表明配置具有奇偶性。

代码语言:javascript
运行
复制
docker exec -u root -it (ID of agent container returned from "docker ps") bash

然后执行:

代码语言:javascript
运行
复制
grep -Ev ^'(#|$)' /etc/zabbix/zabbix_agentd.conf

港口:

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

代码语言:javascript
运行
复制
ss -luntu

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

消防队:

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

代码语言:javascript
运行
复制
iptables -nvx -L --line-numbers

但为了排除防火墙问题,我还是允许iptables中的所有内容都位于Zabbix服务器上的前表中,并允许代理处于用于测试的“红色”状态。

我还允许在MikroTik GW路由器上将Zabbix连接到运行Zabbix代理的不同物理主机上。

路由:

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

AppArmor:

我还阻止了AppArmor,将其排除为因果关系:

代码语言:javascript
运行
复制
sudo systemctl stop apparmor
sudo systemctl status apparmor

摘要:

因此,一切都是开放的,Zabbix服务器可以路由到代理,而"red“代理的配置与居住在Zabbix服务器本身的同一主机上的”绿色“代理的配置具有奇偶性。

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

为什么容器化的Zabbix服务器不能连接到不同主机上的容器化Zabbix代理?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-28 13:00:15

简短答覆:

Zabbix配置没有什么问题;这是一个由Docker引发的问题。

docker logs <hostname of Zabbix server>透露,在Zabbix服务器上似乎出现了NAT‘’ing,而且确实有。

Docker正在修改运行Zabbix Server容器的主机上的iptables NAT表,导致Zabbix Server的源地址显示为物理主机本身的IP,而不是Docker-组合分配的172.16.238.3 IP地址。

因此,代理没有期望这个地址,并拒绝了连接。我对Dockerized的经验是,它们大多擅长修改IP表以创建正确的连接,但在这种情况下却不是这样;-)。

我现在通过在主机(非容器)上执行以下命令来检查NAT表:

代码语言:javascript
运行
复制
iptables -t nat -nvx -L --line-numbers

这表明,Docker是,呃,“有用的”和NAT‘’ing Zabbix服务器的流量

我根据违规规则号删除了这些违规规则:

代码语言:javascript
运行
复制
iptables -t nat -D <chain> <rule #>

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

如果执行以下操作,则该问题是可重复的:

代码语言:javascript
运行
复制
docker-compose -f docker-compose -f docker-compose_v3_ubuntu_pgsql_latest.yaml down

然后运行up命令,再次引发容器,您将看到它还原到运行Zabbix容器的主机的NAT表中的违规iptables规则,破坏了与代理的连接。

较长的答覆:

以下是标识和解决Zabbix服务器NAT‘’ing主机IP外流量问题所需的步骤:

确定Zabbix服务器容器的主机是否正在NAT‘’ing:

我们需要查看Zabbix的容器的IP是如何呈现给代理的,因此我们必须获得Zabbix 代理的容器ID来检查它的‘日志:

代码语言:javascript
运行
复制
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

接下来,向docker logs命令提供代理的容器ID:

代码语言:javascript
运行
复制
docker logs b2fcf38d601f

然后检查日志输出中被拒绝的IP地址,以确定它是而不是,Zabbix的IP:

代码语言:javascript
运行
复制
81:20220328:000320.589 failed to accept an incoming connection: connection from "NAT'ed IP" rejected, allowed hosts: "zabbix-server"

您可以看到此错误的事实证明,不存在路由或连接问题:连接正在通过,它只是被应用程序拒绝,而不是防火墙。

如果纳宁被证实了,继续下一步

在Zabbix服务器主机上:

补救发生在Zabbix Server的主机本身,而不是代理。这很好,因为我们可以在一个地方解决问题,而不是很多地方。

在运行Zabbix容器的主机上执行以下命令:

代码语言:javascript
运行
复制
iptables -t nat -nvx -L --line-numbers

命令输出:

代码语言:javascript
运行
复制
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  
代码语言:javascript
运行
复制
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“和"DOCKER”链,计数器都在递增--这两个规则都在它们各自的链中。这些规则显然是匹配的,并具有效力。

删除Zabbix服务器容器的主机上的违规规则,即NATing它对代理的流量:

代码语言:javascript
运行
复制
sudo iptables -t nat -D POSTROUTING 2
sudo iptables -t nat -D DOCKER 2

稍等片刻,代理就会变成“绿色”--假设没有其他配置或防火墙问题。如果代理在应用修复后保持“红色”,那么请执行我在“问题”部分中记录的故障排除步骤。

结论:

我已经测试并重新启动了Zabbix服务器容器,没有重新创建已删除的规则。但是,请再次注意,docker-compose downdocker-compose up 后面的将重新创建已删除的规则并破坏代理的连接。

希望这能拯救其他人浪费的周期。我是一个Linux和网络工程师,这伤害了我的头,所以如果你不是网络专家,这几乎是不可能解决的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71647841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档