【混合云组网实战】Docker部署内网互通服务,实现本地网段访问公有云VPC私网
前言
在企业混合云架构、本地开发环境对接云端资源的场景中,本地局域网与云端VPC内网互通是高频刚需。相比于复杂的专线方案,用Docker快速搭建轻量内网互通工具,成本低、部署快、易维护,完美适配开发测试、小规模内网互联场景。
本文手把手教你基于Docker完成部署,全程命令可直接复制 ,附带真实部署验证结果,实现本地<192.168.42.0/24>网段所有主机,无缝访问公有云VPC(<10.0.0.0/16>)内网资源,新手也能一步到位!
适用场景:本地开发机访问云端内网服务、混合云内网互通、局域网设备统一访问云端资源
核心优势:Docker容器化部署、一键启动、配置简单、无需额外硬件
一、部署环境准备
1.1 服务器信息梳理
| 设备角色 | 内网IP | 公网IP | 所属网段 | 核心作用 |
|---|---|---|---|---|
| 云端服务节点(公有云CVM) | <10.0.12.10> | <42.136.159.88> | <10.0.0.0/16>(公有云VPC) | 部署内网互通服务端 |
| 本地网关节点(本地虚拟机) | <192.168.42.128> | - | <192.168.42.0/24>(本地局域网) | 部署客户端,做流量转发网关 |
| 本地测试主机 | <192.168.42.129> | - | <192.168.42.0/24>(本地局域网) | 验证全网段互通效果 |
1.2 前置必备条件
-
云端节点、本地网关节点均已安装Docker + Docker Compose,且服务正常启动
-
公有云安全组放通1194/udp端口,允许公网访问该端口
-
本地网关节点内核支持
tun虚拟网卡,执行ls /dev/net/tun可查看到对应设备 -
所有操作均使用root账户,避免权限不足导致部署失败
二、云端服务端部署(公有云<10.0.12.10>)
首先在公有云服务器上部署服务端,生成客户端接入配置,这是整个组网的核心基础。
2.1 创建服务端编排配置
新建部署目录并编写docker-compose.yml,命令如下:
Bash
# 创建部署目录并进入
mkdir -p /opt/network-server && cd /opt/network-server
# 查看并编写docker-compose.yml
cat docker-compose.yml
配置文件内容:
YAML
services:
openvpn:
image: kylemanna/openvpn:latest
container_name: network-server
cap_add:
- NET_ADMIN
ports:
- "1194:1194/udp"
volumes:
- ./data:/etc/openvpn
restart: always
sysctls:
- net.ipv6.conf.all.forwarding=1
- net.ipv6.conf.default.forwarding=1
2.2 初始化服务配置
绑定云端公网IP,生成基础服务配置:
Bash
# 替换为云端服务器公网IP,生成服务配置
docker compose run --rm openvpn ovpn_genconfig -u udp://42.136.159.88
2.3 初始化证书体系
采用无密码模式,简化部署流程,适合内网环境:
Bash
# 初始化证书,无密码模式
docker compose run --rm openvpn ovpn_initpki nopass
2.4 启动服务端容器
Bash
# 后台启动服务
docker compose up -d
# 查看容器状态,确保为Up状态
docker ps | grep network-server
2.5 生成客户端接入文件
创建客户端凭证,并导出配置文件,后续需传输到本地网关节点:
Bash
# 创建客户端身份凭证
docker compose run --rm openvpn easyrsa build-client-full client1 nopass
# 导出客户端配置文件
docker compose run --rm openvpn ovpn_getclient client1 > client1.ovpn
关键操作 :将生成的client1.ovpn文件,通过scp/ftp等方式传输到本地网关节点的部署目录下。
三、本地网关节点部署(<192.168.42.128>)
在本地虚拟机部署客户端,作为局域网流量转发网关,必须使用host网络模式。
3.1 创建客户端编排配置
新建部署目录,放入传输过来的client1.ovpn,编写配置文件:
Bash
# 创建部署目录并进入
mkdir -p /opt/network-client && cd /opt/network-client
# 查看并编写docker-compose.yaml
cat docker-compose.yaml
配置文件内容:
YAML
services:
openvpn-client:
# 国内镜像源,解决拉取失败问题
image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/kylemanna/openvpn:latest
container_name: network-client
cap_add:
- NET_ADMIN
network_mode: host # 必选配置,不可修改!
devices:
- /dev/net/tun
volumes:
- ./client1.ovpn:/etc/openvpn/client1.ovpn
command: openvpn --config /etc/openvpn/client1.ovpn
restart: always
3.2 启动客户端容器
Bash
# 后台启动客户端
docker compose up -d
# 查看容器运行状态
docker ps | grep network-client
四、单节点连通性验证(网关节点本机)
先验证网关节点与云端VPC的连通性,确保单点连接正常,再配置全网段互通。
在本地网关节点(<192.168.42.128>)执行以下命令:
Bash
[root@kube 123]#
[root@kube 123]# ping 10.0.12.10
PING 10.0.12.10 (10.0.12.10) 56(84) bytes of data.
64 bytes from 10.0.12.10: icmp_seq=1 ttl=63 time=20.1 ms
64 bytes from 10.0.12.10: icmp_seq=2 ttl=63 time=14.7 ms
^C
--- 10.0.12.10 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 14.731/17.418/20.106/2.690 ms
[root@kube 123]#
[root@kube /]#
[root@kube /]# curl ip.sb
42.136.159.88
[root@kube /]#
✅ 验证结果:
-
能正常ping通云端内网IP,内网通道建立成功
-
出口IP切换为公有云公网IP,流量转发正常
-
单节点部署无问题,可进行下一步全网段配置
五、全网段互通配置(核心步骤)
目标:让本地<192.168.42.0/24>网段所有主机,都能通过网关节点访问公有云VPC,需配置内核转发、地址伪装和静态路由。伪装成 本地网关的 IP(192.168.42.128)
5.1 开启内核IP转发(永久生效)
Bash
# 开启内核转发,永久生效
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
# 加载配置
sysctl -p
5.2 添加地址伪装规则(关键)
实现本地网段流量通过网关转发至云端VPC,仅支持单向访问:
Bash
# 配置SNAT,实现本地42网段访问云端10网段
iptables -t nat -A POSTROUTING -s 192.168.42.0/24 -j MASQUERADE
5.3 保存iptables规则(重启不失效)
Bash
# 永久保存防火墙规则
iptables-save > /etc/iptables/rules.v4
5.4 本地主机添加静态路由
以本地测试主机(<192.168.42.129>)为例,配置路由指向网关节点:
Bash
# 访问云端10.0.0.0/16网段,流量走本地网关192.168.42.128
ip route add 10.0.0.0/16 via 192.168.42.128
小贴士:如需永久生效,将该命令加入/etc/rc.local开机自启文件
六、全网段互通效果验证
在本地测试主机(<192.168.42.129>)执行命令,验证全网段互通效果:
Bash
root@test:~# hostname -i
192.168.42.129
root@test:~#
root@test:~# ping 10.0.12.10
PING 10.0.12.10 (10.0.12.10) 56(84) bytes of data.
64 bytes from 10.0.12.10: icmp_seq=1 ttl=62 time=12.1 ms
64 bytes from 10.0.12.10: icmp_seq=2 ttl=62 time=14.5 ms
^C
--- 10.0.12.10 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 12.132/13.292/14.452/1.160 ms
root@test:~#
root@test:~# ping 10.0.0.9
PING 10.0.0.9 (10.0.0.9) 56(84) bytes of data.
64 bytes from 10.0.0.9: icmp_seq=1 ttl=61 time=13.2 ms
64 bytes from 10.0.0.9: icmp_seq=2 ttl=61 time=13.2 ms
^C
--- 10.0.0.9 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 13.186/13.188/13.191/0.002 ms
root@test:~#
root@test:~# ip route
default via 192.168.42.2 dev ens33 proto dhcp src 192.168.42.129 metric 100
10.0.0.0/16 via 192.168.42.128 dev ens33
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
192.168.42.0/24 dev ens33 proto kernel scope link src 192.168.42.129 metric 100
192.168.42.2 dev ens33 proto dhcp scope link src 192.168.42.129 metric 100
root@test:~#

✅ 最终效果:
-
本地任意主机可直接ping通云端VPC内所有内网IP
-
路由表配置正常,流量转发无丢包、延迟稳定
-
本地整个网段均可无缝访问云端内网资源,部署完成
七、常见问题排查
-
容器启动失败 :检查
tun设备是否存在,执行modprobe tun加载模块;确认端口1194未被占用 -
无法连通云端:检查公有云安全组是否放通1194/udp端口,公网IP填写是否正确
-
本地网段无法访问:确认内核转发已开启、NAT规则已添加、客户端为host网络模式
-
重启后失效 :重新执行
sysctl -p加载转发配置,检查iptables规则是否保存
八、总结
本文通过Docker容器化部署,快速实现了本地局域网与云端VPC的内网互通,全程无复杂配置,命令直接复用,非常适合中小企业和开发人员使用。
核心要点回顾:
-
服务端绑定公网IP,生成客户端配置文件
-
客户端必须用host网络模式,保证流量转发
-
内核转发+NAT伪装+静态路由,实现全网段互通
-
容器化部署,启停方便,不占用系统额外资源
如果本文对你有帮助,欢迎点赞、收藏、留言交流~
CSDN标签:混合云组网、Docker、内网互通、公有云VPC、局域网访问云端、运维实战