OpenVPN 服务器员工和客户是否在同一个实例和服务器上配置?

OpenVPN 服务器员工和客户是否在同一个实例和服务器上配置?

我想为我的客户添加一些防火墙规则,并为员工添加其他规则。

据我所知,我可以使用不同的子网结合来做到这一点client-config-dir ccd 。此外,据我所知,客户端配置目录基于 CN。当我测试时,我发现我只能通过 CN 获得一个证书。我不希望我的员工或客户使用相同的证书,所以从我的角度来看,这个解决方案似乎是错误的。

我知道如何设置防火墙规则。但我不知道如何配置 openvpn,以便使用两个不同的“配置文件”通过单独的证书分配不同的 IP 地址或子网。

用于客户创作的脚本:

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"

答案1

对每个人都使用相同的 CN 会削弱 OpenVPN 的优势。它通常旨在与每个连接的唯一客户端证书/密钥一起使用。我不明白为什么他们仍然支持这种“单一证书”模式,因为生成证书既便宜又容易,而且这样你可以获得更好的安全性和控制力。我从来没有用过这个duplicate-cn,所以我不知道在这种情况下如何区分它们。如果你准备重新考虑你的 OpenVPN 方法,请继续阅读。

就原始问题而言,至少可能有两种解决方案。

CCD 目录由证书 CN 索引。您可以通过在其 CCD 文件中添加子句来为每个客户端设置一个“静态”IP 地址push "ifconfig <local-ip> <remote-ip>"。这样,您将提前知道谁获得哪个 VPN IP 地址,因此您可以提前构建防火墙规则。将所有类似用途的地址收集到一些在子网边界处分割的“池”中是明智的,这样您的防火墙规则就会少得多。例如,如果您192.168.128.0/24对 VPN 使用块,则通常会对192.168.128.0/30服务器使用块,因此请192.168.128.4÷124/30为您的员工分配块,其余的块则192.168.128.128÷252/30用于客户。这样,您将能够为 31 名员工和 32 名客户定义唯一的地址,然后为192.168.128.0/25所有员工居住的块和192.168.128.128/25所有客户居住的块添加两个防火墙规则。请注意,我net30在这里假设拓扑模式,很容易将这种方法调整为其他拓扑。

另一种方法可能更灵活,即使用 OpenVPN 脚本功能。它可以在某些事件上运行用户定义的脚本。它将有关连接的一些信息传递给被调用的脚本。这当然包括证书的 CN 和其他 DN 字段,它们可用于脚本中以区分客户端。阅读man openvpn更多内容。您可以使用client-connectclient-disconnect钩子,它们可以动态安装和删除防火墙规则。在 Linux 中,最好的方法是预先定义一些 IP 集并安装使用这些集的规则,然后让 OpenVPN 脚本在连接或断开连接事件时将客户端 IP 地址添加到适当的集合中或从中删除。

答案2

您的脚本为所有颁发的证书分配相同的 CN(“interne”)。如果您传递的是 switch--req-cn="$user"而不是--req-cn=interne,则可以区分用户,这样您就可以根据用户名创建客户端配置。

相关内容