OpenVPN 伺服器停用並重新啟用用戶端

OpenVPN 伺服器停用並重新啟用用戶端

我在 Ubuntu 14.04 伺服器機器上執行 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腳本還會打開一個遠端登入連線與 openVPN 並踢出要撤銷的客戶端。

答案2

截至 5 年前,Panos 的答案是正確的。所以它值得豎起大拇指。然而從那時起,發生的事情是 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 設定文件,我找到了這個頁面。

我嘗試了貓頭鷹的答案,第一輪撤銷/取消撤銷沒問題。但如果你想第二次撤銷用戶,easy-rsa 會拋出錯誤,因為它找不到有效的*.crt、*.key 和*.pem 檔案來刪除並移動到/etc/openvpn/easy-rsa /pki /撤銷目錄。

所以解決方案是在 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/該解決方案所基於的參考文章。

相關內容