搭建OpenVPN服务
本文介绍使用 OpenVPN 在 CentOS 和 Ubuntu 上搭建基本的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的证书进行签名.
修改 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
生成密钥和证书
接下来执行以下脚本来生成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, 后缀分别是 crt 和 key . 在这里就是 myvpn.crt 和 myvpn.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.req 和 myvpn.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.req 和 pki/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服务
关键词: