OpenVPN安装与配置#
[!note] 文档概述
本文档详细介绍了OpenVPN的安装与配置方法,包括在Linux环境(Ubuntu)和DD-WRT路由器环境下的配置步骤。
OpenVPN是一个用于创建虚拟专用网络加密通道的软件包,最早由James Yonan编写。OpenVPN允许创建的VPN使用公开密钥、电子证书、或者用户名/密码来进行身份验证。
它大量使用了OpenSSL加密库中的SSLv3/TLSv1协议函数库。
目前OpenVPN能在Solaris、Linux、OpenBSD、FreeBSD、NetBSD、Mac OS X与Microsoft Windows以及Android和iOS上运行,并包含了许多安全性的功能。它并不是一个基于Web的VPN软件,也不与IPsec及其他VPN软件包兼容。
基础知识点#
为什么使用PKI而不是静态密码呢?#
静态加密使用的是静态密钥,它容易设置,但是缺点是:
- 一次只能有一个客户端使用服务器
- 如果密钥遭到丢失,将带来不可挽回的损失
使用PKI允许一次使用多个客户端,每个客户端都有自己的密钥。服务器不必具有客户端的任何特殊知识。OpenVPN只需要提供我们即将设置的OpenVPN CA签署的证书。反之,客户端也会验证服务器的证书
OpenVPN CA密钥不应放在OpenVPN服务器上。它仅用于签署客户端的证书,因此应该存储在可以执行操作的地方,但不能被盗。一旦CA密码被盗,你将无法再信任该CA颁发的任何证书。
什么是Certificate Authority(CA)?#
你可能在应用中遇到过TLS网站证书,通常证书在WEB上下文中有两个作用
- 加密浏览器与服务器之间的数据
- 确保流览器连接到目标网站
只有当浏览器信任某个证书颁发机构颁发的证书时,才可以执行第二个任务。任何人都可以制作证书,但它并不能保证证书是合法的拥有者。因为证书颁发机构可以带来可靠的额外保证,因此CA证书分为收费与免费,创建自己的CA以签署OpenVPN客户端证书是一种可以控制谁可以连接到OpenVpn服务器的有效方法。这样您的Openvpn服务器只会信任你要创建的CA签署的客户端证书。同样如果一个政府机构在互联网提供一些便民服务,那么如何有效的避免钓鱼网站的信息套取呢,注册收费的CA证书是个有效的方法。
[!tip] CA证书的作用
- 提供身份验证和信任链
- 防止中间人攻击
- 控制VPN接入权限
完美前向保密PFS(perfect forward secrecy)#
“perfect forward secrecy”则是由Christoph G. Günther在EUROCRYPT ’89提出的,其最初用于定义会话密钥交换协议的一种安全性。它的作用是保证密钥丢失之前的消息案全性或签名的不可伪造性。一般而言公钥是固定的,而密钥则随着时间进行更新。这个更新过程是单向的,因引也就保证了拿到当前的密钥,是无法恢复出以前的密钥,从而保证了前向安全。
Openvpn服务器配置我们将使用“perfect forward secrecy”,也就是说,加密的数据即使在前进的进候也会是秘密的。用于连接的证书和密钥不用于加密您的通讯数据。它们在传递数据时使用临时的加密密钥。默认情况下,这个临时密钥随着时间的推移每小时旋转一次。以这种方式,如果来不法份子收集了VPN数据包要想获得临时密钥那是不可能的,它允其量能够解密你最后一小时的数据。
在Openvpn服务器上配置了perfect forward secrecy你会在日志中看到每小时数据重置的情况。
1
2
3
4
5
6
7
8
| Tue Jun 13 01:51:20 2017 client/142.68.135.226:53504 TLS: soft reset sec=0 bytes=51538/0 pkts=255/0
Tue Jun 13 01:51:20 2017 client/142.68.135.226:53504 VERIFY OK: depth=1, C=US, ST=RI, L=Quahog, O=Happy Go Lucky Toys, OU=inspections, CN=Happy Go Lucky Toys CA, name=EasyRSA, emailAddress=ca@happygoluckytoys.com
Tue Jun 13 01:51:20 2017 client/142.68.135.226:53504 VERIFY OK: depth=0, C=US, ST=RI, L=Quahog, O=Happy Go Lucky Toys, OU=inspections, CN=client, name=EasyRSA, emailAddress=noreply@happygoluckytoys.com
Tue Jun 13 01:51:20 2017 client/142.68.135.226:53504 Data Channel Encrypt: Cipher 'AES-256-CBC' initialized with 256 bit key
Tue Jun 13 01:51:20 2017 client/142.68.135.226:53504 Data Channel Encrypt: Using 512 bit message hash 'SHA512' for HMAC authentication
Tue Jun 13 01:51:20 2017 client/142.68.135.226:53504 Data Channel Decrypt: Cipher 'AES-256-CBC' initialized with 256 bit key
Tue Jun 13 01:51:20 2017 client/142.68.135.226:53504 Data Channel Decrypt: Using 512 bit message hash 'SHA512' for HMAC authentication
Tue Jun 13 01:51:21 2017 client/142.68.135.226:53504 Control Channel: TLSv1.2, cipher TLSv1/SSLv3 DHE-RSA-AES256-SHA256, 2048 bit RSA
|
Openvpn允许您控制旋转周期以匹配偏执狂级别。在server.conf文件中配置reneg-sec xx控制关键周期是多少秒。
[!note] 配置建议
reneg-sec 3600 # 默认1小时重置一次密钥,可根据安全需求调整
密钥文件类型#
Key文件(*.key)#
这个是应该保密的私钥文件。只有所有者才需要使用私钥,所以它不应该在随意丢放。它可以用来代表其的所有者进行加密、解密和签名文件。
证书文件(*.crt)#
这是个可以公开使用的公钥文件。证书文件只能用于对私有密钥所有者签名的文件进行加密或验证,因此可以广泛共享。在Openvpn上下文中,证书文件用于验证Openvpn服务器本身的身份以及连接客户端的标识。由于这些证书是由我们信任的CA签署的,双方都会信任它。
证书签名请求文件(*.csr)#
CA证书不需要客户端的私钥来生成,它需要来自客户端的CSR一完成,CSR由客户端签名,因此CA信任它是合法的请求并返回签名的证书文件。在购买SSL证书时,CSR的使用更为常见。在服务器上生成CSR,并将其提供给SSL供应商,然后它们将证书文件返回给您,然后将证书文件安装到服务器上。
[!summary] 三种密钥文件对比
| 文件类型 | 扩展名 | 用途 | 安全级别 |
|---|
| 私钥文件 | .key | 服务器/客户端身份验证 | 极高,必须保密 |
| 证书文件 | .crt | 公钥分发和验证 | 公开,可共享 |
| 证书请求 | .csr | 向CA申请证书 | 中间安全级别 |
Linux环境下配置openvpn#
Ubuntu环境下安装OpenVPN#
1
2
| $ sudo apt-get update
$ sudo apt-get install openvpn
|
生成服务器及客户端相关证书#
为了安全起见,建议不要在服务器上安装easy-rsa密钥生成程序,因为我不希望我的密钥出现在服务器上。
1
2
| $ sudo apt-get install easy-rsa
$ /usr/bin/make-cadir CA
|
OR
1
| $ /usr/bin/make-cadir CA
|
设置vars文件,此文件包含我们制作证书所需要的默认值,将这些值设置在53,64~69行之间。
1
2
3
4
5
6
7
| export KEY_SIZE=2048
export KEY_COUNTRY="CN"
export KEY_PROVINCE="ZheJiang"
export KEY_CITY="HangZhou"
export KEY_ORG="A Li Ba Ba"
export KEY_EMAIL="ca@ali.com"
export KEY_OU="Inspections"
|
接下来,下面的命令将在keys目录中生成CA证书和密钥。
1
2
3
4
| [ ~/CA ]$ source ./vars
NOTE: if you run ./clean-all, I will be doing a rm -rf on /CA/kyes
[ ~/CA ]$ ./clean-all
[ ~/CA ]$ ./build-ca
|
执行后在keys文件夹中生成如下文件:
1
2
3
| keys/
├── ca.crt # CA证书文件
└── ca.key # CA密钥文件(必须保密!)
|
现在创建服务器的密钥。虽然你希望接受输入密码的挑战,但这不是个好主意,因为如果输入密码,那每次服务器启动后都需要输入密码。除非服务器每次重启时都在那里。
你可以任意指定服务器的名称。访名称将用作生成的密钥、CRT和CSR文件的文件名。
1
| [ ~/CA ]$ ./build-key-server server
|
我们现在需要创建一些Diffie-Hellman数据。此数据用于生成临时密钥,该密钥将在Openvpn会话期间使用以创建完美的向前保密。你可以使用4096位,位数越高需要的时间越长。若要强制使用较长的键,请将vars文件的第53行更改为所需的密钥长度。
在计算中,entropy被定义为系统上可用的随机性的数量,这些随机性可以被需要随机数据的进程所利用。密码学是entropy的巨大消耗者。计算机系统从它们的环境中提取entropy,比轺鼠标移动、风扇噪音,以及任何自然界中适当的随机现象。空闲系统通常具有较少的可用entropy,因此密钥生成可能需要更长的时间。此外,entropy不是有限的。一个具有大量entropy的系统可能在创建多个密钥后“耗尽”,因此后续的密钥可能需要更长的时间来生成。在极端情况下,没有entropy或低entropy的系统实际上可以创建较不安全的密钥。
回顾一下:我们现在有两个我们需要的三件事。我们有一个带有签名密钥的CA设置,并且有一组服务器凭据(一个密钥和一个crt),并且证书由CA签名。那些,我只打算创建一组客户机凭证,但是您可以根据需要多次重新运行的构建命令,以创建尽可能多的客户机凭证。
此外,与服务器密钥不同,当用户希望连接时,他必须提供密码连接,这时可以在创建客户密钥的时候指定密码。
1
| [ ~/CA ]$ ./build-key client
|
现在我们在keys文件夹中生成的相关密钥文件,目录如下:
服务器和客户端文件各生成三个文件,一个CRT文件,一个密钥文件和一个CSR文件。CA文件只有两种类型,一个CRT和一个密钥。这是因为CA签署了自已的证书,因此不需要生成CSR来请求它签署自己的证书。
由于CA签名的证书需要提供CSR,因此可以在隔离的系统上创建客户端和服务器密钥和CSR文件,然后仅向CA提交CSR以获得证书。这意味着客户端密钥不需要知道CA。但是easy-rsa就是这样,很简单。像这样的高级配置需要使用OpenSSL而不是简单的RSA脚本。
如果我们查看server.crt和client.crt文件的顶部,我们可以看到这些证书已经签名:
1
2
3
4
5
6
7
8
9
10
11
| [ ~/CA/keys ]$ head server.crt
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 1 (0x1)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=US, ST=RI, L=Quahog, O=Happy Go Lucky Toys, OU=inspections, CN=Happy Go Lucky Toys CA/name=EasyRSA/emailAddress=ca@happygoluckytoys.com
Validity
Not Before: Jun 5 12:26:04 2017 GMT
Not After : Jun 3 12:26:04 2027 GMT
Subject: C=US, ST=RI, L=Quahog, O=Happy Go Lucky Toys, OU=inspections, CN=server/name=EasyRSA/emailAddress=noreply@happygoluckytoys.com
|
最后一件事是生成用于将OpenVPN作为完美的前向保密的TLS密钥。
1
| [ ~/CA/keys ]$ openvpn --genkey --secret pfs.key
|
以上生成了一个名这pfs密钥的密钥,该密钥将在客户端和服务器上都需要。回想一下,所有这些文件都驻留在本地系统上,而不是服务器上。为了使Openvpn服务器运行,我们需要将必要的文件传输到Openvpn服务器。Openvpn服务器只需要以下文件:
1
2
3
4
5
6
| /etc/openvpn/keys/
├── dh2048.pem # Diffie-Hellman参数
├── server.key # 服务器私钥(保密)
├── server.crt # 服务器证书
├── ca.crt # CA证书
└── pfs.key # PFS密钥
|
使用easy-rsa3.0证书认证#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| # 安装easy-rsa
apt-get install easy-rsa
# 创建证书目录
make-cadir CA
cd CA
# 编辑vars文件
vi ./vars
# 设置以下变量
set_var EASYRSA_REQ_COUNTRY "US" # 国家
set_var EASYRSA_REQ_PROVINCE "California" # 省
set_var EASYRSA_REQ_CITY "Shanghai" # 城市
set_var EASYRSA_REQ_ORG "Copyleft Certificate Co" # 组织
set_var EASYRSA_REQ_EMAIL "test@example.net" # 邮箱
set_var EASYRSA_REQ_OU "My Organizational Unit" # 公司/组织
# 初始化PKI
./easyrsa init-pki
|
创建ca证书#
创建服务器证书server.crt#
1
2
| ./easyrsa gen-req server nopass
./easyrsa sign server server # 证书签名,第二个server为服务器证书名
|
创建dh证书#
创建ta密钥#
1
2
| cd /etc/OpenVPN
openvpn --genkey --secret ta.key
|
创建客户端证书#
1
2
3
4
5
6
7
8
| # 生成客户端请求(无密码)
./easyrsa gen-req client nopass
# 导入请求文件
./easyrsa import-req ./pki/reqs/client.req client
# 签名客户端证书
./easyrsa sign client client
|
配置OpenVPN服务端#
现在我们已经准备好了所有凭证文件,我们需要构建一个简单的Openvpn配置文件来告诉OpenVPN在哪里可以找到这些文件,并且还要指定一些需要运行的基本配置。将带有示例的服务器配置文件复制到Openvpn目录中并使用。
1
| $ sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn && sudo gunzip server.conf.gunzip
|
查看配置文件的第78至80行(默认配置):
1
2
3
4
5
6
| # Any X509 key management system can be used.
# OpenVPN can also use a PKCS #12 formatted key file
# (see "pkcs12" directive in man page).
ca ca.crt
cert server.crt
key server.key # This file should be kept secret
|
Diffie-Hellman文件的路径需要更正,下面是服务器配置文件/etc/openvpn/server.conf的修改:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| # Basic configuration
port 1194
proto udp
dev tun
# Certificate files
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key # This file should be kept secret
dh /etc/openvpn/keys/dh2048.pem
# Cryptography settings
cipher AES-256-CBC
auth SHA512
server 10.8.0.0 255.255.255.0
# Client routing
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
# Connection settings
ifconfig-pool-persist ipp.txt
keepalive 10 120
comp-lzo
persist-key
persist-tun
# Logging
status openvpn-status.log
log-append openvpn.log
verb 3
# TLS configuration
tls-server
tls-auth /etc/openvpn/keys/pfs.key
|
如果启动OpenVPN有问题,可以将日志记录的详细信息从3增加到6,以便得到更多的错误信息。
[!warning] 调试建议
- 将
verb 3 改为 verb 6 获取详细日志 - 检查文件路径是否正确
- 验证证书文件权限(建议600)
以上配置足以允许OpenVPN客户端连接到服务器,但是服务器还不能代理任何互联网的数据,为了允许这一点,请在服务器上输入如下命令:
1
2
3
| # 启用IP转发(临时)
$ sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
$ sudo echo 1 > /proc/sys/net/ipv4/ip_forward
|
第一条命令允许客户端使用服务器作为Internet代理,它将客户端流量(网络10.8.0.x)呼由一服务器上的eth0网络接口上。eth0接口通常是广域网接口。
第二条命令是允许内核转发IPv4流量,这对于VPN来说是必需的。
1
2
3
4
5
6
| # 启动OpenVPN服务(前台运行,用于调试)
$ sudo openvpn /etc/openvpn/server.conf
# 使用systemd启动(推荐生产环境)
$ sudo systemctl start openvpn@server
$ sudo systemctl enable openvpn@server
|
[!tip] 永久生效配置
为了使IP转发永久生效,需要修改 /etc/sysctl.conf:
1
| net.ipv4.ip_forward = 1
|
执行:sudo sysctl -p 使配置生效
配置OpenVPN客户端#
配置OpenVPN客户端#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| client
dev tun
proto udp
remote XXX.XXX.XXX.XXX 1194
ca ca.crt
cert client.crt
key client.key
tls-version-min 1.2
tls-cipher TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256:TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256:TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256
cipher AES-256-CBC
auth SHA512
resolv-retry infinite
auth-retry none
nobind
persist-key
persist-tun
ns-cert-type server
comp-lzo
verb 3
tls-client
tls-auth pfs.key
|
Ubuntu下OpenVPN客户端配置教程#
首先需要安装OpenVPN客户端。一般来说直接使用apt-get即可。执行如下命令安装:
1
2
| ~$ sudo apt-get update
~$ sudo apt-get install openvpn
|
配置OpenVPN客户端#
作为客户端,OpenVPN并没有特定的配置文件,而是由服务器提供给出一个配置文件。对于认证,OpenVPN提供了两种认证方法:基于用户名/密码的认证与SSL证书认证。用户名/密码方式无法(或较难)限制一个账号同时连接多个客户端,而采用证书,则可保证同一证书同一时间只能有一个客户端连接。当然,这些都是由服务器决定的,不需要客户端进行选择。
将客户端配置文件(client.ovpn)和相关证书文件复制到 /etc/openvpn/ 目录中:
1
2
| sudo cp client.ovpn /etc/openvpn/
sudo cp ca.crt client.crt client.key /etc/openvpn/keys/
|
连接OpenVPN#
在配置好.ovpn文件后,执行:
1
2
3
4
5
6
7
8
9
| # 前台运行(可查看日志)
openvpn /etc/openvpn/client.ovpn
# 后台运行
openvpn /etc/openvpn/client.ovpn > /dev/null &
# 使用systemd服务(推荐)
sudo systemctl start openvpn@client
sudo systemctl enable openvpn@client
|
DD-WRT环境下配置openvpn#
DD-WRT环境下配置openvpn#
基本设置–>时间设置#

