Openvpn

OpenVPN 伺服器員工和客戶配置在同一個實例和伺服器上?

  • February 5, 2021

我想為我的客戶和員工添加一些防火牆規則。

根據我的理解,我可以使用不同的子網與client-config-dir ccd 另外根據我的理解 client-config-dir 是基於 CN 的。當我測試時,我發現我只能擁有一個 CN 證書。而且我不希望我的員工和客戶使用相同的證書,所以從我的 POV 來看,這個解決方案似乎是錯誤的。

我知道如何設置防火牆規則。我不知道如何配置 openvpn 以便使用兩個不同的“配置文件”使用單獨的證書分配不同的 IP plage 或子網。

用於客戶端創作的腳本:

if [[ "$EUID" -ne 0 ]]; then
       echo "This config needs to be run with superuser privileges."
       exit
fi
new_client () {
       # Generates the custom client.ovpn
       {
       cat /etc/openvpn/server/client-common.txt
       echo "<ca>"
       cat /etc/openvpn/server/easy-rsa/pki/ca.crt
       echo "</ca>"
       echo "<cert>"
       sed -ne '/BEGIN CERTIFICATE/,$ p' /etc/openvpn/server/easy-rsa/pki/issued/"$client".crt
       echo "</cert>"
       echo "<key>"
       cat /etc/openvpn/server/easy-rsa/pki/private/"$client".key
       echo "</key>"
       echo "<tls-crypt>"
       sed -ne '/BEGIN OpenVPN Static key/,$ p' /etc/openvpn/server/tc.key
       echo "</tls-crypt>"
       } > /openvpn-clients-files/"$client".ovpn
}
while getopts u: flag
do
       case "${flag}" in
               u) unsanitized_client=${OPTARG};;
       esac
done
if [ -z "$unsanitized_client" ]; then
       echo "-u option followed by the username is required."
       exit
fi

echo "Username: $unsanitized_client";
client=$(sed 's/[^0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-]/_/g' <<< "$unsanitized_client")
if [[ -z "$client" || -e /etc/openvpn/server/easy-rsa/pki/issued/"$client".crt ]]; then
       echo "$client: invalid name."
       exit
fi
cd /etc/openvpn/server/easy-rsa/
EASYRSA_CERT_EXPIRE=3650 ./easyrsa build-client-full "$client" --req-cn=interne  nopass
#EASYRSA_CERT_EXPIRE=3650 ./easyrsa build-client-full "interne"  nopass
# Generates the custom client.ovpn
new_client
echo
echo "$client added. Configuration available in: /openvpn-clients-files/$client.ovpn"

為每個人使用相同的 CN 會削弱 OpenVPN 的優勢。它通常旨在與每個連接的唯一客戶端證書/密鑰一起使用。我不明白為什麼他們仍然支持這種“單一證書”模式,因為生成證書既便宜又容易,這樣你就可以獲得更好的安全性和控制。我從不使用 this duplicate-cn,所以在這種情況下我不知道如何區分它們。如果您準備重新考慮使用 OpenVPN 的方法,請進一步閱讀。

至於最初的問題,可能至少有兩種解決方案。

CCD目錄由證書CN索引。push "ifconfig <local-ip> <remote-ip>"您可以通過在其 CCD 文件中添加一個子句來為每個客戶端設置一個“靜態”IP 地址。這樣您就可以提前知道誰獲得了哪個 VPN IP 地址,從而可以提前建立防火牆規則。將所有類似用途的地址收集到一些“池”中是明智的,這些“池”在子網邊界處拆分,因此您將擁有更少的防火牆規則。例如,如果您192.168.128.0/24為 VPN 使用塊,您通常會為伺服器使用塊,因此為您的員工和其餘的客戶192.168.128.0/30專用塊。這樣您就可以為 31 名員工和 32 名客戶定義唯一地址,然後添加兩個防火牆規則來阻止所有員工的居住地和192.168.128.4÷124/30``192.168.128.128÷252/30``192.168.128.0/25``192.168.128.128/25所有客戶居住的地方。請注意我在這裡假設net30拓撲模式,很容易為其他拓撲調整這種方法。

另一種可能更靈活的方法是使用 OpenVPN 腳本功能。它可以在某些事件上執行使用者定義的腳本。它將有關連接的一些資訊傳遞給被呼叫的腳本。這當然包括證書的 CN 和其他 DN 欄位,可以在腳本中用於區分客戶端。閱讀man openvpn更多。您可以使用client-connectclient-disconnect掛鉤,它可以動態安裝和刪除防火牆規則。在 Linux 中,最好的方法是預先定義一些 IP 集並安裝使用這些集的規則,然後讓 OpenVPN 腳本在連接或斷開連接事件時添加和刪除客戶端 IP 地址到適當的集。

引用自:https://serverfault.com/questions/1052518