使用Let's Encrypt在Ubuntu 18.04/16.04上设置OpenConnect VPN服务器(ocserv)

  • 技术文档
  • 2022.03.23
  • 浏览:659

本教程将向您展示如何在Ubuntu 16.04/18.04上安装OpenConnect VPN服务器。OpenConnect VPN服务器,又名ocserv,是Cisco AnyConnnect VPN协议的开源实现,该协议在企业和大学中很受欢迎。AnyConnect是一种基于SSL的VPN协议,允许单个用户连接到远程网络。

OpenConnect VPN服务器的功能:

  • 轻便快速。在我的测试中,我可以用OpenConnect VPN观看4k的YouTube。YouTube在我的国家被屏蔽了。
  • 与Cisco AnyConnect客户端兼容
  • 支持密码身份验证和证书身份验证
  • 易于设置

我特别喜欢这样一个事实:与其他VPN技术相比,最终用户使用OpenConnect VPN非常简单方便。每当我在我的计算机上安装基于Debian的Linux发行版,并想快速解锁网站或隐藏我的IP地址时,我都会安装OpenConnect客户端,并通过两行命令连接到服务器:

sudo apt install openconnect  sudo openconnect -b vpn.mydomain.com

gnutls bin软件包提供了创建您自己的CA和服务器证书的工具,但我们将获取并安装Let's Encrypt certificate。使用Let’s Encrypt证书的优点是,它是免费的,更容易设置,并且受VPN客户端软件的信任。

要求

要学习本教程,您需要一个VPS(虚拟专用服务器),可以自由访问被屏蔽的网站(在您的国家或互联网过滤系统之外)。我推荐Kamatera VPS,其特点是:

  • 30天免费试用。
  • 起价为每月4美元(1GB内存)
  • 基于KVM的高性能VPS
  • 世界各地的9个数据中心,包括美国、加拿大、英国、德国、荷兰、香港和ISRALL。

按照下面链接的教程在Kamatera创建Linux VPS服务器。

  • 如何在Kamatera上创建Linux VPS服务器

一旦你有了运行Ubuntu18.04的VPS,请按照下面的说明操作。

您还需要一个域名来为OpenConnect VPN启用HTTPS。我从namescape注册了我的域名,因为价格低廉,而且他们终身免费保护whois的隐私。

第一步:在Ubuntu 16.04/18.04上安装OpenConnect VPN服务器

登录你的Ubuntu 16.04/18.04服务器。然后使用apt安装ocserv软件包,该软件包自16.04以来就包含在Ubuntu存储库中。

sudo apt install ocserv

一旦安装,OpenConnect VPN服务器将自动启动。您可以通过以下方式检查其状态:

systemctl status ocserv