解决路由器重启时无可用时间问题#
[!important] 注意事项
- 保证网络通畅,可在路由器的SSH命令行或telnet命令行下测试连通性
- 路由器工作模式选择:
- 网关模式:如果本路由器正在控制您的Internet连接
- 路由模式:如果网络中已经存在的另外一个路由器
在启动脚本中加入以下代码:
1
2
3
| ntpclient pool.ntp.org
stopservice process_monitor
startservice process_monitor
|
图形界面启用OpenVPN Server#
服务–>VPN

[!success] DD-WRT OpenVPN 服务器配置
- OpenVPN: 启用
- Start Type: WAN up
- Config as: Server
- Server mode: Router(TUN)
- Network: 10.8.0.0
- Netmask: 255.255.255.0
- 端口: 1194
- 通道协议: UDP
- Encryption Cipher: AES-256 CBC
- Hash Algorithm: SHA512
- Advanced Options: 禁用
- 公共服务器端证书: ca.crt
- Public Server Cert: server.crt
- Private Server Key: server.key
- DH PEM: dh2048.pem
- TLS Auth Key: ta.key
- Additional Config:
1
2
3
| push "route 192.168.1.0 255.255.255.0"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
|
防火墙配置#
管理 → 命令 → 保存为防火墙指令:
1
2
3
4
5
6
7
8
9
10
11
| # 允许OpenVPN端口
iptables -I INPUT 1 -p tcp --dport 1194 -j ACCEPT
iptables -I INPUT 1 -p udp --dport 1194 -j ACCEPT
# 允许VPN客户端访问
iptables -I FORWARD 1 --source 10.8.0.0/24 -j ACCEPT
iptables -I FORWARD -i br0 -o tun2 -j ACCEPT
iptables -I FORWARD -i tun2 -o br0 -j ACCEPT
# NAT转发
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE
|
配置OpenVPN Server自启动#
创建启动文件/jffs/scripts/openvpn.startup:
1
2
3
| #!/bin/sh
killall -q openvpn
/jffs/usr/sbin/openvpn --config /jffs/etc/openvpn/office.conf
|
[!note] 文件权限
确保启动文件有执行权限:
1
| chmod +x /jffs/scripts/openvpn.startup
|
本文档详细介绍了OpenVPN在Linux(Ubuntu)和DD-WRT路由器环境下的安装与配置方法。包含了从证书生成、服务器配置到客户端连接的完整流程。
关键要点#
- 证书安全:妥善保管私钥文件(.key),防止泄露
- 网络配置:正确配置IP转发和防火墙规则
- 连接测试:使用
verb 6参数进行详细的连接调试 - 生产部署:使用systemd服务确保服务自动启动
故障排除#
- 检查证书路径和权限
- 验证防火墙规则
- 查看详细日志(
verb 6) - 确保时间同步(DD-WRT环境)
希望这份指南能帮助您成功部署OpenVPN服务!