使用Let's Encrypt在Ubuntu 18.04/16.04上设置OpenConnect VPN服务器(ocserv)
- 技术文档
- 2022.03.23
- 浏览:659
文章目录[隐藏]
- 要求
- 第一步:在Ubuntu 16.04/18.04上安装OpenConnect VPN服务器
- 第2步:在Ubuntu 16.04/18.04服务器上安装Let's Encrypt Client(Certbot)
- 步骤3:从Let's Encrypt获取TLS证书
- 第4步:编辑OpenConnect VPN服务器配置文件
- 步骤5:修复DTLS握手失败
- 第6步:创建VPN帐户
- 第7步:启用IP转发
- 第8步:为IP伪装配置防火墙
- 步骤9:打开防火墙中的443端口
- 如何在Ubuntu 16.04/18.04桌面上安装和使用OpenConnect VPN客户端
- 系统启动时自动连接
- VPN连接中断时自动重启
- 适用于Windows和MacOS的OpenConnect GUI客户端
- 速度
- 速度优化
- 自动续订让我们加密证书
- 故障排除提示
- 让OpenConnect VPN服务器和web服务器同时使用端口443
- 如何在ocserv中禁用TLS 1.0和TLS 1.1
- 每用户或每组配置
- 虚拟主机
- 如何运行ocserv的多个实例
- 收尾
本教程将向您展示如何在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:指定你的域名。
从下面的截图可以看到,我成功地获得了证书。
使用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。
要配置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,可以转到文件的末尾。
以上几行将在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。
sudo ufw enable
如果以前启用过UFW,那么可以使用systemctl重新启动UFW。
sudo systemctl restart ufw
现在,如果使用以下命令列出NAT表的后路由链中的规则:
sudo iptables -t nat -L POSTROUTING
你可以看到化装规则。
步骤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。
这是速度测试的测试结果。网
速度优化
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。和往常一样,如果你觉得这篇文章很有用,那么订阅我们的免费时事通讯以获得更多提示和窍门?