0%

实验室 WireGuard 组网部署方案分享.md

无论是家庭内希望完成 HomeLab 的数字基建, 还是实验室服务器需要组网提供外部连接能力,WireGuard 往往都是一个不错的方案。它的配置简单,兼容广泛,效果也不错,兼具兼具安全与自由。相比 TailScale 等魔改方案,直接使用 WireGuard 可以作为代理节点融入“通用网络代理方案”从而实现更加无感的互联网冲浪体验,更重要的是同时带来了公网暴露的便捷性与内网隐蔽安全性。

接下来分享我搭建实验室内网的方案。首先交代下实验室的网络情况,我们实验室的服务器散落在不同的网络环境中,但都处在校园网下,没有公网IP,没有IPv6。我们通过 WireGuard 将服务器连接在一个虚拟内网中,并提供校园网下的连接能力。为了能够实现进一步的公网远程连接,我们在购置的VPS 中部署 frp 来转发 WireGuard。这样做的好处是在校园网下可以使用 WireGuard 校园网的接口从而享受较高速率的连接,同时在公网环境下也可以通过 VPS 转发后的端口有效连接。

配置


尽管 WireGuard 支持多种网络结构,但对于常见的需要内网穿透的场景,建设 “服务端–客户端”这种方式较为简单。

首先建议在 Linux 服务器端安装 WireGuard,安装方式可以参考官网

服务端的配置

  1. 生成私钥公钥

    wg genkey | tee privatekey | wg pubkey > publickey
  2. 编辑网口配置文件
    接下来需要新建虚拟网口,就叫它 wg0 吧,为了给其准备配置文件输入以下命令:

sudo vim /etc/wireguard/wg0.conf
[Interface]
Address = 10.2.100.1/24 # 服务端虚拟 IP
PrivateKey = <privatekey> # 填入上面生成的私钥
ListenPort = 16384

然后使用 systemd 启动 wireguard。这种方式便于管理与配置 wiregurad 自启。

sudo systemctl start wg-quick@wg0
sudo systemctl enable wg-quick@wg0

VPS 配置 FRP 转发

首先在 VPS 中下载 frp 并配置

# frps.toml
bindPort = 7066 # 连接的端口,记得在安全组中放行
auth.token = <生成一个无序的密码>

log.to = "/var/log/frps.log"
log.level = "info"
log.maxDays = 3
# disable log colors when log.to is console, default is false
log.disablePrintColor = false

同样选择在 systemd 中管理 frps,这里可以参考 frp 安装文档

然后在需要在服务器中下载 frp 并配置

# frpc.toml
serverAddr = <服务器的IP>
serverPort = <上面指定的端口>
auth.token = <上面指定的token>

log.to = "/var/log/frpc.log"
# trace, debug, info, warn, error
log.level = "info"
log.maxDays = 3
log.disablePrintColor = false


[[proxies]]
name = "wg_rter"
type = "udp" # wireguard 基于 udp
localIP = "127.0.0.1"
localPort = 16384 # 这个是服务器在 wg0 指定的端口
remotePort = 16385 # 这个是希望 vps 转发出来的端口

启动 frpc 并连接,并在 VPS 安全组中放行上面设置的 remotePort

客户端的配置

在安装完客户端之后,如果是带有 GUI 的客户端,如 macOS,安卓等会为我们自动生成私钥密钥,我们只需要调整即可。否则依然可以使用上面的命令生成。

[Interface]
Address = 10.2.100.2/24 # 服务端虚拟 IP
PrivateKey = <privatekey>
DNS = 10.2.100.1 # 如果我们需要解析内网自定的域名,请在这里填入自建 DNS 的 IP

[Peer]
PublicKey = <publickey> # 这里填上服务器的 publickey
AllowIPs = 10.2.100.0/24
Endpoint = <server_addr>:<Port> # 上面 vps 的 IP 与 转发的端口

分流路由

到这里,我们应该实现了实验室内网访问 / 回家访问自建服务的功能。但对于大多数人来说,我们还需要同时满足向内与向外两个方向的需求。实际上,常见的通用代理软件已经提供了这方面的能力,帮助我们丝滑的满足需求。

mihomo

以下内容直接摘自 mihomo doc

WireGuard 标准配置文件

[Interface]
Address = <本机组网IP>
ListenPort = <本地监听端口>
PrivateKey = <本机私钥>
DNS = <使用的DNS>
MTU = <预设MTU>

[Peer]
AllowedIPs = <转发IP段>
Endpoint = <远端地址>:<远端端口>
PublicKey = <远端公钥>

转换为 mihomo 格式的配置

- name: "wg"
type: wireguard
ip: <本机组网IP,IPv4往这里填>
ipv6: <本机组网IP,IPv6往这里填> # 没有v6地址直接删除
private-key: <本机私钥>
peers:
- server: <远端地址>
port: <远端端口>
public-key: <远端公钥>
allowed-ips: ['0.0.0.0/0'] # 分流由clash处理
# reserved: [209,98,59] # 如果需要自己填
udp: true
mtu: <预设MTU> # 按需设置,不用直接删除
remote-dns-resolve: true # 按需设置,不用直接删除
dns: <使用的DNS> # 按需设置,不用直接删除

上面的配置需要在 mihomo config 的 proxies 部分,下面给出节点与规则配置示例:


... 上面略去

proxies:
- name: "wg"
type: wireguard
ip: <本机组网IP,IPv4往这里填>
ipv6: <本机组网IP,IPv6往这里填> # 没有v6地址直接删除
private-key: <本机私钥>
peers:
- server: <远端地址>
port: <远端端口>
public-key: <远端公钥>
allowed-ips: ['0.0.0.0/0'] # 分流由clash处理
# reserved: [209,98,59] # 如果需要自己填
udp: true
mtu: <预设MTU> # 按需设置,不用直接删除
remote-dns-resolve: true # 按需设置,不用直接删除
dns: <使用的DNS> # 按需设置,不用直接删除

... 中间略去

rules:
- DOMAIN-SUFFIX,lab.cc,wg # 假设 lab.cc 是内网自定的域名
- IP-CIDR,192.168.1.0/24,wg,no-resolve # 假设 192.168.1.0/24 是内网网段

... 下面略去

这样保存设置并生效后应该就可以将内网访问融入到整体的分流代理中。类似的道理,我们同样可以调整 Shadowrocket 等软件的配置,添加 WireGuard 的节点配置与分流规则。

总结

WireGuard 轻量且强大,并具有良好的“生态”,融入到整体的分流路由中,提供超出 TailScale 等魔改版更加自由无缝的冲浪体验。能为接下来搭建 self-hosted 服务提供坚实的基础,借助诸多代理软件的力量兼具安全与便携。