openvpn的使用

安装

1
2
3
yum -y update
yum -y install epel-release
yum -y install openvpn easy-rsa firewalld
  • easy-rsa:用于生成证书
  • openvpn:openvpn服务端
  • firewalld:防火墙管理工具

生成相关文件

生成pki文件夹,后续生成的证书等文件在里面

1
2
cd ~
/usr/share/easy-rsa/3/easyrsa init-pki

生成根证书,根证书服务端和客户端都要用到,其作用由两个

  1. 由根证书派生出服务端证书和客户端证书
  2. 对客户端来说,当服务端发送服务端证书过来,可以校验其证书是否合法。
    生成文件ca.crtprivate/ca.key
    1
    /usr/share/easy-rsa/3/easyrsa build-ca nopass

生成交互密钥,生成文件dh.pem

1
/usr/share/easy-rsa/3/easyrsa gen-dh

生成服务端证书以及密钥,生成文件private/vpn-server.keyissued/vpn-server.crt

1
/usr/share/easy-rsa/3/easyrsa build-server-full vpn-server nopass

生成客户端证书以及密钥,生成文件private/vpn-client-01.keyissued/vpn-client-01.crt

1
/usr/share/easy-rsa/3/easyrsa build-client-full vpn-client-01 nopass

生成证书交互列表,生成文件crl.pem

1
/usr/share/easy-rsa/3/easyrsa gen-crl

生成共享密钥,生成文件ta.key

1
openvpn --genkey --secret pki/ta.key

配置服务端

复制文件到/etc/openvpn目录

1
2
3
4
5
6
cp pki/ca.crt /etc/openvpn/ca.crt
cp pki/dh.pem /etc/openvpn/dh.pem
cp pki/issued/vpn-server.crt /etc/openvpn/server.crt
cp pki/private/vpn-server.key /etc/openvpn/server.key
cp pki/ta.key /etc/openvpn/ta.key
cp pki/crl.pem /etc/openvpn/crl.pem

修改配置文件/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
37
38
39
40
41
# Secure OpenVPN Server Config
# Basic Connection Config
dev tun
proto tcp
port 1194
keepalive 10 120
max-clients 5
# Certs,文件名称对应好
ca ca.crt
cert server.crt
key server.key
dh dh.pem
tls-auth ta.key 0
# Ciphers and Hardening
reneg-sec 0
remote-cert-tls client
crl-verify crl.pem
tls-version-min 1.2
cipher AES-256-CBC
auth SHA512
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
# Drop Privs
user nobody
group nobody
# IP pool,配置vpn网关
server xxx.xxx.100.0 255.255.255.0
topology subnet
ifconfig-pool-persist ipp.txt
client-config-dir client
# Misc
persist-key
persist-tun
comp-lzo
# DHCP Push options force all traffic through VPN and sets DNS servers
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
# Logging
log-append /var/log/openvpn.log
verb 4
duplicate-cn

启动服务端

启动

1
2
systemctl start openvpn@server
systemctl enable openvpn@server

放行 OpenVPN 入网流量与开启 IP 伪装

1
2
3
firewall-cmd --permanent --add-service openvpn
firewall-cmd --permanent --add-masquerade
firewall-cmd --reload

检查是否开启流量转发

1
sysctl -a | grep net.ipv4.ip_forward

确保net.ipv4.ip_forward 等于 1,如果不是,则需要修改一下

1
2
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

安装客户端

客户端社区版

配置客户端

在安装目录的config文件夹下添加文件

1
2
3
4
cp pki/ca.crt config/ca.crt
cp pki/issued/vpn-client-01.crt config/client.crt
cp pki/private/vpn-client-01.key config/client.key
cp pki/ta.key config/ta.key

修改配置文件config/client.ovpn

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
# Secure OpenVPN Client Config
#viscosity dns full
#viscosity usepeerdns true
#viscosity dhcp true
tls-client
pull
client
dev tun
proto udp
remote 123.123.123.123 1194
redirect-gateway def1
nobind
persist-key
persist-tun
comp-lzo
verb 3
ca ca.crt
cert client.crt
key client.key
tls-auth ta.key 1
remote-cert-tls server
ns-cert-type server
key-direction 1
cipher AES-256-CBC
tls-version-min 1.2
auth SHA512
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256

remote后面填写服务端IP地址和使用的端口号,然后将 vpn-client-01-config 的所有文件拷贝到需要链接的电脑上,即可开始使用。

原理

vpn通信需要加密,对称加密的效率较高,所以服务端和客户端需要持有一把对称加密的密钥来加密消息。那么如何让服务端和客户端持有相同的密钥呢?那就是通过非对称加密的方式发送密钥给对方。流程如下

  1. 服务端和客户端都持有根证书,用于对服务端证书和客户端证书验签。
  2. 客户端请求连接vpn,服务端发送服务端证书给客户端。
  3. 客户端收到服务端证书后使用根证书验签,检验是否有效证书。
  4. 检验通过后,客户端生成对称加密密钥,并使用服务端证书加密,加密过后发送给服务端。
  5. 服务端收到客户端使用服务端证书加密的对称加密密钥,服务端使用服务端密钥对其解密,这样服务端就有了客户端生成的对称加密密钥。
  6. 服务端和客户端使用对称加密密钥加密消息。

其实和https一样,使用tls通信,浏览器内置了根证书,而vpn需要自行生成根证书。