0%

OpenWrt 图形化搭建 OpenVPN 服务

最近考虑将虚拟机中的 OpenVPN 服务搬迁到路由器当中。

路由器是 Redmi AC2100,运行的 OpenWrt 23.5,网上的博文都是各种命令行搭建的,我不喜欢。

这里记录一下使用图形界面搭建的笔记。

环境准备

  • OpenWrt
    OpenWrt 是一种嵌入式操作系统,旨在取代原始路由器固件,并提供更多功能和自定义选项。
  • XCA (X Certificate and Key management)
    一款 Windows 平台的私钥和证书管理工具,功能强大。
    项目地址:https://github.com/chris2511/xca/

使用 XCA 生成私钥及证书

初始化 XCA 数据库

XCA 软件使用文件数据库加密保存私钥和证书信息,开始之前需要先新建或打开一个数据库。

点击新建数据库,选择保存位置,然后输入数据库密码完成创建。

创建 Diffie-Hellman 参数文件

OpenVPN 需要用到 Diffie-Hellman 参数文件,使用 XCA 可以创建。
创建DH参数文件.png
点击 其他工具,选择 生成 DH 参数,弹出输入框输入 DH 参数位数保持 1024,之后点击 OK 选择保存位置。

创建 CA 私钥及证书

创建 CA 证书需要对应的私钥文件。
创建CA私钥.png
私钥 页签,点击 创建密钥 按钮,弹窗窗口中输入保存名称,密钥类型保持 RSA ,密钥长度保持 2048,之后点击 创建 按钮完成创建。

然后创建 CA 证书。
创建CA证书-1.png
创建CA证书-2.png
创建CA证书-3.png
创建CA证书-4.png
证书 页签,点击 创建证书 按钮,参考上图进行配置(着重注意红色方框部分配置)。

创建 Server 私钥及证书

创建 Server 证书需要对应的私钥文件。
创建Server私钥.png
私钥 页签,点击 创建密钥 按钮,弹窗窗口中输入保存名称,密钥类型保持 RSA ,密钥长度保持 2048,之后点击 创建 按钮完成创建。

然后创建 Server 证书。
创建Server证书-1.png
创建Server证书-2.png
创建Server证书-3.png
创建Server证书-4.png
证书 页签,点击 创建证书 按钮,参考上图进行配置(着重注意红色方框部分配置)。

创建 Client 私钥及证书

创建 Client 证书需要对应的私钥文件。
创建Client私钥.png
私钥 页签,点击 创建密钥 按钮,弹窗窗口中输入保存名称,密钥类型保持 RSA ,密钥长度保持 2048,之后点击 创建 按钮完成创建。

然后创建 Client 证书。
创建Client证书-1.png
创建Client证书-2.png
创建Client证书-3.png
创建Client证书-4.png
证书 页签,点击 创建证书 按钮,参考上图进行配置(着重注意红色方框部分配置)。

导出服务器私钥和证书

OpenVPN 服务需要 DH 参数文件、CA 证书文件、Server 私钥文件和 Server 证书文件,现在统一从 XCA 导出。
导出CA证书.png
导出Server证书.png
导出Server私钥.png
这一步骤总共得到以下文件。
导出的服务端文件.png
至于客户端的私钥和证书,放后面客户端部分再继续。

安装 & 配置 OpenVpn 软件包

安装

首先在 OpenWrt 中安装必要的软件包。
安装OpenVPN软件包.jpg
如图,需要安装 openvpn-opensslluci-app-openvpnluci-i18n-openvpn-zh-cn 为中文包。

新建服务

然后创建一个服务实例。
添加OpenVPN服务.png
这里使用自带的多客户端模板创建。

配置端口

默认 OpenVPN1194 端口工作,必要时可以修改。
配置端口.png
进入 Default 实例 高级配置,切换到 网络,添加 port 选项,修改即可。

配置协议

默认 OpenVPN 以监听 udp 协议工作,必要时可以修改为 tcp
修改协议.png
进入 Default 实例 高级配置,切换到 网络,添加 proto 选项,修改为 tcp-server 字段即可。

配置网段

有时候需要修改客户端分配的网段。
修改客户端网段.png
进入 Default 实例 高级配置,切换到 VPN,修改 server 字段即可。

配置推送路由

默认情况,OpenVPN 没有推送附加路由,为了转发流量可以在服务端统一推送路由。
推送路由.png
进入 Default 实例 高级配置,切换到 VPN,添加 push 选项,按照 OpenVPN 自定义路由配置 修改即可。

配置证书

