返回文章列表

OpenWrt作为旁路由配置Wireguard实现内网穿透

分类
标签
SilentBlade
SilentBlade
2024-03-27 5 分钟阅读 25 阅读

0. 前言

近期一直在折腾软路由系统及配置,并在家中部署了一套 Kubernetes 环境。由于有从外部访问该环境以补充开发资源的需求,虽然可以通过外网端口暴露的方式实现,但这种做法既不方便也不够安全。因此,最理想的方案是将办公电脑通过内网 IP 直接连入家庭局域网。

由于办公环境使用 H3C 的 iNode 客户端上网,实测发现连接 OpenVPN 会导致 iNode 掉线。查阅官方论坛得知两者存在冲突(详见 iNode 跟其他VPN冲突),若同时使用 SSL VPN 软件会相互排斥,只能二选一。为此,必须更换 VPN 协议,最终选择了基于 UDP 协议的 WireGuard。

本文不介绍 OpenWrt 的安装及旁路由配置,重点讲解如何在旁路由上安装配置 WireGuard 以实现内网穿透。我使用的是 eSir 的“高大全”版本(已预装 WireGuard),固件下载地址如下:

eSir高大全 OpenWrt 固件 eSir高大全 OpenWrt 网盘列表

1. OpenVPN 与 WireGuard 的区别

  • 协议与连接体验:OpenConnect VPN 主要基于 TCP 协议,连接过程类似拨号,在网络断开和重连时感知明显;而 WireGuard 基于 UDP 协议,类似于常驻后台的服务,随用随取,连接体验更佳。
  • 密钥与配置管理:OpenConnect VPN 通常依赖证书来提升安全性和连接体验;WireGuard 则采用点对点的公私钥对进行配对,且需为每个客户端单独分配内网 IP 及专属公私钥。两者前期配置都略显繁琐,但后续的管理和使用均较为便捷。
  • 客户端要求:OpenConnect VPN 客户端仅需证书文件(或配置对应的账号密码);WireGuard 客户端则仅需对应的配置文件。

2. 网络环境介绍

家庭网络拓扑图

  • 192.168.50.1:iNode 主路由。
  • 192.168.50.2:OpenWrt 旁路由(兼任 DNS 服务器,与主路由网关互指)。

3. 服务端设置

3.1 创建公私钥

通过 SSH 登录到 OpenWrt 后台:

shell
# 创建目录存放公钥私钥
mkdir wg
# 进入文件夹
cd wg
# 配置创建密钥的权限
umask 077
# 创建预共享密钥
wg genpsk > sharekey
# 获取密钥并复制保存
cat sharekey

请妥善保存 sharekey,后续配置将会用到。

  • 服务端公私钥
shell
# 创建服务端公钥和私钥
wg genkey | tee server_privatekey | wg pubkey > server_publickey
# 获取服务端私钥并复制保存
cat server_privatekey
# 获取服务端公钥并复制保存
cat server_publickey

请妥善保存 server_privatekeyserver_publickey

  • 客户端公私钥(以 macOS 为例)

有几个客户端就需要生成几套密钥,可按 macos_publickeymacos_privatekey 命名区分:

shell
# 创建 macOS 客户端公钥和私钥
wg genkey | tee macos_privatekey | wg pubkey > macos_publickey
# 获取 macOS 客户端私钥并复制保存
cat macos_privatekey
# 获取 macOS 客户端公钥并复制保存
cat macos_publickey

请妥善保存 macos_privatekeymacos_publickey

最终生成的目录文件结构如下:

密钥生成目录文件结构

3.2 配置 OpenWrt

3.2.1 添加 WireGuard 网络新接口

登录 OpenWrt 后台,依次点击:网络 -> 接口 -> 添加新接口

OpenWrt添加WireGuard接口

填写接口名称,选择接口协议为 WireGuard VPN,点击提交。

WireGuard网络创建新接口

3.2.2 WireGuard 网络接口基本设置
  • 基本设置:填入上文生成的服务端私钥 server_privatekey
  • 监听端口:自定义一个端口号(例如 16666),并在主路由上做好该端口的 UDP 协议映射。

我以 iNode 作为主路由为例,UDP 端口映射设置如下: ikuai端口映射

  • IP 地址:为 VPN 专用的网段分配一个 IP。本文以 192.168.100.X 作为 WireGuard 专用网段,则服务端 IP 设为 192.168.100.1/24

服务端基本设置

点击右下角的保存并应用

核心参数汇总:

  • 协议:WireGuard VPN
  • 私钥:server_privatekey
  • 监听端口:16666(需在 iNode 中做 UDP 映射)
  • IP 地址:192.168.100.1/24
