您的当前位置:首页>全部文章>文章详情

OpenVpn的搭建和使用

发表于:2023-10-27 14:12:03浏览:193次TAG: #openvpn

使用背景

公司的服务器环境使用的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

最后安装成功投入使用