OpenVpn的搭建和使用
发表于:2023-10-27 14:12:03浏览:193次
使用背景
公司的服务器环境使用的AWS-EC2,现想实现居家办公也能连接AWS内网环境,因此使用了OPENVPN
使用过程中 CRL证书过期问题
在openvpn 日志中出现 error=CRL has expired: 就是 CRL证书错误或者过期了, 到配置证书的路径前一个目录 执行 ./easyrsa gen-crl 更新证书即可
AWS-EC2服务器搭建(服务端)
1.首先启动EC2机器,运行系统我选择了 ubuntu 22.04
2.直接用apt 安装 openvpn
~: sudo apt-get -y install openvpn libssl-dev openssl
#查看版本
~: openvpn --version
#我们再来查看下openvpn安装时产生的文件,如下:
~:dpkg --list openvpn
#可以查看到OPENVPN已经预制的模板
~:dpkg -L openvpn | more
3.安装 easy-rsa 来制作证书
~:sudo apt-get -y install easy-rsa
#查看easy-rsa安装的版本:
~:dpkg --list easy-rsa
#查看easy-rsa安装的文件
~:dpkg -L easy-rsa |more
4.开始制作相关证书
#先在/etc/openvpn/目录下创建easyrsa-server文件夹 用来生产服务端证书
~:sudo mkdir /etc/openvpn/easyrsa-server/ cd /etc/openvpn/easyrsa-server/
#然后把/usr/share/easy-rsa/目录下的所有文件全部复制到/etc/openvpn/easyrsa-server/下
~:sudo cp -r /usr/share/easy-rsa/* /etc/openvpn/easyrsa-server/
#后续太多参考这篇文章吧 https://blog.csdn.net/wfjdemmye/article/details/131486127
#注意:生成好服务端证书之后,配置好OPENVPN服务即可,客户端证书的创建,按如下操作
...
##这里用来放置生成打包好后数据的 用户证书密钥等,给员工就这里对应帐号给出去
~:sudo mkdir /etc/openvpn/client/
在 /etc/openvpn/client/ 下生成一个文件内容如下(IP和端口配置改成你的,这个是到时一起打包发给员工的,让他们更好配置客户端):
client
dev tun
proto udp
remote 172.31.31.145 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert name.crt
key name.key
comp-lzo
verb 3
5.继续配置好制作员工证书的环境
##复制一份已经做好服务器证书的环境,这里用来制作员工的证书
~:sudo cp -r /etc/openvpn/easyrsa-server /etc/openvpn/easyrsa-client
6.最后使用脚本创建和吊销用户, 执行脚本 按提示输入即可
在这里有改动的是 我在这里建立了 易于管理用户证书的脚本
#!/bin/bash
#
#********************************************************************
#Date: 2022-02-17
#FileName: openvpn.sh
#Description: openvpn
#Copyright (C): 2022 All rights reserved
#********************************************************************
#输入要操作的用户名
read -p "Please input the username:" NAME
#判断是创建还是吊销
read -p "Please input create or revoke:" FUN
export SDIR="/etc/openvpn/easyrsa-server/"
export CRTDIR="/etc/openvpn/client/"
export CDIR="/etc/openvpn/easyrsa-client/"
export CRTPAS="${RANDOM}!${NAME}"
export PAS=$CRTPAS
#NAME=$1
export CCRT_DIR="/etc/openvpn/client/${NAME}"
#创建用户的函数
create(){
mkdir $CCRT_DIR
echo $PAS > ${CCRT_DIR}/password.txt
#在easyrsa-client证书环境生成req和key文件
cd $CDIR
expect &> /dev/null <<EOF
spawn ./easyrsa gen-req $NAME
expect {
"phrase:" { send "$PAS\n";exp_continue }
"phrase:" { send "$PAS\n";exp_continue }
"]:" { send "\n" }
}
expect eof
EOF
#在easyrsa-server导入req文件并签发证书
cd $SDIR && ./easyrsa import-req ${CDIR}pki/reqs/${NAME}.req $NAME &> /dev/null && echo -e "yes\n" | ./easyrsa sign-req client $NAME &> /dev/null
#整理证书文件
cp ${SDIR}pki/ca.crt $CCRT_DIR
cp ${SDIR}pki/issued/${NAME}.crt $CCRT_DIR
cp ${CDIR}pki/private/${NAME}.key $CCRT_DIR
#复制client.ovpn配置文件并修改
cp ${CRTDIR}client.ovpn $CCRT_DIR && sed -i "s/name/${NAME}/g" ${CCRT_DIR}/client.ovpn
#打包证书文件
cd $CCRT_DIR && tar czf ${NAME}.tar.gz ./* &> /dev/null
}
#证书吊销的函数
revoke(){
if grep -q "$NAME" /etc/openvpn/easyrsa-server/pki/index.txt;then
if grep "$NAME" /etc/openvpn/easyrsa-server/pki/index.txt | grep -q R;then
echo "该用户已吊销"
exit 0
else
echo "+++++++开始吊销用户++++++"
cd $SDIR && echo -e "yes\n" | ./easyrsa revoke $NAME &> /dev/null && ./easyrsa gen-crl &> /dev/null && echo "+++++++吊销完成++++++"
systemctl restart openvpn@server
exit 0
fi
else
echo "该用户不存在"
exit 0
fi
}
#删除证书的函数
delete(){
echo "++++++++开始删除残留文件++++++++"
rm -rf ${CDIR}pki/reqs/${NAME}.req
rm -rf ${CDIR}pki/private/${NAME}.key
rm -rf $CCRT_DIR
rm -rf ${SDIR}pki/reqs/${NAME}.req
rm -rf ${SDIR}pki/issued/${NAME}.crt
#删除带R的吊销记录
sed -i "/${NAME}/d" /etc/openvpn/easyrsa-server/pki/index.txt && echo "+++++++删除完成+++++++"
}
#创建
case $FUN in
create)
#判断是否重名
if [ -e ${CDIR}pki/private/${NAME}.key ];then
echo "The user already exists"
read -p "删除原用户并重新创建或选择退出,Please input delete or exit:" FUN2
if [ "$FUN2" = delete ];then
delete
echo "++++++原用户已删除,现在开始新建++++++++"
create
echo "++++++创建完成++++++++"
elif [ "$FUN2" = exit ];then
exit 0
else
echo "输入参数错误,退出"
exit 1
fi
else
echo "+++++++开始创建+++++"
create
echo "++++++创建完成++++++"
exit 0
fi
;;
revoke)
revoke
;;
*)
echo "Input false,please input create or revoke!"
esac
OPENVPN 访问内网配置
修改服务配置文件 /etc/openvpn/server.conf 修改 加入 push “route 172.31.0.0 255.255.0.0”
然后重启服务
## 这时你会发现A机器连上NPV ping不到 内网服务器B,解决方法是,在 packet 离开 VPN 服务端时,将其「伪装」成来自 172.31.0.0(VPN 服务端的局域网地址),这样机器 B 发送的 ACK 就能顺利回到 VPN 服务端,然后发给机器 A. 这就是所谓的 SNAT, 在 Linux 系统中由 iptables 来管理,具体命令是:
sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
最后安装成功投入使用