3.2.3 WireGuard 网络接口防火墙设置

在防火墙设置页面中,将当前接口绑定至 wireguard 区域。

wireguard防火墙设置

点击右下角的保存并应用

3.2.4 客户端 Peers 设置

在 Peers 区域为每个客户端添加配置:

  • 公钥:填入上文获取的 macOS 客户端公钥 macos_publickey
  • 预共享密钥:填入上文获取的 sharekey
  • 允许的 IP (Allowed IPs):为该 macOS 客户端分配的固定 IP,本文示例为 192.168.100.2/32(注意各客户端 IP 不能冲突,此 IP 将在客户端配置文件中使用)。
  • 持续 Keep-Alive:填写 25

客户端 Peers设置

点击右下角的保存并应用

3.2.5 OpenWrt 防火墙设置

依次点击:网络 -> 防火墙 -> 自定义规则,添加以下防火墙规则,随后重启防火墙:

shell
# 注意:此处的网段 192.168.100.0/24 需与上文服务端 IP 网段保持一致
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o br-lan -j MASQUERADE

OpenWrt防火墙设置

3.2.6 重启 WireGuard

返回 网络 -> 接口,将 WireGuard 接口先关闭再连接;为了稳妥起见,建议直接重启整个 OpenWrt 系统。

4. 客户端配置

创建后缀为 .conf 的客户端配置文件(例如 macos_wireguard.conf),并根据实际情况填写公私钥及网络参数:

  • Address:客户端专用的内网 IP(如 192.168.100.2/32)。
  • PrivateKey:对应的客户端私钥。
  • DNS:OpenWrt 的 IP 地址(192.168.50.2),前提是主路由已将 DNS 指向 OpenWrt。
  • PublicKey:OpenWrt 服务端的公钥。
  • Endpoint:家中的公网 IP(或 DDNS 域名)加端口。
  • AllowedIPs:该参数决定了流量走向。若设置为 0.0.0.0/0,则表示所有网络请求均通过 VPN 转发(即全局 VPN)。由于 iOS 系统同时只能激活一个 VPN 软件,开启全局模式后,其他代理工具将无法使用;但在不需要开启其他代理工具的场景下,它能直接接管所有外网及内网流量。

注意:客户端配置文件中的 PrivateKey 填对应客户端的私钥,而 Peer 下的 PublicKey 填 OpenWrt 服务端的公钥,请勿弄混。

4.1 macOS 配置

新建 macos_wireguard.conf 文件。在 macOS App Store 下载 WireGuard 客户端,从文件导入该隧道(注:下载 WireGuard 客户端需要美区 Apple ID)。

ini
[Interface]
# 客户端分配的专用 IP
Address = 192.168.100.2/32
# 对应客户端私钥
PrivateKey = macos_privatekey
# 本地 DNS 服务器
DNS = 192.168.50.2

[Peer]
# OpenWrt 服务端公钥
PublicKey = server_publickey
# 仅代理局域网与 VPN 网段,互联网流量走本地网络(可与 ClashX Pro 共存)
AllowedIPs = 192.168.50.0/24, 192.168.100.0/24
# 预共享密钥
PresharedKey = sharekey
# WireGuard 服务端连接地址
Endpoint = 公网IP或域名:16666
PersistentKeepalive = 25

提示:AllowedIPs = 192.168.50.0/24, 192.168.100.0/24 中,192.168.50.0/24 为家庭内网网段,192.168.100.0/24 为 WireGuard 专有网段。

连接成功后的运行状态:

WireGuard运行图

4.2 iPhone 配置

新建 ios_wireguard.conf 并上传至 iCloud 云盘。在 iOS 设备 App Store 下载 WireGuard 客户端(同样需要美区 Apple ID),从文件导入隧道。

ini
[Interface]
# 客户端分配的专用 IP(需保持唯一)
Address = 192.168.100.3/32
# 对应客户端私钥
PrivateKey = ios_privatekey
# 本地 DNS 服务器
DNS = 192.168.50.2

[Peer]
# OpenWrt 服务端公钥
PublicKey = server_publickey
# 手机端采用全局代理模式
AllowedIPs = 0.0.0.0/0
# 预共享密钥
PresharedKey = sharekey
# WireGuard 服务端连接地址
Endpoint = 公网IP或域名:16666
PersistentKeepalive = 25

5. OpenWrt 的 WireGuard 运行状态

完成所有配置后,可在 OpenWrt 后台实时查看 WireGuard 的运行状态及连接情况:

OpenWrt的WireGuard运行状态

评论 0

使用 GitHub 身份参与讨论

可以先写评论,登录后草稿会自动恢复。

访
暂无评论,来发表第一条评论吧。