• 在OpenConnect VPN服务器(ocserv)中设置证书身份验证

    本教程将向您展示如何在Debian/Ubuntu/CentOS/RHEL上的OpenConnect VPN服务器(ocserv)中设置证书身份验证。OpenConnect(ocserv)是Cisco AnyConnect VPN协议的开源实现。 在前一篇文章中,我解释了使用Let's Encrypt TLS服务器证书设置OpenConnect VPN服务器的步骤。让我们加密不颁发客户端证书,所以在那篇文章中,我们使用了密码身份验证。每次输入用户名和密码都会很麻烦,尤其是当客户端软件(如iOS上的Cisco AnyConnect应用程序)不提供记住密码的选项时。许多OpenConnect客户端软件可以导入用户证书,这将使用户不必输入用户名和密码。证书认证也比密码认证更安全。 要求 为了学习本教程,假设您已经使用Let's Encrypt TLS server证书设置了OpenConnect VPN服务器。如果没有,请遵循以下教程之一。 在Ubuntu20.04上用Let's Encrypt设置OpenConnect VPN服务器(ocserv) 使用Let's Encrypt在Debian 11 Bullseye上设置OpenConnect VPN服务器(ocserv) 使用Let's Encrypt在CentOS 8/RHEL 8上设置OpenConnect VPN服务器(ocserv) 我们将建立自己的CA(证书颁发机构)来签署客户证书。ocserv守护程序应该继续使用Let's Encrypt颁发的TLS服务器证书,这样客户端软件就不会显示安全警告。 设置自己的CA(证书颁发机构) 我们希望使用证书身份验证,但我们加密不会颁发客户端证书,因此我们需要创建自己的CA。您可以使用openssl来完成这项工作,但ocserv建议使用GnuTLS,因此我将向您展示如何使用GnuTLS。 在Debian/Ubuntu服务器上安装gnutls bin包。 sudo apt安装gnutls bin 在CentOS/RHEL上安装gnutls utils包。 sudo dnf安装gnutls utils 在/etc/ocserv/中创建一个子目录以保存私钥和证书。 sudo mkdir/etc/ocserv/ssl/ 更改工作目录。 cd/etc/ocserv/ssl/ 使用certtool命令为CA生成私钥,该命令由gnutls bin或gnutls utils包提供。默认情况下,它生成3072位RSA密钥,这就足够了。 sudo certtool——生成私钥——输出文件ca私钥。佩姆 在生成CA证书之前,我们先创建CA证书模板文件。模板文件格式可在certtool手册(man certtool)中找到。 sudo nano ca-cert.cfg 将以下行添加到文件中。用适当的值替换占位符。 #X.509证书选项#科目的组织。organization=“vpn.example.com”#证书所有者的通用名称。cn=“示例CA”#证书的序列号。serial=001#从今天算起,该证书将在多少天内过期。如果没有过期日期,请使用-1。过期天数=-1#这是否是CA证书#此证书是否将用于签署数据签名#此密钥是否将用于签署其他证书。cert_signing_key#此密钥是否将用于签署CRL。crl_签名_密钥 保存并关闭文件。现在使用模板文件中的配置生成CA证书。 sudo certtool--生成自签名--加载privkey ca privkey。pem--模板ca-cert.cfg--输出文件ca-cert.pem 现在我们有了一个CA证书文件(CA-cert.pem)。 生成客户端证书 现在运行以下命令生成客户端私钥。 sudo certtool——生成私钥——输出文件客户端私钥。佩姆 创建客户端证书模板文件。 sudo nano client-cert.cfg 将以下行添加到文件中。uid必须是/etc/ocserv/ocpasswd文件中的用户名。 #X.509证书选项#科目的组织。organization=“vpn.example.com”#证书所有者的通用名称。cn=“John Doe”#证书所有者的用户id。uid=“username”#从今天算起,此证书将在多少天内过期。如果没有过期日期,请使用-1。到期日=3650#此证书是否将用于TLS服务器TLS#www#客户端#此证书是否将用于签署数据签名#密钥#此证书是否将用于加密数据(需要#在TLS RSA密码套件中)。请注意,最好使用不同的#密钥进行加密和签名。加密密钥 保存并关闭文件。然后运行以下命令生成客户端证书,该证书将由CA私钥签名。 sudo certtool--生成证书--加载私钥客户端私钥。pem——加载ca证书ca-cert.pem——加载ca私钥ca私钥。pem--模板client-cert.cfg--输出文件client-cert.pem 将客户机私钥和证书组合到一个受PIN保护的PKCS#12文件中。 sudo certtool——to-p12——加载私钥客户端私钥。pem--加载证书客户端-cert.pem--pkcs密码aes-256--输出文件客户端。p12——户外 现在,我们将客户机私钥和证书合并到一个文件客户机中。第12页。 请注意,iOS上的Ciso AnyConnect应用程序不支持AES-256密码。它将拒绝导入客户端证书。如果用户使用的是iOS设备,则可以选择3des-PKCS12密码。 sudo certtool——to-p12——加载私钥客户端私钥。pem--加载证书客户端-cert.pem--pkcs密码3des-pkcs12--输出文件ios客户端。p12——户外 客户端私钥和证书合并到一个文件ios客户端。第12页。 证书签名请求 只有当有多个VPN用户,并且用户希望使用自己的私钥时,才需要此步骤。 为了对最终用户的私钥保密,用户可以使用自己的私钥生成证书签名请求(CSR),然后向管理员发送证书请求,管理员随后向用户颁发客户端证书。首先,他们必须使用上述命令生成私钥和客户端证书模板。然后使用以下命令生成CSR。请求。pem文件由用户的私钥签名。 certtool——生成请求——加载私钥客户端私钥。pem——模板client-cert.cfg——输出文件请求。佩姆 接下来,用户发送请求。将pem和client-cert.cfg文件发送给管理员,管理员运行以下命令生成客户端证书。 sudo certtool--生成证书--加载ca证书ca-cert.pem--加载ca私钥ca私钥。pem——加载请求。pem--模板client-cert.cfg--输出文件client-cert.pem 之后,管理员将client-cert.pem证书文件发送给用户。 在ocserv守护程序中启用证书身份验证 编辑ocserv配置文件。 sudo nano/etc/ocserv/ocserv。形态 在上一个教程中,我们添加了以下行以启用密码身份验证。 auth=“plain[passwd=/etc/ocserv/ocpasswd]” 要启用证书身份验证,请取消注释以下行。 auth=“证书” 如果以上两行都未注释,则意味着用户必须同时通过密码身份验证和证书身份验证。因此,如果证书认证足以证明身份,那么请注释掉第一行。 如果允许用户选择证书身份验证或密码身份验证,则应改为使用以下行。 启用auth=“plain[passwd=/etc/ocserv/ocpasswd]”auth=“certificate” 现在找到ca证书参数。在Debian/Ubuntu上,设置为 ca证书=/etc/ssl/certs/ssl证书蛇油。佩姆 在CentOS 8/RHEL 8上,设置为 ca cert=/etc/ocserv/ca.pem 我们需要使用我们自己的CA证书来验证客户端证书,所以将此行更改为 ca-cert=/etc/ocserv/ssl/ca-cert.pem 接下来,找到下面这行。 证书用户oid=0.9.2342.19200300.100.1.1 你不需要改变它。我只想告诉你,0.9.2342.19200300.100.1.1代表客户证书中的UID。上面的一行告诉ocserv守护程序从客户端证书的UID字段中查找用户名。如果客户端证书已通过CA证书成功验证,并且ocserv守护程序可以在/etc/ocserv/ocpasswd文件中找到匹配的用户名,则客户端可以登录。 保存并关闭文件。然后重启ocserv。 sudo systemctl重启ocserv 在Debian/Ubuntu/CentOS/RHEL桌面上使用证书认证 使用scp命令下载客户端。p12文件到Debian/Ubuntu/CentOS/RHEL桌面。 scp[email protected]:/etc/ocserv/ssl/client。p12~ 然后安装openconnect客户端软件。 Debian/Ubuntu: sudo apt安装openconnect CentOS/RHEL: sudo dnf安装epel释放sudo dnf安装openconnect 要使用证书身份验证,请运行 sudo openconnect-b vpn。实例com-c客户端。p12 您将被要求使用本教程中较早设置的密码短语解锁客户端私钥。 如果密码输入正确,您现在应该连接到VPN服务器。 在Windows和MacOS桌面上使用证书身份验证 从OpenConnect GUI Github页面下载Windows或MacOS的OpenConnect GUI客户端。然后创建一个新的VPN连接配置文件,并将PKCS#12文件导入用户证书字段。点击保存按钮。您需要输入PIN才能解锁私钥。导入后,您不必再输入用户名和密码。 在iOS设备上使用证书身份验证 iOS用户可以使用Cisco AnyConnect应用程序。要在AnyConnect应用程序中导入客户端证书,您可以先将PKCS#12文件发送到附件中的电子邮件地址。然后在iOS上打开邮件应用程序。点击附件几秒钟,并与AnyConnect共享。然后输入PIN以导入文件。 导入后,在AnyConnect中编辑VPN连接。转到高级->证书,然后选择客户端证书。保存你的设置。 现在你不必再在iOS设备上输入用户名和密码了。Cisco AnyConnect应用程序不记得用户名和密码,因此在密码验证模式下,当手机不使用时,VPN连接将断开。在证书认证模式下,如果连接断开,应用程序将自动重新连接到VPN服务器。 iOS上AnyConnect客户端的问题 iOS上最新版本的AnyConnect客户端在TLS 1.3协议中使用证书身份验证时出现问题。如果在ocserv日志(sudo journalctl-eu ocserv)中看到以下错误,那么您也会遇到同样的问题。 GnuTLS错误(在worker vpn.c:795):已收到TLS致命警报。 您需要在AnyConnect iOS客户端中使用密码身份验证,或者在ocserv配置文件中禁用TLS 1.3。禁用TLS1。3.在/etc/ocserv/ocserv中查找tls priorities参数。配置文件,并添加:-VERS-TLS1。3最后禁用TLS 1.3。 tls priorities=“正常:%SERVERu优先级:%COMPAT:-RSA:-VERS-SSL3.0:-ARCFOUR-128:-VERS-TLS1.0:-VERS-TLS1.1:-VERS-TLS1.3” 保存并关闭文件。然后重启ocserv。 sudo systemctl重启ocserv 注意:如果您在ocserv日志中看到SSL 3.3短语,请不要惊慌。SSL 3.3是TLS 1.2的另一个词。您正在使用安全的TLS连接。 收尾 我希望本教程能帮助您在OpenConnect VPN服务器中设置证书身份验证。和往常一样,如果你觉得这篇文章很有用,那么订阅我们的免费时事通讯以获得更多提示和窍门。当心?

    2022.03.23 浏览:2013
  • 在Ubuntu20.04上用Let's Encrypt设置OpenConnect VPN服务器(ocserv)

    本教程将向您展示如何在Ubuntu 20.04上安装OpenConnect VPN服务器来运行自己的VPN服务器。OpenConnect VPN服务器,又名ocserv,是Cisco AnyConnnect VPN协议的开源实现,广泛应用于企业和大学。AnyConnect是一种基于SSL的VPN协议,允许单个用户连接到远程网络。 注意:本教程也适用于Ubuntu20.10和Ubuntu21.04。 为什么要设置自己的VPN服务器? 也许你是VPN服务提供商或系统管理员,这就要求你设置我们自己的VPN服务器。 你不信任VPN服务提供商的禁止登录策略,所以你选择了自主机路径。 您可以使用VPN来实施网络安全策略。例如,如果您运行自己的电子邮件服务器,则可以通过在防火墙中创建IP地址白名单,要求用户仅从VPN服务器的IP地址登录。因此,您的电子邮件服务器经过加固以防止黑客活动。 也许你只是想知道VPN服务器是如何工作的。 OpenConnect VPN服务器的功能 轻便快速。在我的测试中,我可以通过OpenConnect VPN观看YouTube 4K视频。YouTube在我的国家(中国)被屏蔽。 在Linux和大多数BSD服务器上运行。 与Cisco AnyConnect客户端兼容 有针对Linux、MacOS、Windows和OpenWRT的OpenConnect客户端软件。对于Android和iOS,您可以使用Cisco AnyConnect客户端。 支持密码身份验证和证书身份验证 支持RADIUS记帐。 支持虚拟主机(多个域)。 易于设置 我特别喜欢这样一个事实:与其他VPN技术相比,最终用户使用OpenConnect VPN非常简单方便。每当我在我的计算机上安装Linux发行版,并想快速解锁网站或隐藏我的IP地址时,我就会安装OpenConnect客户端,只需两行命令即可连接到服务器: sudo apt安装openconnect sudo openconnect-b vpn。我的域名。通用域名格式 此外,还有用于Fedora、RHEL、CentOS、Arch Linux和OpenSUSE的OpenConnect VPN客户端。您可以使用软件包管理器轻松安装它。 sudo dnf安装openconnect sudo yum安装openconnect sudo pacman-S openconnect 要求 要学习本教程,您需要一个VPS(虚拟专用服务器),可以自由访问被屏蔽的网站(在您的国家或互联网过滤系统之外)。我推荐Kamatera VPS,其特点是: 30天免费试用。 起价为每月4美元(1GB内存) 基于KVM的高性能VPS 世界各地的9个数据中心,包括美国、加拿大、英国、德国、荷兰、香港和ISRALL。 按照下面链接的教程在Kamatera创建Linux VPS服务器。 如何在Kamatera上创建Linux VPS服务器 一旦你有了一个运行Ubuntu20.04的VPS,请按照下面的说明操作。 您还需要一个域名来为OpenConnect VPN启用HTTPS。我从namescape注册了我的域名,因为价格低廉,而且他们终身免费保护whois的隐私。 第一步:在Ubuntu 20.04上安装OpenConnect VPN服务器 登录你的Ubuntu 20.04服务器。然后使用apt从默认的Ubuntu存储库安装ocserv包。 sudo apt更新sudo apt安装ocserv 一旦安装,OpenConnect VPN服务器将自动启动。您可以通过以下方式检查其状态: 系统CTL状态ocserv 样本输出: ● ocserv。服务-OpenConnect SSL VPN服务器已加载:已加载(/lib/systemd/system/ocserv.service;已启用;供应商预置:已启用)活动:自Sun 2020-04-12 19:57:08 HKT起活动(正在运行);12秒前的文档:man:ocserv(8)Main PID:216409(ocserv Main)任务:2(限制:9451)内存:1.6M CGroup:/system。切片/ocserv。服务├─216409 ocserv main└─216429 ocserv sm 提示:如果上述命令没有立即退出,您可以按Q键重新控制终端。 如果它没有运行,则可以从以下内容开始: sudo系统CTL启动ocserv 默认情况下,OpenConnect VPN服务器监听TCP和UDP端口443。如果web服务器正在使用它,那么VPN服务器可能无法启动。稍后我们将在OpenConnect VPN配置文件中看到如何更改端口。 如果你的服务器上有防火墙,那么你需要打开端口80和443。例如,如果使用UFW,则运行以下命令。 sudo ufw允许80443/tcp 第2步:在Ubuntu20.04服务器上安装Let's Encrypt Client(Certbot) 与ocserv一起安装的gnutls bin包提供了创建您自己的CA和服务器证书的工具,但我们将获取并安装Let's Encrypt certificate。使用Let’s Encrypt证书的优点是,它是免费的,更容易设置,并且受VPN客户端软件的信任。 运行以下命令从默认的Ubuntu存储库安装Let's Encrypt client(certbot)。 sudo apt安装certbot 要检查版本号,请运行 certbot——版本 样本输出: certbot 0.40.0 步骤3:从Let's Encrypt获取受信任的TLS证书 我建议使用standalone或webroot插件来获取ocserv的TLS证书。 独立插件 如果您的Ubuntu 20.04服务器上没有运行web服务器,并且您希望OpenConnect VPN服务器使用端口443,那么您可以使用独立插件从Let's Encrypt获取TLS证书。运行以下命令。别忘了为你的域名设置一个记录。 sudo certbot certonly--独立--首选挑战http--同意tos--电子邮件[email protected]-d vpn。实例通用域名格式 哪里: certonly:获取证书,但不要安装它。 --standalone:使用standalone插件获取证书 --首选挑战http:执行http-01挑战以验证我们的域,该域将使用端口80。 --同意:同意让我们加密服务条款。 --电子邮件:电子邮件地址用于帐户注册和恢复。 -d:指定你的域名。 从下面的截图可以看到,我成功地获得了证书。 使用webroot插件 如果你的Ubuntu20.04服务器有一个web服务器监听端口80和443,那么最好使用webroot插件来获取证书,因为webroot插件几乎适用于所有web服务器,我们不需要在web服务器上安装证书。 首先,您需要为vpn创建一个虚拟主机。实例通用域名格式。 阿帕奇 如果您使用的是Apache,那么 sudo nano/etc/apache2/可用站点/vpn。实例通用域名格式。形态 并将以下行粘贴到文件中。 <虚拟主机*:80>服务器名vpn。实例com DocumentRoot/var/www/ocserv&lt/VirtualHost> 保存并关闭文件。然后创建web根目录。 sudo mkdir/var/www/ocserv 将www数据(Apache用户)设置为web根目录的所有者。 sudo chown www-data:www-data/var/www/ocserv-R 启用此虚拟主机。 sudo a2ensite vpn。实例通用域名格式 重新加载Apache以使更改生效。 sudo systemctl重新加载apache2 创建并启用虚拟主机后,运行以下命令以获取使用webroot插件加密证书。 sudo certbot certonly--webroot--同意tos--电子邮件[email protected]-d vpn。实例com-w/var/www/ocserv Nginx 如果您使用的是Nginx,那么 sudo nano/etc/nginx/conf.d/vpn。实例通用域名格式。形态 将以下行粘贴到文件中。 服务器{listen 80;server_name vpn.example.com;root/var/www/ocserv/;location ~/.well-known/acme challenge{allow all;} 保存并关闭文件。然后创建web根目录。 sudo mkdir-p/var/www/ocserv 将www数据(Nginx用户)设置为web根目录的所有者。 sudo chown www-data:www-data/var/www/ocserv-R 重新加载Nginx以使更改生效。 sudo systemctl重新加载nginx 创建并启用虚拟主机后,运行以下命令以获取使用webroot插件加密证书。 sudo certbot certonly--webroot--同意tos--电子邮件[email protected]-d vpn。实例com-w/var/www/ocserv 第4步:编辑OpenConnect VPN服务器配置文件 编辑ocserv主配置文件。 sudo nano/etc/ocserv/ocserv。形态 首先,我们需要配置密码身份验证。默认情况下,通过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端口=443 udp端口=443 然后找出下面两行。我们需要改变它们。 服务器证书=/etc/ssl/certs/ssl证书蛇油。pem服务器密钥=/etc/ssl/private/ssl cert snakeoil。钥匙 将默认设置替换为让我们加密服务器证书和服务器密钥文件的路径。 服务器证书=/etc/letsencrypt/live/vpn。实例com/fullchain。pem服务器密钥=/etc/letsencrypt/live/vpn。实例com/privkey。佩姆 然后,设置客户端的最大数量。默认值为128。设置为零表示无限。 最大客户端数=128 设置用户可以同时登录的设备数量。默认值为2。设置为零表示无限。 最大相同客户端数=2 默认情况下,keepalive数据包每300秒(5分钟)发送一次。我更喜欢使用短时间(30秒)来减少VPN连接中断的机会。 keepalive=30 接下来,找到下面这行。将false更改为true以启用MTU发现,这可以优化VPN性能。 尝试mtu发现=false 您可以通过以下两个参数设置在断开连接之前允许客户端保持空闲的时间。如果您希望客户端无限期地保持连接,那么请注释掉这两个参数。 空闲超时=1200移动空闲超时=1800 之后,将默认域设置为vpn。实例通用域名格式。 默认域=vpn。实例通用域名格式 默认情况下,IPv4网络配置如下所示。这将导致问题,因为许多家庭路由器还将IPv4网络范围设置为192.168.1.0/24。 ipv4网络=192.168.1.0 ipv4网络掩码=255.255.255.0 我们可以使用另一个专用IP地址范围(10.10.10.0/24)来避免IP地址冲突,因此将ipv4网络的值更改为 ipv4网络=10.10.10.0 现在取消注释下面这行,通过VPN隧道所有DNS查询。 隧道所有dns=true 默认DNS解析程序地址如下所示,这很好。 dns=8.8.8.8 dns=1.1.1.1 注意:如果您是VPN服务提供商,那么在同一台服务器上运行自己的DNS解析程序是一个很好的做法。如果在同一台服务器上运行DNS解析程序,请将DNS指定为 dns=10.10.10.1 10.10.10.1是VPN LAN中OpenConnect VPN服务器的IP地址。这将稍微加快客户端的DNS查找,因为VPN服务器和DNS解析程序之间的网络延迟已消除。 然后注释掉所有路由参数(在下面几行的开头添加#符号),这将把服务器设置为客户端的默认网关。 #route=10.0.0.0/8#route=172.16.0.0/12#route=192.168.0.0/16#route=fd00::/8#route=default#no route=192.168.5.0/255.255.0 保存并关闭文件,然后重新启动VPN服务器,以使更改生效。 sudo systemctl重启ocserv 第5步:创建VPN帐户 现在使用ocpasswd工具生成VPN帐户。 sudo ocpasswd-c/etc/ocserv/ocpasswd用户名 系统将要求您为用户设置密码,信息将保存到/etc/ocserv/ocpasswd文件中。要重置密码,只需再次运行上述命令。 步骤6:启用IP转发 为了让VPN服务器在VPN客户端和Internet之间路由数据包,我们需要启用IP转发。编辑sysctl。conf文件。 sudo nano/etc/sysctl。形态 在该文件末尾添加以下行。 网ipv4。ip_forward=1 保存并关闭文件。然后使用下面的命令应用更改。p选项将从/etc/sysctl加载sysctl设置。conf文件。此命令将在系统重新启动时保留所做的更改。 sudo sysctl-p 第7步:在防火墙中配置IP伪装 我们需要在服务器防火墙中设置IP伪装,以便服务器成为VPN客户端的虚拟路由器。我将使用UFW,它是iptables防火墙的前端。在Ubuntu上通过以下方式安装UFW: sudo apt安装ufw 首先,需要允许SSH通信。 sudo ufw允许22/tcp 然后找到服务器主网络接口的名称。 ip地址 正如你所看到的,它在我的Ubuntu服务器上被命名为ens3。 要配置IP伪装,我们必须在UFW配置文件中添加iptables命令。 sudo nano/etc/ufw/before。规则 默认情况下,过滤器表有一些规则。在该文件末尾添加以下行。将ens3替换为您自己的网络接口名称。 #NAT表规则*NAT:POSTROUTING ACCEPT[0:0]-一个POSTROUTING-s 10.10.0/24-o ens3-j伪装#用“提交”行结束每个表,否则这些规则将不会被处理提交 在Nano文本编辑器中,按Ctrl+W,然后按Ctrl+V,可以转到文件的末尾。 以上几行将在nat表的后路由链的末尾附加(-A)条规则。它将把你的虚拟专用网络与互联网连接起来。同时也会对外界隐藏你的人际网络。所以互联网只能看到VPN服务器的IP,却看不到VPN客户端的IP,就像你的家庭路由器隐藏了你的私人家庭网络一样。 默认情况下,UFW禁止数据包转发。我们可以允许为我们的专用网络转发。在该文件中找到ufw BEFORT forward链,并添加以下3行,如果源IP或目标IP在10.10.10.0/24范围内,这3行将接受数据包转发。 #允许受信任网络的转发-转发前的ufw-s 10.10.10.0/24-j接受-转发前的ufw-d 10.10.10.0/24-j接受 保存并关闭文件。然后启用UFW。 sudo ufw启用 如果以前启用过UFW,那么可以使用systemctl重新启动UFW。 sudo systemctl重启ufw 现在,如果使用以下命令列出NAT表的后路由链中的规则: sudo iptables-t nat-L后路由 你可以看到化装规则。 UFW处理防火墙规则可能需要一些时间。如果伪装规则未显示,则再次重新启动UFW(sudo systemctl restart UFW)。 步骤8:打开防火墙中的443端口 运行以下命令打开TCP和UDP端口443。如果您为ocserv配置了不同的端口,则将443更改为您配置的端口。 sudo ufw allow 443/tcp sudo ufw allow 443/udp 现在,OpenConnect VPN服务器已准备好接受客户端连接。 如果运行本地DNS解析程序 对于运行本地DNS解析程序的用户,如果指定10.10.10.1作为VPN客户端的DNS服务器,则必须允许VPN客户端使用以下UFW规则连接到端口53。 sudo ufw插件1允许从10.10.10.0/24进入 您还需要编辑绑定DNS服务器的配置文件(/etc/BIND/named.conf.options),以允许VPN客户端发送如下递归DNS查询。 允许递归{127.0.0.1;10.10.10.0/24;}; 然后重启BIND。 sudo systemctl重新启动已命名 如何在Ubuntu 20.04桌面上安装和使用OpenConnect VPN客户端 运行以下命令在Ubuntu桌面上安装OpenConnect VPN命令行客户端。 sudo apt安装openconnect 您可以从下面的命令行连接到VPN-b标志将使其在连接建立后在后台运行。 sudo openconnect-b vpn。实例com:端口号 您将被要求输入VPN用户名和密码。如果成功建立连接,您将看到以下消息。 获得连接响应:HTTP/1.1 200已连接CSTP已连接。DPD 90,使用SSL建立的DTLS连接(使用GnuTLS),将32400连接到tun0的端口保持为192.168.1.139。密码套件(DTLS1.2)-(RSA)-(AES-256-GCM)。 要停止连接,请运行: sudo pkill openconnect 要以非交互方式运行客户端,请使用以下语法。 echo-n密码| sudo openconnect-b vpn。实例com-u用户名--stdin上的passwd 如果要使用Network Manager管理VPN连接,则还需要安装这些软件包。 sudo apt安装网络管理器openconnect网络管理器openconnect gnome 如果您成功连接到VPN服务器,但您的公共IP地址没有更改,这是因为IP转发或IP伪装不起作用。我的iptables命令有一次输入错误(使用了错误的IP地址范围),这导致我的计算机无法浏览互联网。 如果遇到以下错误,则应禁用ocserv中的UDP端口,这将在后面的速度优化部分中解释。 DTLS握手失败:资源暂时不可用,请重试 如果出现以下错误,则可能是VPN帐户密码错误。 fgets(标准输入):设备的ioctl不合适 系统启动时自动连接 为了让OpenConnect VPN客户端在启动时自动连接到服务器,我们可以创建一个systemd服务单元。 sudo nano/etc/systemd/system/openconnect。服务 将以下行放到文件中。替换红色文本。 [Unit]Description=OpenConnect VPN Client After=网络在线。目标系统已解决。服务需求=网络在线。target[Service]Type=simple ExecStart=/bin/bash-c'/bin/echo-n password |/usr/sbin/openconnect vpn。实例com-u username--passwd on stdin'KillSignal=SIGINT Restart=always RestartSec=2[Install]WantedBy=multi-user。目标 保存并关闭文件。然后启用此服务,使其在引导时启动。 sudo systemctl启用openconnect。服务 文件内容说明: After=网络在线。目标系统已解决。服务和需求=网络在线。目标使此服务在网络启动后运行。我们想要openconnect。系统故障排除后,服务将启动。服务,因为这将确保OpenConnect设置的DNS服务器地址不会被systemd覆盖。服务 实际上,这项服务仍然可以在网络开通之前运行。如果服务失败,我们添加Restart=always和RestartSec=2以在2秒后重新启动该服务。 Systemd无法识别管道重定向,因此在ExecStart指令中,我们用单引号将comand括起来,并使用Bash shell运行它。 由于OpenConnect VPN客户端将作为在后台运行的systemd服务运行,因此不需要在OpenConnect命令中添加-b标志。 当发出systemctl stop openconnect命令时,KillSignal指令告诉Systemd发送SIGINT信号。这将通过注销会话、恢复DNS服务器设置和Linux内核路由表来执行完全关闭。 要立即启动此Systemd服务,请运行 sudo systemctl启动openconnect 要停止此Systemd服务,请运行 sudo systemctl stop openconnect 如何在从挂起恢复时自动重新启动OpenConnect客户端 如果你的Ubuntu桌面进入暂停状态,OpenConnect客户端将失去与VPN服务器的连接。为了让它在从暂停恢复时自动重启,我们需要创建另一个systemd服务单元。 sudo nano/etc/systemd/system/openconnect重启。服务 在文件中添加以下行。 [Unit]Description=暂停后从暂停恢复时重新启动OpenConnect客户端=暂停。target[Service]Type=simple ExecStart=/bin/systemctl——无块重启openconnect。service[Install]WantedBy=挂起。目标 保存并关闭文件。然后启用此服务。 sudo systemctl启用openconnect重启。服务 VPN连接中断时自动重启 有时VPN连接会由于其他原因而中断。您可以运行以下命令来检查VPN客户端是否可以ping VPN服务器的私有IP地址(10.10.10.1)。如果ping失败,则将执行右侧的命令以重新启动VPN客户端。|是Bash中的OR运算符。只有当左边的命令返回错误时,它才会执行右边的命令。 ping-c9 10.10.10.1 | | systemctl重新启动openconnect ping将进行9次,即9秒。可以在Bash shell中使用无限循环,使整个命令永远运行。按Ctrl+C组合键停止。 对于(;))完成(ping-c9 10.10.10.1 | | systemctl重启openconnect) 现在我们可以为这个任务创建一个systemd服务。 sudo nano/etc/systemd/system/openconnect检查。服务 将以下行添加到此文件。我们指定此服务应在openconnect之后运行。服务 [Unit]Description=OpenConnect VPN连接检查器After=OpenConnect。服务[service]Type=simple ExecStart=/bin/bash-c'for(;;))do(ping-c9 10.10.10.1 | | systemctl restart openconnect)done'[Install]WantedBy=multi-user。目标 保存并关闭文件。然后启动这项服务。 sudo systemctl启动openconnect检查 启动时启用自动启动。 sudo systemctl启用openconnect检查 一旦启动此服务,ping命令将永远运行。如果VPN连接断开,它将自动重新启动openconnect。服务 适用于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端口=443 保存并关闭文件。然后重启ocserv服务。 sudo systemctl重启ocserv。服务 要启用TCP BBR,请查看以下教程。请注意,您需要在ocserv中禁用DTL,否则TCP BBR将无法工作。 如何通过启用TCP BBR轻松提升Ubuntu网络性能 在我的测试中,启用TCP BBR的标准TLS比DTL快两倍。 影响速度的另一个非常重要的因素是本地计算机和VPN服务器之间的连接有多好。如果你住在中东和VPN服务器位于美国,速度将是缓慢的。选择一个离你住的地方近的数据中心。 另外,检查你的CPU平均负载。(htop可由sudo apt install htop安装)。 htop 确保CPU平均负载低于1。我曾经的CPU平均负载为3,这导致VPN客户端和VPN服务器之间的延迟很高。 自动续订让我们加密证书 编辑root用户的crontab文件。 sudo crontab-e 在文件末尾添加以下行。VPN服务器需要重新加载ocserv服务才能获取新的证书和密钥文件。 @每日certbot更新——安静与&systemctl重新加载ocserv 故障排除提示 OpenVZ 请注意,如果您使用的是OpenVZ VPS,请确保在VPS控制面板中启用TUN虚拟网络设备。(如果你使用Vultr VPS,那么你有基于KVM的VPS,所以你不必担心这一点。) 日志文件 如果遇到任何问题,请查看OpenConnect VPN服务器日志。 sudo journalctl-eu ocserv。服务 我发现如果我把443端口换成另一个端口,中国的防火长城会阻止这个VPN连接。 调试模式 如果ocserv告诉您它无法加载/etc/ocserv/ocserv。conf文件,您可以停止ocserv。 sudo systemctl stop ocserv 然后在前台运行它,并启用调试。 sudo/usr/sbin/ocserv——前台——pid文件/run/ocserv。pid——config/etc/ocserv/ocserv。conf--debug=10 然后,输出可能会给您一些ocserv不工作的线索。 无法浏览互联网 如果您成功连接到VPN服务器,但无法浏览Internet,那是因为IP转发或IP伪装不起作用。我记得我的VPS提供商曾经进行过一次平台升级,将主网络接口的名称从ens3更改为enp3s0,因此我必须更新UFW文件(/etc/UFW/before.rules)中的名称。 语法错误 如果在尝试建立VPN连接时看到以下错误,可能是因为ocserv配置文件中存在语法错误。查看日志(sudo journalctl-eu ocserv)以了解情况。 得到不适当的HTTP连接响应:HTTP/1.1 401 Cookie不可接受 重新启动计算机 如果在尝试建立VPN连接时看到以下错误,则可能是本地计算机出现问题。试着重新启动你的电脑。 服务器的vpn。你的领域。com请求的基本身份验证在默认情况下被禁用 TLS连接未正确终止 如果在尝试建立VPN连接时在客户端上看到以下错误, SSL连接失败:TLS连接未正确终止。 您可能应该在VPN服务器上重新启动ocserv服务。 sudo systemctl重启ocserv 您可以创建一个cron作业,在每天凌晨4点自动重新启动ocserv一次。 sudo crontab-e 添加以下行。 0 4***系统CTL重新启动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。形态 找到以下行: tls priorities=“正常:%SERVERu优先级:%COMPAT:-RSA:-VERS-SSL3.0:-ARCFOUR-128” 要在OpenConnect VPN服务器中禁用TLS 1.0和TLS 1.1,只需添加-VERS-TLS1。0和-VERS-TLS1。1号排队。 tls priorities=“正常:%SERVERu优先级:%COMPAT:-RSA:-VERS-SSL3.0:-ARCFOUR-128:-VERS-TLS1.0:-VERS-TLS1.1” 保存并关闭文件。然后重启ocserv。 sudo systemctl重启ocserv 现在ocserv只接受TLS1.3和TLS1.2。有关在ocserv中配置TLS参数的更多信息,请参阅GnuTLS优先级字符串。 要检查OpenConnect VPN服务器是否支持TLS 1.0,请运行以下命令。 openssl s_客户端-连接vpn。你的领域。通讯:443-tls1 并检查TLS 1.1 openssl s_客户端-连接vpn。你的领域。通讯:443-tls1_1 如果在输出中看到以下消息,则表示不支持TLS版本。 新建,(无),密码为(无)不支持安全重新协商 每用户或每组配置 Ocserv允许按用户和按组配置。要启用此功能,请取消注释/etc/ocserv/ocserv中的以下两行。conf文件。 每个用户配置=/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 可以在文件中添加如下内容以启用拆分隧道。 路由=10.10.10.0/255.255.255.0隧道所有dns=false dns=8.8.8.8 dns=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重启ocserv 请注意,如果在ocserv中启用IPv6,则还需要添加IPv6网络范围,以便使用拆分隧道。 route=10.10.10.0/255.255.255.0 route=fda9:4efe:7e3b:03ea::/48隧道所有dns=false dns=8.8.8 dns=1.1.1 如果要从默认路由中排除IP地址,请使用“无路由”。 无路线=12.34.56.78/32 这意味着除IP 12.34.56.78之外的所有其他流量都将通过VPN隧道。route和no route参数同时接受网络掩码符号(10.10.10.0/255.255.255.0)和CIDR符号(12.34.56.78/32) 如果在启用拆分隧道后看到以下错误,可能是因为没有使用网络掩码或CIDR符号。 无法分析代理协议头;丢弃连接 按国家划分 比方说,你只想通过VPN隧道传输到外国国家的流量。前往自己国家的交通应使用正常路线。可以使用ocserv配置文件中的no route指令来实现这一点。 首先,您需要通过以下网页下载您所在国家的IP范围:https://www.ip2location.com/free/visitor-blocker,它允许您以CIDR格式下载IP地址范围。 将IP范围保存在文本文件IP2位置。txt,并在Linux终端中运行以下命令,将no route=指令添加到每行的开头。 sed's/^/no route=/'-i ip2localtion。txt 现在在文本编辑器中打开文件并复制其中的所有行。我们需要在ocserv配置文件中添加这些行。如果行太多,可以将这些行添加到每用户配置文件中。 sudo nano/etc/ocserv/config per user/user1 您还可以将它们添加到每个组的配置文件中,然后将用户添加到组中。 重新启动ocserv以使更改生效。 sudo systemctl重启ocserv 如何在OpenConnect VPN中启用IPv6 如果VPN服务器具有公共IPv6地址,则可以在OpenConnect VPN中启用IPv6。编辑ocserv配置文件。 sudo nano/etc/ocserv/ocserv。形态 找到下面两行并取消注释。 ipv6网络=fda9:4efe:7e3b:03ea::/48 ipv6子网前缀=64 保存并关闭文件。重新启动ocserv以使更改生效。 sudo systemctl重启ocserv 然后我们需要为IPv6启用IP转发。编辑sysctl。conf文件。 sudo nano/etc/sysctl。形态 在该文件末尾添加以下行。 网ipv6。好的。转发=1 保存并关闭文件。然后使用下面的命令应用更改。 sudo sysctl-p 接下来,我们需要在服务器防火墙中设置IPv6伪装,以便服务器成为VPN客户端的虚拟路由器。 sudo nano/etc/ufw/before6。规则 默认情况下,过滤器表有一些规则。在该文件末尾添加以下行。将ens3替换为您自己的网络接口名称。 #NAT表格规则*NAT:POSTROUTING ACCEPT[0:0]-一个POSTROUTING-o ens3-j伪装#用“提交”行结束每个表格,否则这些规则将不会被提交处理 在Nano文本编辑器中,按Ctrl+W,然后按Ctrl+V,可以转到文件的末尾。 默认情况下,UFW禁止数据包转发。我们可以允许我们的专用IPv6网络进行转发。在该文件中找到ufw6 before forward链,并添加以下3行,如果源IP或目标IP在fda9:4efe:7e3b:03ea::/48范围内,这3行将接受数据包转发。 保存并关闭文件。重新启动UFW以使更改生效。 sudo systemctl重启ufw 现在,如果使用以下命令列出NAT表的后路由链中的规则: sudo ip6tables-t nat-L后路由 你可以看到化装规则。 断开当前VPN连接,为VPN添加AAAA记录。实例com并重新建立VPN连接。那就去https://test-ipv6.com/检查你的IPv6连接。 如果在VPN服务器上运行自己的绑定DNS解析器,可以在/etc/ocserv/ocserv中添加以下行。conf文件,将VPN服务器设置为VPN客户端的DNS解析程序。 dns=fda9:4efe:7e3b::1 保存并关闭文件。要在IPv6中查询DNS名称,我们需要将BIND配置为允许IPv6 VPN客户端。 sudo nano/etc/bind/named。形态选项 找到allow recursion参数并将其更改为: 允许递归{127.0.0.1;10.10.10.0/24;fda9:4efe:7e3b:03ea::/48;}; 保存并关闭文件。重新启动BIND9。 sudo systemctl重新启动已命名 我们还需要在防火墙中允许IPv6 VPN客户端。 sudo ufw允许从fda9:4efe:7e3b:03ea::/48进入 虚拟主机 注意:如果您只想为VPN服务器使用多个主机名,可以使用certbot获取多域证书。然后重启ocserv,就完成了。 要在ocserv中添加新的虚拟主机,首先需要使用步骤3中的方法为新的虚拟主机获取TLS证书。然后编辑ocserv配置文件。 sudo nano/etc/ocserv/ocserv。形态 转到这个文件的底部。在Nano文本编辑器中,可以按Ctrl+W,然后按Ctrl+V跳转到文件底部。添加以下行。更换vpn2。实例com与第二个虚拟主机的主机名。 [vhost:vpn2.example.com]#允许密码身份验证和证书身份验证启用auth=“plain[passwd=/etc/ocserv/ocpasswd]”auth=“certificate”tcp port=443#如果ocserv在HAProxy后面运行,请取消对这两行的注释#侦听主机=127.0.0.1#侦听代理协议=true#SSL/TLS配置ca证书=/etc/ocserv/SSL/ca-cert.pem服务器证书=/etc/letsencrypt/live/vpn2。实例com/fullchain。pem服务器密钥=/etc/letsencrypt/live/vpn2。实例com/privkey。pem证书用户oid=0.9.2342.19200300.100.1.1#网络配置。为此虚拟主机使用不同的网络范围。设备=VPN ipv4网络=10.10.20.0 ipv4网络掩码=255.255.255.0路由=默认dns=8.8.8.8隧道所有dns=真压缩=真最大客户端=0最大相同客户端=0尝试mtu发现=真空闲超时=1200移动空闲超时=每个用户2400配置=/etc/ocserv/config/每个组=/etc/ocserv/config/每个组/ 保存并关闭文件。然后重启ocserv。 sudo systemctl重启ocserv 编辑UFW配置文件。 sudo nano/etc/ufw/before。规则 在该文件中找到ufw BEFORT forward链,并添加以下两行,如果源IP或目标IP在10.10.20.0/24范围内,这两行将接受数据包转发。 -转发前的ufw-S10.10.20.0/24-j接受-D10.10.20.0/24-j接受前的ufw-d接受 保存并关闭文件。然后重启UFW。 sudo systemctl重启ufw 请注意,ocserv守护进程可能会告诉您,虚拟主机的一些参数将被忽略。然而,我发现一些被忽略的参数实际上是需要的。例如,如果从虚拟主机中删除device=vpns行,则在建立到虚拟主机的VPN连接时可能会遇到以下错误。 VPN服务不可用;原因:服务器配置错误 VPN服务器将在日志中生成以下错误消息。 没有配置网络;拒绝客户 还要注意,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。服务 然后编辑新文件。 sudo nano/etc/systemd/system/ocserv2。服务 改变 /etc/ocserv/ocserv。形态 到 /etc/ocserv/ocserv2。形态 保存并关闭文件。接下来,您可以编辑/etc/ocserv/ocserv2。conf文件并添加自定义配置。完成后,启动第二个ocserv服务。 sudo systemctl启动ocserv2 收尾 就这样!我希望本教程能帮助您在Ubuntu 20.04上安装和配置OpenConnect VPN。和往常一样,如果你觉得这篇文章很有用,那么订阅我们的免费时事通讯以获得更多提示和窍门?

    2022.03.23 浏览:1053
  • 使用Let's Encrypt在Ubuntu 18.04/16.04上设置OpenConnect VPN服务器(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服务器&amp;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。和往常一样,如果你觉得这篇文章很有用,那么订阅我们的免费时事通讯以获得更多提示和窍门?

    2022.03.23 浏览:556
  • 在Debian 10 Buster上设置OpenConnect VPN服务器(ocserv)

    本教程将向您展示如何通过在Debian 10 Buster上安装OpenConnect VPN服务器来运行自己的VPN服务器。OpenConnect VPN服务器,又名ocserv,是Cisco AnyConnnect VPN协议的开源实现,广泛应用于企业和大学。AnyConnect是一种基于SSL的VPN协议,允许单个用户连接到远程网络。 为什么要设置自己的VPN服务器? 也许你是VPN服务提供商或系统管理员,这就要求你设置自己的VPN服务器。 你不信任VPN服务提供商的禁止登录策略,所以你选择了自主机路径。 您可以使用VPN来实施网络安全策略。例如,如果您运行自己的电子邮件服务器,则可以通过在防火墙中创建IP地址白名单,要求用户仅从VPN服务器的IP地址登录。因此,您的电子邮件服务器经过加固以防止黑客活动。 也许你只是想知道VPN服务器是如何工作的。 OpenConnect VPN服务器的功能 轻便快速。在我的测试中,我可以通过OpenConnect VPN观看YouTube 4K视频。YouTube在我的国家(中国)被屏蔽。 在Linux和大多数BSD服务器上运行。 与Cisco AnyConnect客户端兼容 有针对Linux、macOS、Windows和OpenWRT的OpenConnect客户端软件。对于Android和iOS,您可以使用Cisco AnyConnect客户端。 支持密码身份验证和证书身份验证 支持RADIUS记帐。 易于设置 我特别喜欢这样一个事实:与其他VPN技术相比,最终用户使用OpenConnect VPN非常简单方便。每当我在我的计算机上安装Linux发行版,并想快速解锁网站或隐藏我的IP地址时,我就会安装OpenConnect客户端,只需两行命令即可连接到服务器: sudo apt install openconnect sudo openconnect -b vpn.mydomain.com 此外,还有用于Fedora、RHEL、CentOS、Arch Linux和OpenSUSE的OpenConnect VPN客户端。您可以使用软件包管理器轻松安装它。 sudo dnf install openconnect sudo yum install openconnect sudo pacman -S openconnect 要求 要学习本教程,您需要一个VPS(虚拟专用服务器),可以自由访问被屏蔽的网站(在您的国家或互联网过滤系统之外)。我推荐Kamatera VPS,其特点是: 30天免费试用。 起价为每月4美元(1GB内存) 基于KVM的高性能VPS 世界各地的9个数据中心,包括美国、加拿大、英国、德国、荷兰、香港和ISRALL。 按照下面链接的教程在Kamatera创建Linux VPS服务器。 如何在Kamatera上创建Linux VPS服务器 一旦你有了一个运行Debian 10 buster的VPS,请按照下面的说明操作。 您还需要一个域名来为OpenConnect VPN启用HTTPS。我从namescape注册了我的域名,因为价格低廉,而且他们终身免费保护whois的隐私。 步骤1:在Debian 10 Buster上安装OpenConnect VPN服务器 通过SSH登录Debian 10 Buster服务器。然后使用apt从Debian存储库安装ocserv包。 sudo apt update 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 提示:如果上述命令没有立即退出,您可以按Q键重新控制终端。 如果它没有运行,则可以从以下内容开始: sudo systemctl start ocserv 默认情况下,OpenConnect VPN服务器监听TCP和UDP端口443。如果web服务器正在使用它,则VPN服务器无法启动。稍后我们将在OpenConnect VPN配置文件中看到如何更改端口。 如果你的服务器上有防火墙,那么你需要打开端口80和443。例如,如果使用UFW,则运行以下命令。 sudo ufw allow 80/tcp sudo ufw allow 443/tcp 第2步:在Debian 10 Buster服务器上安装Let's Encrypt Client(Certbot) 与ocserv一起安装的gnutls bin包提供了创建您自己的CA和服务器证书的工具,但我们将获取并安装Let's Encrypt certificate。使用Let’s Encrypt证书的优点是,它是免费的,更容易设置,并且受VPN客户端软件的信任。 运行以下命令在Debian 10上安装Let's Encrypt client(certbot)。 sudo apt install certbot 要检查版本号,请运行 certbot --version 样本输出: certbot 0.31.0 步骤3:从Let's Encrypt获取受信任的TLS证书 我建议使用standalone或webroot插件来获取TLS证书。 独立插件 如果Debian 10 Buster服务器上没有运行web服务器,并且您希望OpenConnect VPN服务器使用端口443,那么您可以使用独立插件从Let's Encrypt获取TLS证书。为vpn设置DNS记录。你的地盘。com,然后运行以下命令以获取证书。 sudo certbot certonly --standalone --preferred-challenges http --agree-tos --email [email protected] -d vpn.example.com 说明: certonly:获取证书,但不要安装它。 --standalone:使用standalone插件获取证书 --首选挑战http:执行http-01挑战以验证我们的域,该域将使用端口80。 --同意:同意让我们加密服务条款。 --电子邮件:电子邮件地址用于帐户注册和恢复。 -d:指定你的域名。 从下面的截图可以看出,我成功地获得了证书。 使用webroot插件 如果Debian 10 Buster服务器的web服务器监听端口80和443,那么最好使用webroot插件来获取证书,因为webroot插件几乎适用于所有web服务器,我们不需要在web服务器中安装证书。 首先,您需要为vpn创建一个虚拟主机。实例通用域名格式。 阿帕奇 如果您使用的是Apache web服务器,则在/etc/apache2/sites available/目录下创建虚拟主机。 sudo nano /etc/apache2/sites-available/vpn.example.com.conf 并将以下行粘贴到文件中。 <VirtualHost *:80> ServerName vpn.example.com DocumentRoot /var/www/ocserv </VirtualHost> 保存并关闭文件。然后创建web根目录。 sudo mkdir /var/www/ocserv 将www数据(Apache用户)设置为web根目录的所有者。 sudo chown www-data:www-data /var/www/ocserv -R 启用此虚拟主机。 sudo a2ensite vpn.example.com 重新加载Apache以使更改生效。 sudo systemctl reload apache2 创建并启用虚拟主机后,运行以下命令以获取使用webroot插件加密证书。 sudo certbot certonly --webroot --agree-tos --email [email protected] -d vpn.example.com -w /var/www/ocserv/ Nginx 如果您使用的是Nginx web服务器,那么在/etc/Nginx/conf.d/下创建虚拟主机。 sudo nano /etc/nginx/conf.d/vpn.example.com.conf 将以下行粘贴到文件中。 server { listen 80; server_name vpn.example.com; root /var/www/ocserv/; location ~ /.well-known/acme-challenge { allow all; } } 保存并关闭文件。然后创建web根目录。 sudo mkdir /var/www/ocserv 将www数据(Nginx用户)设置为web根目录的所有者。 sudo chown www-data:www-data /var/www/ocserv -R 重新加载Nginx以使更改生效。 sudo systemctl reload nginx 创建并启用虚拟主机后,运行以下命令以获取使用webroot插件加密证书。 sudo certbot certonly --webroot --agree-tos --email [email protected] -d vpn.example.com -w /var/www/ocserv/ 第4步:编辑OpenConnect VPN服务器配置文件 编辑ocserv配置文件。 sudo nano /etc/ocserv/ocserv.conf 首先,配置密码身份验证。默认情况下,通过PAM(可插拔认证模块)进行密码认证是启用的,这允许您使用Debian系统帐户从VPN客户端登录。可以通过注释掉以下行来禁用此行为。 auth = "pam[gid-min=1000]" 如果我们希望用户使用单独的VPN帐户而不是系统帐户登录,我们需要添加以下行以启用密码文件的密码身份验证。 auth = "plain[passwd=/etc/ocserv/ocpasswd]" 编辑完这个配置文件后,我们将看到如何使用ocpasswd工具生成/etc/ocserv/ocpasswd文件,其中包含用户名和编码密码的列表。 注意:Ocserv支持客户端证书身份验证,但我们来加密它不会颁发客户端证书。如果要启用证书身份验证,则需要设置自己的CA以颁发客户端证书。 接下来,如果您不想让ocserv使用TCP和UDP端口443(有一个web服务器使用端口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 然后,设置客户端的最大数量。默认值为128。设置为零表示无限。 max-clients = 128 设置用户可以同时登录的设备数量。默认值为2。设置为零表示无限。 max-same-clients = 2 默认情况下,keepalive数据包每300秒(5分钟)发送一次。我更喜欢使用短时间(30秒)来减少VPN连接中断的机会。 keepalive = 30 接下来,找到下面这行。将false更改为true以启用MTU发现。 try-mtu-discovery = false 您可以通过以下两个参数设置在断开连接之前允许客户端保持空闲的时间。如果您希望客户端无限期地保持连接,那么请注释掉这两个参数。 idle-timeout=1200 mobile-idle-timeout=1800 之后,将默认域设置为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 = 8.8.4.4 或者Cloudflare的公共DNS服务器。 dns = 1.1.1.1 dns = 1.0.0.1 注意:如果您是VPN服务提供商,最好运行自己的DNS解析器。如果在同一台服务器上运行DNS解析程序,请将DNS指定为 dns = 10.10.10.1 10.10.10.1是VPN LAN中OpenConnect VPN服务器的IP地址。这将稍微加快客户端的DNS查找,因为VPN服务器和DNS解析程序之间的网络延迟已消除。 然后注释掉所有路由参数(在下面几行的开头添加#字符),这将把服务器设置为客户端的默认网关。 #route = 10.0.0.0/8 #route = 172.16.0.0/12 #route = 192.168.0.0/16 #route = fd00::/8 #route = default #no-route = 192.168.5.0/255.255.255.0 保存并关闭文件,然后重新启动VPN服务器,以使更改生效。 sudo systemctl restart ocserv 第5步:创建VPN帐户 现在使用ocpasswd工具生成VPN帐户。 sudo ocpasswd -c /etc/ocserv/ocpasswd username 系统将要求您为用户设置密码,信息将保存到/etc/ocserv/ocpasswd文件中。要重置密码,只需再次运行上述命令。 步骤6:在Linux内核中启用IP转发 为了让VPN服务器在VPN客户端和Internet之间路由数据包,我们需要启用IP转发。编辑sysctl。conf文件。 sudo nano /etc/sysctl.conf 在该文件末尾添加以下行。 net.ipv4.ip_forward = 1 保存并关闭文件。然后使用下面的命令应用更改。p选项将从/etc/sysctl加载sysctl设置。conf文件。此命令将在系统重新启动时保留所做的更改。 sudo sysctl -p 第7步:在防火墙中配置IP伪装 我们需要在服务器防火墙中设置IP伪装,以便服务器成为VPN客户端的虚拟路由器。我将使用UFW,它是iptables防火墙的前端。在Debian上安装UFW时使用: sudo apt install ufw 首先,需要允许SSH通信。 sudo ufw allow 22/tcp 接下来,找到服务器主网络接口的名称。 ip addr 正如你所看到的,在我的Debian服务器上它的名字是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 你可以看到化装规则。 UFW处理防火墙规则可能需要一些时间。如果伪装规则未显示,则再次重新启动UFW(sudo systemctl restart UFW)。 步骤8:打开防火墙中的443端口 运行以下命令打开TCP和UDP端口443。如果您为ocserv配置了不同的端口,则将443更改为您配置的端口。 sudo ufw allow 443/tcp sudo ufw allow 443/udp 现在,OpenConnect VPN服务器已准备好接受客户端连接。 对于运行本地DNS解析程序的用户,如果指定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; }; 如何在Debian 10 Buster桌面上安装和使用OpenConnect VPN客户端 运行以下命令在Debian桌面上安装OpenConnect VPN命令行客户端。 sudo apt install openconnect 您可以从下面的命令行连接到VPN-b标志将使其在连接建立后在后台运行。 sudo openconnect -b vpn.example.com 默认情况下,openconnect客户端将联系服务器的端口443。如果为服务器配置了其他端口,则可以添加端口号。 sudo openconnect -b vpn.example.com:port-number 您将被要求输入VPN用户名和密码。如果成功建立连接,您将看到以下消息。 Got CONNECT response: HTTP/1.1 200 CONNECTED CSTP connected. DPD 60, Keepalive 300 Connected as 10.10.10.139, using SSL + LZ4, with DTLS + LZ4 in progress Continuing in background; pid 17050 如果连接失败,可以查看ocserv日志以了解原因。(可能您没有正确输入密码。) sudo journaltcl -eu ocserv 要停止连接,请运行: 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 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' KillSignal=SIGINT Restart=always RestartSec=2 [Install] WantedBy=multi-user.target 保存并关闭文件。然后启用此服务,使其在引导时启动。 sudo systemctl enable openconnect.service 文件内容说明: After=网络在线。目标和需求=网络在线。目标使此服务在网络启动后运行。 实际上,这项服务仍然可以在网络开通之前运行。如果服务失败,我们添加Restart=always和RestartSec=2以在2秒后重新启动该服务。 Systemd无法识别管道重定向。因此,在ExecStart指令中,我们将命令用单引号括起来,并使用Bash shell运行它。 由于OpenConnect VPN客户端将作为在后台运行的systemd服务运行,因此不需要在OpenConnect命令中添加-b标志。 当发出systemctl stop openconnect命令时,KillSignal指令告诉Systemd发送SIGINT信号。这将通过注销会话、恢复DNS服务器设置和Linux内核路由表来执行完全关闭。 要立即启动此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,请查看以下教程。请注意,您需要在ocserv中禁用DTL,否则TCP BBR将无法工作。 如何通过启用TCP BBR轻松提升Debian网络性能 在我的测试中,启用TCP BBR的标准TLS比DTL快两倍。 影响速度的另一个非常重要的因素是本地计算机和VPN服务器之间的连接有多好。如果你住在中东和VPN服务器位于美国,速度将是缓慢的。选择一个离你住的地方近的数据中心。 自动续订让我们加密证书 编辑root用户的crontab文件。 sudo crontab -e 在文件末尾添加以下行以每天运行Cron作业。如果证书将在30天后过期,certbot将尝试续订证书。VPN服务器需要重新启动ocserv服务才能获取新的证书和密钥文件。 @daily certbot renew --quiet && systemctl restart ocserv 故障排除提示 请注意,如果您使用的是OpenVZ VPS,请确保在VPS控制面板中启用TUN虚拟网络设备。(如果你使用Kamatera VPS,那么你有基于KVM的VPS,所以你不必担心这一点。) 如果遇到任何问题,请查看OpenConnect VPN服务器日志。 sudo journalctl -eu 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服务器&amp;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:-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只接受TLS1.3和TLS1.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.0 这意味着,在user1连接到此VPN服务器后,只有到10.10.10.0/24网络的流量将通过VPN服务器路由。到其他IP地址的流量通过原始网关路由。这被称为分裂隧道,在以下情况下非常有用: 您只希望VPN客户端能够浏览内部资源,而不希望所有流量都通过VPN服务器。 你需要为云服务器构建一个专用网络。 客户端需要连接到多个VPN。一个VPN可以使用拆分隧道,另一个使用完整隧道。 保存并关闭文件。重新启动ocserv以使更改生效。 如何运行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 收尾 就这样!我希望本教程能帮助您在Debian 10 Buster服务器上安装和配置OpenConnect VPN。和往常一样,如果你觉得这篇文章很有用,那么订阅我们的免费时事通讯以获得更多提示和窍门。当心?

    2022.03.23 浏览:1862
  • 运行OpenConnect VPN服务器;Apache/Nginx与HAProxy在同一个盒子上

    本教程将向您展示如何使用HAProxy在同一个设备上运行OpenConnect VPN服务器(ocserv)和Apache/Nginx。OpenConnect(ocserv)是Cisco AnyConnect VPN协议的开源实现。 先决条件 为了学习本教程,假设您已经使用Let's Encrypt TLS server证书设置了OpenConnect VPN服务器。如果没有,请遵循以下教程之一。 在Ubuntu20.04上用Let's Encrypt设置OpenConnect VPN服务器(ocserv) 使用Let's Encrypt在Ubuntu 16.04/18.04上设置OpenConnect VPN服务器(ocserv) 使用Let's Encrypt在Debian 10 Buster上设置OpenConnect VPN服务器(ocserv) 使用Let's Encrypt在CentOS 8/RHEL 8上设置OpenConnect VPN服务器(ocserv) 使OpenConnect VPN服务器和web服务器同时使用端口443 默认情况下,OpenConnect VPN服务器监听端口443。如果您已经让Apache/Nginx监听端口443,那么ocserv无法绑定到端口443。您可以将ocserv配置为在另一个端口上侦听,但这将要求最终用户在客户端软件中指定端口,如果您关心用户体验,应该避免使用该端口。此外,TCP端口443上的TLS流量通常在QoS(服务质量)方面享有更高的优先级,因此您将有更好的速度。 通常一个端口只能由一个进程使用。但是,我们可以使用HAproxy(高可用性代理)和SNI(服务器名称指示)使ocserv和Apache/Nginx同时使用端口443。 Ocserv配置 首先,编辑ocserv配置文件。 sudo nano /etc/ocserv/ocserv.conf 取消对以下行的注释。这将允许ocserv获取客户端IP地址,而不是HAproxy IP地址。 listen-proxy-proto = true 然后找到下面一行。 #listen-host = [IP|HOSTNAME] 换成 listen-host = 127.0.0.1 这将使ocserv监听127.0.0.1,因为稍后HAproxy将需要监听公共IP地址。保存并关闭文件。然后重启ocserv。 sudo systemctl restart ocserv 接下来,我们还需要让web服务器只监听本地主机,而不是监听公共IP地址。 Nginx配置 如果使用Nginx,请编辑服务器块文件。 sudo nano /etc/nginx/conf.d/example.com.conf 在SSL服务器块中,找到以下指令。 listen 443 ssl; 换成 listen 127.0.0.2:443 ssl; 这一次我们让它在127.0.0.2:443上收听,因为127.0.0.1:443已经被ocserv占用。保存并关闭文件。Nginx主配置文件/etc/Nginx/Nginx。conf和默认的server block/etc/nginx/sites enabled/default可能包括一个默认的虚拟主机监听443,所以您可能也需要编辑这个文件。 然后重新启动Nginx。 sudo systemctl restart nginx Apache配置 如果使用Apache web服务器,请编辑虚拟主机文件。 Debian/Ubuntu sudo nano /etc/apache2/sites-enabled/example.com.conf 森托斯/瑞尔 sudo nano /etc/httpd/conf.d/example.com.conf 在SSL虚拟主机中,更改 <VirtualHost *:443> 到 <VirtualHost 127.0.0.2:443> 这一次我们让它在127.0.0.2:443上收听,因为127.0.0.1:443已经被ocserv占用。保存并关闭文件。 然后编辑/etc/apache2/端口。Debian/Ubuntu上的conf文件。 sudo nano /etc/apache2/ports.conf 编辑/etc/httpd/conf.d/ssl。CentOS/RHEL上的conf文件。 sudo nano /etc/httpd/conf.d/ssl.conf 改变 Listen 443 到 Listen 127.0.0.2:443 保存并关闭文件。重启Apache。 sudo systemctl restart apache2 或 sudo systemctl restart httpd 单倍体构型 现在安装HAproxy。 sudo apt install haproxy 或 sudo dnf install haproxy 开始HAProxy sudo systemctl start haproxy 编辑配置文件。 sudo nano /etc/haproxy/haproxy.cfg 如果使用Nginx,请将以下行复制并粘贴到文件末尾。将12.34.56.78替换为服务器的公共IP地址。替换vpn。实例com和ocserv和www.example使用的域名。com与您的web服务器使用的域名。 frontend https bind 12.34.56.78:443 mode tcp tcp-request inspect-delay 5s tcp-request content accept if { req_ssl_hello_type 1 } use_backend ocserv if { req_ssl_sni -i vpn.example.com } use_backend nginx if { req_ssl_sni -i www.example.com } use_backend nginx if { req_ssl_sni -i example.com } default_backend ocserv backend ocserv mode tcp option ssl-hello-chk # pass requests to 127.0.0.1:443. Proxy protocol (v2) header is required by ocserv. server ocserv 127.0.0.1:443 send-proxy-v2 backend nginx mode tcp option ssl-hello-chk server nginx 127.0.0.2:443 check 如果使用Apache,请将以下行复制并粘贴到文件末尾。将12.34.56.78替换为服务器的公共IP地址。替换vpn。实例com和ocserv和www.example使用的域名。com与您的web服务器使用的域名。 frontend https bind 12.34.56.78:443 mode tcp tcp-request inspect-delay 5s tcp-request content accept if { req_ssl_hello_type 1 } use_backend ocserv if { req_ssl_sni -i vpn.example.com } use_backend apache if { req_ssl_sni -i www.example.com } use_backend apache if { req_ssl_sni -i example.com } default_backend ocserv backend ocserv mode tcp option ssl-hello-chk # pass requests to 127.0.0.1:443. Proxy protocol (v2) header is required by ocserv. server ocserv 127.0.0.1:443 send-proxy-v2 backend apache mode tcp option ssl-hello-chk server apache 127.0.0.2:443 check 保存并关闭文件。然后重启HAproxy。 sudo systemctl restart haproxy 在上面的配置中,我们利用TLS中的SNI(服务器名称指示)功能来区分VPN流量和正常HTTPS流量。 当vpn。实例com位于TLS客户端Hello,HAProxy将流量重定向到ocserv后端。 当www.example。com位于TLS客户端Hello,HAProxy将流量重定向到apache/nginx后端。 如果客户端没有在TLS client Hello中指定服务器名称,那么HAproxy将使用默认后端(ocserv)。 您可以使用openssl工具测试此设置。首先,多次运行以下命令。 echo | openssl s_client -connect your-server-IP:443 | grep subject 我们没有在上面的命令中指定服务器名称,因此HAproxy将始终将请求传递到默认后端(ocserv),其证书将发送到客户端。接下来,运行以下两个命令。 echo | openssl s_client -servername www.example.com -connect your-server-IP:443 | grep subject echo | openssl s_client -servername vpn.example.com -connect your-server-IP:443 | grep subject 现在,我们在命令中指定了服务器名称,因此HAproxy将根据我们定义的SNI规则传递请求。请注意,Cisco AnyConnect应用程序不支持TLS SNI,因此最好在HAProxy配置文件中将ocserv设置为默认后端。 为您的网站续订Let's Encrypt证书时,建议您使用http-01质询而不是tls-alpn-01质询,因为HAproxy正在侦听公共IP地址的端口443,因此它可能会干扰续订过程。 sudo certbot renew --preferred-challenges http-01 修正单极性误差 如果您的Apache/Nginx网站没有显示在浏览器中,而您在haproxy日志(/var/log/haproxy.log)中看到以下消息 Server nginx/nginx is DOWN, reason: Socket error, info: "Connection reset by peer backend nginx has no server available! Layer6 invalid response 可能是您的后端Nginx web服务器正在使用带有OCSP扩展的TLS证书。Nginx不会在第一个HTTP请求时发送OCSP订书钉信息。要使其正常工作,请确保在Nginx虚拟主机配置中添加解析程序,如下所示。 { .... ssl_trusted_certificate /etc/letsencrypt/live/www.example.com/chain.pem; ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8; .... } 保存并关闭文件。然后重新启动Nginx。 sudo systemctl restart nginx 此外,考虑删除HAproxy后端服务器的健康检查。所以改变 server nginx 127.0.0.2:443 check 到 server nginx 127.0.0.2:443 保存并关闭文件。然后重启HAproxy。 sudo systemctl restart haproxy 如何使用HAProxy在ocserv中启用IPv6 首先,为vpn创建AAAA记录。实例因此,当您在ocserv中完成IPv6设置后,DNS记录应该传播到Internet。 测试IPv6连接 要在IPv6协议中建立VPN隧道,请确保VPN服务器具有公共IPv6地址。(VPN客户端不必具有公共IPv6地址。)要找到答案,请运行以下命令。 ip addr 找到主网络接口。如果你能找到iNet 6。。。。范围全局行,如下图所示,则您有一个公共IPv6地址。带有作用域链接的inet6地址是专用IPv6地址。 那就去https://test-ipv6.com/检查你的IPv6连接。如果VPN客户端有一个公共IPv6地址,它可能会告诉您,您的VPN只保护一个协议,而不是两个协议。那是因为我们没有在ocserv中启用IPv6。 在ocserv中启用IPv6 要在ocserv中启用IPv6,请编辑ocserv配置文件。 sudo nano /etc/ocserv/ocserv.conf 找到下面两行并取消注释,这样VPN客户端将获得专用IPv6地址。 ipv6-network = fda9:4efe:7e3b:03ea::/48 ipv6-subnet-prefix = 64 如果你看到下面这行 ipv6-network = fda9:4efe:7e3b:03ea::/64 请将其更改为: ipv6-network = fda9:4efe:7e3b:03ea::/48 保存并关闭文件。重新启动ocserv以使更改生效。 sudo systemctl restart ocserv 为IPv6启用IP转发 然后我们需要在Linux内核中为IPv6启用IP转发。编辑sysctl。conf文件。 sudo nano /etc/sysctl.conf 在该文件末尾添加以下行。 net.ipv6.conf.all.forwarding=1 保存并关闭文件。然后使用下面的命令应用更改。 sudo sysctl -p 在防火墙中设置IPv6(Debian、Ubuntu) 接下来,我们需要在UFW防火墙中设置IPv6伪装,以便服务器成为VPN客户端的虚拟路由器。 sudo nano /etc/ufw/before6.rules 默认情况下,过滤器表有一些规则。在该文件末尾添加以下行。将ens3替换为您自己的网络接口名称。在Nano文本编辑器中,按Ctrl+W,然后按Ctrl+V,可以转到文件的末尾。 # 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 默认情况下,UFW禁止数据包转发。我们可以允许我们的专用IPv6网络进行转发。在该文件中找到ufw6 before forward链,并添加以下3行,如果源IP或目标IP在fda9:4efe:7e3b:03ea::/48范围内,这3行将接受数据包转发。 # allow forwarding for VPN -A ufw6-before-forward -s fda9:4efe:7e3b:03ea::/48 -j ACCEPT -A ufw6-before-forward -d fda9:4efe:7e3b:03ea::/48 -j ACCEPT 保存并关闭文件。我们还需要在防火墙的输入链中允许IPv6 VPN客户端。 sudo ufw allow in from fda9:4efe:7e3b:03ea::/48 重新启动UFW以使更改生效。 sudo systemctl restart ufw 现在,如果使用以下命令列出NAT表的后路由链中的规则: sudo ip6tables -t nat -L POSTROUTING 你可以看到化装规则。 断开当前VPN连接,为VPN添加AAAA记录。实例com并重新建立VPN连接。那就去https://test-ipv6.com/检查你的IPv6连接。 在防火墙中设置IPv6(CentOS) 为IPv6启用伪装。 sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv6" source address="fda9:4efe:7e3b:03ea::/48" masquerade' 允许在输入链中使用VPN客户端。 sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv6" source address="fda9:4efe:7e3b:03ea::/48" accept' 重新加载firewalld以使更改生效。 sudo systemctl reload firewalld 在绑定解析器中配置IPv6 如果在VPN服务器上运行自己的绑定DNS解析器,可以在/etc/ocserv/ocserv中添加以下行。conf文件,将VPN服务器设置为VPN客户端的DNS解析程序。 dns = fda9:4efe:7e3b::1 保存并关闭文件。要在IPv6中查询DNS名称,我们需要将BIND配置为允许IPv6 VPN客户端。 Debian/Ubuntu 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 bind9 森托斯 sudo nano /etc/named.conf 找到allow query参数并将其更改为: allow-query { 127.0.0.1; 10.10.10.0/24; fda9:4efe:7e3b:03ea::/48; }; 保存并关闭文件。重新启动BIND9。 sudo systemctl restart named 在HAProxy中设置IPv6 编辑HAProxy配置文件。 sudo nano /etc/haproxy/haproxy.cfg 让https前端同时监听IPv4和IPv6地址。显然,您需要使用自己服务器的公共IPv6地址。 frontend https bind 12.34.56.78:443 bind 2607:f8b0:4006:810::200e:443 mode tcp tcp-request inspect-delay 5s tcp-request content accept if { req_ssl_hello_type 1 } 然后找到ocserv后端并添加IPv6服务器。 backend ocserv mode tcp option ssl-hello-chk server ocserv 127.0.0.1:443 send-proxy-v2 server ocserv6 [::1]:443 send-proxy-v2 保存并关闭文件。 要使ocserv同时在127.0.0.1和::1上侦听,请编辑/etc/hosts文件。 sudo nano /etc/hosts 编辑127.0.0.1和::1的条目,如下所示,这样vpn。实例com主机名可以解析为两个地址。 127.0.0.1 localhost vpn.example.com ::1 ip6-localhost ip6-loopback vpn.example.com 保存并关闭文件。然后编辑ocserv配置文件。 sudo nano /etc/ocserv/ocserv.conf 找到下面这行。 listen-host = 127.0.0.1 换成 listen-host  = vpn.example.com ocserv将查找vpn的IPv4和IPv6地址。实例com,并绑定到127.0.0.1和::1地址。保存并关闭文件。然后重启ocserv和HAProxy sudo systemctl restart ocserv sudo systemctl restart haproxy 现在运行以下命令来检查ocserv的监听状态。您将看到它同时在127.0.0.1和::1上收听。 sudo ss -lnpt | grep ocserv 测试IPv6连接 重新启动VPN客户端并转到https://test-ipv6.com/检查你的IPv6连接。如果一切顺利,您应该在测试结果中看到VPN服务器的IPv4和IPv6地址。“VPN只保护一个协议”的警告应该消失。 如果在测试结果中看不到VPN服务器的IPv6地址,可能需要重新启动VPN客户端并重新建立VPN连接。 注意:VPN客户端不必具有公共IPv6地址。它可以通过IPv4 VPN隧道使用IPv6。 收尾 我希望本教程能帮助您在同一台机器上运行OpenConnect VPN服务器和Apache/Nginx。和往常一样,如果你觉得这篇文章很有用,那么订阅我们的免费时事通讯以获得更多提示和窍门。当心?

    2022.03.24 浏览:1843