来自 计算机教程 2019-05-18 10:04 的文章
当前位置: 美洲杯冠军竞猜 > 计算机教程 > 正文

搭建OpenVPN服务

本文介绍使用 OpenVPNCentOSUbuntu 上搭建基本的VPN服务的方法.

一、原理

大概就是通过虚拟网卡将物理层的数据流作为数据,在外面重新ssl打包报头,发往对面,再在对面重新解包发出去,

生成所需密钥和证书

OpenVPN 使用 Easy-RSA 来管理PKI所需要的密钥和证书. Easy-RSA 现在有2和3两个主要版本, 使用方式略有不同. 下面分别介绍用法. 可以根据自己使用的版本选择一种来操作.

二、配置文件

openvpn的配置文件主要有三个:vars、server.conf、client.conf,下面我们对这三个配置文件进行一一的详解。

Easy-RSA 2

1.vars配置文件

vars配置文件的主要内容如下:

#cat vars |grep -vE “^#|^$”

KEY_DIR定义key生成的目录。

KEY_SIZE定义生成私钥的大小,一般为1024或2048,默认为2048位。这个就是我们在执行build-dh命令生成dh2048文件的依据。

CA_EXPIRE定义CA证书的有效期,默认是3650天,即10年。

KEY_EXPIRE定义密钥的有效期,默认是3650天,即10年。

KEY_COUNTRY定义所在的国家。

KEY_PROVINCE定义所在的省份。

KEY_CITY定义所在的城市。

KEY_美洲杯冠军竞猜,ORG定义所在的组织。

KEY_EMAIL定义邮箱地址。

KEY_OU定义所在的单位。

KEY_NAME定义openvpn服务器的名称。

以上就是vars配置文件的全部内容,有关vars配置文件的使用,我们也可以系统的默认配置

安装

在Ubuntu 16.04上使用 apt 安装的是Easy-RSA 2:

# apt-get install -y easy-rsa

安装完成后, 可以在 /usr/share/easy-rsa/ 目录下找到生成密钥对和证书的脚本. 这些脚本会将生成的密钥和证书放在当前目录, 为了安全, 我们将这些脚本复制到 /root 目录下:

# cp -r /usr/share/easy-rsa /root

2.server.conf服务器端配置文件

服务器端配置文件server.conf,是这三个配置文件中最重要的一个,也是所有对openvpn客户端推送的信息,都是通过这个文件进行配置的。

#grep -vE “^#|^$” server.conf

;local a.b.c.d

定义openvpn监听的IP地址,如果是服务器单网卡的也可以不注明,但是服务器是多网卡的建议注明。

port 1194

定义openvpn监听的的端口,默认为1194端口。

proto tcp

;proto udp

定义openvpn使用的协议,默认使用UDP。如果是生产环境的话,建议使用TCP协议。

dev tun

;dev tap

定义openvpn运行时使用哪一种模式,openvpn有两种运行模式一种是tap模式,一种是tun模式。

tap模式也就是桥接模式,通过软件在系统中模拟出一个tap设备,该设备是一个二层设备,同时支持链路层协议。

tun模式也就是路由模式,通过软件在系统中模拟出一个tun路由,tun是ip层的点对点协议。

具体使用哪一种模式,需要根据自己的业务进行定义。

ca ca.crt

定义openvpn使用的CA证书文件,该文件通过build-ca命令生成,CA证书主要用于验证客户证书的合法性。

cert vpnilanni.crt

定义openvpn服务器端使用的证书文件。

key vpnilanni.key

定义openvpn服务器端使用的秘钥文件,该文件必须严格控制其安全性。

dh dh2048.pem

定义Diffie hellman文件。

server 10.8.0.0 255.255.255.0

定义openvpn在使用tun路由模式时,分配给client端分配的IP地址段。

ifconfig-pool-persist ipp.txt

定义客户端和虚拟ip地址之间的关系。特别是在openvpn重启时,再次连接的客户端将依然被分配和断开之前的IP地址。

username-as-common-name

#使用客户提供的UserName作为Common Name

;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100

定义openvpn在使用tap桥接模式时,分配给客户端的IP地址段。

;push “route 192.168.10.0 255.255.255.0”

向客户端推送的路由信息,假如客户端的IP地址为10.8.0.2,要访问192.168.10.0网段的话,使用这条命令就可以了。

;client-config-dir ccd

这条命令可以指定客户端IP地址。

