安装
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
|
生成根证书,根证书服务端和客户端都要用到,其作用由两个
- 由根证书派生出服务端证书和客户端证书
- 对客户端来说,当服务端发送服务端证书过来,可以校验其证书是否合法。
生成文件ca.crt和private/ca.key1
| /usr/share/easy-rsa/3/easyrsa build-ca nopass
|
生成交互密钥,生成文件dh.pem。
1
| /usr/share/easy-rsa/3/easyrsa gen-dh
|
生成服务端证书以及密钥,生成文件private/vpn-server.key和issued/vpn-server.crt
1
| /usr/share/easy-rsa/3/easyrsa build-server-full vpn-server nopass
|
生成客户端证书以及密钥,生成文件private/vpn-client-01.key和issued/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通信需要加密,对称加密的效率较高,所以服务端和客户端需要持有一把对称加密的密钥来加密消息。那么如何让服务端和客户端持有相同的密钥呢?那就是通过非对称加密的方式发送密钥给对方。流程如下
- 服务端和客户端都持有根证书,用于对服务端证书和客户端证书验签。
- 客户端请求连接vpn,服务端发送服务端证书给客户端。
- 客户端收到服务端证书后使用根证书验签,检验是否有效证书。
- 检验通过后,客户端生成对称加密密钥,并使用服务端证书加密,加密过后发送给服务端。
- 服务端收到客户端使用服务端证书加密的对称加密密钥,服务端使用服务端密钥对其解密,这样服务端就有了客户端生成的对称加密密钥。
- 服务端和客户端使用对称加密密钥加密消息。
其实和https一样,使用tls通信,浏览器内置了根证书,而vpn需要自行生成根证书。