实现了什么功能?

通过wg我们可以轻松的组件一个局域网。
当然我的使用场景更多的是组建业务内网。
客户端安装WireGuard
全平台支持:win、mac、ubuntu、android、ios、openwrt.....
mac推荐这款passepartout开源版本,官方太久没更新有些小问题。
使用
导入配置即可。
代理地址配置说明
修改AllowedIPs即可,是白名单的意思,只能配置IP地址(WireGuard 运行在 OSI 模型第 3 层网络层,只能配置IP)
代理全部地址
AllowedIPs = 0.0.0.0/0, ::/0仅代理指定网段
AllowedIPs = 10.8.0.0/24,192.168.100.0/24,192.168.1.0/24,10.52.0.0/16,172.16.0.0/16解释:
192.168.100.0/24:192.168.100.0~192.168.100.255都作为代理转发出去
服务器安装
参考官方:https://wg-easy.github.io/wg-easy/latest/examples/tutorials/basic-installation/
推荐docker安装。
配置迁移
我这里有从A服务器迁移到B服务器的需求,记录一下配置如何迁移。
# 进入到目录
/var/lib/docker/volumes/wg-easy_etc_wireguard/_data/
# 压缩
tar -czvf wg_backup.tar.gz .
# 发送到新服务器后解压后重启服务即可
tar -xzvf wg_backup.tar.gz
docker compose up -d物理服务器安装客户端
apt install wireguard -y
apt install openresolv -y修改配置文件
sudo nano /etc/wireguard/wg0.conf
# 启动
sudo wg-quick up wg0
# 停止
sudo wg-quick down wg0
# 开机自启
sudo systemctl enable wg-quick@wg0机房 A 和 B 的内部转发(必须做)
即便云服务器把包发到了机房电脑上,机房电脑还得“转发”给内网的其他服务器。
在机房 A 和机房 B 的 Linux 电脑上分别执行:
开启内核转发:
Bash
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p设置 NAT 伪装(最核心): 假设机房电脑的网卡叫 eno1(用
ip addr确认一下),WireGuard 网卡叫wg0:Bash
# 让机房电脑代理 VPN 流量去访问本地局域网
sudo iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE
sudo iptables -A FORWARD -i wg0 -o eno1 -j ACCEPT第一步:在 Wg-Easy 容器内手动强制添加路由(临时测试)
为了立即验证猜想,你在云服务器上执行以下命令,手动把路修通:
Bash
# 1. 告诉 WireGuard 进程:192.168.100.0/24 归 yNV8... 这个 Peer 管
docker exec wg-easy wg set wg0 peer yNV80i1ESmoPUWdRJ8+mwCLhbA3akx2QoyXFv1Z1Jjk= allowed-ips 10.8.0.6/32,192.168.100.0/24
# 2. 告诉 Linux 系统:去这个网段的包丢给 wg0 接口
docker exec wg-easy ip route add 192.168.100.0/24 dev wg0
# 1. 告诉 WireGuard 进程:192.168.1.0/24 归 GhCD... 这个 Peer 管
docker exec wg-easy wg set wg0 peer GhCDXM5RTCYs4V/lg5d2+kgSt9pt9uYSzlWlCjpKcwY= allowed-ips 10.8.0.5/32,192.168.1.0/24
# 2. 告诉 Linux 系统:去这个网段的包丢给 wg0 接口
docker exec wg-easy ip route add 192.168.1.0/24 dev wg0当wg服务网段出现冲突
核心矛盾:宿主机找不到“门”
虽然容器里的 wg0 认识 172.29.45.0,但宿主机并不认识。当你从宿主机 Ping 这个 IP 时,它并没有进入容器,而是直接从云服务器的物理网卡 eth0 跑出去了,所以 100% 丢包。
立即修复:三行命令打通路径
请按顺序执行以下命令(在云服务器宿主机上):
第一步:手动在宿主机指路
告诉宿主机,凡是找机房 172 段的,丢给 wg-easy 容器(假设你的容器 IP 是 10.42.42.x,我们先动态获取它):
Bash
# 获取容器内网 IP
WGEASY_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' wg-easy)
# 强制将路由指向容器
sudo ip route add 172.29.45.0/24 via $WGEASY_IP第二步:在容器内指路
由于 wg-easy 容器启动时可能没自动把新加的 AllowedIPs 写进自己的系统路由表,我们需要手动同步:
Bash
docker exec wg-easy ip route add 172.29.45.0/24 dev wg0(如果提示 File exists,说明已经有了,可以忽略)
第三步:开启容器转发“许可证”
容器默认可能只处理自己的包,不转发宿主机的包,我们需要在容器内对 172 段做 NAT 伪装:
Bash
docker exec wg-easy iptables -t nat -A POSTROUTING -d 172.29.45.0/24 -o wg0 -j MASQUERADE