使用方法是在/etc/openvpn/创建ccd目录,然后创建在ccd目录下创建以客户端命名的文件。比如要设置客户端 ilanni为10.8.0.100这个IP地址,只要在 /etc/openvpn/ccd/ilanni文件中包含如下行即可:

ifconfig-push 10.8.0.200 255.255.255.0

push “redirect-gateway def1 bypass-dhcp”

这条命令可以重定向客户端的网关,在进行翻墙时会使用到。

;push “dhcp-option DNS 208.67.222.222”

向客户端推送的DNS信息。

假如客户端的IP地址为10.8.0.2,要访问192.168.10.0网段的话,使用这条命令就可以了。如果有网段的话,可以多次出现push route关键字。同时还要配合iptables一起使用。

client-to-client

这条命令可以使客户端之间能相互访问,默认设置下客户端间是不能相互访问的。

duplicate-cn

定义openvpn一个证书在同一时刻是否允许多个客户端接入,默认没有启用。

keepalive 10 120

定义活动连接保时期限

comp-lzo

启用允许数据压缩,客户端配置文件也需要有这项。

;max-clients 100

定义最大客户端并发连接数量

;user nobody

;group nogroup

定义openvpn运行时使用的用户及用户组。

persist-key

通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys。

persist-tun

通过keepalive检测超时后,重新启动VPN,一直保持tun或者tap设备是linkup的。否则网络连接,会先linkdown然后再linkup。

status openvpn-status.log

把openvpn的一些状态信息写到文件中,比如客户端获得的IP地址。

log openvpn.log

记录日志,每次重新启动openvpn后删除原有的log信息。也可以自定义log的位置。默认是在/etc/openvpn/目录下。

;log-append openvpn.log

记录日志,每次重新启动openvpn后追加原有的log信息。

verb 3

设置日志记录冗长级别。

;mute 20

重复日志记录限额

以上就是openvpn服务器端server.conf配置文件的内容。

生成CA密钥和证书

接下来的操作都是在 /root/easy-rsa 目录下进行的.

首先, 我们需要生成CA根密钥和证书, 用来给VPN Server和Client的证书进行签名.

  1. 修改 vars 文件
    vars 文件里定义了后续生成密钥和证书所需要的环境变量. 在文件里找到定义 KEY_COUNTRY, KEY_PROVINCE, KEY_CITY, KEY_ORG, 和 KEY_EMAIL 变量的部分, 根据自己的实际情况修改为需要的值. 这几个值都不能留空. 如下

     export KEY_COUNTRY="CN"
     export KEY_PROVINCE="ZJ"
     export KEY_CITY="HZ"
     export KEY_ORG=" MyCompany"
     export KEY_EMAIL="support@mycompany.com"
    

    其它变量的意义可以参考文件中的注释, 一般不需要修改.
    修改保存后, 执行以下命令来使这些变量生效供后续操作使用:

     # source ./vars
    
  2. 生成密钥和证书
    接下来执行以下脚本来生成CA的密钥和证书

     # ./build-ca
    

    脚本会提示确认证书和密钥所需的字段, 默认值是在 vars 文件里指定的. 脚本执行完后, 会在 keys 目录下生成CA的密钥 ca.key 和证书 ca.crt .

3.client.conf客户端配置文件

openvpn客户端的配置文件client.conf比较简单,如下:

#grep -vE “^#|^;|^$” client.ovpn

client

定义这是一个client,配置从server端pull拉取过来,如IP地址,路由信息之类,Server使用push指令推送过来。

dev tun

定义openvpn运行的模式,这个地方需要严格和Server端保持一致。

proto tcp

定义openvpn使用的协议,这个地方需要严格和Server端保持一致。

remote 192.168.1.8 1194

设置Server的IP地址和端口,这个地方需要严格和Server端保持一致。

如果有多台机器做负载均衡,可以多次出现remote关键字。

;remote-random

随机选择一个Server连接,否则按照顺序从上到下依次连接。该选项默认不启用。

resolv-retry infinite

始终重新解析Server的IP地址(如果remote后面跟的是域名),保证Server IP地址是动态的使用DDNS动态更新DNS后,Client在自动重新连接时重新解析Server的IP地址。这样无需人为重新启动,即可重新接入VPN。

nobind

定义在本机不邦定任何端口监听incoming数据。

persist-key

persist-tun

ca ca.crt

定义CA证书的文件名,用于验证Server CA证书合法性,该文件一定要与服务器端ca.crt是同一个文件。

cert laptop.crt

定义客户端的证书文件。

key laptop.key

