NAT背后的Docker群工人

时间:2020-05-02 19:39:07

标签: docker networking docker-swarm traefik

我想在服务器上有一个位于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列表中的每个服务器/节点/工人。为什么?


在vpn后面的工人上加入这样的群时:

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的成功集群工作人员上

但是我得到了

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

在新的群集节点上。为什么要过滤?我在做什么错了?

1 个答案:

答案 0 :(得分:0)

我在这里添加它,因为它要长一些。 我认为仅管理器和远程节点就无法通信就足够了;节点之间必须能够通信。

尝试配置管理器(连接到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