OpenVPN 服务器禁用并重新启用客户端

OpenVPN 服务器禁用并重新启用客户端

我在 Ubuntu 14.04 Server 机器上运行 OpenVPN 2.3.2(仍然是新手)。我希望能够禁用/重新启用连接到我的 OpenVPN 服务器的客户端。

我跟着撤销客户端证书的指南,但似乎此举是不可逆的。此外,如果我撤销客户端证书,并且客户端已经连接,则连接似乎不会停止。我希望连接立即停止。

有没有什么简单的方法可以禁用并重新启用客户端?

我的 server.conf 文件:

# OpenVPN server configuration file
dev tun
proto udp
port 1194
server 10.8.0.0 255.255.255.0
ca /usr/share/easy-rsa/keys/ca.crt
cert /usr/share/easy-rsa/keys/vpnserver.crt
key /usr/share/easy-rsa/keys/vpnserver.key
dh /usr/share/easy-rsa/keys/dh2048.pem
push "dhcp-option DNS 8.8.8.8"
push "redirect-gateway def1"
comp-lzo
keepalive 10 60
persist-tun
persist-key
user panos
group panos
log-append /var/log/openvpn.log
verb 3
# crl-verify keys/crl.pem

最后一行是针对上述指南的。

谢谢。

答案1

我实施了与 davidgo 类似的解决方案。不幸的是,我遇到了类似以下的 openssl 错误这个错误,我花了很多时间才找到解决这个问题的方法。

我最终编写了两个用于撤销和取消撤销客户端证书的脚本:

撤销.sh:

#!/bin/bash

keys_index_file=/usr/share/easy-rsa/keys/index.txt
fileline="$(grep "/CN=$1/" $keys_index_file)"
columns_number="$(echo $fileline | awk -F' ' '{print NF;}')"

if [[ $columns_number -eq 5 ]] && [[ $fileline == V* ]]; then

    source /usr/share/easy-rsa/vars 
    /usr/share/easy-rsa/revoke-full $1

    {
        sleep 3
        echo kill $1
        sleep 3
        echo exit
    } | telnet localhost 7505

    echo "Client certificate revoked successfully."
    exit 0;

elif [[ $columns_number -eq 6 ]] && [[ $fileline == R* ]]; then

    echo "Client certificate is already revoked."
    exit 0;

else

    echo "Error; key index file may be corrupted."
    exit 1;
fi

取消撤销.sh:

#!/bin/bash

keys_index_file=/usr/share/easy-rsa/keys/index.txt
linenumber="$(grep -n "/CN=$1/" $keys_index_file | cut -f1 -d:)"
fileline="$(grep -n "/CN=$1/" $keys_index_file)"
line="$(grep "/CN=$1/" $keys_index_file)"

columns_number="$(echo $line | awk -F' ' '{print NF;}')"
echo $columns_number



if [[ $columns_number -eq 6 ]] && [[ $line == R* ]]; then

    column2="$(echo $fileline | awk '{print $2}')"
    column4="$(echo $fileline | awk '{print $4}')"
    column5="$(echo $fileline | awk '{print $5}')"
    column6="$(echo $fileline | awk '{print $6}')"
    echo -e "V\t$column2\t\t$column4\t$column5\t$column6" >> $keys_index_file
    sed -i "${linenumber}d" $keys_index_file
    cd /usr/share/easy-rsa; source ./vars; openssl ca -gencrl -out "keys/crl.pem" -config "$KEY_CONFIG"

    echo "Certificate unrevoked successfully."
    exit 0;

elif [[ $columns_number -eq 5 ]] && [[ $fileline == V* ]]; then

    echo "Certificate is already unrevoked and active"
    exit 0;

else

    echo "Error; Key index file may be corrupted."
    exit 1;

fi

请注意,revoke.sh脚本还会打开telnet 连接使用 openVPN 并踢出要撤销的客户端。

答案2

Panos 的回答在 5 年前是正确的。所以值得点赞。然而从那时起,发生的事情是 vars 目录已被移动/删除,/usr/share/easy-rsa 目录似乎不再存在,并且 $KEY_CONFIG 似乎不存在或与 vars 目录耦合,正如我所说,它似乎不再存在,至少在 Ubuntu 21.10(2022 年 4 月)中是这样。

