openvpn部署

#在家里内网部署openvpn服务器,因为没有外网ip,所以采用frp内网端口1194映射到阿里云外网ip服务器端口1194,在windows10客户端连内网
#提前frpc映射过了
#1添加epel yum源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
#2下载证书生成工具easy-rsa
yum -y install easy-rsa
#3创建证书环境目录
mkdir -p /opt/easy-rsa
cd /opt/easy-rsa
cp -a /usr/share/easy-rsa/3.0.8/* .
cp -a /usr/share/doc/easy-rsa-3.0.8/vars.example ./vars
#4修改vars配置文件,取消下面配置的注释
vi /opt/easy-rsa/vars #全部替换
set_var EASYRSA_DN "cn_only"
set_var EASYRSA_REQ_COUNTRY "CN"
set_var EASYRSA_REQ_PROVINCE "Shanghai"
set_var EASYRSA_REQ_CITY "Shanghai"
set_var EASYRSA_REQ_ORG "IT"
set_var EASYRSA_REQ_EMAIL "414017224@qq.comm"
set_var EASYRSA_NS_SUPPORT "yes"
----------------------------------------------------------------------------------
#5初始化,创建pki目录用于存储证书(以下都在/opt/easy-rsa目录下操作)
cd /opt/easy-rsa/
./easyrsa init-pki
#6创建根证书,根证书用于ca对之后生成的server和client证书签名时使用
./easyrsa build-ca

8d6a04aff52c79164764ffc66afa9107

#7创建server端证书和密钥文件(nopass表示不加密密钥文件,生成过程中直接默认回车)
./easyrsa gen-req server nopass

9a78b30c253ad7cdb687a7cf5b15ba87

#8、给server端证书签名
./easyrsa sign server server

59fe8e4e9db75468413a1daf658827fa

#9、创建Diffie-Hellman文件,密钥交换时的Diffie-Hellman算法
./easyrsa gen-dh

869c309e6b8da2b61c271e841667dd4a

# 10、创建client端证书和密钥文件(nopass表示不加密密钥文件,生成过程中直接默认回车
./easyrsa gen-req client nopass
#11、给client端证书签名
./easyrsa sign client client

376d7a60f24a06e3d2e566713505b81c

OpenVPN服务端部署

yum -y install openvpn	
vim /etc/openvpn/server.conf
------------------------------------------------------
port 1194 #端口
proto udp #协议
dev tun #采用路由隧道模式
ca /opt/easy-rsa/pki/ca.crt #ca证书的位置
cert /opt/easy-rsa/pki/issued/server.crt #服务端公钥的位置
key /opt/easy-rsa/pki/private/server.key #服务端私钥的位置
dh /opt/easy-rsa/pki/dh.pem #证书校验算法
server 10.8.0.0 255.255.255.0 #给客户端分配的地址池
push "route 172.16.1.0 255.255.255.0" #坑###允许客户端访问的内网网段
ifconfig-pool-persist ipp.txt #地址池记录文件位置,未来让openvpn客户端固定ip地址使用的
keepalive 10 120 #存活时间,10秒ping一次,120秒如果未收到响应则视为短线
max-clients 100 #最多允许100个客户端连接
status openvpn-status.log #日志位置,记录openvpn状态
log /var/log/openvpn.log #openvpn日志记录位置
verb 3 #openvpn版本
client-to-client #允许客户端与客户端之间通信
persist-key #通过keepalive检测超时后,重新启动VPN,不重新读取
persist-tun #检测超时后,重新启动VPN,一直保持tun是linkup的,否则网络会先linkdown然后再linkup
duplicate-cn #客户端密钥(证书和私钥)是否可以重复
comp-lzo #启动lzo数据压缩格式
启动并检查端口
systemctl start openvpn@server
systemctl enable openvpn@server
ss -lntup|grep 1194 #检查端口
ps -ef|grep openvpn #检查pid
windows客户端配置
#https://www.filehorse.com/download-openvpn/44646/
OpenVPN 2.4.8 (Windows 10)
#安装在那个目录下的config放入,去服务器
#ca根证书、client.key、client.crt放入config目录
#/opt/easy-rsa/pki/ca.crt
#/opt/easy-rsa/pki/private/client.key
#/opt/easy-rsa/pki/issued/client.crt

1c10a90604d032e23560f31b0a42b27c

#在客户端openvpn安装目录的config目录下,新建一个client.ovpn文件,写入配置
client
dev tun
proto udp
remote 106.15.137.239 1194 #注意此处更改为openvpn服务端代码
resolv-retry infinite
nobind
ca ca.crt
cert client.crt
key client.key
verb 3
persist-key
comp-lzo

782ef6d45a82bdc5e316bd2ebb7180df

#直连其他内网服务器 
#首先确保我们的openvpn服务端开启了内核转发。
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
#确保openvpn开启了ip转发
sysctl -p
#net.ipv4.ip_forward = 1
#openvpn验证成功,服务器重启会失效
#并且添加防火墙方式访问内部网络
systemctl start firewalld
firewall-cmd --add-masquerade --permanent
firewall-cmd --add-service=openvpn --permanent
firewall-cmd --add-port=1194/tcp --permanent
firewall-cmd --reload
systemctl enable firewalld
------------------------------------------------------
#假如开启了firewalld,openvpn这台服务器的其他应用会有问题可以开放所以的端口
#主要openvpn服务器一般不会添加其他应用
firewall-cmd --zone=public --add-port=0-65535/tcp --permanent
firewall-cmd --zone=public --add-port=0-65535/udp --permanent
firewall-cmd --reload

Openvpn密码认证
#openvpn服务端配置
#1、修改服务端配置文件为支持密码认证
vim /etc/openvpn/server.conf #添加配置文件,下面追加三行
script-security 3 #允许使用自定义脚本
auth-user-pass-verify /etc/openvpn/check.sh via-env #指定认证脚本
username-as-common-name #用户密码登陆方式验证
#2、编写脚本文件
vim /etc/openvpn/check.sh
---------------------------------------------------------
#!/bin/bash
PASSFILE="/etc/openvpn/openvpnfile" #密码文件 用户名 密码明文
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
#3、给脚本执行权限
chmod +x /etc/openvpn/check.sh
#4创建用户密码,空格为分割符
vim /etc/openvpn/openvpnfile #yangcheng yangcheng007
#5、重启服务端
systemctl restart openvpn@server

windows客户端配置

#Disconnect断开连接,注意要先断开,否则容易报错,再修改配置文件
#conf文件最后加入
auth-user-pass