定义客户端的密钥文件。

ns-cert-type server

Server使用build-key-server脚本生成的,在x509 v3扩展中加入了ns-cert-type选项。防止client使用他们的keys + DNS hack欺骗vpn client连接他们假冒的VPN Server,因为他们的CA里没有这个扩展。

comp-lzo

启用允许数据压缩,这个地方需要严格和Server端保持一致。

verb 3

设置日志记录冗长级别。

生成VPN Server密钥和证书

有了CA密钥和证书, 就可以生成VPN Server所需要的密钥和证书了. 执行以下脚本:

# ./build-key-server myvpn

脚本需要一个参数来指定证书和密钥的CN, 这里就是 myvpn , 根据自己的需要来指定对应的值. 脚本在执行时, 同样会提示需要确认和输入的字段值. 脚本执行完成后, 同样会在 keys 目录下生成VPN Server的密钥和证书. 密钥和证书的文件名前缀都是指定的CN, 后缀分别是 crtkey . 在这里就是 myvpn.crtmyvpn.key .

三、生成证书

1.安装easy-rsa或者去GitHub下载

apt-get install easy-rsa

2.生成证书和私钥

这是安装OpenVPN中最重要和最关键的一步,目的是建立公钥基础设施(PKI)。包括如下内容:

- 为OpenVPN服务器创建一个证书(公钥)和一个私钥

- 为每个OpenVPN客户端创建证书和私钥

- 建立一个证书颁发机构(CA)并创建证书和私钥。这个私钥用来给OpenVPN服务器和客户端的证书签名

3.在/usr/share/easy-rsa/有相关的执行脚本

修改好参数文件vars,修改好后source vars加载

4.清除之前的证书文件

./clean-all

5.创建ca证书和密钥,如果vars文件配置好了,基本就是敲回车就好了。执行完成后会在当前子目录keys下生成ca.crt(证书) ca.key(密钥)

./build-ca

6.生成OpenVPN服务器的证书和私钥,执行完成后会得到haha.crt haha.key

./build-key-server haha(服务器名)

7.生成Diffie-Hellman参数,会生成dh2048.pem

./bulid-dh

8.cp ca.crt haha.crt haha.key dh2048.pem /etc/openvpn

9.客户端证书和私钥

./build-key client

10.生成OpenVPN Static key

openvpn --genkey --secret ta.key 与tls-auth /etc/openvpn/ta.key 0 参数有关 #用户名密码认证时需要

生成Client密钥和证书

Client端同样需要CA签名过的密钥和证书来. 执行以下脚本:

# ./build-key hongling

类似于VPN Server的密钥证书生成脚本, 这个脚本参数同样是Client的CN. 根据提示确认和输入必要参数后, Client所需的密钥 hongling.key 和证书 hongling.crt 也会保存在 keys 目录下.

对于每个Client, 都需要生成一套密钥和证书.

四、启动

service openvpn start

看到Initialization Sequence Completed 即启动成功。

生成Diffie Hellman参数

Diffie Hellman参数用于VPN Server和Client之间进行公钥交换. 执行以下脚本:

# ./build-dh

这个脚本执行完成以后, 可以在 keys 目录下找到生成的文件 dh2048.pem . 文件名中的2048是密钥长度, 可以在 vars 文件中设置, 默认为2048.

五、示例

Easy-RSA 3

证书登陆

server端

vi server.conf

port 1194

proto tcp

dev tun

ca ca.crt

cert server.crt

key server.key # This file should be kept secret

dh dh2048.pem

server 172.30.25.0 255.255.255.0

ifconfig-pool-persist ipp.txt

push "route 10.1.1.0 255.255.255.0"

push "route 10.1.10.0 255.255.255.192"

push "redirect-gateway def1 bypass-dhcp"

push "dhcp-option DNS 114.114.114.114"

client-to-client

keepalive 10 120

comp-lzo

persist-key

persist-tun

status openvpn-status.log

verb 3

如果证书文件没有放在config目录,那么配置文件中要写绝对路径

client端

client

dev tun

proto tcp

remote 172.30.25.0 1194

resolv-retry infinite

nobind

persist-key

persist-tun

ca ca.crt

cert client.crt

key client.key

comp-lzo

verb 3

安装

在Centos 7.5上, 首先要确认是否安装了 epel 源:

# yum repolist

如果源列表中没有 epel 源, 需要安装:

# yum install -y epel-release

然后就可以安装 easy-RSA 了:

# yum install -y easy-rsa
# yum list installed easy-rsa

