使用WireGuard组建大内网环境
我在开始做这个之前一直使用的是 frp 公网映射方案。旧的域名过期了,新的域名正在备案,不能去做解析。同时使用 frp 方案去链接服务即意味着将服务暴露在公网上,即意味着其他人仍然可以打开你的网页。如果部署的某个项目出现了安全漏洞,将会对我们设备的数据安全造成不可估量的危害。如果不是有直接的公网访问需求,不推荐使用此方案,更推荐使用有额外鉴权的 VPN 方案。
我需要使用专门的段落强调一下,此处所提到的 VPN 是一种技术,正确使用是合法的,目前国内有许多企业或者高校仍在使用 VPN 技术进行远程办公,所以不要谈 VPN 色变。应遵守所在地法律与单位/校园规定”“若服务器与客户端均部署在境内,理论上数据只在境内传输
维基百科描述(截止于
2025-09-25 01:55 UTC+8
):虚拟专用网(英语:Virtual Private Network,缩写:VPN)将专用网络延伸到公共网络上,使用户能够在共享或公共网络上发送和接收数据,就像他们的计算设备直接连接到专用网络上一样。VPN 的好处包括增加专用网络的功能、安全性和管理,它提供了对公共网络上无法访问的资源访问通常用于远程办公人员。加密很常见但不是 VPN 连接的固有部分。
百度百科描述(截止于
2025-09-25 01:55 UTC+8
):虚拟专用网络(英文:Virtual Private Network),简称虚拟专网(VPN),其主要功能是在公用网络上建立专用网络,进行加密通讯。在企业网络中有广泛应用。VPN 网关通过对数据包的加密和数据包目标地址的转换实现远程访问。VPN 可通过服务器、硬件、软件等多种方式实现。
本次我们搭建 WireGuard 所利用的就是专用网络(可以理解为局域网)这个属性,使得我们可以使用安全的方式链接到我们的局域网中的设备。并防止未经授权的登陆。
我在上周尝试使用 Tailscale 搭建了一个大内网环境。由于他们的服务器在境外,所以体验并不是特别如意。平时也可以勉强用用,但是上周有一节选修课的时候,我想使用电脑远程到我的远程计算机去写仍然没有完成的代码,但是 Tailscale 的延迟令我萌生出找到解决方案或者卸载掉它的冲动。
Tailscale DERP 部署上仍然有一些难度,且仍然有外网通信,影响效率。Tailscale 是基于 WireGuard 的,这给了一些启示。
我们可以使用 WireGuard 建立专用网络环境,但是我们的所有局域网节点设备均没有公网 IP,无法建立连接,需要有一台在公网环境下的服务器用于中转流量。我们在公网服务器上搭建 WireGuard 的服务端,然后让每个局域网节点设备均作为客户端进行工作。
在开始之前,我们需要明确的三点是:
- 如果你在学校或者单位使用,请清楚由于此行为导致的危害,包括但不限于由于你的操作而导致的有意或者无意中的泄密或者危害到单位或者学校的其他设备的安全以及之后的经济或者人身安全。如果你符合条件,并执意要继续操作,则造成的所有责任均为你个人承担。
- 如果你正准备跟随本文的描述进行实践操作,请通篇阅读,并再三思考此文是否适合你。本文仅描述其中的一个个例(即我本人使用的方案),并不适合每个人,请在合适的时机做出自己的思考,切勿照搬照抄(每个人的网络环境都不一样)。
- 在操作之前,你需要具备基础的视力、计算机操作能力、Linux 基础知识、网络的基础知识、信息的检索能力。
准备服务器
在开始之前 ,我们需要准备一台可以在公网访问的服务器,你可以在 【雨云】购买,使用我的邀请码 heStudio
首月可享受 5 折优惠,购买 NAT 主机(共享公网 IP,只能映射几个端口,但是便宜)即可满足使用要求。

我选择的这个主机是目前(截止于 2025-09-25 23:23 UTC+8
)最便宜的一个主机了,搭配上新人优惠券,实际仅需 9 元(首月)。

