本教程将向您展示如何通过在 CentOS 8/RHEL 8 上安装 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 VPN 服务器。
sudo openconnect -b vpn.mydomain.com
openconnect
客户端软件适用于 Debian、Ubuntu、Fedora、RHEL、CentOS、Arch Linux 和 OpenSUSE。您可以使用包管理器轻松安装它。
sudo apt install openconnect sudo dnf install openconnect sudo pacman -S openconnect
要求
要学习本教程,您需要一个可以自由访问被阻止网站(在您所在国家/地区或互联网过滤系统之外)的 VPS(虚拟专用服务器)。我推荐 Kamatera VPS,它具有以下特点:
30 天免费试用。
起价为 4 美元/月(1GB RAM)
基于KVM的高性能VPS
全球9个数据中心,包括美国、加拿大、英国、德国、荷兰、香港和以色列。
按照下面链接的教程在 Kamatera 创建 Linux VPS 服务器。
如何在 Kamatera 上创建 Linux VPS 服务器
一旦您拥有运行 CentOS 8 的 VPS,请按照以下说明操作。
您还需要一个域名才能为 OpenConnect VPN 启用 HTTPS。我从 NameCheap 注册了我的域名,因为价格低,而且他们终身免费提供 whois 隐私保护。
步骤 1:在 CentOS 8 上安装 OpenConnect VPN 服务器 (ocserv)
通过 SSH 登录 CentOS 8 服务器。然后运行以下命令从 EPEL 存储库安装 ocserv 包。
sudo dnf install epel-releasesudo dnf install ocserv
步骤 2:在防火墙中打开端口
CentOS 上的防火墙默认启用。通常将 ocserv 配置为监听 443 端口,因此运行以下命令打开 TCP 和 UDP 端口 443。
sudo firewall-cmd --permanent --add-port=443/tcp sudo firewall-cmd --permanent --add-port=443/udp
我们还需要打开 TCP 端口 80 以从 Let’s Encrypt 获取 TLS 证书。
sudo firewall-cmd --permanent --add-port=80/tcp
重新加载防火墙以使更改生效。
sudo systemctl reload firewalld
步骤3:在CentOS 8服务器上安装Let’s Encrypt客户端(Certbot)
与 ocserv 一起安装的 gnutls-utils 软件包提供了创建您自己的 CA 和服务器证书的工具,但我们将获取并安装 Let’s Encrypt 证书。使用 Let’s Encrypt 证书的优点是免费、易于设置且受 VPN 客户端软件信任。
运行以下命令在 CentOS 8 上安装 Let’s Encrypt 客户端 (certbot)。
sudo dnf install certbot
要检查版本号,请运行
certbot --version
示例输出:
certbot 1.14.0
第 4 步:从 Let’s Encrypt 获取受信任的 TLS 证书
我建议使用 standalone
或 webroot
插件来获取 TLS 证书。
独立插件
如果您的 CentOS 8 服务器上没有运行 Web 服务器,并且您希望 OpenConnect VPN 服务器使用端口 443,那么您可以使用独立插件从 Let’s Encrypt 获取 TLS 证书。在域名注册商的网站上设置 vpn.example.com
的 DNS A 记录,然后运行以下命令获取证书。
sudo certbot certonly --standalone --preferred-challenges http --agree-tos --email [email -d vpn.example.com
解释:
certonly
:获取证书但不安装它。--standalone
:使用standalone插件获取证书--preferred-challenges http
:执行 http-01 质询来验证我们的域,该域将使用端口 80。--agree-tos
:同意 Let’s Encrypt 服务条款。--email
:电子邮件地址,用于账户注册和恢复。-d
:指定您的域名。
从下面的截图可以看到,我成功获得了证书。
使用 webroot 插件
如果您的 CentOS 8 服务器有一个 Web 服务器侦听端口 80 和 443,那么最好使用 webroot 插件来获取证书,因为 webroot 插件几乎适用于每个 Web 服务器,我们不需要安装Web 服务器中的证书。
首先,您需要为 vpn.example.com
创建一个虚拟主机。
阿帕奇
如果您使用 Apache Web 服务器,请在 /etc/httpd/conf.d/
目录下创建虚拟主机。
sudo nano /etc/httpd/conf.d/vpn.example.com.conf
并将以下行粘贴到文件中。
<VirtualHost *:80> ServerName vpn.example.com DocumentRoot /var/www/html/</VirtualHost>
保存并关闭文件。重新加载 Apache 以使更改生效。
sudo systemctl reload httpd
创建并启用虚拟主机后,运行以下命令以使用 webroot 插件获取 Let’s Encrypt 证书。
sudo certbot certonly --webroot --agree-tos --email [email -d vpn.example.com -w /var/www/html/
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 /usr/share/nginx/html/; location ~ /.well-known/acme-challenge { allow all; } }
保存并关闭文件。重新加载 Nginx 以使更改生效。
sudo systemctl reload nginx
创建并启用虚拟主机后,运行以下命令以使用 webroot 插件获取 Let's Encrypt 证书。
sudo certbot certonly --webroot --agree-tos --email [email -d vpn.example.com -w /usr/share/nginx/html/
步骤 5:编辑 OpenConnect VPN 服务器配置文件
编辑 ocserv 配置文件。
sudo nano /etc/ocserv/ocserv.conf
首先,配置密码认证。默认情况下,启用通过 PAM(可插拔身份验证模块)的密码身份验证,这允许您使用 CentOS 系统帐户从 VPN 客户端登录。可以通过注释掉以下行来禁用此行为。
auth = "pam"
如果我们希望用户使用单独的VPN帐户而不是系统帐户登录,我们需要添加以下行以使用密码文件启用密码验证。
auth = "plain[passwd=/etc/ocserv/ocpasswd]"
编辑完此配置文件后,我们将看到如何使用 ocpasswd 工具生成 /etc/ocserv/ocpasswd
文件,其中包含用户名和编码密码的列表。
注意:Ocserv 支持客户端证书身份验证,但 Let’s Encrypt 不颁发客户端证书。如果要启用证书认证,则需要设置自己的CA来颁发客户端证书。
接下来,找到以下两行。
tcp-port = 443udp-port = 443
注释掉 UDP 端口。 (我们将使用 TCP BBR 算法来提高 TCP 速度。)
tcp-port = 443 #udp-port = 443
如果您不希望 ocserv 使用 TCP 端口 443(有使用端口 443 的 Web 服务器?),则更改 TCP 端口号。否则就不要管它。
然后找到以下两行。我们需要改变它们。
server-cert = /etc/pki/ocserv/public/server.crtserver-key = /etc/pki/ocserv/private/server.key
将默认设置替换为 Let’s Encrypt 服务器证书和服务器密钥文件的路径。
server-cert = /etc/letsencrypt/live/vpn.example.com/fullchain.pemserver-key = /etc/letsencrypt/live/vpn.example.com/privkey.pem
建议启用 LZ4 压缩,因此取消注释以下行。
compression = true
然后,设置最大客户端数。默认值为 16。设置为零表示无限制。
max-clients = 0
设置用户可以同时登录的设备数量。默认值为 2。设置为零表示无限制。
max-same-clients = 0
默认情况下,保活数据包每 32400 秒(9 小时)发送一次。我更喜欢使用较短的时间(30秒)来减少VPN连接丢失的机会。
keepalive = 30
接下来,找到以下行。将 false
更改为 true
以启用 MTU 发现,这可以优化 VPN 性能。
try-mtu-discovery = true
您可以通过以下两个参数设置客户端在断开连接之前允许保持空闲的时间。如果您希望客户端无限期地保持连接,请注释掉这两个参数。
idle-timeout=1200mobile-idle-timeout=2400
之后,将默认域设置为vpn.example.com
。
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-network
的值更改为10.10。 10.0
。
ipv4-network = 10.10.10.0ipv4-netmask = 255.255.255.0
找到以下两行并取消注释,这样 VPN 客户端就会获得私有 IPv6 地址。
ipv6-network = fda9:4efe:7e3b:03ea::/48ipv6-subnet-prefix = 64
如果您看到以下行
ipv6-network = fda9:4efe:7e3b:03ea::/64
请更改为:
ipv6-network = fda9:4efe:7e3b:03ea::/48
现在取消注释以下行以通过 VPN 传输所有 DNS 查询。
tunnel-all-dns = true
更改 DNS 解析器地址。您可以使用 Google 的公共 DNS 服务器。
dns = 8.8.8.8dns = 8.8.4.4
或 Cloudflare 的公共 DNS 服务器。
dns = 1.1.1.1dns = 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.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
最后,向下滚动到文件末尾(在 Nano 文本编辑器中,您可以按 Ctrl+W
转到文件末尾,然后按 Ctrl+V
),并注释掉 user-profile
参数,因为 iOS 和 Android 上的 OpenConnect 客户端或 Cisco AnyConnect 客户端不需要用户配置文件 XML 文件。
#user-profile = profile.xml
注意:如果启用用户配置文件,iOS 上的 Cisco AnyConnect 客户端在连接到 OpenConnect VPN 服务器时将产生以下错误。
Failed to download the AnyConnect profile. Please try again.
保存并关闭文件。
第6步:创建VPN帐户
现在使用 ocpasswd 工具生成 VPN 帐户。
sudo ocpasswd -c /etc/ocserv/ocpasswd username
系统将要求您为用户设置密码,该信息将保存到 /etc/ocserv/ocpasswd
文件中。要重置密码,只需再次运行上述命令即可。
现在我们可以启动 ocserv 服务了。
sudo systemctl start ocserv
并启用开机自动启动功能。
sudo systemctl enable ocserv
您可以通过以下方式检查其状态:
systemctl status ocserv
示例输出:
● ocserv.service - OpenConnect SSL VPN server Loaded: loaded (/usr/lib/systemd/system/ocserv.service; enabled; vendor preset: disabled) Active: active (running) since Fri 2020-01-03 19:04:53 CST; 15s ago Docs: man:ocserv(8) Main PID: 19851 (ocserv-main) Tasks: 2 (limit: 5061) Memory: 3.2M CGroup: /system.slice/ocserv.service ├─19851 ocserv-main └─19853 ocserv-sm
提示:如果上述命令没有立即退出,您可以按 Q 键重新获得对终端的控制权。
默认情况下,OpenConnect VPN 服务器侦听 TCP 和 UDP 端口 443。如果 Web 服务器正在使用它,则 VPN 服务器无法启动。稍后我们将看到如何使 OpenConnect VPN 服务器和 Web 服务器使用相同的端口。
第7步:在Linux内核中启用IP转发
为了使 VPN 服务器能够在 VPN 客户端和 Internet 之间路由数据包,我们需要通过运行以下命令来启用 IP 转发。
echo "net.ipv4.ip_forward = 1" | sudo tee /etc/sysctl.d/60-custom.conf
另外,运行以下两个命令启用 TCP BBR 算法以提高 TCP 速度。
echo "net.core.default_qdisc=fq" | sudo tee -a /etc/sysctl.d/60-custom.confecho "net.ipv4.tcp_congestion_control=bbr" | sudo tee -a /etc/sysctl.d/60-custom.conf
然后使用以下命令应用更改。 -p 选项将从 /etc/sysctl.d/60-custom.conf 文件加载 sysctl 设置。该命令将在系统重新启动后保留我们的更改。
sudo sysctl -p /etc/sysctl.d/60-custom.conf
步骤 8:在防火墙中配置 IP 伪装
运行以下命令在服务器防火墙中启用 10.10.10.0/24
子网的 IP 伪装。
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.10.10.0/24" masquerade' sudo systemctl reload firewalld
这将对外界隐藏您的 VPN 网络。因此互联网只能看到您的 VPN 服务器的 IP,而看不到您的 VPN 客户端的 IP,就像您的家庭路由器隐藏您的私人家庭网络一样。
现在 OpenConnect VPN 服务器已准备好接受客户端连接。
在 CentOS 8/Fedora 桌面上安装和使用 OpenConnect VPN 客户端
运行以下命令在 Fedora 桌面上安装 OpenConnect VPN 命令行客户端。
sudo dnf install openconnect
在 CentOS 8 上,您需要启用 EPEL 存储库才能安装客户端。
sudo dnf install epel-releasesudo dnf 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 90, Keepalive 32400Connected as 10.10.10.139, using SSL + lz4 Continuing in background; pid 2137Established DTLS connection (using GnuTLS). Ciphersuite (DTLS1.2)-(PSK)-(AES-256-GCM).
如果连接失败,您可以检查ocserv日志找出原因。 (可能是你没有输入正确的密码。)
sudo journaltcl -eu ocserv
要停止连接,请运行:
sudo pkill openconnect
要以非交互方式运行客户端,请使用以下语法。
echo -n password | sudo openconnect -b vpn.example.com -u username --passwd-on-stdin
如果您成功连接到VPN服务器,但您的公共IP地址没有改变,那是因为IP转发或IP伪装不起作用。
系统启动时自动连接
为了使 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=network-online.target
和Wants=network-online.target
使该服务在网络启动后运行。实际上,该服务在网络恢复之前仍然可以运行。我们添加
Restart=always
和RestartSec=2
以便在该服务失败时在 2 秒后重新启动该服务。Systemd 无法识别管道重定向。因此,在 ExecStart 指令中,我们将命令用单引号括起来,并使用 Bash shell 运行它。
由于 OpenConnect VPN 客户端将作为在后台运行的 systemd 服务运行,因此无需向
openconnect
命令添加-b
标志。KillSignal
指令告诉 Systemd 在发出systemctl stop openconnect
命令时发送SIGINT
信号。这将通过注销会话并恢复 DNS 服务器设置和 Linux 内核路由表来执行干净关闭。
要立即启动此 Systemd 服务,请运行
sudo systemctl start openconnect
要停止此 Systemd 服务,请运行
sudo systemctl stop openconnect
适用于 Windows 和 MacOS 的 OpenConnect GUI 客户端
它们可以从 OpenConnect GUI Github 页面下载。
速度
OpenConnect VPN 速度相当快。我可以用它在 YouTube 上观看 4k 视频。如您所见,连接速度为 63356 Kbps,即 61 Mbit/s。
这是 speedtest.net 上的测试结果。
速度优化
OpenConnect 默认使用 TLS over UDP 协议 (DTLS) 来实现更快的速度,但 UDP 无法提供可靠的传输。 TCP 比 UDP 慢,但可以提供可靠的传输。我可以给您的一项优化技巧是禁用 DTLS,使用标准 TLS(通过 TCP),然后启用 TCP BBR 来提高 TCP 速度。
您可能还想禁用 DTLS 以绕过防火墙限制,因为 DTLS 使用 UDP 端口 443。标准 TLS 使用 TCP 端口 443。
要禁用 DTLS,请在 ocserv 配置文件中注释掉以下行(在开头添加 # 符号)。
udp-port = 443
保存并关闭文件。然后重新启动 ocserv 服务。
sudo systemctl restart ocserv.service
要启用 TCP BBR,请查看以下教程。它是为 Ubuntu 编写的,但也适用于 CentOS。请注意,您需要在 ocserv 中禁用 DTLS,否则 TCP BBR 将无法工作。
如何通过启用 TCP BBR 轻松提升服务器网络性能
在我的测试中,启用 TCP BBR 的标准 TLS 比 DTLS 快两倍。
影响速度的另一个非常重要的因素是本地计算机和 VPN 服务器之间的连接情况。如果您住在中东并且VPN服务器位于美国,速度会很慢。选择靠近您居住地的数据中心。
自动续订 Let's Encrypt 证书
编辑 root 用户的 crontab 文件。
sudo crontab -e
在文件末尾添加以下行以每天运行 Cron 作业。如果证书将在 30 天后过期,certbot 将尝试续订证书。需要重新启动 ocserv 服务,VPN 服务器才能获取新的证书和密钥文件。
@daily certbot renew --quiet && systemctl restart ocserv
故障排除技巧
请注意,如果您使用 OpenVZ VPS,请确保在 VPS 控制面板中启用 TUN 虚拟网络设备。 (如果您使用Vultr 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 无法工作的线索。
如果您成功连接到VPN服务器,但无法浏览互联网,那是因为IP转发或IP伪装不起作用。
此系统上未安装 Tap-Windows 适配器
如果您使用 OpenConnect GUI Windows 客户端并在日志(查看 - 日志窗口)中发现“此系统上未安装 Tap-Windows 适配器”错误,这可能是因为您安装了其他 VPN 客户端后来就像OpenVPN。
要修复此错误,您需要卸载 OpenConnect GUI 客户端并重新安装。在安装向导中,您可以选择安装 TAP 驱动程序。
使 OpenConnect VPN 服务器和 Web 服务器同时使用端口 443
请阅读以下文章:
使用 HAProxy 在同一台机器上运行 OpenConnect VPN 服务器和 Apache/Nginx
如何在 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,请将其替换为:
tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-RSA:-VERS-SSL3.0:-ARCFOUR-128:-VERS-TLS1.0:-VERS-TLS1.1"
保存并关闭文件。然后重新启动 ocserv。
sudo systemctl restart ocserv
现在 ocserv 将仅接受 TLS 1.3 和 TLS 1.2。有关在 ocserv 中配置 TLS 参数的更多信息,请参阅 GnuTLS 优先级字符串。
要检查 OpenConnect VPN 服务器是否支持 TLS 1.0,请运行以下命令。
openssl s_client -connect vpn.your-domain.com:443 -tls1
并检查 TLS 1.1
openssl s_client -connect vpn.your-domain.com:443 -tls1_1
如果您在输出中看到以下消息,则表示不支持 TLS 版本。
New, (NONE), Cipher is (NONE) Secure Renegotiation IS NOT supported
每用户或每组配置
Ocserv 允许按用户和按组进行配置。要启用此功能,请取消注释 /etc/ocserv/ocserv.conf
文件中的以下两行。
config-per-user = /etc/ocserv/config-per-user/config-per-group = /etc/ocserv/config-per-group/
保存并关闭文件。然后创建每个用户和每个组的配置目录。
sudo mkdir /etc/ocserv/config-per-user/sudo mkdir /etc/ocserv/config-per-group/
接下来,您可以在这两个目录下创建一个文件。例如,创建 user1
文件以允许对 user1
进行自定义配置。
sudo nano /etc/ocserv/config-per-user/user1
您还可以创建 group1
文件以允许对名为 group1
的组进行自定义配置。
sudo nano /etc/ocserv/config-per-group/group1
您可以在文件中添加如下内容。
route = 10.10.10.0/255.255.255.0
这意味着 user1
连接到此 VPN 服务器后,只有到 10.10.10.0/24
网络的流量将通过 VPN 服务器路由。到其他 IP 地址的流量将通过原始网关路由。这称为分割隧道,在以下情况下很有用:
您只希望 VPN 客户端能够浏览内部资源,而不希望所有流量都经过 VPN 服务器。
您需要为云服务器构建私有网络。
客户端需要连接多个VPN。一个 VPN 可以使用分割隧道,另一个则使用完整隧道。
保存并关闭文件。重新启动 ocserv 以使更改生效。
如何设置 VPN 中继
假设有两台服务器:服务器A和服务器B。
您与服务器 A 的连接良好。延迟非常低,并且没有丢包。
您与服务器 B 的连接很差。延迟很高并且有数据包丢失。
服务器A和服务器B之间的连接良好。
当然,您想在服务器 A 上安装 VPN。但是如果您希望 Internet 看到您的流量来自服务器 B 的 IP 地址,该怎么办?那么,您可以在服务器 B 上安装 ocserv VPN,然后在服务器 A 上设置 HAProxy 来代理您的计算机和服务器 B 之间的流量。
在服务器 A 上安装 HAProxy。
sudo dnf install haproxy
编辑主配置文件。
sudo nano /etc/haproxy/haproxy.cfg
像以前一样创建前端和后端。将 12.34.56.78 替换为服务器 A 的公共 IP 地址。将 12.34.56.79 替换为服务器 B 的公共 IP 地址。
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 } default_backend ocserv backend ocserv mode tcp option ssl-hello-chk server ocserv 12.34.56.79:443 send-proxy-v2
保存并关闭文件。在服务器 B 上,您应该像以前一样将 ocserv 配置为侦听公共 IP 地址并启用代理协议。之后,编辑vpn.example.com的A记录。它应该指向服务器A的IP地址。
重新启动 HAProxy 和 Ocserv,它应该可以工作。
注意:如果服务器 B 也使用 HAProxy,则应删除上述 HAProxy 配置中的
send-proxy-v2
参数。
虚拟主机
要在ocserv中添加新的虚拟主机,首先需要使用步骤4中的方法为新的虚拟主机获取TLS证书。然后编辑ocserv配置文件。
sudo nano /etc/ocserv/ocserv.conf
转到此文件的底部。在 Nano 文本编辑器中,您可以按 Ctrl+W
,然后按 Ctrl+V
跳转到文件底部。添加以下行。将 vpn2.example.com
替换为第二个虚拟主机的主机名。
[vhost:vpn2.example.com]#Allow password authentication and certificate authenticationenable-auth = "plain[passwd=/etc/ocserv/ocpasswd]"auth = "certificate"tcp-port = 443#uncomment the two lines if ocserv runs behind HAProxy.#listen-host = 127.0.0.1#listen-proxy-proto = true# SSL/TLS configurationca-cert = /etc/ocserv/ssl/ca-cert.pemserver-cert = /etc/letsencrypt/live/vpn2.example.com/fullchain.pemserver-key = /etc/letsencrypt/live/vpn2.example.com/privkey.pemcert-user-oid = 0.9.2342.19200300.100.1.1#Networking configuration. Use a different network range for this virtual host. device = vpnsipv4-network = 10.10.20.0ipv4-netmask = 255.255.255.0route = defaultdns = 8.8.8.8tunnel-all-dns = truecompression = truemax-clients = 0max-same-clients = 0try-mtu-discovery = trueidle-timeout=1200mobile-idle-timeout=2400config-per-user = /etc/ocserv/config-per-user/config-per-group = /etc/ocserv/config-per-group/
保存并关闭文件。然后重新启动 ocserv。
sudo systemctl restart ocserv
请注意,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 进程。这很简单。将 /usr/lib/systemd/system/ocserv.service
复制到新文件。
sudo cp /usr/lib/systemd/system/ocserv.service /etc/systemd/system/ocserv2.service
然后编辑新文件。
sudo nano /etc/systemd/system/ocserv2.service
改变
/etc/ocserv/ocserv.conf
到
/etc/ocserv/ocserv2.conf
保存并关闭文件。接下来,您可以编辑 /etc/ocserv/ocserv2.conf
文件并添加自定义配置。完成后,启动第二个 ocserv 服务。
sudo systemctl start ocserv2
推荐本站淘宝优惠价购买喜欢的宝贝:
本文链接:https://sg.hqyman.cn/post/8625.html 非本站原创文章欢迎转载,原创文章需保留本站地址!
休息一下~~