You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过VPN实现Docker Swarm节点接入及端口访问可行性咨询

解决方案:通过VPN隧道打通Docker Swarm跨网络节点通信

针对你的场景,答案是完全可行的——既可以通过VPN隧道让受限制网络中的Pi2工作节点接收入站连接,也能借助Swarm的Overlay网络访问这些节点上的所有端口。下面是具体的实现思路和步骤:

一、用反向VPN让Pi2主动接入Swarm管理节点

因为Pi2所在网络拦截所有入站连接,所以必须采用反向VPN方案:让Pi2作为VPN客户端主动发起连接到Digital Ocean的管理节点,建立持久的双向通信隧道。推荐用WireGuard(轻量、低资源占用,适合树莓派),步骤如下:

1. 在DO管理节点部署WireGuard服务器

  • 安装WireGuard:apt install wireguard(Debian/Ubuntu系)
  • 生成服务器和客户端密钥对:
    # 生成服务器密钥
    wg genkey | tee server_private.key | wg pubkey > server_public.key
    # 生成Pi2密钥
    wg genkey | tee pi2_private.key | wg pubkey > pi2_public.key
    
  • 配置服务器的/etc/wireguard/wg0.conf:
    [Interface]
    Address = 10.10.10.1/24  # 自定义VPN子网
    ListenPort = 51820        # VPN监听端口
    PrivateKey = <服务器私钥,来自server_private.key>
    PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
    
    [Peer]
    PublicKey = <Pi2的公钥,来自pi2_public.key>
    AllowedIPs = 10.10.10.2/32  # Pi2的VPN静态IP
    
  • 启动WireGuard并设置开机自启:
    wg-quick up wg0
    systemctl enable wg-quick@wg0
    
  • 在DO的防火墙中开放51820/udp(VPN端口),以及Swarm集群所需的端口:2377/tcp(集群管理)、7946/tcp/udp(节点间 gossip 通信)、4789/udp(Overlay网络VXLAN)。

2. 在Pi2上配置WireGuard客户端

  • 安装WireGuard:apt install wireguard(Raspberry Pi OS)
  • 创建/etc/wireguard/wg0.conf:
    [Interface]
    Address = 10.10.10.2/24
    PrivateKey = <Pi2的私钥,来自pi2_private.key>
    
    [Peer]
    PublicKey = <服务器公钥,来自server_public.key>
    Endpoint = <DO节点的公网IP>:51820
    AllowedIPs = 10.10.10.0/24, <DO节点的Swarm管理IP>  # 确保能访问管理节点的Swarm通信地址
    PersistentKeepalive = 25  # 保持NAT连接不中断
    
  • 启动并自启WireGuard:
    wg-quick up wg0
    systemctl enable wg-quick@wg0
    

3. 将Pi2通过VPN隧道加入Swarm

在Pi2上执行Swarm加入命令时,指定VPN分配的IP作为节点的通信地址:

docker swarm join --token <你的Swarm join token> <DO节点的VPN IP>:2377 --advertise-addr 10.10.10.2

这样Swarm集群内的所有通信都会通过VPN隧道进行,绕过Pi2所在网络的入站限制。

二、通过Overlay网络访问Pi2的所有端口

只要Swarm节点之间的通信隧道(VPN)正常,Overlay网络就能完全发挥作用,允许你访问Pi2上容器的所有端口(无论是否暴露给主机):

关键原理

Docker Swarm的Overlay网络基于VXLAN技术,只要节点间能互相通信(这里通过VPN打通了三层网络),Overlay网络就会自动在节点间建立加密的容器通信通道。容器之间可以直接通过Overlay网络的IP访问任意端口,不需要额外的端口映射。

验证方法

  1. 创建一个Overlay网络:
    docker network create --driver overlay my_overlay_net
    
  2. 在Pi2上部署一个测试容器(比如带SSH的镜像):
    docker service create --name test-pi --network my_overlay_net --constraint node.hostname==<Pi2的主机名> lscr.io/linuxserver/openssh-server
    
  3. 在管理节点或其他Swarm节点上,启动一个同网络的容器并测试访问:
    docker run --rm --network my_overlay_net alpine ssh test-pi:22
    
    如果能正常连接,说明Overlay网络已经可以访问Pi2容器的任意端口。

额外注意事项

  • 确保VPN隧道的带宽和延迟满足你的服务需求,树莓派2的性能有限,尽量选择轻量的VPN协议(WireGuard是最优选择)。
  • 如果需要通过Traefik暴露Pi2上的服务,只需将Traefik部署在Swarm集群中(建议在管理节点),并将服务加入Traefik所在的Overlay网络,Traefik就能通过VPN隧道路由流量到Pi2的服务。
  • 定期检查VPN连接状态,可以用wg show命令查看隧道是否正常。

内容的提问来源于stack exchange,提问作者rushsteve1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:29:45