在安装系统的时候推荐安装最新的 Ubuntu LTS 系统(截至 2025-09-25 23:43 UTC+8
雨云提供的最新的 LTS 系统为 Ubuntu 24.04 LTS)以防止安装依赖的时候出现报错问题。
安装 WireGuard
服务端
你可以使用 https://github.com/angristan/wireguard-install 项目,运行文档中提供的命令(如果你的服务器上的网络环境无法连接到 Github,你可以将脚本保存到你的电脑上,然后上传到服务器上)。

首次运行脚本的时候会自动的安装 WireGuard 服务端,在安装的过程中会询问你服务运行的端口,如果你使用的是云主机,请前往安全组开放对应的 UDP 端口。 相关的设置项因为我已经安装完成了,并没有截图。在安装完成后会进入如下图所示的管理面板。

比如我要添加新的局域网节点,就选择“Add a new user”

然后客户端名称随便输入,但是不要重复,方便区分设备。

IP 地址一般保持默认即可。如果要修改,请保证输入的 IP 地址在一个网段中,我们本次操作的网段为10.66.66.0/24
.回车之后会让你设置 IPV6,修改规则和 IPV4 一样,如果你不使用 IPV6 保持默认即可。
在按下回车之后会在终端输出二维码(可能部分终端不能正常加载),并同时将客户端配置文件保存到用户根目录。
客户端
将导出的配置文件添加到你的客户端即可,然后修改 AllowedIPs
为 WireGuard 网段(不是你的本地网络内网),防止其他的非必要的网络请求被转发。如果你的设备 NAT 等级较高,会出现连不上的情况,此时需要修改 keep-alive
使得连接更加稳定。在配置文件中添加一行:
PersistentKeepalive = 25

客户端 (Openwrt)
我们也可以在 Openwrt 设备上安装,以将路由下的设备选择性的映射到大内网环境。这样映射由于不在目标设备上运行,就无需担心目标设备开机的时候没有启动计划任务导致无法连接无人值守的计算机的情况(点名 Windows)。
我在部署的时候并没有将 lan 的整个内网环境映射到大内网环境,主要是安全性考虑。局域网的使用者除了我还有工作室的其他小伙伴们,而大内网环境只有我在使用,这样部署会影响他们对局域网环境的绝对信任。我采用的是端口转发的方案,即使是自己使用,使用此方案也更安全,可以阻止很多意外情况下的端口泄露。
在 Openwrt 中搜索 wireguard,然后安装wireguard-tools
,kmod-wireguard
,luci-proto-wireguard
(见图片中圈出的部分)

在安装结束之后需要重启 Openwrt 设备,然后在网络 → 接口中点击“添加新接口”,协议选择“WireGuard VPN”

创建接口之后会进入编辑界面,选择底部的“导入配置文件”导入

然后将在服务端导出的配置文件粘贴到输入框,然后点击“导入配置”。
点击顶部的“Peers”,点击编辑。

修改“允许的 IP”为你的 WireGuard 的内网网段。如果你的设备 NAT 等级较高,会出现连不上的情况,此时需要修改 keep-alive
使得连接更加稳定。

点击保存存储你的 Peer 配置文件,然后点击顶部的“防火墙设置”,创建一个新的防火墙区域。我这里使用的名称是 wg0
,你可以使用其他名称。然后点击“保存”即可。在配置完成之后点击“重启”按钮重启 WireGuard 接口。每次修改相关接口配置后在点击完成“保存并应用”后都需要单独点击“重启”,否则修改不会生效。

前往网络 → 防火墙,然后修改区域 wg0
的防火墙规则(其实照搬 wan 的配置即可)。保证红框中的和我的截图一致即可。

(可选步骤)目前我们的隧道已经开始工作了,但是如果不想让 lan 中的人访问的隧道内容怎么办?我们可以写防火墙规则,然后抛弃 lan 访问 wg0 的请求。在网络 → 防火墙 → 通信规则中,添加一条规则用于丢弃 lan 访问 wg0 的包即可。