我发现这个脚本已提交到 github,看起来不错,我运行它并且有效,它取消了我被撤销的证书。

#!/bin/bash
set -e

keys_index_file="/etc/openvpn/server/easy-rsa/pki/index.txt"
linenumber="$(grep -n "/CN=$1"'$' $keys_index_file | cut -f1 -d: | head -1)"
fileline="$(grep -n "/CN=$1"'$' $keys_index_file | head -1)"
line="$(grep "/CN=$1"'$' $keys_index_file | head -1)"

columns_number="$(echo $line | awk -F' ' '{print NF;}')"
echo $columns_number

if [[ $columns_number -eq 6 ]] && [[ $line == R* ]]; then

    column2="$(echo $fileline | awk '{print $2}')"
    column4="$(echo $fileline | awk '{print $4}')"
    column5="$(echo $fileline | awk '{print $5}')"
    column6="$(echo $fileline | awk '{print $6}')"
    echo -e "V\t$column2\t\t$column4\t$column5\t$column6" >> $keys_index_file
    sed -i "${linenumber}d" $keys_index_file

    cd /etc/openvpn/server/easy-rsa
    EASYRSA_CRL_DAYS=3650 ./easyrsa gen-crl
    rm -f /etc/openvpn/server/crl.pem
    cp /etc/openvpn/server/easy-rsa/pki/crl.pem /etc/openvpn/server/crl.pem
    # CRL is read with each client connection, when OpenVPN is dropped to nobody
    chown nobody:nogroup /etc/openvpn/server/crl.pem

    echo "Certificate unrevoked successfully."
    exit 0;

elif [[ $columns_number -eq 5 ]] && [[ $fileline == V* ]]; then

    echo "Certificate is already unrevoked and active"
    exit 0;

else

    echo "Error; Key index file may be corrupted."
    exit 1;

fi

要运行该脚本,您需要为其提供已撤销的 vpn 证书的名称。这将与命令行上 /etc/openvpn/server/easy-rsa/pki/ 目录中的 index.txt 文件中显示的名称相同。因此,将其复制并粘贴到文件中,例如 unrevoke.sh,然后运行:

chmod 777 unrevoke.sh
./unrevoke.sh <Openvpn-Cert-name>

现在,我理解了为什么不应该取消撤销证书的理由。但这是紧急情况。

我来解释一下情况:

我是一家初创公司的开发人员。我既不是网络管理员也不是系统管理员,所以我不是最适合咨询的人,但是也没有其他人可以咨询,所以责任就落在了我身上。

本质上,我们需要将一个远程且无人看管的设备从一个 VPN 移动到另一个 VPN。尽管我们对新 VPN 进行了所有测试,但我们(我指的是“我”)忽略了一个事实,即系统默认会尝试通过 VPN 发送所有内容。包括通过 4G 连接传输数十 GB 的数据。

当然,切换后系统完全没有响应,我们无法通过 vpn 连接(也无法通过 teamviewer)登录。在尝试找出原因后,我得出的结论是,这是因为它试图通过互联网将数据传输回自身,这可能会花费我们数千美元。

为了缓解这种情况,同时我思考如何解决这个问题,我撤销了 vpn 证书,所以至少它尝试使用的带宽仅限于连接尝试,而不是巨大的数据流。

我用来撤销 VPN 证书的命令是:

openvpn-install.sh

它随 openvpn 安装一起提供,并提供了一种撤销给定证书的方法。

半夜时,我发现有一种方法可以从 openvpn 服务器配置推送更具体的路由信息​​,以阻止其传输所有内容。所以我这样做了,并取消了已撤销的 openvpn 证书。

果然,大约 20-30 分钟后,远程设备就检测到了 VPN 变化并开始平静下来,这样我就可以登录并将 VPN 恢复到旧设置,然后我们尝试切换并恢复系统。

我不会因此丢掉工作。但其他公司的其他人可能会。无论如何,我只是想和你分享我的经验和见解,说明为什么你可能想要取消撤销 VPN 证书。

