为什么需要组建内网?
在分布式部署场景中,多台异地服务器之间建立安全的通信通道具有重要价值:
- 简化权限管理:内网通信可以免去复杂的公网权限校验
- 提升安全性:避免敏感服务暴露在公网上
- 优化性能:内网通信延迟更低,带宽更稳定
实际应用场景
以 Docker 服务为例,如果需要将位于广州的服务器的 Docker Daemon socket 分享给位于深圳的服务器操作:
- 公网方案:需要配置 TLS 证书来保证通信安全,详见 Protect the Docker daemon socket
- 内网方案:可以直接指定监听接口和端口
-H tcp://192.168.2.1:2375
,详见 Daemon socket option
WireGuard 简介
WireGuard 是一种现代化的 VPN 解决方案,具有以下优势:
- 简单高效:配置简单,性能优异
- 内核级实现:运行在内核空间,效率更高
- 现代加密:使用最新的加密算法
适用场景
WireGuard 采用全互联(Full Mesh)拓扑结构,每台机器都需要配置其他所有机器为 peer。例如 ABC 三台机器组建内网:
- A 机器配置 B、C 为 peer
- B 机器配置 A、C 为 peer
- C 机器配置 A、B 为 peer
适用性:适合少量机器(通常 ≤ 10 台)的场景,机器数量过多时建议考虑其他方案。
环境准备
系统要求
- 内核版本:Linux 5.x 或更高版本
- 操作系统:支持 WireGuard 的 Linux 发行版
安装 WireGuard
# Ubuntu/Debian
sudo apt update && sudo apt install wireguard-tools
# CentOS/RHEL
sudo yum install wireguard-tools
# 或使用 EPEL
sudo yum install epel-release
sudo yum install wireguard-tools
配置步骤
1. 生成密钥对
cd /etc/wireguard
umask 077
wg genkey | tee privatekey | wg pubkey > publickey
2. 创建配置文件
编辑 /etc/wireguard/wg0.conf
:
[Interface]
Address = 192.168.2.1/24
ListenPort = 1234
PrivateKey = <本机私钥>
[Peer]
PublicKey = <服务器2的公钥>
AllowedIPs = 192.168.2.2/32
Endpoint = <服务器2公网IP>:1234
PersistentKeepalive = 60
[Peer]
PublicKey = <服务器3的公钥>
AllowedIPs = 192.168.2.3/32
Endpoint = <服务器3公网IP>:1234
PersistentKeepalive = 60
配置说明
- Address:本机在内网中的 IP 地址和网段
- ListenPort:WireGuard 监听端口
- PrivateKey:本机私钥(从 privatekey 文件读取)
- PublicKey:对端服务器的公钥
- AllowedIPs:路由规则,指定访问哪些 IP 时转发到该 peer
- Endpoint:对端服务器的公网地址和端口
- PersistentKeepalive:NAT 穿透心跳间隔(秒)
3. 启动服务
# 启动 WireGuard 接口
sudo wg-quick up wg0
# 停止 WireGuard 接口
sudo wg-quick down wg0
# 查看状态
sudo wg show
4. 设置开机自启
sudo systemctl enable wg-quick@wg0
验证连接
# 检查接口状态
ip addr show wg0
# 测试连通性
ping 192.168.2.2
ping 192.168.2.3
# 查看路由表
ip route show table all | grep wg0
故障排查
常见问题
-
连接失败
- 检查防火墙设置
- 确认端口是否开放
- 验证密钥配置
-
NAT 穿透问题
- 调整 PersistentKeepalive 值
- 检查服务器是否在 NAT 后面
-
路由问题
- 确认 AllowedIPs 配置正确
- 检查系统路由表
安全建议
- 定期更换密钥对
- 使用非标准端口
- 配置防火墙规则
- 监控网络流量