我们在此部分开始的时候提到了使用端口转发方案,我们需要将 lan 中的服务端口通过端口转发映射到 WireGuard 大内网环境。
在网络 → 防火墙 → 端口转发中,点击添加,然后添加如图所示的转发规则即可,需要转发几个服务则添加几个。

目前我们的大内网布局已经基本上完成了。
UDP 流量伪装 | Phantun
在部分网络环境下,WireGuard 的 UDP 包会被 QoS 限速甚至阻断。主要表现为在使用过程中延迟较大,经常断开重连。在此种状态下,我们可以使用 https://github.com/dndx/phantun 将 UDP 流量伪装成 TCP 流量,以实现稳定的网络连接。
服务端
和之前一样,我们仍然需要再放行一个端口号。按照正常情况下,我们其实只放行 Phantun 的端口就够了,但是 Phantun 只支持 Linux,如果我们需要让一些无法运行 Phantun 客户端的设备连接,我们仍然需要原先的 WireGuard 端口。所以我建议同时保证两个服务的端口开放。
由于我们选装的是 Ubuntu 24.04 LTS,使用的是 nftables
,所以可以将以下的文本添加到 /etc/nftables.conf
table inet nat {
chain prerouting {
type nat hook prerouting priority dstnat; policy accept;
iif eth0 tcp dport 4567 dnat ip to 192.168.201.2
iif eth0 tcp dport 4567 dnat ip6 to fcc9::2
}
}
添加完成之后使用以下命令验证文件格式是否正确:
nft --check --file /etc/nftables.conf
如果你正在使用 iptables
同样可以运行以下命令完成配置:
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 4567 -j DNAT --to-destination 192.168.201.2
ip6tables -t nat -A PREROUTING -p tcp -i eth0 --dport 4567 -j DNAT --to-destination fcc9::2
需要注意的是, eth0
对应的是你的服务器对外服务的网卡,而端口号 4567
为 Phantun 的端口号。如果你不需要 IPV6 的相关配置,请在添加或者运行命令的时候删除包含有 IPV6 的那一行。
我们还需要配置 IP 转发,编辑 /etc/sysctl.conf
,然后添加以下内容:
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
还是遵守上面的原则,如果你不使用 IPV6,则不添加 IPV6 对应的部分。
在添加后重启服务器。
前往 Release 去下载你服务器对应架构的压缩包,然后解压到本地,解压出 Server 端上传到 /usr/local/bin
然后赋予执行权限。
新建 /etc/systemd/system/phantun-server.service
文件,然后填入以下内容
[Unit]
Description=Phantun Server
After=network.target wg-quick@wg0.service
Requires=wg-quick@wg0.service
[Service]
Environment="RUST_LOG=info"
ExecStart=/usr/local/bin/phantun_server --local 4567 --remote 127.0.0.1:1234
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
其中需要注意的是, After
和Requires
中的wg-quick@wg0.service
请修改成你的 WireGuard Server 对应的服务,--local 4567
为 Phantun 的端口号,--remote 127.0.0.1:1234
为你的 WireGuard 的地址,请修改成对应的 IP 地址。
然后依次运行以下命令:
systemctl daemon-reload
systemctl enable phantun-server.service
systemctl start phantun-server.service
systemctl status phantun-server.service
如果显示 active 则代表服务端成功部署。
(可选)WireGuard 默认的 MTU 值为 1420,如果你在启用 IPV6 的情况下使用 Phantun,你应当修改你的 WireGuard 的 MTU 值为1400
.
客户端
客户端只需在物理接口上启用 SNAT,将 Phantun 的地址转换为可在物理网络中使用的地址。通过简单的伪装功能即可实现。—[https://github.com/dndx/phantun]
使用 nftables
table inet nat {
chain postrouting {
type nat hook postrouting priority srcnat; policy accept;
iifname tun0 oif eth0 masquerade
}
}
使用 iptables
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
eth0
对应的是你的设备对外数据通信的网卡。如果你不需要 IPV6 的相关配置,请在运行命令的时候删除包含有 IPV6 的那一行。
前往 Release 下载对应架构的压缩包,然后放到/usr/local/bin
,运行以下命令启动客户端:
RUST_LOG=info /usr/local/bin/phantun_client --local 127.0.0.1:1234 --remote 10.0.0.1:4567
其中,--local 127.0.0.1:1234
对应的是 Phantun 需要本地监听的 IP 端口,--remote 10.0.0.1:4567
对应的是服务端的 IP 和端口。
(可选)如果你需要开机自启动,请将其添加到 /etc/systemd/system/phantun-client.service
[Unit]
Description=Phantun Client
After=network.target
[Service]
Environment="RUST_LOG=info"
ExecStart=/usr/local/bin/phantun_client --local 127.0.0.1:1234 --remote 10.0.0.1:4567
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
然后依次运行以下命令:
systemctl daemon-reload
systemctl enable phantun-client.service
systemctl start phantun-client.service
systemctl status phantun-client.service
在客户端生效后还需要修改 WireGuard 客户端配置文件中的Peer
中的Endpoint
为你的 Phantun 本地监听端口。
客户端(Openwrt)
我们现在 Release 下载你的 Openwrt 对应架构的压缩包,然后将对应的客户端文件上传到/usr/bin
目录。
检查/etc/sysctl.conf
和/etc/sysctl.d
下的文件,查看是否已包含:
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
大多数情况存在以上两条,如果不存在,请将其添加到/etc/sysctl.conf
内。
然后,添加以下内容到/etc/init.d/phantun_client
#!/bin/sh /etc/rc.common
START=99
STOP=10
USE_PROCD=1
PROG=/usr/bin/phantun_client
start_service() {
procd_open_instance
procd_set_param command $PROG \
--local 127.0.0.1:1234 \
--remote 10.0.0.1:4567
procd_set_param env RUST_LOG=info
procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-5}
procd_set_param stdout 1
procd_set_param stderr 1
procd_close_instance
}
stop_service() {
service_stop $PROG
}
restart() {
stop
sleep 2
start
}
其中,--local 127.0.0.1:1234
对应的是 Phantun 需要本地监听的 IP 端口,--remote 10.0.0.1:4567
对应的是服务端的 IP 和端口。
保存文件后,依次运行以下命令:
chmod +x /etc/init.d/phantun_client
/etc/init.d/phantun_client enable
/etc/init.d/phantun_client start
/etc/init.d/phantun_client status
在成功启动之后,系统会出现一个虚拟网卡tun0
(详见网络 → 设备)。然后我们新建防火墙区域,按照下图配置:

