本教程将向您展示如何像专业人士一样使用 OpenConnect VPN (ocserv)。你将学习:
禁用不安全的 TLS 协议
每用户/每组配置
分配静态私有IP地址
分割隧道
启用 IPv6
虚拟主机
如何运行 ocserv 的多个实例
要求
为了学习本教程,假设您已经使用 Let’s Encrypt TLS 服务器证书设置了 OpenConnect VPN 服务器。如果没有,请按照以下教程之一进行操作。
使用 Let’s Encrypt 在 Ubuntu 20.04 上设置 OpenConnect VPN 服务器 (ocserv)
使用 Let’s Encrypt 在 Debian 11 Bullseye 上设置 OpenConnect VPN 服务器 (ocserv)
使用 Let’s Encrypt 在 CentOS 8/RHEL 8 上设置 OpenConnect VPN 服务器 (ocserv)
如何在 ocserv 中禁用 TLS 1.0 和 TLS 1.1
PCI 委员会于 2018 年 6 月 30 日弃用了 TLS 1.0,主流 Web 浏览器将在 2020 年禁用 TLS 1.0 和 TLS 1.1。我们也应该对 VPN 服务器做同样的事情。编辑主配置文件。
sudo nano /etc/ocserv/ocserv.conf
找到以下行:
tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-RSA:-VERS-SSL3.0:-ARCFOUR-128"
要在 OpenConnect VPN 服务器中禁用 TLS 1.0 和 TLS 1.1,只需在该行中添加 -VERS-TLS1.0
和 -VERS-TLS1.1
即可。
tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-RSA:-VERS-SSL3.0:-ARCFOUR-128:-VERS-TLS1.0:-VERS-TLS1.1"
保存并关闭文件。然后重新启动 ocserv。
sudo systemctl restart ocserv
现在 ocserv 将仅接受 TLS 1.3 和 TLS 1.2。有关在 ocserv 中配置 TLS 参数的更多信息,请参阅 GnuTLS 优先级字符串。
要检查 OpenConnect VPN 服务器是否支持 TLS 1.0,请运行以下命令。
openssl s_client -connect vpn.your-domain.com:443 -tls1
并检查 TLS 1.1
openssl s_client -connect vpn.your-domain.com:443 -tls1_1
如果您在输出中看到以下消息,则表示不支持 TLS 版本。
New, (NONE), Cipher is (NONE) Secure Renegotiation IS NOT supported
每用户或每组配置
Ocserv 允许按用户和按组进行配置。要启用此功能,请取消注释 /etc/ocserv/ocserv.conf
文件中的以下两行。
config-per-user = /etc/ocserv/config-per-user/config-per-group = /etc/ocserv/config-per-group/
保存并关闭文件。然后创建每个用户和每个组的配置目录。
sudo mkdir /etc/ocserv/config-per-user/sudo mkdir /etc/ocserv/config-per-group/
接下来,您可以在这两个目录下创建一个文件。例如,创建 user1
文件以允许对 user1
进行自定义配置。
sudo nano /etc/ocserv/config-per-user/user1
您还可以创建 group1
文件以允许对名为 group1
的组进行自定义配置。
sudo nano /etc/ocserv/config-per-group/group1
您可以在文件中添加如下内容以启用分割隧道。
route = 10.10.10.0/255.255.255.0tunnel-all-dns = falsedns = 8.8.8.8dns = 1.1.1.1
在哪里 :
第一行表示
user1
或group1
中的用户连接到此VPN服务器后,仅流向10.10.10.0/24
网络的流量通过 VPN 服务器路由。到其他 IP 地址的流量将通过原始网关路由。第二行禁用隧道 DNS 查询。
第三行和第四行设置VPN客户端的DNS服务器。
我使用这个技巧允许我的另一个 VPS(虚拟专用服务器)连接到该 VPN 服务器,而不会中断正常流量,因此我的 VPN 服务器的 TUN 设备(vpns0)始终打开,这意味着我的 VPN 服务器将始终具有私有IP地址10.10.10.1。
保存并关闭文件。重新启动 ocserv 以使更改生效。
sudo systemctl restart ocserv
请注意,如果您在 ocserv 中启用 IPv6,则还需要添加 IPv6 网络范围才能使用分割隧道。
route = 10.10.10.0/255.255.255.0route = fda9:4efe:7e3b:03ea::/48tunnel-all-dns = falsedns = 8.8.8.8dns = 1.1.1.1
如果您想从默认路由中排除某个 IP 地址,请使用 no-route
。
no-route = 12.34.56.78/32
这意味着除 IP 12.34.56.78 的流量外,所有其他流量都将通过 VPN 隧道。路由和无路由参数接受网络掩码表示法 (10.10.10.0/255.255.255.0) 和 CIDR 表示法 (12.34.56.78/32)
如果启用分割隧道后看到以下错误,可能是因为您没有使用网络掩码或 CIDR 表示法。
could not parse proxy protocol header; discarding connection
如何为用户分配静态 IP 地址
ocserv 不支持为每个用户分配静态私有 IP 地址。不过,我将向您展示一个为特定用户分配静态私有 IP 地址的技巧。
首先,您需要启用每用户配置,如上一节所示。然后在每个用户的配置文件中添加以下两行。
ipv4-network = 10.10.10.0ipv4-netmask = 255.255.255.252
这会将网络掩码设置为 255.255.255.252
,而不是默认的 255.255.255.0
,因此只有 4 个可用的 IP 地址。
10.10.10.0
10.10.10.1
10.10.10.2
10.10.10.3
实际上,只有一个 IP 地址可以分配给该 VPN 用户(10.10.10.2)。
10.10.10.0 是网络地址
VPN 服务器始终使用 10.10.10.1。
10.10.10.3 是广播地址。
所以VPN用户只能使用10.10.10.2地址。
按国家/地区分割隧道
假设您只希望通过 VPN 隧道传输到国外的流量。前往您所在国家/地区的交通应使用正常路线。您可以在 ocserv 配置文件中使用 no-route
指令来实现此目的。
首先,您需要访问此网页下载您所在国家/地区的 IP 范围:https://www.ip2location.com/free/visitor-blocker,该网页允许您下载 CIDR 格式的 IP 地址范围。
将 IP 范围保存在文本文件 ip2location.txt
中,然后在 Linux 终端中运行以下命令,将 no-route =
指令添加到每行的开头。
sed 's/^/no-route = /' -i ip2localtion.txt
现在在文本编辑器中打开该文件并复制其中的所有行。我们需要在 ocserv 配置文件中添加这些行。如果行太多,您可以将这些行添加到每用户配置文件中。
sudo nano /etc/ocserv/config-per-user/user1
您还可以将它们添加到每个组的配置文件中,然后将用户添加到组中。
重新启动 ocserv 以使更改生效。
sudo systemctl restart ocserv
如何在 OpenConnect VPN 中启用 IPv6
如果您的 VPN 服务器有公共 IPv6 地址,您可以在 OpenConnect VPN 中启用 IPv6。编辑 ocserv 配置文件。
sudo nano /etc/ocserv/ocserv.conf
找到以下两行并取消注释。
ipv6-network = fda9:4efe:7e3b:03ea::/48ipv6-subnet-prefix = 64
保存并关闭文件。重新启动 ocserv 以使更改生效。
sudo systemctl restart ocserv
然后我们需要启用 IPv6 的 IP 转发。编辑 sysctl.conf 文件。
sudo nano /etc/sysctl.conf
在此文件末尾添加以下行。
net.ipv6.conf.all.forwarding=1
保存并关闭文件。然后使用以下命令应用更改。
sudo sysctl -p
接下来,我们需要在服务器防火墙中设置IPv6伪装,使服务器成为VPN客户端的虚拟路由器。
sudo nano /etc/ufw/before6.rules
默认情况下,filter
表有一些规则。在此文件末尾添加以下行。将 ens3 替换为您自己的网络接口名称。
# NAT table rules*nat :POSTROUTING ACCEPT [0:0]-A POSTROUTING -o ens3 -j MASQUERADE # End each table with the 'COMMIT' line or these rules won't be processed COMMIT
在 Nano 文本编辑器中,您可以通过按 Ctrl+W
,然后按 Ctrl+V
转到文件末尾。
缺省情况下,UFW 禁止报文转发。我们可以允许转发我们的私有 IPv6 网络。在此文件中找到 ufw6-before-forward 链,添加以下 3 行,如果源 IP 或目标 IP 位于 fda9:4efe:7e3b:03ea 中,则将接受数据包转发::/48
范围。
保存并关闭文件。重新启动 UFW 以使更改生效。
sudo systemctl restart ufw
现在,如果您使用以下命令列出 NAT 表的 POSTROUTING 链中的规则:
sudo ip6tables -t nat -L POSTROUTING
你可以看到假面舞会规则。
断开当前的 VPN 连接,为 vpn.example.com
添加 AAAA 记录并重新建立 VPN 连接。然后转到 https://test-ipv6.com/ 检查您的 IPv6 连接。
如果您在 VPN 服务器上运行自己的 BIND DNS 解析器,则可以在 /etc/ocserv/ocserv.conf
文件中添加以下行,将 VPN 服务器设置为 VPN 客户端的 DNS 解析器。
dns = fda9:4efe:7e3b::1
保存并关闭文件。要查询 IPv6 中的 DNS 名称,我们需要配置 BIND 以允许 IPv6 VPN 客户端。
sudo nano /etc/bind/named.conf.options
找到allow-recursion参数并将其更改为:
allow-recursion { 127.0.0.1; 10.10.10.0/24; fda9:4efe:7e3b:03ea::/48; };
保存并关闭文件。重新启动 BIND9。
sudo systemctl restart named
我们还需要在防火墙中允许 IPv6 VPN 客户端。
sudo ufw allow in from fda9:4efe:7e3b:03ea::/48
虚拟主机
注意:如果您只是想能够为 VPN 服务器使用多个主机名,您可以使用 certbot 来获取多域证书。然后重新启动 ocserv 就完成了。
要在ocserv中添加新的虚拟主机,首先需要使用步骤3中的方法为新的虚拟主机获取TLS证书。然后编辑ocserv配置文件。
sudo nano /etc/ocserv/ocserv.conf
转到此文件的底部。在 Nano 文本编辑器中,您可以按 Ctrl+W
,然后按 Ctrl+V
跳转到文件底部。添加以下行。将 vpn2.example.com
替换为第二个虚拟主机的主机名。
[vhost:vpn2.example.com]#Allow password authentication and certificate authenticationenable-auth = "plain[passwd=/etc/ocserv/ocpasswd]"auth = "certificate"tcp-port = 443#uncomment the two lines if ocserv runs behind HAProxy.#listen-host = 127.0.0.1#listen-proxy-proto = true# SSL/TLS configurationca-cert = /etc/ocserv/ssl/ca-cert.pemserver-cert = /etc/letsencrypt/live/vpn2.example.com/fullchain.pemserver-key = /etc/letsencrypt/live/vpn2.example.com/privkey.pemcert-user-oid = 0.9.2342.19200300.100.1.1#Networking configuration. Use a different network range for this virtual host. device = vpnsipv4-network = 10.10.20.0ipv4-netmask = 255.255.255.0route = defaultdns = 8.8.8.8tunnel-all-dns = truecompression = truemax-clients = 0max-same-clients = 0try-mtu-discovery = trueidle-timeout=1200mobile-idle-timeout=2400config-per-user = /etc/ocserv/config-per-user/config-per-group = /etc/ocserv/config-per-group/
保存并关闭文件。然后重新启动 ocserv。
sudo systemctl restart ocserv
编辑 UFW 配置文件。
sudo nano /etc/ufw/before.rules
在此文件中找到 ufw-before-forward 链并添加以下 2 行,如果源 IP 或目标 IP 在 10.10.20.0/24范围。
-A ufw-before-forward -s 10.10.20.0/24 -j ACCEPT -A ufw-before-forward -d 10.10.20.0/24 -j ACCEPT
保存并关闭文件。然后重新启动UFW。
sudo systemctl restart ufw
请注意,ocserv 守护程序可能会告诉您虚拟主机将忽略某些参数。然而,我发现一些被忽略的参数实际上是需要的。例如,如果从虚拟主机中删除
device=vpns
行,则在与虚拟主机建立 VPN 连接时可能会遇到以下错误。
VPN service unavailable; reason: Server configuration error
VPN 服务器会在日志中生成以下错误消息。
no networks are configured; rejecting client
另请注意,iOS 上的 AnyConnect VPN 客户端不支持 TLS SNI,因此 iOS 用户将连接到默认虚拟主机。
如何运行 ocserv 的多个实例
一个 ocserv 进程只能绑定到服务器上的一个 TCP 或 UDP 端口。如果您想允许 ocserv 绑定到多个 TCP 或 UDP 端口,那么您需要运行多个 ocserv 进程。这很简单。将
/lib/systemd/system/ocserv.service
复制到新文件。
sudo cp /lib/systemd/system/ocserv.service /etc/systemd/system/ocserv2.service
然后编辑新文件。
sudo nano /etc/systemd/system/ocserv2.service
改变
/etc/ocserv/ocserv.conf
到
/etc/ocserv/ocserv2.conf
保存并关闭文件。接下来,您可以编辑
/etc/ocserv/ocserv2.conf
文件并添加自定义配置。完成后,启动第二个 ocserv 服务。
sudo systemctl start ocserv2
推荐本站淘宝优惠价购买喜欢的宝贝:
以下内容需要兑换:本文链接:https://www.hqyman.cn/post/8623.html 非本站原创文章欢迎转载,原创文章需保留本站地址!
休息一下~~