异地组网方案

本文最后更新于 2025年11月19日 晚上

家庭网络拓扑如下图,使用WireGuard实现异地组网,可以在公司电脑或手机,通过安装WireGuard客户端通过openwrt路由器访问家中局域网的所有网络设备,需要准备公网ip

网络拓扑图

其中wireguard网段是10.0.8.x,家中局域网的网段为192.168.6.x
可以在公司电脑中输入192.168.6.x访问家中设备

准备

需要先提前安装docker和docker compose
参考:Docker相关
同时机器需要开放51820端口
WireGuard官网安装教程:Installation-WireGuard

服务端

1.准备工作

云服务器系统为centos7,需要安装一些模块,其他系统参考官网安装教程,这里我选择方法2

1
2
3
sudo yum install epel-release elrepo-release
sudo yum install yum-plugin-elrepo
sudo yum install kmod-wireguard wireguard-tools

2.docker-compose.yaml配置

创建docker-compose.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
services:
wireguard:
image: linuxserver/wireguard
container_name: wireguard
cap_add:
- NET_ADMIN
- SYS_MODULE
environment:
- PUID=1000
- PGID=1000
- TZ=Etc/UTC
volumes:
- ./config:/config
- ./wg0.conf:/config/wg0.conf
ports:
- 51820:51820/udp
sysctls:
- net.ipv4.conf.all.src_valid_mark=1
- net.ipv4.ip_forward=1
restart: unless-stopped

同时在docker-compose.yaml的路径下创建一个空的文件wg0.conf

先启动服务(此时服务端尚未配置好)

1
docker compose up -d

3.生成公钥、私钥和预共享密钥

进入容器,生成一组公钥、私钥和预共享密钥,并记录下来

1
2
3
4
5
6
7
8
9
10
# 进入容器
docker exec -it wireguard /bin/bash

# 生成公钥、私钥和预共享密钥
wg genkey | tee /etc/wireguard/private.key | wg pubkey > /etc/wireguard/public.key | wg genpsk > /etc/wireguard/shared.key

# 分别查看公钥、私钥和预共享密钥,需要记录下来
cat /etc/wireguard/public.key
cat /etc/wireguard/private.key
cat /etc/wireguard/shared.key

每个节点需要一组公钥、私钥和预共享密钥,我这里1个服务端+3个客户端总共4个节点,所以需要执行4次生成4组(后续增加客户端可以重复此步骤)

4.服务端配置

退出容器,修改wg0.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# Server
# PublicKey = 服务端公钥(个人为了方便配置后续客户端在此记录一下服务端公钥,这里是注释可不填)
[Interface]
PrivateKey = 服务端私钥
Address = 10.0.8.1/24
ListenPort = 51820
PreUp =
PostUp = iptables -t nat -A POSTROUTING -s 10.0.8.0/24 -o eth0 -j MASQUERADE; iptables -A INPUT -p udp -m udp --dport 51820 -j ACCEPT; iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT;
PreDown =
PostDown = iptables -t nat -D POSTROUTING -s 10.0.8.0/24 -o eth0 -j MASQUERADE; iptables -D INPUT -p udp -m udp --dport 51820 -j ACCEPT; iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT;


# Client: PC客户端
[Peer]
PublicKey = PC客户端公钥
PresharedKey = PC客户端预共享密钥
AllowedIPs = 10.0.8.2/32

# Client: 旁路由openwrt客户端
[Peer]
PublicKey = 旁路由openwrt客户端公钥
PresharedKey = 旁路由openwrt客户端预共享密钥
AllowedIPs = 10.0.8.4/32, 192.168.6.0/24

# Client: 手机客户端
[Peer]
PublicKey = 手机客户端公钥
PresharedKey = 手机客户端预共享密钥
AllowedIPs = 10.0.8.3/32

5.启动

因为刚刚先启动了服务端会在docker-compose.yaml路径下生成config文件,需要删除后才能读取新的wg0.conf,然后重新启动服务端

1
2
# 删除config后重启服务端
docker compose restart

客户端

openwrt

我这里wireguard装在了旁路由上,主路由也可安装实现,方法一样

网络-接口-添加新接口

名称随意,协议选择WireGuard VPN

其他配置如下图,保存并应用

防火墙打开转发

最后在openwrt中ping一下10.0.8.1(服务端),通了则openwrt客户端配置成功

Win

下载win客户端并安装
按照下图配置

保存后启动连接,打开cmd,分别ping一下服务端、openwrt客户端和家庭内网的centos7虚拟机,通了则表示已经成功连上家庭内网

Android

下载app,安装
按照下图新建配置,启动连接即可

问题

1.家庭内网win主机和linux主机都可以互相连接,但是公司电脑无法连接内网的win主机(台式机和PVE虚拟的win)

解决办法:
win添加防火墙规则

  • 打开 Windows 防火墙高级安全设置:
    • Win + R,输入 wf.msc,然后按 Enter
  • 创建入站规则:
    • 在左侧面板中选择“入站规则”。
    • 在右侧面板中选择“新建规则”。
    • 选择“自定义”规则类型,然后单击“下一步”。
    • 在“程序”部分选择“所有程序”,然后单击“下一步”。
    • 在“协议和端口”部分选择“任何”,然后单击“下一步”。
    • 在“作用范围”部分,添加 WireGuard 的 IP 范围。例如,如果 WireGuard 的网络是 10.0.0.0/24,将其添加到远程 IP 地址。
    • 在“操作”部分选择“允许连接”,然后单击“下一步”。
    • 在“配置文件”部分选择“域”、“专用”和“公用”,然后单击“下一步”。
    • 为规则命名,例如“Allow WireGuard VPN”,然后单击“完成”。
  • 创建出站规则(步骤类似入站规则):
    • 在左侧面板中选择“出站规则”。
    • 在右侧面板中选择“新建规则”,并重复上述步骤。

此方法只能连接内网win台式机,PVE虚拟的win还是无法访问,目前未找到解决方案

如果只是想进行远程桌面连接,可以在openwrt里的 网络-socat 配置一下转发,配置如下图,这样就可以通过10.0.8.4:10005连接到PVE虚拟win的桌面控制了。内网其他网络设备连接也可以通过此方法连接,其中3389是win远程桌面默认端口


异地组网方案
http://blog.baicat.eu.org/2024/07/19/异地组网方案/
作者
liuxiaobai5201314
发布于
2024年7月19日
更新于
2025年11月19日
许可协议