样本输出:

 ocserv.service - OpenConnect SSL VPN server    Loaded: loaded (/lib/systemd/system/ocserv.service; enabled; vendor preset: enabled    Active: active (running) since Thu 2017-11-30 05:45:07 UTC; 11s ago      Docs: man:ocserv(8)  Main PID: 19235 (ocserv-main)    CGroup: /system.slice/ocserv.service            ├─19235 ocserv-main                                                              └─19242 ocserv-secm  

如果它没有运行,则可以从以下内容开始:

sudo systemctl start ocserv

默认情况下,OpenConnect VPN服务器监听TCP和UDP端口443。如果web服务器正在使用它,则VPN服务器无法启动。稍后我们将在OpenConnect VPN配置文件中看到如何更改端口。

第2步:在Ubuntu 16.04/18.04服务器上安装Let's Encrypt Client(Certbot)

运行以下命令从官方PPA安装最新版本的certbot。如果要从PPA安装软件包,则需要使用通用软件属性。你的Ubuntu服务器上可能没有。

sudo apt install software-properties-common  sudo add-apt-repository ppa:certbot/certbot  sudo apt update  sudo apt install certbot

要检查版本号,请运行

certbot --version

样本输出:

certbot 0.31.0

步骤3:从Let's Encrypt获取TLS证书

独立插件

如果您的Ubuntu 16.04/18.04服务器上没有运行web服务器,并且您希望OpenConnect VPN服务器使用端口443,那么您可以使用独立插件从Let's Encrypt获取TLS证书。运行以下命令。别忘了为你的域名设置一个记录。

sudo certbot certonly --standalone --preferred-challenges http --agree-tos --email your-email-address -d vpn.example.com

说明:

  • certonly:获取证书,但不要安装它。
  • --standalone:使用standalone插件获取证书
  • --首选挑战http:执行http-01挑战以验证我们的域,该域将使用端口80。默认情况下,独立插件将使用端口443执行tls sni挑战。由于端口443已经被OpenConnect VPN服务器使用,我们需要更改默认行为。
  • --同意:同意让我们加密服务条款。
  • --电子邮件:电子邮件地址用于帐户注册和恢复。
  • -d:指定你的域名。

从下面的截图可以看到,我成功地获得了证书。

install openconnect ubuntu server

使用webroot插件

如果你的Ubuntu 16.04/18.04服务器有一个web服务器在监听端口80和443,你想让OpenConnect VPN服务器使用另一个端口,那么最好使用webroot插件来获取证书,因为webroot插件几乎适用于所有web服务器,我们不需要在web服务器中安装证书。

首先,您需要为vpn创建一个虚拟主机。实例通用域名格式。

阿帕奇

如果您使用的是Apache,那么

sudo nano /etc/apache2/sites-available/vpn.example.com.conf

并将以下行粘贴到文件中。

<VirtualHost *:80>                 ServerName vpn.example.com          DocumentRoot /var/www/vpn.example.com </VirtualHost> 

保存并关闭文件。然后创建web根目录。

sudo mkdir /var/www/vpn.example.com

将www数据(Apache用户)设置为web根目录的所有者。

sudo chown www-data:www-data /var/www/vpn.example.com -R

启用此虚拟主机。

sudo a2ensite vpn.example.com

重新加载Apache以使更改生效。

sudo systemctl reload apache2

创建并启用虚拟主机后,运行以下命令以获取使用webroot插件加密证书。

sudo certbot certonly --webroot --agree-tos --email your-email-address -d vpn.example.com -w /var/www/vpn.example.com

Nginx

如果您使用的是Nginx,那么

sudo nano /etc/nginx/conf.d/vpn.example.com.conf

将以下行粘贴到文件中。

server {       listen 80;       server_name vpn.example.com;        root /var/www/vpn.example.com/;        location ~ /.well-known/acme-challenge {          allow all;       } }

保存并关闭文件。然后创建web根目录。

sudo mkdir -p /var/www/vpn.example.com

将www数据(Nginx用户)设置为web根目录的所有者。

sudo chown www-data:www-data /var/www/vpn.example.com -R

重新加载Nginx以使更改生效。

sudo systemctl reload nginx

创建并启用虚拟主机后,运行以下命令以获取使用webroot插件加密证书。

sudo certbot certonly --webroot --agree-tos --email your-email-address -d vpn.example.com -w /var/www/vpn.example.com

第4步:编辑OpenConnect VPN服务器配置文件

编辑ocserv配置文件。

sudo nano /etc/ocserv/ocserv.conf

首先,配置密码身份验证。默认情况下,通过PAM(可插拔认证模块)进行密码认证是启用的,这允许您使用Ubuntu系统帐户从VPN客户端登录。可以通过注释掉以下行来禁用此行为。

auth = "pam[gid-min=1000]"

如果我们希望用户使用单独的VPN帐户而不是系统帐户登录,我们需要添加以下行以启用密码文件的密码身份验证。

auth = "plain[passwd=/etc/ocserv/ocpasswd]"

编辑完这个配置文件后,我们将看到如何使用ocpasswd工具生成/etc/ocserv/ocpasswd文件,其中包含用户名和编码密码的列表。

注意:Ocserv支持客户端证书身份验证,但我们来加密它不会颁发客户端证书。您需要设置自己的CA来颁发客户端证书。

接下来,如果您不希望ocserv使用TCP和UDP端口443,请找到以下两行并更改端口号。否则就别管他们。

tcp-port = 443 udp-port = 443

然后找出下面两行。我们需要改变它们。

server-cert = /etc/ssl/certs/ssl-cert-snakeoil.pem server-key = /etc/ssl/private/ssl-cert-snakeoil.key

将默认设置替换为让我们加密服务器证书和服务器密钥文件的路径。

server-cert = /etc/letsencrypt/live/vpn.example.com/fullchain.pem server-key = /etc/letsencrypt/live/vpn.example.com/privkey.pem

然后,设置客户端的最大数量。默认值为16。设置为零表示无限。

max-clients = 16

设置用户可以同时登录的设备数量。默认值为2。设置为零表示无限。

max-same-clients = 2

接下来,找到下面这行。将false更改为true以启用MTU发现,这可以优化VPN性能。

try-mtu-discovery = false

之后,将默认域设置为vpn。实例通用域名格式。

default-domain = vpn.example.com

默认情况下,IPv4网络配置如下所示。这将导致问题,因为大多数家庭路由器还将IPv4网络范围设置为192.168.1.0/24。

ipv4-network = 192.168.1.0 ipv4-netmask = 255.255.255.0

我们可以使用另一个专用IP地址范围(10.10.10.0/24)来避免IP地址冲突,因此将ipv4网络的值更改为

ipv4-network = 10.10.10.0

现在取消注释下面这行,通过VPN隧道所有DNS查询。

tunnel-all-dns = true

更改DNS解析程序地址。你可以使用谷歌的公共DNS服务器。

dns = 8.8.8.8

注意:在同一台服务器上运行自己的DNS解析程序是一种很好的做法,尤其是如果您是VPN提供商。如果在同一台服务器上运行DNS解析程序,请将DNS指定为

dns = 10.10.10.1

10.10.10.1是VPN LAN中OpenConnect VPN服务器的IP地址。这将稍微加快客户端的DNS查找,因为VPN服务器和DNS解析程序之间的网络延迟已消除。

然后注释掉所有路由参数(在下面四行的开头添加#符号),这将把服务器设置为客户端的默认网关。

route = 10.10.10.0/255.255.255.0 route = 192.168.0.0/255.255.0.0 route = fef4:db8:1000:1001::/64  no-route = 192.168.5.0/255.255.255.0

保存并关闭文件,然后重新启动VPN服务器,以使更改生效。

sudo systemctl restart ocserv

步骤5:修复DTLS握手失败

在Ubuntu16.04和Ubuntu18.04上,ocserv守护程序ocserv。套接字不尊重配置文件中的“侦听主机”值,这将在客户端连接到VPN服务器时导致以下错误。

DTLS handshake failed: Resource temporarily unavailable, try again.

要修复此错误,我们需要编辑ocserv。服务文件。我们首先将/lib/systemd/system/directory中的原始文件复制到/etc/systemd/system/directory,然后对其进行编辑,因为我们不希望新版本的ocserv包覆盖我们的修改。(要了解有关systemd unit文件的更多信息,请运行man systemd.unit。)

sudo cp /lib/systemd/system/ocserv.service /etc/systemd/system/ocserv.service sudo nano /etc/systemd/system/ocserv.service

注释掉下面两行。

Requires=ocserv.socket  Also=ocserv.socket

保存并关闭文件。然后重新加载系统D

sudo systemctl daemon-reload

停止ocserv。套接字并禁用它。

sudo systemctl stop ocserv.socket  sudo systemctl disable ocserv.socket

重新启动ocserv服务。

sudo systemctl restart ocserv.service

如果ocserv systemd服务无法重新启动,它将不会输出任何消息,因此我们需要检查状态以确保它实际运行。

systemctl status ocserv

第6步:创建VPN帐户

现在使用ocpasswd工具生成VPN帐户。

sudo ocpasswd -c /etc/ocserv/ocpasswd username

系统将要求您为用户设置密码,信息将保存到/etc/ocserv/ocpasswd文件中。要重置密码,只需再次运行上述命令。

第7步:启用IP转发

为了让VPN服务器在VPN客户端和外部世界之间路由数据包,我们需要启用IP转发。编辑sysctl。conf文件。

sudo nano /etc/sysctl.conf

在该文件末尾添加以下行。

net.ipv4.ip_forward = 1

保存并关闭文件。然后使用下面的命令应用更改。p选项将从/etc/sysctl加载sysctl设置。conf文件。此命令将在系统重新启动时保留所做的更改。

sudo sysctl -p

第8步:为IP伪装配置防火墙

我们需要在服务器防火墙中设置IP伪装,以便服务器成为VPN客户端的虚拟路由器。我将使用UFW,它是iptables防火墙的前端。在Ubuntu上通过以下方式安装UFW:

sudo apt install ufw

首先,需要允许SSH通信。

sudo ufw allow 22/tcp

接下来,找到服务器主网络接口的名称。

ip addr

正如你所看到的,它在我的Ubuntu服务器上被命名为ens3。

openconnect ubuntu command line

要配置IP伪装,我们必须在UFW配置文件中添加iptables命令。

sudo nano /etc/ufw/before.rules

默认情况下,过滤器表有一些规则。在该文件末尾添加以下行。将ens3替换为您自己的网络接口名称。

# NAT table rules *nat :POSTROUTING ACCEPT [0:0] -A POSTROUTING -s 10.10.10.0/24 -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 masquerade rule ocserv ubuntu

以上几行将在nat表的后路由链的末尾附加(-A)条规则。它将把你的虚拟专用网络与互联网连接起来。同时也会对外界隐藏你的人际网络。所以互联网只能看到VPN服务器的IP,却看不到VPN客户端的IP,就像你的家庭路由器隐藏了你的私人家庭网络一样。

默认情况下,UFW禁止数据包转发。我们可以允许为我们的专用网络转发。在该文件中找到ufw BEFORT forward链,并添加以下3行,如果源IP或目标IP在10.10.10.0/24范围内,这3行将接受数据包转发。

# allow forwarding for trusted network -A ufw-before-forward -s 10.10.10.0/24 -j ACCEPT -A ufw-before-forward -d 10.10.10.0/24 -j ACCEPT

ufw allow packet fowarding

保存并关闭文件。然后启用UFW。

sudo ufw enable

如果以前启用过UFW,那么可以使用systemctl重新启动UFW。

sudo systemctl restart ufw

现在,如果使用以下命令列出NAT表的后路由链中的规则:

sudo iptables -t nat -L POSTROUTING

你可以看到化装规则。

ocserv-IP-Masquerading-ufw-ubuntu

步骤9:打开防火墙中的443端口

运行以下命令打开TCP和UDP端口443。如果您为ocserv配置了不同的端口,则将443更改为您配置的端口。

sudo ufw allow 443/tcp sudo ufw allow 443/udp

现在,OpenConnect VPN服务器已准备好接受客户端连接。

如果指定10.10.10.1作为VPN客户端的DNS服务器,则必须允许VPN客户端使用以下UFW规则连接到端口53。

sudo ufw insert 1 allow in from 10.10.10.0/24

您还需要编辑绑定DNS服务器的配置,以允许VPN客户端发送如下递归DNS查询。

allow-recursion { 127.0.0.1; 10.10.10.0/24; };

如何在Ubuntu 16.04/18.04桌面上安装和使用OpenConnect VPN客户端

运行以下命令在Ubuntu桌面上安装OpenConnect VPN命令行客户端。

sudo apt install openconnect

您可以从下面的命令行连接到VPN-b标志将使其在连接建立后在后台运行。

sudo openconnect -b vpn.example.com:port-number

您将被要求输入VPN用户名和密码。如果成功建立连接,您将看到以下消息。

Got CONNECT response: HTTP/1.1 200 CONNECTED CSTP connected. DPD 90, Keepalive 32400 Connected tun0 as 192.168.1.139, using SSL Established DTLS connection (using GnuTLS). Ciphersuite (DTLS1.2)-(RSA)-(AES-256-GCM).

要停止连接,请运行:

sudo pkill openconnect

要以非交互方式运行客户端,请使用以下语法。

echo -n password | sudo openconnect -b vpn.example.com -u username --passwd-on-stdin

如果要使用Network Manager管理VPN连接,则还需要安装这些软件包。

sudo apt install network-manager-openconnect network-manager-openconnect-gnome

如果您成功连接到VPN服务器,但您的公共IP地址没有更改,这是因为IP转发或IP伪装不起作用。我的iptables命令有一次输入错误,导致我的电脑无法浏览互联网。

系统启动时自动连接

为了让OpenConnect VPN客户端在启动时自动连接到服务器,我们可以创建一个systemd服务单元。

sudo nano /etc/systemd/system/openconnect.service

将以下行放到文件中。替换红色文本。

[Unit]   Description=OpenConnect VPN Client   After=network-online.target systemd-resolved.service   Wants=network-online.target  [Service]   Type=simple   ExecStart=/bin/bash -c '/bin/echo -n password | /usr/sbin/openconnect vpn.example.com -u username --passwd-on-stdin'   ExecStop=/bin/bash -c '/sbin/resolvconf -d tun0 && /usr/bin/pkill -SIGINT openconnect && /sbin/ip route flush 12.34.56.78'   Restart=always   RestartSec=2  [Install]   WantedBy=multi-user.target 

保存并关闭文件。然后启用此服务,使其在引导时启动。

sudo systemctl enable openconnect.service

文件内容说明:

  • After=网络在线。目标系统已解决。服务和需求=网络在线。目标使此服务在网络启动后运行。我们想要openconnect。系统故障排除后,服务将启动。服务,因为这将确保OpenConnect设置的DNS服务器地址不会被systemd覆盖。服务
  • 实际上,这项服务仍然可以在网络开通之前运行。如果服务失败,我们添加Restart=always和RestartSec=2以在2秒后重新启动该服务。
  • Systemd无法识别管道重定向,因此在ExecStart指令中,我们用单引号将comand括起来,并使用Bash shell运行它。
  • 由于OpenConnect VPN客户端将作为在后台运行的systemd服务运行,因此不需要在OpenConnect命令中添加-b标志。
  • ExecStop指令用于停止VPN连接。首先,我们使用resolvconf命令恢复DNS服务器设置。tun0是TUN设备的默认名称,可以通过ip link命令看到。然后我们使用pkill命令停止openconenct进程。最后,我们使用ip route flush命令恢复Linux内核路由表。将12.34.56.78替换为VPN服务器的IP地址。

要立即启动此Systemd服务,请运行

sudo systemctl start openconnect

要停止此Systemd服务,请运行

sudo systemctl stop openconnect

VPN连接中断时自动重启

有时VPN连接会由于各种原因而中断。要使VPN客户端自动重新启动,请编辑根用户的crontab文件。

sudo crontab -e

在该文件末尾添加以下行。

* * * * * ping -c 10 10.10.10.1 > /dev/null || systemctl restart openconnect

此Cron作业将每分钟运行一次,以检查VPN客户端是否可以ping VPN服务器的专用IP地址(10.10.10.1)。如果ping失败,则将执行右侧的命令以重新启动VPN客户端。|是Bash中的OR运算符。只有当左边的命令返回错误时,它才会执行右边的命令。

保存并关闭文件。

适用于Windows和MacOS的OpenConnect GUI客户端

它们可以从OpenConnect GUI Github页面下载。

速度

OpenConnect VPN非常快。我可以用它在YouTube上观看4k视频。如您所见,连接速度为63356kbps,相当于61Mbit/s。

ocserv vpn speed test singapore server

这是速度测试的测试结果。网

ocserv vpn speed test singapore

速度优化

OpenConnect默认使用TLS over UDP协议(DTLS)来实现更快的速度,但UDP无法提供可靠的传输。TCP比UDP慢,但可以提供可靠的传输。我可以给你的一个优化技巧是禁用DTL,使用标准TLS(通过TCP),然后启用TCP BBR以提高TCP速度。

要禁用DTL,请在ocserv配置文件中注释掉以下行(在开头添加#符号)。

udp-port = 443

保存并关闭文件。然后重启ocserv服务。

sudo systemctl restart ocserv.service

要启用TCP BBR,请查看以下教程。

  • 如何通过启用TCP BBR轻松提升Ubuntu网络性能

在我的测试中,启用TCP BBR的标准TLS比DTL快两倍。

自动续订让我们加密证书

编辑root用户的crontab文件。

sudo crontab -e

在文件末尾添加以下行。VPN服务器需要重新启动ocserv服务才能获取新的证书和密钥文件。

@daily certbot renew --quiet && systemctl restart ocserv

故障排除提示

请注意,如果您使用的是OpenVZ VPS,请确保在VPS控制面板中启用TUN虚拟网络设备。

如果遇到任何问题,请查看OpenConnect VPN服务器日志。

sudo journalctl -xe -u ocserv.service

我发现如果我把443端口换成另一个端口,中国的防火长城会阻止这个VPN连接。

如果ocserv告诉您它无法加载/etc/ocserv/ocserv。conf文件,您可以停止ocserv。

sudo systemctl stop ocserv

然后在前台运行它,并启用调试。

sudo /usr/sbin/ocserv --foreground --pid-file /run/ocserv.pid --config /etc/ocserv/ocserv.conf --debug=10

然后,输出可能会给您一些ocserv不工作的线索。

让OpenConnect VPN服务器和web服务器同时使用端口443

请阅读以下文章:

  • 运行OpenConnect VPN服务器&;Apache/Nginx与HAProxy在同一个盒子上

如何在ocserv中禁用TLS 1.0和TLS 1.1

PCI理事会在2018年6月30日否决了TLS 1.0,主流网络浏览器将在2020年禁用TLS 1.0和TLS 1.1。对于VPN服务器,我们也应该这样做。编辑主配置文件。

sudo nano /etc/ocserv/ocserv.conf

找到以下行:

tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-VERS-SSL3.0"

要在OpenConnect VPN服务器中禁用TLS 1.0和TLS 1.1,只需添加-VERS-TLS1。0和-VERS-TLS1。1号排队。

tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-VERS-SSL3.0:-VERS-TLS1.0:-VERS-TLS1.1"

保存并关闭文件。然后重启ocserv。

sudo systemctl restart ocserv

现在ocserv只接受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

我试图启用TLS 1.3,但Ubuntu上的ocserv包还不支持它。

每用户或每组配置

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.0

这意味着,在user1连接到此VPN服务器后,只有到10.10.10.0/24网络的流量将通过VPN服务器路由。到其他IP地址的流量通过原始网关路由。我使用这个技巧允许我的另一个VPS(虚拟专用服务器)连接到此VPN服务器,而不会中断正常通信,因此我的VPN服务器的tun设备(vpns0)始终处于打开状态,这意味着我的VPN服务器将始终具有专用IP地址10.10.10.1。

保存并关闭文件。重新启动ocserv以使更改生效。

sudo systemctl restart ocserv

虚拟主机

要在ocserv中添加新的虚拟主机,首先需要使用步骤3中的方法为新的虚拟主机获取TLS证书。然后编辑ocserv配置文件。

sudo nano /etc/ocserv/ocserv.conf

转到这个文件的底部。在Nano文本编辑器中,可以按Ctrl+W,然后按Ctrl+V跳转到文件底部。添加以下行。更换vpn2。实例com与第二个虚拟主机的主机名。

[vhost:vpn2.example.com] #Allow password authentication and certificate authentication enable-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 configuration ca-cert = /etc/ocserv/ssl/ca-cert.pem server-cert = /etc/letsencrypt/live/vpn2.example.com/fullchain.pem server-key = /etc/letsencrypt/live/vpn2.example.com/privkey.pem cert-user-oid = 0.9.2342.19200300.100.1.1  #Networking configuration. Use a different network range for this virtual host.  device = vpns ipv4-network = 10.10.20.0 ipv4-netmask = 255.255.255.0 route = default dns = 8.8.8.8 tunnel-all-dns = true  compression = true max-clients = 0 max-same-clients = 0 try-mtu-discovery = true idle-timeout=1200 mobile-idle-timeout=2400  config-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 BEFORT forward链,并添加以下两行,如果源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。新文件的服务。

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

收尾

就这样!我希望本教程能帮助您在Ubuntu 16.04和Ubuntu 18.04上安装和配置OpenConnect VPN。和往常一样,如果你觉得这篇文章很有用,那么订阅我们的免费时事通讯以获得更多提示和窍门?