最近考虑将虚拟机中的 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 参数
,弹出输入框输入 DH
参数位数保持 1024
,之后点击 OK
选择保存位置。
创建 CA
私钥及证书
创建 CA
证书需要对应的私钥文件。
在 私钥
页签,点击 创建密钥
按钮,弹窗窗口中输入保存名称,密钥类型保持 RSA
,密钥长度保持 2048
,之后点击 创建
按钮完成创建。
然后创建 CA
证书。
在 证书
页签,点击 创建证书
按钮,参考上图进行配置(着重注意红色方框部分配置)。
创建 Server
私钥及证书
创建 Server
证书需要对应的私钥文件。
在 私钥
页签,点击 创建密钥
按钮,弹窗窗口中输入保存名称,密钥类型保持 RSA
,密钥长度保持 2048
,之后点击 创建
按钮完成创建。
然后创建 Server
证书。
在 证书
页签,点击 创建证书
按钮,参考上图进行配置(着重注意红色方框部分配置)。
创建 Client
私钥及证书
创建 Client
证书需要对应的私钥文件。
在 私钥
页签,点击 创建密钥
按钮,弹窗窗口中输入保存名称,密钥类型保持 RSA
,密钥长度保持 2048
,之后点击 创建
按钮完成创建。
然后创建 Client
证书。
在 证书
页签,点击 创建证书
按钮,参考上图进行配置(着重注意红色方框部分配置)。
导出服务器私钥和证书
OpenVPN
服务需要 DH
参数文件、CA
证书文件、Server
私钥文件和 Server
证书文件,现在统一从 XCA
导出。
这一步骤总共得到以下文件。
至于客户端的私钥和证书,放后面客户端部分再继续。
安装 & 配置 OpenVpn
软件包
安装
首先在 OpenWrt
中安装必要的软件包。
如图,需要安装 openvpn-openssl
和 luci-app-openvpn
,luci-i18n-openvpn-zh-cn
为中文包。
新建服务
然后创建一个服务实例。
这里使用自带的多客户端模板创建。
配置端口
默认 OpenVPN
以 1194
端口工作,必要时可以修改。
进入 Default
实例 高级配置
,切换到 网络
,添加 port
选项,修改即可。
配置协议
默认 OpenVPN
以监听 udp
协议工作,必要时可以修改为 tcp
。
进入 Default
实例 高级配置
,切换到 网络
,添加 proto
选项,修改为 tcp-server
字段即可。
配置网段
有时候需要修改客户端分配的网段。
进入 Default
实例 高级配置
,切换到 VPN
,修改 server
字段即可。
配置推送路由
默认情况,OpenVPN
没有推送附加路由,为了转发流量可以在服务端统一推送路由。
进入 Default
实例 高级配置
,切换到 VPN
,添加 push
选项,按照 OpenVPN 自定义路由配置 修改即可。
配置证书
最后给服务实例配置私钥和证书。
进入 Default
实例 高级配置
,切换道 加密算法
,将上一章节生成的服务端需要的文件上传,然后给截图红框条目选中对应已经上传的文件。
启动服务
最后启动 OpenVPN
实例。
需要先勾选 已启用
然后点击 保存并应用
,然后点击 start
按钮启动服务。
调试 & 日志
如果配置错误导致实例服务不能启动,可以通过日志分析原因。
进入 状态
的 系统日志
界面可以查看日志。
配置 OpenVPN
防火墙策略
服务启动之后,由于防护墙的存在,还不能直接使用。
配置虚拟网卡策略
为了打开 OpenVPN
隧道内各个设备直接相互访问的能力,需要对 tun
设备增加一个区域设置。
在防火墙 区域设置
中新增加一个区域,将入站、出站、转发都给允许了,并且将 lan
网络组合在一起,设备选择虚拟的 tun
设备。
当然,也可以通过修改现有的 lan
区域将 tun
设备绑定到一起,效果是类似的。
配置防火墙的要点:
- 如果需要局域网内设备普通情况下可以直接和隧道内设备通讯,则需要满足
lan
和tun
绑定在同一个区域。 - 如果需要隧道内设备可以和局域网内设备通讯,则需要满足
tun
放行了向lan
或OpenWrt(即不指定)
的转发。
配置工作端口入站放行
正常情况下通过 wan
口的外网是访问不了 1194
端口的。
在防火墙 通信规则
中新增加对 wan
口 1194
端口的放行策略。
客户端使用
创建客户端配置文件
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
属性,需要显式指定并且和服务器配置相同,配得不一样会导致对端不能收到数据。
- 将上面的内容保存为一个
ovpn
后缀的文件。 - 将内容中的
HOSTNAME
替换为实际的域名或IP
。 - 替换客户端私钥和证书部分,这部分内容从
XCA
中导出。
XCA
可以直接导出OpenVPN
客户端需要的私钥和证书配置信息,将导出文件对应的内容填充即可。 - 导入到客户端软件中测试连接。
一般情况下,不同的客户端分配不同的私钥和证书!
客户端连接
导入上一步骤的配置文件到客户端,成功连接!
修改服务配置中的 server
字段可以修改客户端网段。
客户端密码
OpenVPN
的客户端支持对连接/私钥加密,用法是在连接服务器前要求输入一个密码,保证私钥安全。原理其实是配置文件中增加了私钥的 `` 加密。
通过 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
通过吊销客户端证书的方式拉黑客户端。
这部分操作主要使用 XCA
吊销客户端证书并生成 CRL
文件。
使用证书吊销列表(CRL)文件
在 OpenVPN
服务端配置使用 CRL
文件。
进入 Default
实例 高级配置
,切换道 加密算法
,添加 crl_verify
选项,将 CRL
文件上传,然后给截图红框条目输入对应已经上传文件的路径。
反吊销证书
有时候可能需要恢复某个证书,这个时候可以反吊销。
在 XCA
反吊销证书后,重新生成 CRL
文件,上传并配置到 OpenVPN
的 crl_verify
属性即可。