WireGuard访问局域网络

  1. 角色定义
  • 公网服务器: 作为 WireGuard 的“服务器”或“中继站”(Hub)。它拥有固定公网IP,是所有设备连接的汇聚点
  • 家庭服务器: 作为 WireGuard 的一个“客户端”(Peer),主动连接到公网服务器
  • 你的外部设备(比如笔记本电脑、手机): 作为另一个 WireGuard “客户端”(Peer),也连接到公网服务器
  1. 网络流量走向
    • 当你在外部时,你的设备通过 WireGuard 隧道连接到公网服务器。
    • 你想访问家庭服务器时,流量路径为:你的设备 -> 公网服务器 -> 家庭服务器
    • 公网服务器充当了一个“路由器”的角色,负责在多个 Peer 之间转发流量

准备工作

  1. 公网服务器: 确保你的公网服务器的防火墙(如 ufwfirewalld)放行了 WireGuard 的端口(默认是 UDP 51820,可以自定义)
  2. 家庭服务器: 确保它能够访问互联网
  3. 域名(可选但推荐): 为公网服务器配置一个域名,避免使用难以记忆的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 步:配置公网服务器(中继服务器)

  1. 生成密钥对

    cd /etc/wireguard/
    umask 077
    wg genkey | tee privatekey | wg pubkey > publickey
    

    这会生成两个文件:privatekeypublickey

  2. 创建配置文件 /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] 部分是空的,在生成其他设备的密钥后补充完整
  3. 启用IP转发:编辑 /etc/sysctl.conf,取消注释或添加一行:

    net.ipv4.ip_forward=1
    

    使配置生效:sudo sysctl -p

  4. 启动WireGuard

    sudo wg-quick up wg0
    
    # 设置开机自启
    sudo systemctl enable wg-quick@wg0 
    

第 3 步:配置家庭服务器

  1. 生成密钥对(同样在 /etc/wireguard/ 目录下):

    umask 077
    wg genkey | tee privatekey | wg pubkey > publickey
    
  2. 创建配置文件 /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后)能够持续与公网服务器保持连接的关键

  3. 启动WireGuard

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

第 4 步:配置你的笔记本电脑(或其他外部设备)

过程与配置家庭服务器几乎完全相同

  1. 安装WireGuard,生成密钥对
  2. 创建配置文件 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 # 对于经常移动的客户端,可开可不开
    
  3. 启动连接。

第 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 步:测试连接

  1. 在公网服务器上,运行 sudo wg 查看状态。应该看到两个 peer 都有最新的握手时间

  2. 从笔记本电脑上,尝试 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