我想为我的客户添加一些防火墙规则,并为员工添加其他规则。
据我所知,我可以使用不同的子网结合来做到这一点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-connect
和client-disconnect
钩子,它们可以动态安装和删除防火墙规则。在 Linux 中,最好的方法是预先定义一些 IP 集并安装使用这些集的规则,然后让 OpenVPN 脚本在连接或断开连接事件时将客户端 IP 地址添加到适当的集合中或从中删除。
答案2
您的脚本为所有颁发的证书分配相同的 CN(“interne”)。如果您传递的是 switch--req-cn="$user"
而不是--req-cn=interne
,则可以区分用户,这样您就可以根据用户名创建客户端配置。