【混合云组网实战】Docker部署内网互通服务,实现本地网段访问公有云VPC私网

【混合云组网实战】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 前置必备条件

  1. 云端节点、本地网关节点均已安装Docker + Docker Compose,且服务正常启动

  2. 公有云安全组放通1194/udp端口,允许公网访问该端口

  3. 本地网关节点内核支持tun虚拟网卡,执行ls /dev/net/tun可查看到对应设备

  4. 所有操作均使用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 /]#

验证结果

  1. 能正常ping通云端内网IP,内网通道建立成功

  2. 出口IP切换为公有云公网IP,流量转发正常

  3. 单节点部署无问题,可进行下一步全网段配置


五、全网段互通配置(核心步骤)

目标:让本地<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:~#

最终效果

  1. 本地任意主机可直接ping通云端VPC内所有内网IP

  2. 路由表配置正常,流量转发无丢包、延迟稳定

  3. 本地整个网段均可无缝访问云端内网资源,部署完成


七、常见问题排查

  1. 容器启动失败 :检查tun设备是否存在,执行modprobe tun加载模块;确认端口1194未被占用

  2. 无法连通云端:检查公有云安全组是否放通1194/udp端口,公网IP填写是否正确

  3. 本地网段无法访问:确认内核转发已开启、NAT规则已添加、客户端为host网络模式

  4. 重启后失效 :重新执行sysctl -p加载转发配置,检查iptables规则是否保存


八、总结

本文通过Docker容器化部署,快速实现了本地局域网与云端VPC的内网互通,全程无复杂配置,命令直接复用,非常适合中小企业和开发人员使用。

核心要点回顾:

  • 服务端绑定公网IP,生成客户端配置文件

  • 客户端必须用host网络模式,保证流量转发

  • 内核转发+NAT伪装+静态路由,实现全网段互通

  • 容器化部署,启停方便,不占用系统额外资源

如果本文对你有帮助,欢迎点赞、收藏、留言交流~

CSDN标签:混合云组网、Docker、内网互通、公有云VPC、局域网访问云端、运维实战

相关推荐
白狐_7982 小时前
我的第一台云服务器:阿里云 ECS 配置记录,以及本地连接后到底能做什么
运维·服务器·阿里云
不剪发的Tony老师2 小时前
mayfly-go:一款基于WEB的服务器、数据库、中间件统一运维平台
运维·服务器·数据库
孤岛站岗2 小时前
【AI Agent实战手册】AG11:用LangGraph搭一个自动化研究助手:从设计到部署全流程
运维·自动化
minji...2 小时前
Linux 多线程(五)用C++语言以面向对象方式封装线程
linux·运维·服务器·网络·jvm·数据库
merlin-mm2 小时前
volcano 原理分析
容器·kubernetes
Y淑滢潇潇2 小时前
HCIP IP-VLAN 实验报告
运维·网络·tcp/ip
秋风&萧瑟2 小时前
【Linux系统编程】system函数和exec函数族的使用
linux·运维·服务器
秋风&萧瑟2 小时前
【Linux系统编程】Linux多进程介绍及使用
linux·运维·网络
宵时待雨2 小时前
linux笔记归纳1:linux初识
linux·运维·笔记