配置服务端
安装 epel 源、openvpn、easyRsa
yum -y install epel-release
yum -y install openvpn easy-rsa
生成证书和密钥
mkdir -p /etc/openvpn/easy-rsa/
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
生成 CA 根证书
cd /etc/openvpn/easy-rsa/
./easyrsa init-pki
#执行完成会生成 /etc/openvpn/easy-rsa/pki
./easyrsa build-ca nopass
#nopass 指的是证书不需要密码验证
#这里会让你输入一个 common name,可以近似理解为你的域名,随便写
生成 OpenVPN 服务器证书和密钥
./easyrsa build-server-full server nopass #第一个参数 server 为证书名称
./easyrsa gen-dh
openvpn --genkey --secret ta.key
把生成的证书复制到 openvpn 配置文件夹
cd /etc/openvpn/
cp /etc/openvpn/easy-rsa/{pki/dh.pem,pki/ca.crt,ta.key,pki/issued/server.crt,pki/private/server.key} /etc/openvpn
配置 OpenVPN 服务端配置
# 这个文件官方给出了例子:/usr/share/doc/openvpn-2.4.12/sample/sample-config-files/server.conf
vim /etc/openvpn/server.conf
#local 123.57.237.225 #指定监听的本机 IP(因为有些计算机具备多个网卡),该命令是可选的,默认监听所有 IP 地址
port 1194 #服务端端口号
proto tcp #通过 tcp 协议来连接,也可以通过 udp
dev tun #路由模式,注意 windows 下必须使用 dev tap
ca ca.crt #ca 证书存放位置
cert server.crt #服务器证书存放位置
key server.key # #服务器密钥存放位置
dh dh.pem #dh.pem 存放位置
tls-auth ta.key 0 #ta.key 存放位置
server 10.8.0.0 255.255.255.0 #虚拟局域网网段设置
ifconfig-pool-persist ipp.txt
client-to-client #开启客户端互访
#duplicate-cn #支持一个证书 / 用户多个客户端登录使用,建议不启用
keepalive 10 120
cipher AES-128-CBC
#comp-lzo
max-clients 100 #最大客户端并发连接数量
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
verb 3
log /var/log/openvpn/openvpn.log
log-append /var/log/openvpn/openvpn.log
push "route 172.16.214.0 255.255.255.0" #实际内网 ip 网段
建立一个日志目录
#
mkdir -p /var/log/openvpn/
systemctl stop firewalld && systemctl mask firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
配置 iptables
iptables -F # 清理所有防火墙规则
iptables -t nat -A POSTROUTING -s 10.8.0.0/16 -j MASQUERADE
iptables-save > /etc/sysconfig/iptables # iptables 规则持久化保存
地址转发
echo -e "###OpenVPN ADD\nnet.ipv4.conf.default.accept_source_route = 1\nnet.ipv4.conf.default.rp_filter = 0\nnet.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
启动命令
systemctl start openvpn@server #启动 OpenVPN 服务
systemctl restart openvpn@server #重启 OpenVPN 服务
systemctl stop openvpn@server #停止 OpenVPN 服务
配置客户端 (生成客户端配置)
vim /etc/openvpn/client/sample.ovpn
client
remote OPENVPN 服务端公网 IP 1194 #例:remote 106.12.1.1 1194
dev tun
proto tcp
ca ca.crt
cert client.crt
key client.key
tls-auth ta.key 1
remote-cert-tls server
resolv-retry infinite
nobind
persist-key
persist-tun
#comp-lzo
verb 3
mute-replay-warnings
redirect-gateway def1 bypass-dns #这个是设置默认流量走向 注释掉就走本地外网 不注释掉就走 vpn 流量
用户添加脚本
vim ovpn_user.sh
#! /bin/bash
set -e
OVPN_USER_KEYS_DIR=/etc/openvpn/client/keys
EASY_RSA_DIR=/etc/openvpn/easy-rsa/
PKI_DIR=$EASY_RSA_DIR/pki
for user in "$@"
do
if [ -d "$OVPN_USER_KEYS_DIR/$user" ]; then
rm -rf $OVPN_USER_KEYS_DIR/$user
rm -rf $PKI_DIR/reqs/$user.req
sed -i '/'"$user"'/d' $PKI_DIR/index.txt
fi
cd $EASY_RSA_DIR
# 生成客户端 SSL 证书文件
./easyrsa build-client-full $user nopass
# 整理下生成的文件
mkdir -p $OVPN_USER_KEYS_DIR/$user
cp $PKI_DIR/ca.crt $OVPN_USER_KEYS_DIR/$user/ # CA 根证书
cp $PKI_DIR/issued/$user.crt $OVPN_USER_KEYS_DIR/$user/ # 客户端证书
cp $PKI_DIR/private/$user.key $OVPN_USER_KEYS_DIR/$user/ # 客户端证书密钥
cp /etc/openvpn/client/sample.ovpn $OVPN_USER_KEYS_DIR/$user/$user.ovpn # 客户端配置文件
sed -i 's/client.crt/'"$user".crt'/g' $OVPN_USER_KEYS_DIR/$user/$user.ovpn
sed -i 's/client.key/'"$user".key'/g' $OVPN_USER_KEYS_DIR/$user/$user.ovpn
cp $EASY_RSA_DIR/ta.key $OVPN_USER_KEYS_DIR/$user/ta.key # auth-tls 文件
cd $OVPN_USER_KEYS_DIR
zip -r $user.zip $user
done
exit 0
用户删除脚本
vim del_ovpn_user.sh
#! /bin/bash
set -e
OVPN_USER_KEYS_DIR=/etc/openvpn/client/keys
EASY_RSA_DIR=/etc/openvpn/easy-rsa/
PKI_DIR=$EASY_RSA_DIR/pki
for user in "$@"
do
if [ -d "$OVPN_USER_KEYS_DIR/$user" ]; then
rm -rf $OVPN_USER_KEYS_DIR/$user
rm -rf $PKI_DIR/reqs/$user.req
sed -i '/'"$user"'/d' $PKI_DIR/index.txt
fi
cd $EASY_RSA_DIR
# 生成客户端 SSL 证书文件
./easyrsa build-client-full $user nopass
# 整理下生成的文件
mkdir -p $OVPN_USER_KEYS_DIR/$user
cp $PKI_DIR/ca.crt $OVPN_USER_KEYS_DIR/$user/ # CA 根证书
cp $PKI_DIR/issued/$user.crt $OVPN_USER_KEYS_DIR/$user/ # 客户端证书
cp $PKI_DIR/private/$user.key $OVPN_USER_KEYS_DIR/$user/ # 客户端证书密钥
cp /etc/openvpn/client/sample.ovpn $OVPN_USER_KEYS_DIR/$user/$user.ovpn # 客户端配置文件
sed -i 's/client.crt/'"$user".crt'/g' $OVPN_USER_KEYS_DIR/$user/$user.ovpn
sed -i 's/client.key/'"$user".key'/g' $OVPN_USER_KEYS_DIR/$user/$user.ovpn
cp $EASY_RSA_DIR/ta.key $OVPN_USER_KEYS_DIR/$user/ta.key # auth-tls 文件
cd $OVPN_USER_KEYS_DIR
zip -r $user.zip $user
done
exit 0
配置账号密码登录
验证脚本
vim /etc/openvpn/checkpsw.sh
#!/bin/sh
###########################################################
# checkpsw.sh (C) 2004 Mathias Sundman
#
# 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="/etc/openvpn/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
设置权限
chmod 755 /etc/openvpn/checkpsw.sh
配置用户和密码
vim /etc/openvpn/psw-file
test test
openvpn password
服务端配置
cat >>/etc/openvpn/server.conf<<EOF
script-security 3
auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env #指定用户认证脚本
username-as-common-name
verify-client-cert none
EOF
客户端配置
# 注释两行,添加一行即可
;cert cyh.crt #注释
;key cyh.key #注释
auth-user-pass
重启服务端
systemctl restart openvpn@server
openvpn 客户端配置文件 | 合并配置
将对应文件内容复制到 ovpn 文件中的对应位置,如下:<ca>
</ca>
<cert>
</cert>
<key>
</key>
key-direction 1
<tls-auth>
</tls-auth>
需要注意的是必须要加上面红色的一行,否则会失败。
密码验证的话,只配置 ca 和 tls-auth 就可以。
正文完