环境准备
- 操作系统:CentOS 7.8
- OpenVPN server: 2.4.11
- easy-rsa:3.0.8
1、安装准备
1.1 系统优化
关闭selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
修改系统参数:
cat /etc/sysctl.d/99-net.conf
# 二层的网桥在转发包时也会被iptables的FORWARD规则所过滤
net.bridge.bridge-nf-call-arptables=1
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
# 关闭严格校验数据包的反向路径,默认值1
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0
# 设置 conntrack 的上限
net.netfilter.nf_conntrack_max=1048576
# 端口最大的监听队列的长度
net.core.somaxconn=21644
# 打开ipv4数据包转发
net.ipv4.ip_forward=1
# TCP FastOpen
# 0:关闭 ; 1:作为客户端时使用 ; 2:作为服务器端时使用 ; 3:无论作为客户端还是服务器端都使用
net.ipv4.tcp_fastopen=3
# 修改limits参数:
cat /etc/security/limits.d/99-centos.conf
* - nproc 1048576
* - nofile 1048576
2、安装openvpn
安装epel源:
yum -y install epel-*
更新软件:
yum makecache
yum update -y
安装openvpn及easy-rsa:
yum -y install openvpn easy-rsa
3、服务端证书配置
复制文件:
# 拷贝easy-rsa的文件到/etc/openvpn下
cp -r /usr/share/easy-rsa/3.0.8 /etc/openvpn/easy-rsa
cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easy-rsa/vars
修改/etc/openvpn/easy-rsa/vars配置:
set_var EASYRSA_REQ_COUNTRY "CN"
set_var EASYRSA_REQ_PROVINCE "Zhe Jiang"
set_var EASYRSA_REQ_CITY "Hang Zhou"
set_var EASYRSA_REQ_ORG "test"
set_var EASYRSA_REQ_EMAIL "xx@test.com"
set_var EASYRSA_REQ_OU "openvpn"
set_var EASYRSA_KEY_SIZE 4096
set_var EASYRSA_ALGO rsa
set_var EASYRSA_CA_EXPIRE 365000
set_var EASYRSA_CERT_EXPIRE 3650
set_var EASYRSA_CERT_RENEW 180
set_var EASYRSA_CRL_DAYS 60
初始化PKI和CA
切换目录:
cd /etc/openvpn/easy-rsa
创建PKI
./easyrsa init-pki
创建CA
./easyrsa build-ca nopass
创建服务器证书
方式一:
./easyrsa build-server-full openvpn-server nopass #自动签发公钥和私钥
方式二:
./easyrsa gen-req openvpn-server nopass # 创建服务器密钥
./easyrsa sign-req server openvpn-server # 用CA证书签署密钥
创建客户端证书
方式一:
./easyrsa build-server-full openvpn-client nopass
方式二:
./easyrsa gen-req openvpn-client nopass # 创建服务器密钥
./easyrsa sign-req client openvpn-client # 用CA证书签署密钥
创建DH证书
./easyrsa gen-dh # 根据在顶部创建的vars配置文件生成密钥
创建ta.key
openvpn --genkey --secret /etc/openvpn/easy-rsa/ta.key
生成CRL密钥:
./easyrsa gen-crl
拷贝证书
mkdir -p /etc/openvpn/pki
cp /etc/openvpn/easy-rsa/pki/ca.crt \
/etc/openvpn/easy-rsa/pki/dh.pem \
/etc/openvpn/easy-rsa/pki/issued/openvpn-server.crt \
/etc/openvpn/easy-rsa/pki/private/openvpn-server.key \
/etc/openvpn/pki/
ln -sv /etc/openvpn/easy-rsa/pki/crl.pem /etc/openvpn/pki/crl.pem
chown -R root:openvpn /etc/openvpn/pki
# 复制ca证书,ta.key和server端证书及密钥到/etc/openvpn/server文件夹里
cp -p /etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/server/
cp -p /etc/openvpn/easy-rsa/pki/issued/openvpn-server.crt /etc/openvpn/server/
cp -p /etc/openvpn/easy-rsa/pki/private/openvpn-server.key /etc/openvpn/server/
cp -p /etc/openvpn/easy-rsa/ta.key /etc/openvpn/server/
# 复制ca证书,ta.key和client端证书及密钥到/etc/openvpn/client文件夹里
cp -p /etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/client/
cp -p /etc/openvpn/easy-rsa/pki/issued/openvpn-client.crt /etc/openvpn/client/
cp -p /etc/openvpn/easy-rsa/pki/private/openvpn-client.key /etc/openvpn/client/
cp -p /etc/openvpn/easy-rsa/ta.key /etc/openvpn/client/
# 复制dh.pem , crl.pem到/etc/openvpn/client文件夹里
cp /etc/openvpn/easy-rsa/pki/dh.pem /etc/openvpn/server/
cp /etc/openvpn/easy-rsa/pki/crl.pem /etc/openvpn/server/
cp /etc/openvpn/easy-rsa/pki/dh.pem /etc/openvpn/client/
cp /etc/openvpn/easy-rsa/pki/crl.pem /etc/openvpn/client/
4、OpenVPN服务端配置
文件创建
创建日志目录:
mkdir -p /var/log/openvpn
chown -R openvpn:openvpn /var/log/openvpn
创建客户端配置目录
mkdir -p /etc/openvpn/client/{config,user}
chown -R root:openvpn /etc/openvpn/client/{config,user}
配置文件创建
cp -p /usr/share/doc/openvpn-2.4.11/sample/sample-config-files/server.conf /etc/openvpn/server/
cat /etc/openvpn/server/server.conf
# 路径根据实际情况修改,一般情况下服务启动失败都是因为证书的原因
# 监听地址
#local 0.0.0.0
# 监听端口
port 1194
# 通信协议
proto udp
# TUN模式还是TAP模式
dev tun
# 证书
ca /etc/openvpn/pki/ca.crt
cert /etc/openvpn/pki/openvpn-server.crt
key /etc/openvpn/pki/openvpn-server.key
dh /etc/openvpn/pki/dh.pem
crl-verify /etc/openvpn/pki/crl.pem
# 禁用OpenVPN自定义缓冲区大小,由操作系统控制
sndbuf 0
rcvbuf 0
# TLS rules “client” | “server”
#remote-cert-tls "client"
# TLS认证
tls-auth /etc/openvpn/pki/ta.key 0
# TLS最小版本
#tls-version-min "1.2"
# 重新协商数据交换的key,默认3600
#reneg-sec 3600
# 在此文件中维护客户端与虚拟IP地址之间的关联记录
# 如果OpenVPN重启,重新连接的客户端可以被分配到先前分配的虚拟IP地址
ifconfig-pool-persist /etc/openvpn/ipp.txt
# 配置client配置文件
client-config-dir /etc/openvpn/client/config
# 该网段为 open VPN 虚拟网卡网段,不要和内网网段冲突即可。
server 10.7.0.0 255.0.0.0
# 配置网桥模式,需要在OpenVPN服务添加启动关闭脚本,将tap设备桥接到物理网口
# 假定内网地址为192.168.0.0/24,内网网关是192.168.0.1
# 分配192.168.0.200-250给VPN使用
#server-bridge 192.168.0.1 255.255.255.0 192.168.0.200 192.168.0.250
# 给客户端推送自定义路由
#push "route 192.168.0.0 255.255.255.0"
# 所有客户端的默认网关都将重定向到VPN
push "redirect-gateway def1 bypass-dhcp"
# 向客户端推送DNS配置
push "dhcp-option DNS 114.114.114.114"
push "dhcp-option DNS 8.8.8.8"
# 允许客户端之间互相访问
client-to-client
# 限制最大客户端数量
max-clients 100
# 客户端连接时运行脚本
#client-connect ovpns.script
# 客户端断开连接时运行脚本
#client-disconnect ovpns.script
# 保持连接时间
keepalive 20 120
# 开启vpn压缩
comp-lzo
# 允许多人使用同一个证书连接VPN,不建议使用,注释状态
duplicate-cn
# 运行用户
user openvpn
#运行组
group openvpn
# 持久化选项可以尽量避免访问那些在重启之后由于用户权限降低而无法访问的某些资源
persist-key
persist-tun
cipher AES-256-CBC
compress lz4-v2
push "compress lz4-v2"
# 显示当前的连接状态
status /var/log/openvpn/openvpn-status.log
# 日志路径,不指定文件路径时输出到控制台
# log代表每次启动时清空日志文件
# log /var/log/openvpn/openvpn.log
# log-append代表追加写入到日志文件
log-append /var/log/openvpn/openvpn.log
# 日志级别
verb 6
# 忽略过多的重复信息,相同类别的信息只有前20条会输出到日志文件中
mute 20
explicit-exit-notify 1
5、防火墙配置
firewall-cmd --permanent --add-service=openvpn
firewall-cmd --permanent --add-interface=tun0 # vpn网卡名
firewall-cmd --permanent --add-masquerade
firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.7.0.0/8 -o ens33 -j MASQUERADE # IP地址为vpn网卡监听的网段,ens33指的是你服务器上网的网卡名称
firewall-cmd --reload
6、服务端启动
systemctl enable openvpn-server@server # 开机启动
systemctl start openvpn-server@server # 本次启动
systemctl status openvpn-server@server # 查看状态
netstat -tlunp | grep openvpn
7、客户端配置
# 复制配置文件模板
cp -p /usr/share/doc/openvpn-2.4.11/sample/sample-config-files/client.conf /etc/openvpn/client/
# 修改后的内容如下
[root@localhost client]# cat client.conf |grep '^[^#|^;]'
client
dev tun
proto udp
remote 192.168.43.138 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert openvpn-client.crt
key openvpn-client.key
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-CBC
verb 6
# 更改client.conf文件名为client.ovpn
mv /etc/openvpn/client/client.conf /etc/openvpn/client/client.ovpnmv client/client.conf client/client.ovpn
# 打包client文件夹
[root@localhost openvpn]# tar -zcvf client.tar.gz client/
# 安装lrzsz工具,通过sz命令把 client.tar.gz传到客户机上面
[root@localhost openvpn]# yum -y install lrzsz
# 将客户端文件复制到需要使用的机器上即可
8、客户端使用openvpn命令连接服务端
openvpn --daemon --cd /root/client/ --config client.ovpn --log-append /var/log/openvpn/openvpn-status.log --auth-nocache
--daemon:后台运行
--cd:切换路径
--config: 指定配置文件
--log-append:指定日志
--auth-nocache:自动认证