可以看到这里安装的是 Easy-RSA 3 . 安装目录在 /usr/share/easy-rsa . 对于不同的具体版本, 这个目录下的内容可能会有不同:

# ls -l /usr/share/easy-rsa/
总用量 4
lrwxrwxrwx 1 root root    5 7月  16 18:21 3 -> 3.0.3
lrwxrwxrwx 1 root root    5 7月  16 18:21 3.0 -> 3.0.3
drwxr-xr-x 4 root root 4096 7月  16 19:41 3.0.3

如以上情况中, 实际的安装目录在 3.0.3 子目录下. 为了安全, 将安装目录复制到 /root 目录下:

# cp -r /usr/share/easy-rsa/3.0.3 /root/easyrsa

后续密钥和证书操作都在 /root/easyrsa 目录下进行.

用户密码验证

修改server.conf:

tls-auth ta.key 0 # This file is secret

auth-user-pass-verify /usr/local/openvpn/config/checkpsw.sh via-env

client-cert-not-required

username-as-common-name

script-security 3

修改客户端配置文件:client.conf(或者client.ovpn)

注销掉这两行

#cert client1.crt

#key client1.key

再添加这一行,添加这行,就会提示输入用户名和密码

auth-user-pass

tls-auth ta.key 1

嫌麻烦的话可以auth-user-pass password.txt

password.txt 文件样例如下,用户名和密码分为两行存放。

生成CA密钥和证书

在生成密钥和证书前, 需要进行初始化:

# ./easyrsa init-pki

这个操作会在当前目录下创建 pki 子目录, 接下来的操作生成的文件都会保存在这个子目录里. 如果这个 pki 子目录已经存在, 这个操作会将子目录下所有的文件清空. 所以, 如果希望重新生成所有的密钥和证书资源, 也可以使用这个命令.

接下来就可以生成CA的密钥和证书了:

# ./easyrsa build-ca

这个命令会要求输入密钥的密码和证书的CN. 这个密钥在后续给VPN Server和Client的证书签名里, 会用到. 命令完成后, 会在 pki 目录下生成密钥文件 ca.key 和证书文件 ca.crt . 有了CA的密钥和证书, 就可以生成VPN Server和Client的密钥和证书了.

生成VPN Server的密钥和证书

首先, 需要生成Server的密钥和签名请求:

# ./easyrsa gen-req myvpn

命令的输入参数是使用这套密钥和证书的实体名, 这个名字会用来标识生成的文件, 并作为证书默认的CN. 同样, 这个命令会提示输入密钥密码和CN. 其中密钥在后续启动VPN Server时需要验证, 而CN的默认值就是命令的参数. 命令完成后, 会在 pki/reqs 下生成签名请求文件, pki/private 下生成密钥文件. 在这个例子中文件名分别为 myvpn.reqmyvpn.key .

然后对生成的请求进行签名, 生成VPN Server的证书:

# ./easyrsa sign-req server myvpn

这个命令接收两个参数, 第一个是证书类型, 这里是 server , 第二个是证书使用的实体名, 需要和上一步生成签名请求的实体名一致, 这里同样为 myvpn . 命令会提示要求确认证书信息, 并输入CA的密钥密码. 命令执行完成后, 会在 pki/issued 目录下生成CA签名的证书, 在这个例子里, 文件名是 myvpn.crt .

生成VPN Client的密钥和证书

生成Client需要的密钥和证书与生成Server的密钥和证书基本一致. 比如我们希望创建一个为用户 hongling 创建密钥和证书:

# ./easyrsa gen-req hongling
# ./easyrsa sign-req client hongling

唯一的不同是 sign_req 的第一个参数需要指定为 client . 以上两个命令执行完成后, 会生成文件 pki/private/hongling.key , pki/reqs/hongling.reqpki/issued/hongling.crt .

生成Diffie-Hellman参数文件

为了在Server和Client之间交换密钥, 需要生成Diffie-Hellman参数文件:

# ./easyrsa gen-dh

命令执行完成后, 会在 pki 目录下生成长度为2048位的Diffie-Hellman参数文件 dh.pem .

安装和配置VPN Server

安装

在Ubuntu下, 执行

# apt-get install -y openvpn

在CentOS下, 需要首先确认安装了 epel 源, 然后执行以下命令来安装 OpenVPN :

# yum install -y openvpn

本文由美洲杯冠军竞猜发布于计算机教程,转载请注明出处:搭建OpenVPN服务

关键词: