OpenVPN 安装和配置

Virtual Private Network,虚拟私有网络,或称为虚拟专用网络,常用于在公用网络上实现专用网络功 能,为了安全通常需要进行加密通讯。此方式在企业网络中有广泛应用。VPN网关通过对数据包的加密 和数据包目标地址的转换实现远程访问。VPN功能可通过服务器、网络硬件、软件等多种方式实现

OpenVPN 是一个基于 OpenSSL 库的应用层 VPN 实现。和传统 VPN 相比,它的优点是简单易用

https://openvpn.net/ openvpn 官网

https://openvpn.net/community-downloads/ openpn windows客户端社区版下载

VPN 常见应用模式

点对站点 peer to site

站点对站点 site to site

OPEN VPN 部署

#!/bin/bash

set -u
set -e


PUSH_INNER_NET="192.168.10.0 255.255.255.0"
VPN_NET="10.8.0.0 255.255.255.0"
HOST_IP=10.0.0.3

setup_server()
{

    #安装openvpn客户端
    yum -y install openvpn easy-rsa
    #拷贝easy-rsa的证书颁发的相关模板文件目录到openvpn的配置文件目录下
    cp -r /usr/share/easy-rsa/3/ /etc/openvpn/easy-rsa
    cp /usr/share/doc/easy-rsa/vars.example  /etc/openvpn/easy-rsa/vars
    #ca 证书有效年100年,等下需要用vars这个文件里面定义的变量值来生成证书申请文件
    sed -ri "s/^#(set_var EASYRSA_CA_EXPIRE).*/\1      36500/" /etc/openvpn/easy-rsa/vars
    #服务器证书默为为825天,可适当加长,比如:3650天
    sed -ri "s/^#(set_var EASYRSA_CERT_EXPIRE).*/\1   3650/" /etc/openvpn/easy-rsa/vars
    cd /etc/openvpn/easy-rsa
    #初始化PKI生成PKI相关目录和文件,PKI 公共密码体系
    ./easyrsa init-pki
    #创建 CA 机构证书环境,生成自签名ca证书
    ./easyrsa build-ca nopass <<EOF

EOF

#创建服务端证书申请,其中server是文件前缀
./easyrsa gen-req server nopass <<EOF

EOF


#颁发服务端证书
#第一个server表示证书的类型,第二个server表示请求文件名的前缀
./easyrsa sign server server <<EOF
yes
EOF
    # 创建 Diffie-Hellman 密钥
    ./easyrsa  gen-dh
    #将CA和服务器证书相关文件复制到服务器相应的目录
    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
#配置 OpenVPN 服务器并启动服务
#cp /usr/share/doc/openvpn/sample/sample-config-files/server.conf /etc/openvpn/
cat > /etc/openvpn/server.conf <<EOF
port 1194
proto tcp
dev tun
ca  /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server.crt
key /etc/openvpn/server/server.key  # This file should be kept secret
dh /etc/openvpn/server/dh.pem
server ${VPN_NET}
push "route ${PUSH_INNER_NET}"
keepalive 10 120
cipher AES-256-CBC
compress lz4-v2
push "compress lz4-v2"
max-clients 2048
user openvpn
group openvpn
status       /var/log/openvpn/penvpn-status.log
log-append   /var/log/openvpn/openvpn.log
verb 3
mute 20
EOF

#把日志文件夹创建出来,并修改相对应的权限
    mkdir -p /var/log/openvpn/
    chown openvpn:openvpn -R /var/log/openvpn/

#红帽8系列需要增加service文件,7版本里面带的有,不需要加,ubuntu22.04也有service文件,
#也不需要加,但是ubuntu22.04没有openvpn:openvpn 主和组,自己手动创建
cat > /lib/systemd/system/[email protected] <<EOF
[Unit]
Description=OpenVPN Robust And Highly Flexible Tunneling Application On %I
After=network.target

[Service]
Type=notify
PrivateTmp=true
ExecStart=/usr/sbin/openvpn --cd /etc/openvpn/ --config %i.conf

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload 
systemctl enable --now [email protected]  #注意,启动和停止用的service文件是[email protected]这个文件


}




#下面是为客户端申请证书和创建客户端的配置文件,然后打包之后,需要发给客户端

setup_client()
{
    cd  /etc/openvpn/easy-rsa/
    read -r -p "客户端名字(字母组合): " NAME
    read -r -p "客户端证书过期时间(单位:天): " CLIENT_EXPIRE

    #准备客户端证书环境
    # 修改客户端证书有效期
    sed -ri "s/^(set_var EASYRSA_CERT_EXPIRE).*/\1   $CLIENT_EXPIRE/" /etc/openvpn/easy-rsa/vars
#创建客户端证书申请
/etc/openvpn/easy-rsa/easyrsa gen-req $NAME  nopass <<EOF

EOF


# 颁发客户端证书
/etc/openvpn/easy-rsa/easyrsa sign client $NAME <<EOF
yes
EOF

#将客户端私钥与证书相关文件复制到服务器相关的目录
mkdir -p /etc/openvpn/client/$NAME/
find /etc/openvpn/easy-rsa/ \( -name "$NAME.crt" -o -name "$NAME.key" -o -name "ca.crt" \)  -exec cp {} /etc/openvpn/client/$NAME/ \;

#准备 OpenVPN 客户端配置文件
cat  > /etc/openvpn/client/$NAME/client.ovpn <<EOF

client
dev tun
proto tcp
remote $HOST_IP  1194
resolv-retry infinite
nobind
ca ca.crt
cert ${NAME}.crt
key ${NAME}.key
remote-cert-tls server
cipher AES-256-CBC
verb 3
compress lz4-v2

EOF

mkdir -p ../client-tar/$NAME/
tar zcf  ../client-tar/$NAME/${NAME}.tar.gz   ../client/${NAME}/ 
}

MENU="
配置VPN服务器
产生客户端配置
退出
"
PS3="请选择: "
select item in  $MENU; do 
    case $(tr -d " " <<<"$REPLY") in
        1)
            setup_server
            ;;
        2)
            setup_client
            ;;
        3) 
            exit
            ;;
        *) 
            echo "无对应操作"
            ;;
    esac
done

关于为什么 启动和停止用的service文件是[email protected]这个文件

服务模板:[email protected] 是一个模板服务文件。在 Systemd 系统中,带有 @ 符号的服务文件是模板,可以用来创建具有特定参数的服务实例。

实例名:server 是传递给这个模板的实例名。这意味着 Systemd 会查找一个名为 [email protected] 的模板,然后将 server 作为参数传递给这个服务。通常,这个实例名与你的配置文件名相对应。

配置文件的关联:在 OpenVPN 的情况下,当你使用 [email protected] 启动服务时,Systemd 会尝试加载 /etc/openvpn/server.conf 配置文件。如果你使用 [email protected],则会加载 /etc/openvpn/client.conf 文件。

tun 设备 和 tap 设备

TUN 设备:
TAP 设备:
选择 TUN 还是 TAP?

VPN 管理

启用安全增强功能

启用防止DoS攻击的安全增强配置

openvpn --genkey --secret /etc/openvpn/server/ta.key #注意这个文件一定设置为属主和属组 openvpn:openvpn

vim /etc/openvpn/server.conf
tls-auth /etc/openvpn/server/ta.key 0  #客户端为1,服务器端为0, 客户端windows的config目录下也需要这个文件,
systemctl restart [email protected]


OpenVPN 2.5.9 版本不再支持 tls-auth 选项。在 OpenVPN 2.5 版本及以后,
此配置项已被更新为 tls-crypt 且客户端和服务器端都不需要 跟数字值 0和1

设置客户端的私钥密码增强安全性

这个操作执行,一定要在 easy-rsa 目录下
/etc/openvpn/easy-rsa/easyrsa gen-req zhu   #这个地方不要设置nopass,就可以设置密码

证书手动注销

./easyrsa revoke wang

./easyrsa gen-crl
每次吊销证书后都需要更新证书吊销列表文件,并且需要重启OpenVPN服务


第一次吊销证时需要编辑配置文件调用吊销证书的文件,后续吊销无需此步

vim /etc/openvpn/server.conf
crl-verify /etc/openvpn/easy-rsa/pki/crl.pem

#每次吊销证书后,都需要重新启动才能生效
systemctl restart [email protected]

多个用户共用一个证书

服务端配置文件加上
duplicate-cn   
默认不开启,生产环境不建议开启

openvpn windows 客户端配置

windows 配置

openvpn 客户端安装完之后,只需要把客户端配置解压之后的文件夹的全部文件拷贝,放到openvpn的安装目录下的config目录下即可

如果遇到启动如下图所示的无法启动

可以 window + x 进入计算机管理 –> 服务管理,把 openvpn 的两个服务启动,即可