Docker 在 openvpn 上使用 vxlan 路由的 swarm overlay 网络

Docker swarm overlay network with vxlan routing over openvpn

我设置了一个有 3 个节点的 docker 群 (docker 18.03)。这些节点使用覆盖网络进行通信。

node1:  
  laptop   
  host tun0 172.16.0.6 --> openvpn -> nat gateway
  container n1
    ip = 192.169.1.10  

node2: 
  aws ec2
  host eth2 10.0.30.62
  container n2
    ip = 192.169.1.9

node3:
  aws ec2
  host eth2 10.0.140.122
  container n3
    ip = 192.169.1.12

nat-gateway:
  aws ec2
  tun0 172.16.0.1 --> openvpn --> laptop
  eth0 10.0.30.198

该方案部分有效:
1. 容器可以使用 name (n1,n2,n3)
互相 ping 2. Docker swarm 命令正在运行,可以部署服务

覆盖部分起作用。某些节点无法使用 tcp/ip 或 udp 相互通信。我尝试了 3 个节点与 udp 和 tcp/ip:

的所有组合

我在nat网关上做了一个tcpdump来监控overlay vxlan网络activity(端口4789):

tcpdump -l -n -i eth0 "port 4789"
tcpdump -l -n -i tun0 "port 4789"

然后我尝试 tcp/ip 从 node2 到 node3 的通信。在节点 3 上: nc -l -s 0.0.0.0 -p 8999 在节点 1 上: 远程登录 192.169.1.12 8999

然后节点 1 将尝试连接到节点 3。我看到数据包通过 tun0 接口进入 nat 网关:

在 nat-gateway eth0 接口上:

nat-gateway 似乎没有通过 tun0 接口发回回复。

iptables 配置nat-gateway

nat-gateway的路由

你能帮我解决这个问题吗?

我已经能够在 NAT 网关上使用以下配置解决问题:

  1. 无需伪装 172.16.0.0/22。所有的工作人员和管理人员都将通过 NAT 网关将他们的流量路由到 172.16.0.0/22,它知道如何通过 tun0 发送数据包。
  2. 伪装 eth0 是错误的...

所有容器现在都可以 ping 并相互建立 tcp/ip 连接。