【问题标题】:Docker swarm worker behind NATNAT 后面的 Docker swarm worker
【发布时间】:2020-05-02 19:39:07
【问题描述】:

我想在我拥有的位于 NAT 后面的服务器上拥有一个工作节点(即不能公开端口)我认为这不是问题,但事实证明这是一个问题:

在我运行的 NAT 后面的服务器上:

docker swarm join --token SWMTKN-1... X.X.X.X:2377

这反过来又将服务器添加到集群中。我不确定“内部”IP 地址来自哪里,但在 traefik 上,如果我在 traefik 容器中执行,我将拥有一个新服务器 http://10.0.1.126:808010.0.1.126 绝对不是公共 IP):

docker exec -it 80f9cb33e24c sh

我可以 ping 到 traefik 列表中的每个服务器/节点/worker,除了新的。为什么?


当像这样在 vpn 后面的 worker 上加入 swarm 时:

docker swarm join --advertise-addr=tun0 --token SWMTKN-1-... X.X.X.X:2377

我可以从经理那里看到我网络上的新对等点:

$ docker network inspect traefik
...
        "Peers": [
            ...
            {
                "Name": "c2f01f1f1452",
                "IP": "12.0.0.2"
            }
        ]

其中12.0.0.2tun0 是从管理器到NAT 后面服务器的vpn 接口。不幸的是,当我运行时:

$ nmap -p 2377,2376,4789,7946 12.0.0.2
Starting Nmap 7.70 ( https://nmap.org ) at 2020-05-04 11:01 EDT
Nmap scan report for 12.0.0.2
Host is up (0.017s latency).

PORT     STATE  SERVICE
2376/tcp closed docker
2377/tcp closed swarm
4789/tcp closed vxlan
7946/tcp open   unknown

我可以看到码头工人的端口被关闭了,这很奇怪吗?

另外,如果我在管理器的 traefik 容器内使用nmap -p 8080 10.0.1.0/24,我会得到:

Nmap scan report for app.6ysph32io2l9q74g6g263wed3.mbnlnxusxv2wz0pa2njpqg2u1.traefik (10.0.1.62)
Host is up (0.00033s latency).

PORT     STATE SERVICE
8080/tcp open  http-proxy

在具有网络内部 ip 10.0.1.62 的成功 swarm worker 上

但我明白了:

Nmap scan report for app.y7odtja923ix60fg7madydia3.jcfbe2ke7lzllbvb13dojmxzq.traefik (10.0.1.126)
Host is up (0.00065s latency).

PORT     STATE    SERVICE
8080/tcp filtered http-proxy

在新的 swarm 节点上。为什么会被过滤?我做错了什么?

【问题讨论】:

  • 我猜集群管理器需要一条可以到达节点的路由(通过 VPN 隧道)。 docker node ls 说什么?另请注意,swarm 也需要允许 UDP 流量(端口 4789 和 7946)
  • 另外,如果远程主机使用 VPN 连接到 swarm 的网络,那么它是否在 NAT 后面应该无关紧要;只要它可以通过 VPN 隧道使用 TCP 和 UDP 与 swarm 的节点通信就可以了。
  • docker node ls 显示是Ready Active 19.03.8
  • @IonutTicus 在我在 vpn 后面添加的节点上!
  • 为什么在您的 VPN 接口上使用公共 IP 地址 (12.0.0.2)? VPN 中的所有 docker 节点都是成员吗?

标签: docker networking docker-swarm traefik


【解决方案1】:

我在这里添加它,因为它有点长。
我认为只有管理器和远程节点能够通信是不够的;节点需要能够在它们之间进行通信。

尝试配置管理器(连接到 VPN)通过 VPN 路由数据包进出远程工作人员,并在所有节点(包括远程节点)上添加所需的路由。

类似:

# Manager
sysctl -w net.ipv4.ip_forward=1  # if you use systemd you might need extra steps
# Remote node
ip route add LOCAL_NODES_SUBNET via MANAGER_TUN_IP dev tun0
#Local nodes
ip route add REMOTE_NODE_TUN_IP/32 via MANAGER_IP dev eth0

如果上述工作正常,您需要将上述路由更改永久化。

要查找所有节点的 IP 地址,请在管理器上运行以下命令:

for NODE in $(docker node ls --format '{{.Hostname}}'); do echo -e "${NODE} - $(docker node inspect --format '{{.Status.Addr}}' "${NODE}")"; done

【讨论】:

  • 抱歉,我不确定我会用什么替换这些值?
  • 好的,我知道他们的公共 IP,但其中一个是内部 VPN IP 12.0.0.2 对吧?我没有得到 IPTABLES 规则中的值?
  • 你能发布命令输出吗?如果没有网络拓扑,我无法提供准确的命令。
  • 当然是的:``` foo - X.X.X.X bar - Y.Y.Y.Y baz - 12.0.0.2 ```
  • 这是我的 3 个节点
猜你喜欢
  • 1970-01-01
  • 2019-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-01
  • 2019-01-30
  • 1970-01-01
相关资源
最近更新 更多