WireGuard访问局域网络
WireGuard访问局域网络
- 角色定义:
- 公网服务器: 作为 WireGuard 的“服务器”或“中继站”(Hub)。它拥有固定公网IP,是所有设备连接的汇聚点
- 家庭服务器: 作为 WireGuard 的一个“客户端”(Peer),主动连接到公网服务器
- 你的外部设备(比如笔记本电脑、手机): 作为另一个 WireGuard “客户端”(Peer),也连接到公网服务器
- 网络流量走向:
- 当你在外部时,你的设备通过 WireGuard 隧道连接到公网服务器。
- 你想访问家庭服务器时,流量路径为:
你的设备 -> 公网服务器 -> 家庭服务器 - 公网服务器充当了一个“路由器”的角色,负责在多个 Peer 之间转发流量
准备工作
- 公网服务器: 确保你的公网服务器的防火墙(如
ufw或firewalld)放行了 WireGuard 的端口(默认是UDP 51820,可以自定义) - 家庭服务器: 确保它能够访问互联网
- 域名(可选但推荐): 为公网服务器配置一个域名,避免使用难以记忆的IP地址。如果只有IP,也可以。
详细步骤
第 1 步:在所有机器上安装 WireGuard
在公网服务器和家庭服务器上执行:
# Ubuntu/Debian
sudo apt update && sudo apt install wireguard
# CentOS/RHEL
sudo dnf install wireguard-tools
# 或者使用较旧的 yum
sudo yum install epel-release
sudo yum install wireguard-tools
第 2 步:配置公网服务器(中继服务器)
-
生成密钥对:
cd /etc/wireguard/ umask 077 wg genkey | tee privatekey | wg pubkey > publickey这会生成两个文件:
privatekey和publickey -
创建配置文件
/etc/wireguard/wg0.conf:[Interface] Address = 10.0.0.1/24 # 定义虚拟局域网的网段,服务器本身是 10.0.0.1 SaveConfig = true ListenPort = 51820 # 监听的UDP端口 PrivateKey = <公网服务器的私钥内容> # 粘贴 privatekey 文件里的内容 PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE [Peer] # 这是家庭服务器的配置 PublicKey = <家庭服务器的公钥内容> # 稍后在家庭服务器上生成 AllowedIPs = 10.0.0.2/32 # 为家庭服务器分配一个固定的虚拟IP [Peer] # 这是你笔记本电脑的配置 PublicKey = <你笔记本电脑的公钥内容> # 稍后在笔记本电脑上生成 AllowedIPs = 10.0.0.3/32 # 为你笔记本电脑分配一个固定的虚拟IP关键解释:
PostUp/PostDown: 用于设置防火墙转发和NAT规则,这是服务器成为中继的关键。eth0需要替换为公网服务器上实际连接公网的网卡名称- (可能是
ens3,enp0s3等,可通过ip addr命令查看)
- (可能是
- 目前
[Peer]部分是空的,在生成其他设备的密钥后补充完整
-
启用IP转发:编辑
/etc/sysctl.conf,取消注释或添加一行:net.ipv4.ip_forward=1使配置生效:
sudo sysctl -p -
启动WireGuard:
sudo wg-quick up wg0 # 设置开机自启 sudo systemctl enable wg-quick@wg0
第 3 步:配置家庭服务器
-
生成密钥对(同样在
/etc/wireguard/目录下):umask 077 wg genkey | tee privatekey | wg pubkey > publickey -
创建配置文件
/etc/wireguard/wg0.conf:[Interface] Address = 10.0.0.2/24 # 与公网服务器分配的IP一致 PrivateKey = <家庭服务器的私钥内容> # 家服务器不需要监听,也不需要设置PostUp [Peer] PublicKey = <公网服务器的公钥内容> # 粘贴公网服务器 publickey 文件里的内容 Endpoint = <你的公网服务器IP或域名>:51820 # 公网服务器的地址 AllowedIPs = 10.0.0.0/24 # 告诉家服务器,通往 10.0.0.0/24 网段的流量都走wg隧道 PersistentKeepalive = 25 # 非常重要!保持连接,因为家服务器在NAT后PersistentKeepalive是让家庭服务器(位于NAT后)能够持续与公网服务器保持连接的关键 -
启动WireGuard:
sudo wg-quick up wg0 sudo systemctl enable wg-quick@wg0
第 4 步:配置你的笔记本电脑(或其他外部设备)
过程与配置家庭服务器几乎完全相同
- 安装WireGuard,生成密钥对
- 创建配置文件
wg0.conf:[Interface] Address = 10.0.0.3/24 PrivateKey = <你笔记本电脑的私钥内容> [Peer] PublicKey = <公网服务器的公钥内容> Endpoint = <你的公网服务器IP或域名>:51820 AllowedIPs = 10.0.0.0/24 # 告诉笔记本,所有访问 10.0.0.0/24 的流量都走wg隧道 # PersistentKeepalive = 25 # 对于经常移动的客户端,可开可不开 - 启动连接。
第 5 步:将Peer信息添加到公网服务器
现在,你有了所有客户端的公钥,需要回到****公网服务器,编辑 /etc/wireguard/wg0.conf,将各个 [Peer] 段的 PublicKey 补充完整。
或者,使用更动态的命令(推荐,避免重启服务):
# 添加家庭服务器作为Peer
sudo wg set wg0 peer <家庭服务器的公钥> allowed-ips 10.0.0.2
# 添加你的笔记本电脑作为Peer
sudo wg set wg0 peer <笔记本电脑的公钥> allowed-ips 10.0.0.3
之后,配置会自动保存到 wg0.conf 文件中(因为设置了 SaveConfig = true)。
第 6 步:测试连接
-
在公网服务器上,运行
sudo wg查看状态。应该看到两个 peer 都有最新的握手时间 -
从笔记本电脑上,尝试 ping 家庭服务器的虚拟IP:
ping 10.0.0.2注:如果是服务器需要在安全组和防火墙放行51820端口
提示
- 使用配置脚本: 对于多个设备,手动管理密钥和IP容易出错。可以考虑使用自动化脚本(如
wg-gen)来生成配置- WireGuard工具
- Wg Gen Web Docker工具
-
docker run --rm -it -v /tmp/wireguard:/data -p 8080:8080 -e "WG_CONF_DIR=/data" vx3r/wg-gen-web:latest
-
- 安全性:
- 防火墙规则: 在公网服务器上,防火墙只开放必需的端口(如SSH和WireGuard的端口)
- 密钥管理: 私钥非常重要,务必妥善保管,不要泄露
- 连接更多设备: 只需重复步骤 3 和 4,为每个新设备生成密钥对,分配一个新的IP(如
10.0.0.4),然后将其作为新的[Peer]添加到公网服务器的配置中即可
二、核心命令:wg(运行时查看与动态管理)
1. 查看 WireGuard 接口状态
sudo wg
显示所有接口的详细信息:公钥、端口、peer、握手时间、流量等。
2. 查看指定接口
sudo wg show wg0
3. 动态添加一个客户端(peer)
sudo wg set wg0 peer <客户端公钥> allowed-ips <分配的IP> endpoint <客户端公网IP:端口>
示例:
sudo wg set wg0 peer JeI1Qc7VyIr2vJrhS7GRzGVtEhKs/HPXkFJWdeXJczo= allowed-ips 10.0.0.4/32
endpoint可选,服务端一般不需要加(客户端自己上报)。
4. 删除一个 peer
sudo wg set wg0 peer <客户端公钥> remove
5. 清空所有 peer(保留接口)
sudo wg set wg0 peers remove-everything
二、接口管理:wg-quick(启动/关闭隧道)
1. 启动 WireGuard 接口
sudo wg-quick up wg0
读取
/etc/wireguard/wg0.conf,创建接口、设置 IP、路由、防火墙规则。
2. 关闭 WireGuard 接口
sudo wg-quick down wg0
删除接口,清理 iptables 规则。
3. 重启接口(修改配置后常用)
sudo wg-quick down wg0 && sudo wg-quick up wg0
三、配置文件管理
1. 编辑配置文件
sudo nano /etc/wireguard/wg0.conf
所有静态配置写在这里。
2. 导出现行运行配置(含动态添加的 peer)
sudo wg showconf wg0
可用于备份或写回
.conf文件。
3. 从配置文件重新加载(不重启)
sudo wg syncconf wg0 <(wg-quick strip wg0)
将
.conf文件内容同步到运行中的接口(推荐用于脚本)。
四、密钥管理(生成密钥对)
1. 生成私钥
wg genkey
输出如:
UN6y+9Wt6/BRyq+GIyhADckAWUiPzFSsDQU0drCbyX0=
2. 从私钥生成公钥
echo <私钥> | wg pubkey
示例:
echo UN6y+9Wt6/BRyq+GIyhADckAWUiPzFSsDQU0drCbyX0= | wg pubkey
输出公钥:
idjkok24wL++QPbmg6imYTqFMeroNUccJjitpISmIzE=
一键生成客户端密钥对
# 生成客户端私钥
CLIENT_PRIV=$(wg genkey)
# 生成客户端公钥
CLIENT_PUB=$(echo $CLIENT_PRIV | wg pubkey)
echo "Private Key: $CLIENT_PRIV"
echo "Public Key: $CLIENT_PUB"
五、服务管理(systemd)
1. 设置开机自启
sudo systemctl enable wg-quick@wg0
2. 立即启动服务
sudo systemctl start wg-quick@wg0
3. 重启服务
sudo systemctl restart wg-quick@wg0
4. 查看服务状态
sudo systemctl status wg-quick@wg0
5. 禁用开机自启
sudo systemctl disable wg-quick@wg0
六、网络与调试命令
1. 查看接口状态
ip a show wg0
2. 查看路由表
ip route
3. 检查 NAT 规则是否生效
sudo iptables -t nat -L POSTROUTING -n -v
4. 查看转发是否开启
cat /proc/sys/net/ipv4/ip_forward
**正常应输出 **
1。
5. 抓包分析(高级)
sudo tcpdump -i wg0 -n
七、统一访问内网设备的真实 IP 地址
在当前配置中,我们为内网设备 A 分配了一个 WireGuard 虚拟 IP(如 10.10.0.2),而它在局域网中的真实 IP 是 10.0.0.2。
这种双 IP 的设计导致无论从内网还是外网访问该设备时,都需要记住两个不同的地址,使用起来非常不便。
我们的目标是:无论从内网还是公网,都直接通过设备的真实 IP(如 10.0.0.2)进行访问。
要实现这一点,需要在公网 WireGuard 服务器上做适当配置,使其能将发往 10.0.0.0/24 网段的流量正确转发到对应的内网设备。具体做法如下:
公网服务器配置(wg0.conf)
[Interface]
Address = 10.10.0.1/24
ListenPort = 51820
PrivateKey = UN6y+9Wt6/BRyq+GXXXDQU0drCbyX0=
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# 笔记本(内网设备 A)
[Peer]
PublicKey = 9RK0SLrTAeoQLIXXXXaiIiFxquWg=
AllowedIPs = 10.10.0.2/32, 10.0.0.0/24
注意:
AllowedIPs中同时包含虚拟 IP(10.10.0.2)和真实子网(10.0.0.0/24),这样服务器才知道哪些流量应通过该 Peer 转发。
内网设备配置(如笔记本的 wg-client.conf)需要有一台能够转发的设备
[Interface]
Address = 10.10.0.2/24 # 与公网服务器分配的IP一致
PrivateKey = COfRw9GpL+XXX=
PostUp = iptables -t nat -A POSTROUTING -s 10.10.0.0/24 -o enp2s0 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -s 10.10.0.0/24 -o enp2s0 -j MASQUERADE
[Peer]
PublicKey = idjkok24wL++XXX=
Endpoint = xxx.com:51820 # 公网服务器的地址
# AllowedIPs = 10.10.0.0/24 # 告诉家服务器,通往 10.10.0.0/24 网段的流量都走wg隧道
AllowedIPs = 10.10.0.0/24
PersistentKeepalive = 25
为了让设备既能访问 WireGuard 虚拟网络,又能被通过真实 IP 访问,其配置也需包含两个网段:
[Interface]
PrivateKey = iGFZ2oTbE9+BnDQQviXF+6XXXXXK/AGE=
Address = 10.0.0.3/24
[Peer]
PublicKey = idjkok24wL++QPbXXXXXXXzE=
AllowedIPs = 10.0.0.0/24, 10.10.0.0/24
Endpoint = hz-server.glax.live:51820
PersistentKeepalive = 25
这样配置后,无论你身处内网还是通过公网连接 WireGuard,都可以直接使用
10.0.0.2(设备的真实 IP)访问该设备,无需再区分“虚拟”或“真实”地址。
如有更多设备,只需在各自的 [Peer] 配置中同样添加 10.0.0.0/24 到 AllowedIPs,并确保内网设备开启 IP 转发(如需要路由其他主机流量)。