OpenVPN 伺服器員工和客戶配置在同一個實例和伺服器上?
我想為我的客戶和員工添加一些防火牆規則。
根據我的理解,我可以使用不同的子網與
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-connect
和client-disconnect
掛鉤,它可以動態安裝和刪除防火牆規則。在 Linux 中,最好的方法是預先定義一些 IP 集並安裝使用這些集的規則,然後讓 OpenVPN 腳本在連接或斷開連接事件時添加和刪除客戶端 IP 地址到適當的集。