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而不是静态密码呢?

静态加密使用的是静态密钥,它容易设置,但是缺点是:

  1. 一次只能有一个客户端使用服务器
  2. 如果密钥遭到丢失,将带来不可挽回的损失

使用PKI允许一次使用多个客户端,每个客户端都有自己的密钥。服务器不必具有客户端的任何特殊知识。OpenVPN只需要提供我们即将设置的OpenVPN CA签署的证书。反之,客户端也会验证服务器的证书

OpenVPN CA密钥不应放在OpenVPN服务器上。它仅用于签署客户端的证书,因此应该存储在可以执行操作的地方,但不能被盗。一旦CA密码被盗,你将无法再信任该CA颁发的任何证书。

什么是Certificate Authority(CA)?

你可能在应用中遇到过TLS网站证书,通常证书在WEB上下文中有两个作用

  1. 加密浏览器与服务器之间的数据
  2. 确保流览器连接到目标网站

只有当浏览器信任某个证书颁发机构颁发的证书时,才可以执行第二个任务。任何人都可以制作证书,但它并不能保证证书是合法的拥有者。因为证书颁发机构可以带来可靠的额外保证,因此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行更改为所需的密钥长度。

1
$ ./build-dh

在计算中,entropy被定义为系统上可用的随机性的数量,这些随机性可以被需要随机数据的进程所利用。密码学是entropy的巨大消耗者。计算机系统从它们的环境中提取entropy,比轺鼠标移动、风扇噪音,以及任何自然界中适当的随机现象。空闲系统通常具有较少的可用entropy,因此密钥生成可能需要更长的时间。此外,entropy不是有限的。一个具有大量entropy的系统可能在创建多个密钥后“耗尽”,因此后续的密钥可能需要更长的时间来生成。在极端情况下,没有entropy或低entropy的系统实际上可以创建较不安全的密钥。

回顾一下:我们现在有两个我们需要的三件事。我们有一个带有签名密钥的CA设置,并且有一组服务器凭据(一个密钥和一个crt),并且证书由CA签名。那些,我只打算创建一组客户机凭证,但是您可以根据需要多次重新运行的构建命令,以创建尽可能多的客户机凭证。

此外,与服务器密钥不同,当用户希望连接时,他必须提供密码连接,这时可以在创建客户密钥的时候指定密码。

1
[ ~/CA ]$ ./build-key client

现在我们在keys文件夹中生成的相关密钥文件,目录如下: 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证书

1
./easyrsa build-ca

创建服务器证书server.crt

1
2
./easyrsa gen-req server nopass
./easyrsa sign server server # 证书签名,第二个server为服务器证书名

创建dh证书

1
./easyrsa gen-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

基本设置–>时间设置

|300x66

解决路由器重启时无可用时间问题

[!important] 注意事项

  1. 保证网络通畅,可在路由器的SSH命令行或telnet命令行下测试连通性
  2. 路由器工作模式选择:
    • 网关模式:如果本路由器正在控制您的Internet连接
    • 路由模式:如果网络中已经存在的另外一个路由器

在启动脚本中加入以下代码:

1
2
3
ntpclient pool.ntp.org
stopservice process_monitor
startservice process_monitor

图形界面启用OpenVPN Server

服务–>VPN

|300x184

[!success] DD-WRT OpenVPN 服务器配置

  1. OpenVPN: 启用
  2. Start Type: WAN up
  3. Config as: Server
  4. Server mode: Router(TUN)
  5. Network: 10.8.0.0
  6. Netmask: 255.255.255.0
  7. 端口: 1194
  8. 通道协议: UDP
  9. Encryption Cipher: AES-256 CBC
  10. Hash Algorithm: SHA512
  11. Advanced Options: 禁用
  12. 公共服务器端证书: ca.crt
  13. Public Server Cert: server.crt
  14. Private Server Key: server.key
  15. DH PEM: dh2048.pem
  16. TLS Auth Key: ta.key
  1. 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 -![|300x66](./image/dd-1.png)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路由器环境下的安装与配置方法。包含了从证书生成、服务器配置到客户端连接的完整流程。

关键要点

  1. 证书安全:妥善保管私钥文件(.key),防止泄露
  2. 网络配置:正确配置IP转发和防火墙规则
  3. 连接测试:使用verb 6参数进行详细的连接调试
  4. 生产部署:使用systemd服务确保服务自动启动

故障排除

  • 检查证书路径和权限
  • 验证防火墙规则
  • 查看详细日志(verb 6
  • 确保时间同步(DD-WRT环境)

希望这份指南能帮助您成功部署OpenVPN服务!