通过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访问任意端口,不需要额外的端口映射。
验证方法
- 创建一个Overlay网络:
docker network create --driver overlay my_overlay_net - 在Pi2上部署一个测试容器(比如带SSH的镜像):
docker service create --name test-pi --network my_overlay_net --constraint node.hostname==<Pi2的主机名> lscr.io/linuxserver/openssh-server - 在管理节点或其他Swarm节点上,启动一个同网络的容器并测试访问:
如果能正常连接,说明Overlay网络已经可以访问Pi2容器的任意端口。docker run --rm --network my_overlay_net alpine ssh test-pi:22
额外注意事项
- 确保VPN隧道的带宽和延迟满足你的服务需求,树莓派2的性能有限,尽量选择轻量的VPN协议(WireGuard是最优选择)。
- 如果需要通过Traefik暴露Pi2上的服务,只需将Traefik部署在Swarm集群中(建议在管理节点),并将服务加入Traefik所在的Overlay网络,Traefik就能通过VPN隧道路由流量到Pi2的服务。
- 定期检查VPN连接状态,可以用
wg show命令查看隧道是否正常。
内容的提问来源于stack exchange,提问作者rushsteve1
相关产品推荐
相关产品推荐

