28
2024
11
10:05:16

Ocserv Advanced(分割隧道、IPv6、静态 IP、每用户配置、虚拟主机)


本教程将向您展示如何像专业人士一样使用 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

在哪里 :

  • 第一行表示user1group1中的用户连接到此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




推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

以下内容需要兑换:

本文链接:https://www.hqyman.cn/post/8623.html 非本站原创文章欢迎转载,原创文章需保留本站地址!

分享到:
打赏





休息一下~~


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

请先 登录 再评论,若不是会员请先 注册

您的IP地址是: