
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