最后给服务实例配置私钥和证书。
配置实例证书.png
进入 Default 实例 高级配置,切换道 加密算法,将上一章节生成的服务端需要的文件上传,然后给截图红框条目选中对应已经上传的文件。

启动服务

最后启动 OpenVPN 实例。
启动OpenVPN服务.png
需要先勾选 已启用 然后点击 保存并应用,然后点击 start 按钮启动服务。

调试 & 日志

如果配置错误导致实例服务不能启动,可以通过日志分析原因。
系统日志.png
进入 状态系统日志 界面可以查看日志。

配置 OpenVPN 防火墙策略

服务启动之后,由于防护墙的存在,还不能直接使用。

配置虚拟网卡策略

为了打开 OpenVPN 隧道内各个设备直接相互访问的能力,需要对 tun 设备增加一个区域设置。
防火墙虚拟网卡数据放行-1.png
防火墙虚拟网卡数据放行-2.png
防火墙虚拟网卡数据放行-3.png
在防火墙 区域设置 中新增加一个区域,将入站、出站、转发都给允许了,并且将 lan 网络组合在一起,设备选择虚拟的 tun 设备。

当然,也可以通过修改现有的 lan 区域将 tun 设备绑定到一起,效果是类似的。

配置防火墙的要点:

  • 如果需要局域网内设备普通情况下可以直接和隧道内设备通讯,则需要满足 lantun 绑定在同一个区域。
  • 如果需要隧道内设备可以和局域网内设备通讯,则需要满足 tun 放行了向 lanOpenWrt(即不指定) 的转发。

配置工作端口入站放行

正常情况下通过 wan 口的外网是访问不了 1194 端口的。
防火墙工作端口入站放行.png
在防火墙 通信规则 中新增加对 wan1194 端口的放行策略。

客户端使用

创建客户端配置文件

OpenVPN 的客户端通常需要一个 ovpn 格式的配置文件,这里需要手动创建一个。

cipher AES-256-CBC
client
server-poll-timeout 4
nobind
remote HOSTNAME 1194 tcp
remote HOSTNAME 1194 udp
dev tun
dev-type tun
remote-cert-tls server
tls-version-min 1.2
reneg-sec 604800
verb 3
push-peer-info
comp-lzo yes

<ca>
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----
</key>

注意配置要和服务端对应,尤其是 comp-lzo 属性,需要显式指定并且和服务器配置相同,配得不一样会导致对端不能收到数据。

  1. 将上面的内容保存为一个 ovpn 后缀的文件。
  2. 将内容中的 HOSTNAME 替换为实际的域名或IP
  3. 替换客户端私钥和证书部分,这部分内容从 XCA 中导出。
    导出客户端配置.png

    XCA 可以直接导出 OpenVPN 客户端需要的私钥和证书配置信息,将导出文件对应的内容填充即可。

  4. 导入到客户端软件中测试连接。

一般情况下,不同的客户端分配不同的私钥和证书!

客户端连接

导入上一步骤的配置文件到客户端,成功连接!
成功连接.png
通信测试.png
修改服务配置中的 server 字段可以修改客户端网段。

客户端密码

OpenVPN 的客户端支持对连接/私钥加密,用法是在连接服务器前要求输入一个密码,保证私钥安全。原理其实是配置文件中增加了私钥的 `` 加密。
导出加密私钥.png
通过 XCA 导出加密的客户端私钥,导出时需要设置一个密码。然后将普通未加密的 ovpn 配置文件中的 key 替换为加密后的内容即可。

最终 ovpn 的内容如下:

...

<ca>
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,49D08669BFFCB47DF6936ECA11FF0AD0

...
-----END RSA PRIVATE KEY-----
</key>

吊销客户端

如果某个客户端私钥和证书不小心泄露,但又不想重新部署整个环境,可以通过吊销证书的方式拉黑客户端。

生成证书吊销列表(CRL)文件

OpenVPN 通过吊销客户端证书的方式拉黑客户端。
吊销证书.png
生成证书吊销列表.png
生成证书吊销列表文件.png
这部分操作主要使用 XCA 吊销客户端证书并生成 CRL 文件。

使用证书吊销列表(CRL)文件

OpenVPN 服务端配置使用 CRL 文件。
配置证书吊销列表文件.png
进入 Default 实例 高级配置,切换道 加密算法,添加 crl_verify 选项,将 CRL 文件上传,然后给截图红框条目输入对应已经上传文件的路径。

反吊销证书

有时候可能需要恢复某个证书,这个时候可以反吊销。
反吊销证书.png
XCA 反吊销证书后,重新生成 CRL 文件,上传并配置到 OpenVPNcrl_verify 属性即可。