尽管规则明确允许,但 UFW 端口无法从公共网络访问

尽管规则明确允许,但 UFW 端口无法从公共网络访问

我有两个专用服务器:“web”(YYY.YYY.YYY.YYY)和“monitor”(XXX.XXX.XXX.XXX)。它们都位于一个大规模主机提供商(hetzner)的同一网络中。

现在在“web”上,我运行了 3 个 prometheus 指标端点:裸机主机上的 docker-engine (9323) 和作为 docker 容器的 neo4j (2004)、telegraf (9273)。两个 docker 容器都将其输出端口正确映射到主机,因此在“web”上执行的以下调用有效:

lynx http://YYY.YYY.YYY.YYY:9323/metrics => OK
lynx http://YYY.YYY.YYY.YYY:9273/metrics => OK
lynx http://YYY.YYY.YYY.YYY:2004/metrics => OK

但是从“监控”服务器调用这些端点仅适用于 bear metal 服务 docker-engine (9323)

lynx http://YYY.YYY.YYY.YYY:9323/metrics => OK
lynx http://YYY.YYY.YYY.YYY:9273/metrics => timeout
lynx http://YYY.YYY.YYY.YYY:2004/metrics => timeout

UFW status verbose 提供以下内容

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
[...]
9323/tcp                   ALLOW IN    XXX.XXX.XXX.XXX
9273/tcp                   ALLOW IN    XXX.XXX.XXX.XXX
2004/tcp                   ALLOW IN    XXX.XXX.XXX.XXX
[...]

这些 IP 没有其他规则,也没有适用于子网、接口等的一般规则。所有其他规则都是针对离散端口,如 22、80、443 等。

奇怪的是,几个小时前它还有效。与此同时,我在这里做了一些实验https://medium.com/@pitapun_44686/what-is-the-best-practice-of-docker-ufw-under-ubuntu-69e11c826b31并将以下块附加到 /etc/ufw/after.rules 的最末尾

*filter
:ufw-user-forward - [0:0]
:DOCKER-USER - [0:0]
-A DOCKER-USER -j RETURN -s 10.0.0.0/8
-A DOCKER-USER -j RETURN -s 172.16.0.0/12
-A DOCKER-USER -j RETURN -s 192.168.0.0/16
-A DOCKER-USER -j ufw-user-forward
-A DOCKER-USER -j DROP -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 192.168.0.0/16
-A DOCKER-USER -j DROP -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 10.0.0.0/8
-A DOCKER-USER -j DROP -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 172.16.0.0/12
-A DOCKER-USER -j DROP -p udp -m udp --dport 0:32767 -d 192.168.0.0/16
-A DOCKER-USER -j DROP -p udp -m udp --dport 0:32767 -d 10.0.0.0/8
-A DOCKER-USER -j DROP -p udp -m udp --dport 0:32767 -d 172.16.0.0/12
-A DOCKER-USER -j RETURN
COMMIT

现在我将其注释掉并重新启动了 ufw。那些端口 9273 和 2004 仍然无法访问,所以这不是原因。

我将 ufw 日志级别配置为高,但我看不到来自主机 XXX.XXX.XXX.XXX 的任何连接尝试或丢弃的数据包。

尝试通过 telnet 进入一个工作端口 (telnet YYY.YYY.YYY.YYY 9323) 我可以在 ufw 日志中看到通信,但看不到其他两个端口。

[UFW AUDIT] SRC=XXX.XXX.XXX.XXX DST=YYY.YYY.YYY.YYY DPT=9323 =>
[UFW AUDIT] SRC=YYY.YYY.YYY.YYY DST=XXX.XXX.XXX.XXX SPT=9323

我使用 ansible“ufw”模块配置了 ufw。

还有什么其他原因?发生了什么事?:-)

会不会是因为主机托管商的网络在这些服务器之间强加了某种过滤,以防出现“可疑”活动(频繁通信)?今天我也从 XXX.XXX.XXX.XXX 到 YYY.YYY.YYY.YYY 上的 80/443 端口运行了一些过多的 artillery.io 测试,但这个假设无法解释为什么只有这两个端口不再工作。

而最终的测试,在 YYY.YYY.YYY.YYY 关闭 ufw,也无济于事。端口 9273 和 2004 无法访问,但 9323 可以访问。

以下是iptables -L -v -n https://pastebin.com/HVeJGXb9

答案1

由于 Docker 暴露了端口 9273 和 2004,因此发往这些端口的数据包将通过FORWARD链,然后再通过DOCKER-USER链。您添加的规则DOCKER-USER阻止了大部分到 docker 容器网络的外部流量。您需要允许转发流量,ufw route allow或者您可以直接将规则添加到DOCKER-USER链中。

相关内容