答案3

希望找到一种方法来激活/停用 openvpn 用户,而无需为他们提供另一个 *.ovpn 配置文件,这让我找到了这个页面。

我尝试了 Owl 的答案,第一轮撤销/取消撤销没有问题。但是如果你想第二次撤销用户,easy-rsa 会抛出错误,因为它找不到有效的 *.crt、*.key 和 *.pem 文件来删除并移动到 /etc/openvpn/easy-rsa/pki/revoked 目录。

因此,解决方案是在 Owl 的答案中添加 3 行,以将文件复制回其原始目录。它们是:

cp /etc/openvpn/easy-rsa/pki/revoked/certs_by_serial/$column4.crt /etc/openvpn/easy-rsa/pki/issued/$1.crt
mv /etc/openvpn/easy-rsa/pki/revoked/certs_by_serial/$column4.crt /etc/openvpn/easy-rsa/pki/certs_by_serial/$column4.pem
mv /etc/openvpn/easy-rsa/pki/revoked/private_by_serial/$column4.key /etc/openvpn/easy-rsa/pki/private/$1.key

取消撤销脚本将变为:

#!/bin/bash
set -e

keys_index_file="/etc/openvpn/server/easy-rsa/pki/index.txt"
linenumber="$(grep -n "/CN=$1"'$' $keys_index_file | cut -f1 -d: | head -1)"
fileline="$(grep -n "/CN=$1"'$' $keys_index_file | head -1)"
line="$(grep "/CN=$1"'$' $keys_index_file | head -1)"

columns_number="$(echo $line | awk -F' ' '{print NF;}')"
echo $columns_number

if [[ $columns_number -eq 6 ]] && [[ $line == R* ]]; then

    column2="$(echo $fileline | awk '{print $2}')"
    column4="$(echo $fileline | awk '{print $4}')"
    column5="$(echo $fileline | awk '{print $5}')"
    column6="$(echo $fileline | awk '{print $6}')"
    echo -e "V\t$column2\t\t$column4\t$column5\t$column6" >> $keys_index_file
    sed -i "${linenumber}d" $keys_index_file

    cd /etc/openvpn/server/easy-rsa
    EASYRSA_CRL_DAYS=3650 ./easyrsa gen-crl
    rm -f /etc/openvpn/server/crl.pem
    cp /etc/openvpn/server/easy-rsa/pki/crl.pem /etc/openvpn/server/crl.pem
    # CRL is read with each client connection, when OpenVPN is dropped to nobody
    chown nobody:nogroup /etc/openvpn/server/crl.pem
    cp /etc/openvpn/easy-rsa/pki/revoked/certs_by_serial/$column4.crt /etc/openvpn/easy-rsa/pki/issued/$1.crt
    mv /etc/openvpn/easy-rsa/pki/revoked/certs_by_serial/$column4.crt /etc/openvpn/easy-rsa/pki/certs_by_serial/$column4.pem
    mv /etc/openvpn/easy-rsa/pki/revoked/private_by_serial/$column4.key /etc/openvpn/easy-rsa/pki/private/$1.key
    echo "Certificate unrevoked successfully."
    exit 0;

elif [[ $columns_number -eq 5 ]] && [[ $fileline == V* ]]; then

    echo "Certificate is already unrevoked and active"
    exit 0;

else

    echo "Error; Key index file may be corrupted."
    exit 1;

fi

答案4

忽略 iptables 选项(我认为它在技术上更胜一筹),您可以通过修改撤销文件并重新加载 openvpn 来撤销和恢复私钥。(如果您使用的是 easyRSA,则可以编辑 easyRSA/index.txt。找到相应的行并将“R”标志更改为“V”标志,删除第三列。)然后

  source ./vars
  openssl ca -gencrl -out "crl.pem" -config "$KEY_CONFIG"

您可以重新加载打开的服务器以使新配置生效。这将踢出所有客户端,但它们应该会自动重新连接并协商新会话。

http://sq4ind.eu/openvpn-revoke-unrevoke-certificates/此解决方案所基于的参考文章。

相关内容