[TOC]
###使用openvpn需要用到epel源
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
yum list openvpn
yum -y install openvpn easy-rsa
###将申请签发证书的相关文件和程序拷贝到openvpn目录下
cp -r /usr/share/easy-rsa/3/ /etc/openvpn/easy-rsa
cp /usr/share/doc/easy-rsa/vars.example /etc/openvpn/easyrsa/vars
cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easyrsa/vars
###在/etc/openvpn/easy-rsa/vars文件中可以修改证书有效期
###进入/etc/openvpn/easyrsa目录下对证书服务器进行初始化
cd /etc/openvpn/easy-rsa
./easyrsa
./easyrsa init-pki
###创建CA证书
./easyrsa build-ca nopass
###申请并签发server端的证书和私钥
./easyrsa gen-req server nopass
./easyrsa sign server server
###创建 Diffie-Hellman 密钥
./easyrsa gen-dh
###申请并签发客户端证书和私钥
./easyrsa gen-req chenjiahao nopass
./easyrsa sign client chenjiahao
###将CA证书、Diffie-Hellman密钥、server的证书以及私钥拷贝到对应目录
cp /etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/server/
cp /etc/openvpn/easy-rsa/pki/issued/server.crt /etc/openvpn/server/
cp /etc/openvpn/easy-rsa/pki/private/server.key /etc/openvpn/server/
cp /etc/openvpn/easy-rsa/pki/dh.pem /etc/openvpn/server
###创建存放用户证书和配置文件的目录,并将对应文件拷贝进去
mkdir /etc/openvpn/client/chenjiahao
find /etc/openvpn/easy-rsa \( -name "chenjiahao.key" -o -name "chenjiahao.crt" -o -name ca.crt \) -exec cp {} /etc/openvpn/client/chenjiahao \;
###准备server的配置文件
cp /usr/share/doc/openvpn-2.4.12/sample/sample-config-files/server.conf /etc/openvpn/
grep '^[a-z].*' /etc/openvpn/server.conf
;local a.b.c.d #本机监听IP,默认为本机所有IP
port 1194 #端口
;proto tcp #协议,生产推荐使用TCP
proto udp #默认协议udp
;dev tap #创建以太网隧道设备,tap设备实现以太网帧通过Openvpn隧道,可提供非IP协议如IPX和AppleTalk等的支持,tap等当于一个以太网设备,它操作第二层数据包如以太网数据帧。
dev tun #创建IP路由隧道,生产推存使用tun.互联网使用tun,一个tun设备大多时候被用于基于IP协议的通讯。tun模拟了网络层设备,操作第三层数据包比如IP数据封包。
;dev-node MyTap #TAP-Win32的设备驱动。非windows系统不需要
ca ca.crt #ca证书文件
cert server.crt #服务器证书文件
key server.key #服务器私钥文件
dh dh2048.pem #dh参数文件
;topology subnet
server 10.8.0.0 255.255.255.0 #客户端连接后自动分配的IP网段,默认会给服务器分配此网段的第一个IP将做为客户端的网关,注意不要和内网网段相同
ifconfig-pool-persist ipp.txt #记录客户端和虚拟ip地址分配的文件
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100 #配置网桥模式,无需配置,建议注释
;server-bridge
;push "route 192.168.10.0 255.255.255.0" #推送给客户端的到达服务器后面网段的静态路由,网关是服务器地址10.8.0.1
;push "route 192.168.10.100 255.255.255.255" #用255.255.255.255可实现只能访问内网单个主机的功能,比如:jumpserver
;push "route 192.168.20.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 #允许不同的客户端直接通信,不安全,生产环境一般无需配置
;duplicate-cn #多个用户共用一个证书,一般用于测试环境,生产环境建议一个用户一个证书,无需开启
keepalive 10 120 #设置服务端活动的检测的间隔和超时时间,每隔10秒ping一次,120秒没有回应则认为已经断线
tls-auth ta.key 0 #访止DoS等攻击的安全增强配置,服务器和每个客户端都需要拥有此密钥文件。第二个参数在服务器端为0,客户端为1
cipher AES-256-CBC #加密算法
;compress lz4-v2 #启用Openvpn2.4.X新版压缩算法
;push "compress lz4-v2" #推送客户端使用新版压缩算法,和下面的comp-lzo不要同时使用
;comp-lzo #旧户端兼容的压缩配置,需要客户端配置开启压缩,openvpn2.4.X等新版可以不用开启
;max-clients 100 #最多支持的客户端数量
;user nobody #指定openvpn服务的用户
;group nobody #指定openvpn服务的组
persist-key #重启服务时默认会重新读取key文件,开启此配置后保持使用第一次的key文件,生产环境无需开启
persist-tun #Don’t close and reopen TUN/TAP device or run up/down scripts across SIGUSR1 or --ping-restart restarts,生产环境建议无需开启
status openvpn-status.log #服务器状态记录文件,每分钟记录一次相关信息
;log openvpn.log #第一种日志记录方式,并指定日志路径,log会在openvpn启动的时候清空日志文件,不建议使用
;log-append openvpn.log #第二种日志记录方式,并指定日志路径,重启openvpn后在之前的日志后面追加新的日志,生产环境建议使用
verb 3 #设置日志级别,0-9,级别越高记录的内容越详细,0 表示静默运行,只记录致命错误,4 表示合理的常规用法,5 和 6 可以帮助调试连接错误。9 表示极度冗余,输出非常详细的日
志信息
;mute 20 #对相同类别的信息只记录前20条到日志文件中
explicit-exit-notify 1 #当服务端重启后通知客户端自动重新连接服务器,此项配置仅能用于udp模式,tcp模式无需配置即能实现重新连接功能,且开启此项后tcp配置后将导致openvpn服务无法启动,所以tcp时必须不能开启此项
script-security 3 # 允许使用自定义脚本
auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env #指定自定义脚本路径
username-as-common-name #开启用户密码验证
client-cert-not-required #只支持用户和密码方式验证,不支持证书,无此配置表示需要证书和用户密码多种验证
###启动server
systemctl enable --now openvpn@server
###准备客户端的配置文件
grep '^[[:alpha:]].*' /usr/share/doc/openvpn-2.4.12/sample/sample-config-files/client.conf > /etc/openvpn/client/chenjiahao/chenjiahao.ovpn
grep '^[a-z].*' /etc/openvpn/client/chenjiahao/chenjiahao.ovpn
client
dev tun
proto udp
remote 120.244.93.178 64331
resolv-retry infinite
nobind
ca ca.crt
cert chenjiahao.crt
key chenjiahao.key
remote-cert-tls server
cipher AES-256-CBC
verb 3
compress lz4-v2
###做ip转发以及IP伪装
#iptables -t nat -A POSTROUTING -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o ens192 -d 10.8.0.0/24 -j SNAT --to-source 100.100.100.101
iptables-save > /etc/iptables-script
echo '/sbin/iptables-restore /etc/iptables-script'>> /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
吊销证书
#查看当前证书的有效性
#证书有效为V,无效为R
cat /etc/openvpn/easy-rsa/pki/index.txt
V 250614151847Z 96C0138B3D4E146158D4B2572066800B unknown /CN=server
V 250614152021Z 4322129E90224A78D34801E151CD23B5 unknown /CN=chenjiahao
R 250619143848Z 230317144249Z CE2870494E94BFD00BE5B36129296F52 unknown /CN=chenjiahao
R 250619153844Z 230317153913Z 56736B549BFF969DB4744910D0FAA41E unknown /CN=chenjiahao
R 250619154327Z 230317160430Z 0B6FEA9138DDFD2E28533157F3E7433D unknown /CN=xiaoming
#吊销指定的用户的证书
cd /etc/openvpn/easy-rsa/
./easyrsa revoke chenjiahao
#生成证书吊销列表
#每次吊销证书后都需要更新证书吊销列表文件,并且需要重启OpenVPN服务
./easyrsa gen-crl
cat pki/crl.pem
#传到windows上,修改文件后缀为crl,双击就可以打开此文件
#第一次吊销证时需要编辑配置文件调用吊销证书的文件,后续吊销无需此步
[root@openvpn-server ~]# vim /etc/openvpn/server.conf
crl-verify /etc/openvpn/easy-rsa/pki/crl.pem
#每次吊销证书后,都需要重新启动才能生效
systemctl restart openvpn@server.service
指定客户端IP
#要使用这个功能需要开启tap网络设备(server端和client都要配置)
dev tap
;dev tun
#修改配置项(指定配置文件路径)
client-config-dir /etc/openvpn/ccd
#为用户添加配置文件,文件名为用户名,文件内容为:ifconfig-push IP NETMASK
cat ccd/xiaochen
ifconfig-push 10.8.0.88 255.255.255.0
持久化客户端IP
#在server端配置文件中修改
ifconfig-pool-persist ipp.txt
#它会将给用户自动分配的IP记录下来,当客户端登陆时,将自动分配此IP
server端重启client重新连接
#在server端修改配置
explicit-exit-notify 1
用户名密码验证
#在server端配置文件中添加三行
# 允许使用自定义脚本
script-security 3
#开启用户密码验证
username-as-common-name
#指定自定义脚本路径
auth-user-pass-verify checkpsw.sh via-env
#脚本需要从网上拉取
http://openvpn.se/files/other/checkpsw.sh
#脚本需要给与执行权限
#脚本内对应的两个文件,一个日志文件需要给与读写权限,配置文件需要有读权限
#!/bin/sh
###########################################################
# checkpsw.sh (C) 2004 Mathias Sundman <mathias@openvpn.se>
#
# This script will authenticate OpenVPN users against
# a plain text file. The passfile should simply contain
# one row per user with the username first followed by
# one or more space(s) or tab(s) and then the password.
PASSFILE="/etc/openvpn/psw-file"
LOG_FILE="/var/log/openvpn-password.log"
TIME_STAMP=`date "+%Y-%m-%d %T"`
###########################################################
if [ ! -r "${PASSFILE}" ]; then
echo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >> ${LOG_FILE}
exit 1
fi
CORRECT_PASSWORD=`awk '!/^;/&&!/^#/&&$1=="'${username}'"{print $2;exit}' ${PASSFILE}`
if [ "${CORRECT_PASSWORD}" = "" ]; then
echo "${TIME_STAMP}: User does not exist: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
exit 1
fi
if [ "${password}" = "${CORRECT_PASSWORD}" ]; then
echo "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >> ${LOG_FILE}
exit 0
fi
echo "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
exit 1
#客户端配置文件需要添加一行
auth-user-pass
#此配置项用于支持用户名密码验证
Windows添加网卡
进入openvpn安装目录,找到bin目录,执行命令行
C:\Program Files\OpenVPN\bin>tapctl.exe
OpenVPN 2.5.7 built on May 27 2022
Usage:
tapctl <command> [<command specific options>]
Commands:
create Create a new TUN/TAP adapter
list List TUN/TAP adapters
delete Delete specified network adapter
help Display this text
Hint: Use "tapctl help <command>" to display help for particular command.