1.1 OpenVPN 简介
OpenVPN 是一个健全且高效的 VPN 守护进程,它支持 SSL/TLS 安全、以太网桥,支持TCP 或者 UDP 代理或者是 NAT 通道传输,支持动态 IP 地址和 DHCP,可支持成百上 千的用户,并且可以移植到大多数主要平台的操作系统上。
OpenVPN 需要使用 OpenSSL 库,这是因为它使用了 OpenSSL 的加密功能。OpenVPN 支持常规的加密,即使用预共享密钥(即静态 Key 模式)或者客户端和服务器端 的证书公钥安全(即 SSL/TLS 模式)。它还支持非加密的 TCP/UDP 通道。OpenVPN 被设 计为使用 TUN/TAP 虚拟网络接口连接网络,这种接口可以在大多数平台上使用。
OpenVPN 允许任何选项放置在命令行或者是配置文件中(在配置文件中我们称选项为指令)
1.2 OpenVPN 部署
操作系统版本和时间同步
时间同步可参考其他文章
[root@openvpn-server ]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
[root@openvpn-server ]# ntp
ntpd ntpdc ntpq ntptime
ntpdate ntp-keygen ntpstat
[root@openvpn-server ~]# ntpdate time1.aliyun.com
6 Feb 10:46:45 ntpdate[12220]: the NTP socket is in use, exiting
1.2.2 安装 OpenVPN
安装 openvpn 和 easy-rsa 证书管理工具,版本号会有差异,查看自己安装的实际版本。
[root@openvpn-server ]# yum install epel-release -y
[root@openvpn-server ]# yum install openvpn -y
[root@openvpn-server ]# yum install easy-rsa -y
root@openvpn-server ~]# cp /usr/share/doc/openvpn-2.4.12/sample/sample-config-files/server.conf /etc/openvpn
[root@openvpn-server ~]# cp -r /usr/share/easy-rsa/ /etc/openvpn/easyrsa-server
[root@openvpn-server ~]# cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easyrsa-server/3/vars
1.2.3 初始化 pki 环境和 CA 签发机构
[root@openvpn-server 3]#cd /etc/openvpn/easyrsa-server/3
[root@openvpn-server 3]#./easyrsa init-pki
1.2.4 创建 CA 机构
[root@openvpn-server 3]#cd /etc/openvpn/easyrsa-server/3
[root@openvpn-server 3]#./easyrsa build-ca nopass
1.2.5 生成服务端私钥
[root@openvpn-server 3]#cd /etc/openvpn/easyrsa-server/3
[root@openvpn-server 3]# ./easyrsa gen-req server nopass
1.2.6 签发服务端证书
使用自建 ca 签发服务器证书,即生成服务端 crt 证书,crt 证书后期将发给各用户客户端,从而实现与 openvpn-server 端加密传输数据。
[root@openvpn-server 3]#cd /etc/openvpn/easyrsa-server/3
[root@openvpn-server 3]# ./easyrsa sign server server
1.2.7 生成 dh.pem 证书
DH 密钥交换方法,由惠特菲尔德·迪菲(Bailey Whitfield Diffie)、马丁·赫尔曼(Martin Edward Hellman)于 1976 年发表,它是一种安全协议,让双方在完全没 有对方任何预先信息的条件下通过不安全信道建立起一个密钥,这个密钥一般作为 "对称加密"的密钥而被双方在后续数据传输中使用,DH 数学原理是 base 离散对数 问题,做类似事情的还有非对称加密类算法,如:RSA。其应用非常广泛,在 SSH、 VPN、Https…都有应用,勘称现代密码基石。 .pem证书和.crt证书的差别就是编码方式不一样,本质上都是证书文件
[root@openvpn-server 3]# cd /etc/openvpn/easyrsa-server/3
[root@openvpn-server 3]# ./easyrsa gen-dh
1.2.8 生成客户端证书
[root@openvpn-server ~]# cp -r /usr/share/easy-rsa/ /etc/openvpn/easyrsa-client
[root@openvpn-server ~]# cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easyrsa-client/3/vars
[root@openvpn-server ~]# cd /etc/openvpn/easyrsa-client/3
[root@openvpn-server 3]# ./easyrsa init-pki
[root@openvpn-server 3]# ./easyrsa gen-req test nopass
在 openvpn server 目录中签发客户端证书
[root@openvpn-server 3]# cd /etc/openvpn/easyrsa-server/3
[root@openvpn-server 3]# ./easyrsa import-req /etc/openvpn/easyrsa-client/3/pki/reqs/test.req test
[root@openvpn-server 3]# ./easyrsa sign client test
1.2.10 归档服务端证书到 server 目录
对签发的服务端证书进行归档保存
[root@openvpn-server 3]# mkdir /etc/openvpn/certs
[root@openvpn-server 3]# cd /etc/openvpn/certs
[root@openvpn-server certs]# cp /etc/openvpn/easyrsa-server/3/pki/dh.pem .
[root@openvpn-server certs]# cp /etc/openvpn/easyrsa-server/3/pki/ca.crt .
[root@openvpn-server certs]# cp /etc/openvpn/easyrsa-server/3/pki/issued/server.crt .
[root@openvpn-server certs]# cp /etc/openvpn/easyrsa-server/3/pki/private/server.key .
1.2.11 归档客户端证书到相应目录
对签发的客户端证书进行归档保存
[root@openvpn-server certs]# mkdir /etc/openvpn/client/test
[root@openvpn-server certs]# cd /etc/openvpn/client/test
[root@openvpn-server test]# cp /etc/openvpn/easyrsa-server/3/pki/ca.crt .
[root@openvpn-server test]# cp /etc/openvpn/easyrsa-server/3/pki/issued/test.crt .
[root@openvpn-server test]# cp /etc/openvpn/easyrsa-client/3/pki/private/test.key .
1.2.12 server 端配置
服务器端配置说明
[root@openvpn-server ~]# vim /etc/openvpn/server.conf
local 127.0.0.1 # 本机监听IP
port 1194 # 端口
# TCP or UDP server?
proto tcp # 协议,指定OpenVPN创建的通信隧道类型
#proto udp
#dev tap:创建一个以太网隧道,以太网使用tap
dev tun # 创建一个路由IP隧道,互联网使用tun一个TUN设备大多时候,被用于基于IP协议的通讯。一个TAP设备允
# 许完整的以太网帧通过Openvpn隧道,因此提供非ip协议的支持,比如IPX协议和AppleTalk协议
#dev-node MyTap # TAP-Win32适配器。非windows不需要
#topology subnet # 网络拓扑,不需要配置
server 10.8.0.0 255.255.255.0 #客户端连接后分配IP的地址池,服务器默认会占用第一个IP 10.8.0.1
#ifconfig-pool-persist ipp.txt #为客户端分配固定IP,不需要配置
#server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100 #配置网桥模式,不需要
push "route 10.20.0.0 255.255.255.0" # 给客户端生成的静态路由表,下一跳为openvpn服务器的
# 10.8.0.1,地址段为openvpn服务器后的公司内部网络,可以是多个网段
push "route 192.168.0.0 255.255.255.0"
;client-config-dir ccd #为指定的客户端添加路由,改路由通常是客户端后面的内网网段而不是服务端的,也不需要设置
;route 192.168.40.128 255.255.255.248
;client-config-dir ccd
;route 10.9.0.0 255.255.255.252
;learn-address ./script #运行外部脚本,创建不同组的iptables 规则,不配置
;push "redirect-gateway def1 bypass-dhcp" #启用后,客户端所有流量都将通过VPN服务器,因此不需要配置
#;push "dhcp-option DNS 208.67.222.222" #推送DNS服务器,不需要配置
#;push "dhcp-option DNS 208.67.220.220"
#client-to-client #允许不同的client通过openvpn server直接通信,不开启
;duplicate-cn #多个用户共用一个账户,一般用于测试环境,生产环境都是一个用户一个证书
keepalive 10 120 #设置服务端检测的间隔和超时时间,默认为每 10 秒 ping一次,如果 120 秒没有回应则认为对方已经 down
#tls-auth /etc/openvpn/server/ta.key 0 #可使用以下命令来生成:openvpn –genkey –secret
ta.key #服务器和每个客户端都需要拥有该密钥的一个拷贝。第二个参数在服务器端应该为’0’,在客户端应该为’1’
cipher AES-256-CBC #加密算法
;compress lz4-v2 #启用压缩
;push "compress lz4-v2"
;comp-lzo #旧户端兼容的压缩配置,需要客户端配置开启压缩
;max-clients 100 #最大客户端数
user nobody #运行openvpn服务的用户和组
group nobody
#persist-key #重启OpenVPN服务,重新读取keys文件,保留使用第一次的keys文件,不开启
#persist-tun #重启OpenVPN服务,一直保持tun或者tap设备是up的,否则会先down然后再up,不开启
status /var/log/openvpn/openvpn-status.log #openVPN状态记录文件,每分钟会记录一次
#;log openvpn.log #日志记录方式和路径,log会在openvpn启动的时候清空日志文件
log-append /var/log/openvpn/openvpn.log #重启openvpn后在之前的日志后面追加新的日志
verb 4 #设置日志级别,0-9,级别越高记录的内容越详细,
mute 20 #相同类别的信息只有前20条会输出到日志文件中
;explicit-exit-notify 1 # 通知客户端,在服务端重启后可以自动重新连接,仅能用于udp模式,tcp模式不需要
# 配置即可实现断开重连接,且tcp配置后会导致openvpn服务无法启动。
[root@openvpn-server ~]# mkdir /var/log/openvpn
[root@openvpn-server ~]# chown nobody.nobody /var/log/openvpn
最终配置
[root@openvpn-server ~]# grep "^[a-Z]" /etc/openvpn/server.conf
local 192.168.2.71
port 1194
proto tcp
dev tun
ca /etc/openvpn/certs/ca.crt
cert /etc/openvpn/certs/server.crt
key /etc/openvpn/certs/server.key # This file should be kept secret
dh /etc/openvpn/certs/dh.pem
server 10.8.0.0 255.255.255.0
push "route 192.168.10.0 255.255.255.0"
push "route 192.168.20.0 255.255.255.0"
push "route 192.168.2.0 255.255.255.0" #新增允许访问内网192.168.2.0网段
client-to-client
keepalive 10 120
cipher AES-256-CBC
max-clients 100
user nobody
group nobody
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 3
status-version 3 #新增这条命令为了实现Prometheus对Openvpn的监控。
1.2.13 client 端配置文件
[root@openvpn-server ~]# cd /etc/openvpn/client/test/
[root@openvpn-server test]# grep -Ev "^(#|$|;)" /usr/share/doc/openvpn-2.4.12/sample/sample-config-files/client.conf > /etc/openvpn/client/test/client.ovpn
[root@openvpn-server test]# vim /etc/openvpn/client/test/client.ovpn
client # 声明自己是个客户端
dev tun # 接口类型,必须和服务端保持一致
proto tcp # 使用的协议,必须和服务端保持一致
remote 192.168.2.71 1194 #server端的ip和端口,可以写域名但是需要可以解析成IP
resolv-retry infinite # 如果是写的server端的域名,那么就始终解析,如果域名发生变化,
# 会重新连接到新的域名对应的IP
nobind #本机不绑定监听端口,客户端是随机打开端口连接到服务端的1194
persist-key #
persist-tun
ca ca.crt
cert test.crt
key test.key
remote-cert-tls server #指定采用服务器校验方式
#tls-auth ta.key 1
cipher AES-256-CBC
verb 3
1.2.14 OpenVPN 启动
# 启动OpenVPN
[root@openvpn-server ~]# systemctl start openvpn@server.service
[root@openvpn-server ~]# systemctl status openvpn@server.service
验证 tun 网卡设备:
[root@openvpn-server ~]# ifconfig tun0
tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500
inet 10.8.0.1 netmask 255.255.255.255 destination 10.8.0.2
inet6 fe80::8a69:b152:413b:2421 prefixlen 64 scopeid 0x20<link>
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 100 (UNSPEC)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3 bytes 144 (144.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
1.2.15 安装 OpenVPN 的 Windows 客户端
客户端地址:https://sourceforge.net/projects/securepoint/files/
1.2.16 客户端连接测试
保存证书到 openvpn 客户端安装目录:C:\Program Files\OpenVPN\config
二.OpenVPN 自动脚本
OpenVPN 新增账户和吊销证书脚本编写参考:
- 新增账户
#!/bin/bash
# Add a user to openvpn
if [[ $# -eq 0 ]]; then
echo "Usage: basename $0 USERNAME1 [USERNAME2 [USERNAME3...]]"
fi
for user in "$@"; do
echo"Adding new user: $user"
if [[ -d "/etc/openvpn/client/$user" ]]; then
rm -rf /etc/openvpn/client/$user
rm -rf /etc/openvpn/easy-rsa/3.0.3/pki/reqs/$user.req
sed -i '/'''$user'''/d' /etc/openvpn/easy-rsa/3.0.3/pki/index.txt
fi
echo "Gen .csr file."
cd /etc/openvpn/easyrsa-client/3
./easyrsa init-pki
./easyrsa gen-req $user nopass
echo "Sign client certification."
cd /etc/openvpn/easyrsa-server/3
./easyrsa import-req /etc/openvpn/easyrsa-client/3/pki/reqs/$user.req $user
./easyrsa sign client $user
echo "Manage the crts."
mkdir -p /etc/openvpn/client/$user/
cp /etc/openvpn/easyrsa-server/3/pki/ca.crt /etc/openvpn/client/$user/
cp /etc/openvpn/easyrsa-server/3/pki/issued/$user.crt /etc/openvpn/client/$user/
cp /etc/openvpn/easyrsa-client/3/pki/private//$user.key /etc/openvpn/client/$user/
cp /etc/openvpn/client/client.ovpn /etc/openvpn/client/$user/$user.ovpn
sed -i 's/admin/'''$user'''/g' /etc/openvpn/client/$user/$user.ovpn
cd /etc/openvpn/client/$user/
zip -r $user.zip *
mv /etc/openvpn/client/$user/$user.zip ~
echo "All done."
done
- 吊销证书
#!/bin/bash
# Del a user from openvpn
if [[ $# -eq 0 ]]; then
echo "Usage: basename $0 USERNAME"
fi
echo "Revoking $1..."
cd /etc/openvpn/easyrsa-server/3
./easyrsa revoke $1 # 吊销$user账户的证书
./easyrsa gen-crl
if [[ -f /etc/openvpn/easyrsa-server/3/pki/crl.pem]]; then
echo "crl-verify /etc/openvpn/easyrsa-server/3/pki/crl.pem" >> /etc/openvpn/server.conf
else
echo "Can not find crl.pem. Exit."
fi
echo "Done."
三.OpenVPN 宽带限流
限制网段
tc qdisc del dev tun0 root
tc qdisc add dev tun0 root handle 1: htb default 10
tc class add dev tun0 parent 1: classid 1:1 htb rate 9000kbit burst 10k #限制总带宽9M,
tc qdisc add dev tun0 parent 1:1 handle 10: sfq perturb 10 #随机公平队列 ,避免一个IP占用整个带宽
tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 10.8.0.0/24 flowid 1:1 #限速的网段
- 参数解读:
rate:限制带宽速率。
ceil:限制带宽峰值速率。
burst:限制突发流量大小。
cburst:限制类别突发流量大小。
perturb:多少秒后重新配置一次散列算法
部分往期文章:
从零开始:Jenkins中代码审计SonarQube生产实践全攻略!
一文带你了解Chrony时间同步服务:让你的设备时间完美同步!
本文暂时没有评论,来添加一个吧(●'◡'●)