loading

Loading

请输入关键字开始搜索
    首页 技术实践随笔技术

    wireguard 局域网VPN方案

    分类:随笔技术
    字数: (8008)
    阅读: (471)
    0

    本文用一台云服务器作为 WireGuard 服务端,手机、电脑、CatWrt 作为客户端接入。这个方案最稳定,也最适合普通用户:云服务器有公网 IP,客户端不需要公网 IP,直接连服务器即可。

    一、网络规划

    先统一规划 IP,后面所有配置都按这个来。

    设备 角色 WireGuard IP
    云服务器 服务端 10.8.0.1
    手机 客户端 10.8.0.2
    电脑 客户端 10.8.0.3
    CatWrt 客户端 10.8.0.10
    端口 UDP 51820

    需要记住一个原则:一台设备一套密钥,一个独立 IP,不要多个设备共用同一个配置。

    二、服务器安装 WireGuard

    1. 安装软件

    Ubuntu / Debian 执行:

    sudo apt update
    sudo apt install -y wireguard qrencode iptables

    CentOS / Rocky / AlmaLinux 执行:

    sudo dnf install -y wireguard-tools qrencode iptables

    2. 开启 IP 转发

    编辑系统配置:

    sudo vim /etc/sysctl.conf

    加入或确认有这一行:

    net.ipv4.ip_forward=1

    让配置立即生效:

    sudo sysctl -p

    检查结果:

    cat /proc/sys/net/ipv4/ip_forward

    输出 1 就是成功。

    3. 查看服务器公网网卡

    执行:

    ip route | grep default

    你会看到类似:

    default via 172.31.0.1 dev eth0

    这里的 eth0 就是公网网卡。也可能是 ens3ens5enp1s0,后面配置里的 eth0 要按实际结果替换。

    4. 生成服务端密钥

    sudo mkdir -p /etc/wireguard/clients
    cd /etc/wireguard
    sudo umask 077
    sudo wg genkey | sudo tee server_private.key | sudo wg pubkey | sudo tee server_public.key

    查看服务端私钥和公钥:

    sudo cat /etc/wireguard/server_private.key
    sudo cat /etc/wireguard/server_public.key

    私钥不要泄露,公钥后面要填到客户端里。

    5. 创建服务端配置

    编辑配置文件:

    sudo vim /etc/wireguard/wg0.conf

    写入:

    [Interface]
    Address = 10.8.0.1/24
    ListenPort = 51820
    PrivateKey = 填服务端PrivateKey
    PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

    注意:如果你的公网网卡不是 eth0,把上面的 eth0 改成你的实际网卡名。

    6. 放行 UDP 端口

    如果服务器用了 UFW:

    sudo ufw allow 51820/udp
    sudo ufw reload

    如果是云服务器,还要去云厂商安全组放行:

    协议:UDP
    端口:51820
    来源:0.0.0.0/0

    这是最容易漏的一步。WireGuard 用的是 UDP,不是 TCP。

    7. 启动 WireGuard

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

    查看状态:

    sudo wg show

    看到 interface: wg0 就说明服务端启动成功。

    三、添加手机、电脑、CatWrt 客户端

    1. 生成客户端密钥

    生成手机密钥:

    cd /etc/wireguard
    sudo wg genkey | sudo tee clients/phone_private.key | sudo wg pubkey | sudo tee clients/phone_public.key

    生成电脑密钥:

    sudo wg genkey | sudo tee clients/pc_private.key | sudo wg pubkey | sudo tee clients/pc_public.key

    生成 CatWrt 密钥:

    sudo wg genkey | sudo tee clients/catwrt_private.key | sudo wg pubkey | sudo tee clients/catwrt_public.key

    2. 把客户端加入服务端

    编辑服务端配置:

    sudo vim /etc/wireguard/wg0.conf

    在文件末尾追加:

    [Peer]
    # phone
    PublicKey = 填phone_public.key里的内容
    AllowedIPs = 10.8.0.2/32
    [Peer]
    # pc
    PublicKey = 填pc_public.key里的内容
    AllowedIPs = 10.8.0.3/32
    [Peer]
    # catwrt
    PublicKey = 填catwrt_public.key里的内容
    AllowedIPs = 10.8.0.10/32

    服务端这里一定要写 /32,不要给每个客户端都写 10.8.0.0/24,否则多客户端容易冲突。

    3. 重启服务端

    sudo systemctl restart wg-quick@wg0
    sudo wg show

    四、生成客户端配置文件

    1. 手机配置 phone.conf

    查看需要填的密钥:

    sudo cat /etc/wireguard/clients/phone_private.key
    sudo cat /etc/wireguard/server_public.key

    创建手机配置:

    sudo vim /etc/wireguard/clients/phone.conf

    写入:

    [Interface]
    PrivateKey = 填phone_private.key里的内容
    Address = 10.8.0.2/32
    DNS = 1.1.1.1
    MTU = 1420
    [Peer]
    PublicKey = 填server_public.key里的内容
    Endpoint = 你的服务器公网IP或域名:51820
    AllowedIPs = 0.0.0.0/0
    PersistentKeepalive = 25

    AllowedIPs = 0.0.0.0/0 表示手机所有流量都走 WireGuard。如果只想访问 WireGuard 内网,改成:

    AllowedIPs = 10.8.0.0/24

    生成二维码:

    sudo qrencode -t ansiutf8 < /etc/wireguard/clients/phone.conf

    2. 电脑配置 pc.conf

    查看电脑私钥:

    sudo cat /etc/wireguard/clients/pc_private.key

    创建电脑配置:

    sudo vim /etc/wireguard/clients/pc.conf

    写入:

    [Interface]
    PrivateKey = 填pc_private.key里的内容
    Address = 10.8.0.3/32
    DNS = 1.1.1.1
    MTU = 1420
    [Peer]
    PublicKey = 填server_public.key里的内容
    Endpoint = 你的服务器公网IP或域名:51820
    AllowedIPs = 0.0.0.0/0
    PersistentKeepalive = 25

    3. CatWrt 配置 catwrt.conf

    查看 CatWrt 私钥:

    sudo cat /etc/wireguard/clients/catwrt_private.key

    创建 CatWrt 配置:

    sudo vim /etc/wireguard/clients/catwrt.conf

    写入:

    [Interface]
    PrivateKey = 填catwrt_private.key里的内容
    Address = 10.8.0.10/32
    DNS = 1.1.1.1
    MTU = 1420
    [Peer]
    PublicKey = 填server_public.key里的内容
    Endpoint = 你的服务器公网IP或域名:51820
    AllowedIPs = 0.0.0.0/0
    PersistentKeepalive = 25

    如果你第一次配置 CatWrt,建议先把 AllowedIPs 写成:

    AllowedIPs = 10.8.0.0/24

    确认能连通后,再改成:

    AllowedIPs = 0.0.0.0/0

    这样可以避免路由器一启用 WireGuard 就全家断网。

    五、手机设置 WireGuard

    1. iPhone / iPad

    在 App Store 安装 WireGuard,打开 App,点击 +,选择扫码导入,扫描服务器生成的二维码,保存后打开开关。

    2. Android

    安装 WireGuard App,点击 +,选择扫码导入或导入配置文件,保存后打开开关。

    3. 手机测试

    手机打开 WireGuard 后,访问查 IP 网站。如果显示的是服务器公网 IP,说明手机流量已经走服务器。如果只是访问内网,可以测试:

    ping 10.8.0.1

    六、电脑设置 WireGuard

    1. Windows

    安装 WireGuard 官方客户端,点击 Import tunnel(s) from file,选择 pc.conf,然后点击 Activate

    2. macOS

    在 App Store 安装 WireGuard,导入 pc.conf,然后启用。

    3. Linux

    安装:

    sudo apt update
    sudo apt install -y wireguard

    复制配置:

    sudo cp pc.conf /etc/wireguard/wg0.conf
    sudo chmod 600 /etc/wireguard/wg0.conf

    启动:

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

    查看:

    sudo wg show

    七、CatWrt 设置 WireGuard

    CatWrt 可以按 OpenWrt 的方式配置。这里推荐把 CatWrt 当客户端,连接云服务器。

    1. 安装 WireGuard 组件

    SSH 登录 CatWrt,执行:

    opkg update
    opkg install luci-proto-wireguard wireguard-tools kmod-wireguard qrencode

    安装后重启:

    reboot

    如果提示 kmod-wireguard 内核版本不匹配,不要硬装。通常是固件和软件源不匹配,需要换匹配的软件源或升级 CatWrt 固件。

    2. 新建 WireGuard 接口

    进入 CatWrt 后台:

    网络 -> 接口 -> 添加新接口

    设置:

    名称:wg_vps
    协议:WireGuard VPN

    如果没有 WireGuard VPN 选项,说明插件没装好,或装完没有重启。

    3. 填写接口信息

    wg_vps 接口中填写:

    私钥:catwrt_private.key 的内容
    IP 地址:10.8.0.10/32
    MTU:1420
    监听端口:留空

    CatWrt 作为客户端时,监听端口可以留空。

    4. 添加服务端 Peer

    对端 / Peers 里添加:

    公钥:server_public.key 的内容
    端点主机:服务器公网IP或域名
    端点端口:51820
    允许的 IP:10.8.0.0/24 或 0.0.0.0/0
    持久 KeepAlive:25

    如果只是测试,允许的 IP 先写:

    10.8.0.0/24

    如果想让 CatWrt 下的设备都走 WireGuard,再改成:

    0.0.0.0/0

    如果页面有 Route Allowed IPs / 路由允许的 IP,需要勾选。

    5. 设置防火墙区域

    如果只是让 CatWrt 自己访问 WireGuard,把 wg_vps 放到 lan 区域即可。
    如果想让 CatWrt 下面的设备通过 WireGuard 上网,建议把 wg_vps 放到 wan 区域,因为 wan 通常已经开启 NAT,并允许 lan -> wan 转发。
    如果你新建了 vpn 区域,需要确认:

    lan -> vpn:允许转发
    vpn:开启 Masquerading
    vpn:允许输出

    普通用户建议先放到 wan 区域,少踩坑。

    6. CatWrt 测试

    SSH 到 CatWrt:

    wg show
    ping 10.8.0.1

    如果看到 latest handshake,说明已经连上。如果 CatWrt 配的是全局流量,可以测试出口 IP:

    curl ifconfig.me

    显示服务器公网 IP,说明 CatWrt 已经通过 WireGuard 出口上网。

    八、常见坑

    1. 没有握手

    优先检查:云服务器安全组是否放行 UDP 51820,服务器防火墙是否放行 UDP 51820,客户端 Endpoint 是否写错,服务端是否添加了对应客户端 Peer,公钥是否填反。

    2. 有握手但不能上网

    检查服务器是否开启转发:

    cat /proc/sys/net/ipv4/ip_forward

    必须输出:

    1

    再检查 NAT 网卡名是否正确:

    ip route | grep default

    如果实际网卡是 ens3,配置里却写 eth0,就会连上但不能上网。

    3. 多个客户端互相顶掉

    原因通常是多个设备用了同一个配置。每台设备都要有独立 PrivateKey 和独立 Address

    4. CatWrt 一启用就断网

    先把 CatWrt 的 AllowedIPs 从:

    0.0.0.0/0

    改成:

    10.8.0.0/24

    确认基础连接正常后,再考虑全局代理。旁路由不会自动接管全家流量,如果 CatWrt 是旁路由,还需要让设备网关指向 CatWrt,或者使用策略路由。

    5. 能连但网页打不开

    优先检查 DNS。客户端可以先写:

    DNS = 1.1.1.1

    如果某些网络下不稳定,保留:

    PersistentKeepalive = 25

    必要时把 MTU 改小:

    MTU = 1280

    九、新增客户端接入时怎么修改

    后面如果要新增手机、电脑、平板、路由器,不需要重装 WireGuard,只需要做三件事:生成新客户端密钥、服务端增加一个 Peer、生成新客户端配置。

    1. 规划一个新 IP

    先给新设备分配一个没有用过的 WireGuard IP。例如前面已经用了:

    手机:10.8.0.2
    电脑:10.8.0.3
    CatWrt:10.8.0.10

    新增一台平板,可以用:

    平板:10.8.0.4

    不要和已有设备重复。

    2. 生成新客户端密钥

    假设新客户端叫 pad

    cd /etc/wireguard
    sudo bash -c 'umask 077; wg genkey | tee /etc/wireguard/pad_private.key | wg pubkey > /etc/wireguard/pad_public.key'

    查看新客户端公钥:

    sudo cat /etc/wireguard/pad_public.key

    3. 修改服务端配置

    编辑服务端配置:

    sudo vim /etc/wireguard/wg0.conf

    在文件末尾追加:

    [Peer]
    # pad
    PublicKey = 填pad_public.key里的内容
    AllowedIPs = 10.8.0.4/32

    注意:服务端这里只需要新增这个客户端的 [Peer],不要修改已有手机、电脑、CatWrt 的配置。

    4. 重启 WireGuard

    sudo systemctl restart wg-quick@wg0

    查看状态:

    sudo wg show

    重启时已有客户端会短暂断开,几秒后会自动恢复。普通用户用这种方式最简单。

    5. 生成新客户端配置

    查看服务端公钥和新客户端私钥:

    sudo cat /etc/wireguard/server_public.key
    sudo cat /etc/wireguard/clients/pad_private.key

    创建新客户端配置:

    sudo vim /etc/wireguard/clients/pad.conf

    写入:

    [Interface]
    PrivateKey = 填pad_private.key里的内容
    Address = 10.8.0.4/32
    DNS = 1.1.1.1
    MTU = 1420
    [Peer]
    PublicKey = 填server_public.key里的内容
    Endpoint = 你的服务器公网IP或域名:51820
    AllowedIPs = 0.0.0.0/0
    PersistentKeepalive = 25

    如果这个客户端只想访问 WireGuard 内网,不想让所有流量都走服务器,把:

    AllowedIPs = 0.0.0.0/0

    改成:

    AllowedIPs = 10.8.0.0/24

    6. 导入新客户端

    手机或平板可以生成二维码:

    sudo qrencode -t ansiutf8 < /etc/wireguard/clients/pad.conf

    然后用 WireGuard App 扫码导入。电脑客户端则直接导入 pad.conf 文件。

    7. 新增客户端时最容易出错的地方

    新增客户端时,只记住这几条:

    1. 新设备必须用新的 PrivateKey 和 PublicKey
    2. 新设备必须用新的 Address,不能和旧设备重复
    3. 服务端必须新增一个对应的 [Peer]
    4. 服务端 Peer 里的 AllowedIPs 要写这个客户端的 /32
    5. 原有客户端配置不用改

    例如新增 pad,服务端只新增:

    [Peer]
    # pad
    PublicKey = pad的PublicKey
    AllowedIPs = 10.8.0.4/32

    客户端只使用:

    Address = 10.8.0.4/32

    不要复制旧手机的配置直接用,否则两个设备会互相顶掉。

    文章出处: 求索空间
    文章链接: https://blog.askerlab.com/wireguard_install
    评论列表:
    empty

    暂无评论