然后在高级设置中的“涵盖的设备”中选择虚拟网卡设备。

前往已经创建好的wg0
接口,然后修改 Peer 中的端点主机为 Phantun 的监听地址。如果无法连通,请尝试重启 Openwrt 主机。
客户端(Windows)
Phantun 只能在 Linux 上使用,但是我们仍然有使用 Windows 的需求,此时我们就需要借助于 WSL 的神力了(是的,还是要 Linux 环境的)。
我使用的是 Ubuntu 24.04 LTS,不同的系统操作上有区别。
首先我们需要安装iptables
. 其次,还是老规矩,下载对应架构的 Release 并解压提取客户端放在一个文件夹中。在客户端二进制的同一目录下新建 Shell 脚本文件:
sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo RUST_LOG=info ./phantun_client --local 127.0.0.1:1234 --remote 10.0.0.1:4567
其中,--local 127.0.0.1:1234
对应的是 Phantun 需要本地监听的 IP 端口,--remote 10.0.0.1:4567
对应的是服务端的 IP 和端口。 eth0
对应的是你的设备对外数据通信的网卡。如果你不需要 IPV6 的相关配置,请在运行命令的时候删除包含有 IPV6 的那一行。在默认情况下,WSL 和 Windows 本机通信使用的是 NAT 转发,使用ip address
查看 WSL 和 Windows 建立通信的网卡,--local
中的 IP 地址对应的是eth0
的 IP. 运行成功后还需要修改 WireGuard 客户端配置文件中的Peer
中的Endpoint
为你的 Phantun 本地监听端口。