OpenConnect VPN aka ocserv是一种开源免费 VPN 解决方案,具有企业级性能和功能。它基于在企业行业广泛使用的 Cisco AnyConnect VPN 协议。在本教程中,您将学习如何在 Ubuntu 22.04 计算机上安装 OpenConnect VPN 服务器。您还将学习如何使用 OpenConnect 客户端连接到服务器。
先决条件
- 运行 Ubuntu 22.04 的服务器。
- 具有 sudo 权限的非根用户。
- 完全限定的域名 (FQDN),例如
vpn.example.com
. - 确保一切都已更新。
$ sudo apt update $ sudo apt upgrade
- 您的系统需要的软件包很少。
$ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -y
其中一些软件包可能已经安装在您的系统上。
第 1 步 - 配置防火墙
第一步是配置防火墙。Ubuntu 默认带有 ufw (Uncomplicated Firewall)。
检查防火墙是否正在运行。
$ sudo ufw status
您应该得到以下输出。
Status: inactive
允许 SSH 端口,以便防火墙在启用时不会中断当前连接。
$ sudo ufw allow OpenSSH
也允许 HTTP 和 HTTPS 端口。
$ sudo ufw allow http $ sudo ufw allow https
启用防火墙
$ sudo ufw enable 命令可能会中断现有的 ssh 连接。继续操作 (y|n)?是 防火墙处于活动状态并在系统启动时启用
再次检查防火墙的状态。
$ sudo ufw status
您应该会看到类似的输出。
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere 80/tcp ALLOW Anywhere 443 ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) 80/tcp (v6) ALLOW Anywhere (v6) 443 (v6) ALLOW Anywhere (v6)
第 2 步 - 安装 Git
第 3 步 - 安装 OpenConnect
Ubuntu 22.04 附带旧版本 (1.1.3) 的 OpenConnect。如果您对此感到满意,则可以使用以下命令安装它。
$ sudo apt install ocserv
但是,对于本教程,我们将安装最新版本 (1.1.6) 的 OpenConnect。为此,我们需要从源代码构建它。
安装构建源所需的依赖项。
$ sudo apt install -y libgnutls28-dev libev-dev libpam0g-dev liblz4-dev libseccomp-dev \ libreadline-dev libnl-route-3-dev libkrb5-dev libradcli-dev \ libcurl4-gnutls-dev libcjose-dev libjansson-dev libprotobuf-c-dev \ libtalloc-dev libhttp-parser-dev protobuf-c-compiler gperf \ nuttcp lcov libuid-wrapper libpam-wrapper libnss-wrapper \ libsocket-wrapper gss-ntlmssp haproxy iputils-ping freeradius \ gawk gnutls-bin iproute2 yajl-tools tcpdump autoconf automake
克隆ocserv Git 存储库。
$ git clone https://gitlab.com/openconnect/ocserv.git
切换到克隆的目录。
$ cd ocserv
生成配置脚本。
$ autoreconf -fvi
编译源代码。忽略任何已弃用的警告。
$ ./configure && make
安装 ocserv。
$ sudo make install
这些文件将安装到/usr/local/bin
和/usr/local/sbin
目录。复制 systemd 服务文件。
$ sudo cp doc/systemd/standalone/ocserv.service /etc/systemd/system/ocserv.service
打开服务文件进行编辑。
$ sudo nano /etc/systemd/system/ocserv.service
在以下行中更改 ocserv 二进制文件的路径
$ ExecStart=/usr/sbin/ocserv --foreground --pid-file /run/ocserv.pid --config /etc/ocserv/ocserv.conf
到以下。
$ ExecStart=/usr/local/sbin/ocserv --foreground --pid-file /run/ocserv.pid --config /etc/ocserv/ocserv.conf
通过按Ctrl + X并在出现提示时输入Y来保存文件。
重新加载系统守护进程。
$ sudo systemctl daemon-reload
第 4 步 - 生成 SSL 证书
我们需要安装 Certbot 来生成 SSL 证书。您可以使用 Ubuntu 的存储库安装 Certbot,也可以使用 Snapd 工具获取最新版本。我们将使用 Snapd 版本。
Ubuntu 22.04 默认安装了 Snapd。运行以下命令以确保您的 Snapd 版本是最新的。
$ sudo snap install core && sudo snap refresh core
安装 Certbot。
$ sudo snap install --classic certbot
使用以下命令确保可以通过创建/usr/bin
目录的符号链接来运行 Certbot 命令。
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
生成 SSL 证书时有两种可能性。如果您的系统上没有运行 Web 服务器,则可以使用独立方法生成证书。运行以下命令以使用 Certbot 的独立插件创建证书。
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m name@example.com -d vpn.example.com
上面的命令会将证书下载到/etc/letsencrypt/live/vpn.example.com
服务器上的目录中。
接下来,如果您的系统上运行着服务器,则可以使用 webroot 插件或 Nginx 或 Apache 插件(如果您正在使用它们)。对于 Nginx 或 Apache 服务器,您只需运行以下命令即可。
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m name@example.com -d vpn.example.com
或者
$ sudo certbot certonly --apache --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m name@example.com -d vpn.example.com
如果您有不同的服务器,那么我们将需要使用 webroot 插件。为此,创建 Web 根目录。
$ sudo mkdir -p /var/www/ocserv
将服务器设置为网站根目录的所有者。www-data
在我们的例子中,我们作为服务器用户 使用。
$ sudo chown www-data:www-data /var/www/ocserv -R
vpn.example.com
接下来,将您的服务器配置为在目录中为域提供服务/var/www/ocserv
。重新启动服务器。接下来,使用以下命令生成证书。
$ sudo certbot certonly --webroot --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m name@example.com -d vpn.example.com
检查 Certbot 更新计划程序服务。
$ sudo systemctl list-timers
您会发现snap.certbot.renew.service
作为计划运行的服务之一。
NEXT LEFT LAST PASSED UNIT ACTIVATES Wed 2023-04-19 10:31:47 UTC 2h 55min left Wed 2023-04-19 03:31:58 UTC 4h 3min ago ua-timer.timer ua-timer.service Wed 2023-04-19 12:02:42 UTC 4h 26min left Wed 2023-04-19 03:19:20 UTC 4h 16min ago motd-news.timer motd-news.service Wed 2023-04-19 18:19:56 UTC 10h left Wed 2023-04-19 07:19:52 UTC 16min ago apt-daily.timer apt-daily.service Wed 2023-04-19 22:51:00 UTC 15h left n/a n/a snap.certbot.renew.timer snap.certbot.renew.service
试运行该过程以检查 SSL 续订是否正常工作。
$ sudo certbot renew --dry-run
如果您没有看到任何错误,则一切就绪。您的证书将自动更新。
第 5 步 - 配置 OpenConnect
如果您使用 APT 安装 ocserv,那么配置文件应该已经在该位置可用/etc/ocserv/ocserv.conf
。但是如果你从源代码构建包,我们需要复制配置文件。
为配置文件创建目录。
$ sudo mkdir /etc/ocserv
复制配置文件。
$ sudo cp /home/username/ocserv/doc/sample.config /etc/ocserv/ocserv.conf
打开文件进行编辑。
$ sudo nano /etc/ocserv/ocserv.conf
将auth
参数值更改为以下内容。这将允许用户使用单独的 VPN 帐户。
auth = "plain[passwd=/etc/ocserv/ocpasswd]"
默认情况下,OpenConnect 使用 443 TCP 和 UDP 端口。我们将只使用 TCP 端口进行连接,因此,通过注释掉它来禁用 UDP 端口。
tcp-port = 443 #udp-port = 443
如果你有一个 web 服务器运行在 443 端口,那么通过改变值来改变 TCP 端口的值。
tcp-port = 8443
接下来,找到变量server-crt
并server-key
更改它们的值,如下所示。
server-cert = /etc/letsencrypt/live/vpn.example.com/fullchain.pem server-key = /etc/letsencrypt/live/vpn.example.com/privkey.pem
设置允许的最大客户端数。默认值为 16。设置为 0 表示无限制。
max-clients = 16
设置一个用户可以同时使用的设备数量。默认值为 2。设置为 0 表示无限制。
max-same-clients = 2
默认情况下,OpenConnect 每 9 小时(32400 秒)发送一次保活数据包。这个值太高了。将其设置为 60 秒以减少 VPN 连接断开的机会。
keepalive = 60
try-mtu-discovery
更改to的值true
以启用 MTU 发现。它可以优化 VPN 性能。
try-mtu-discovery = true
通过取消注释以下变量,配置允许客户端在断开连接之前保持空闲状态的时间。如果您希望客户端无限期保持连接,请保持原样。
idle-timeout=1200 mobile-idle-timeout=1800
设置 OpenConnect VPN 的默认域名。
default-domain = vpn.example.com
更改默认 IPv4 配置以避免 IP 地址冲突。我们将用作10.10.10.0
值。
ipv4-network = 10.10.10.0
取消注释以下行以通过 VPN 隧道传输所有 DNS 查询。
tunnel-all-dns = true
将 DNS 解析器更改为 Google DNS。还要添加第二个条目。
dns = 8.8.8.8 dns = 8.8.4.4
通过在其前面添加井号 (#) 符号来注释掉所有路由参数。
#route = 10.10.10.0/255.255.255.0 #route = 192.168.0.0/255.255.0.0 #route = fef4:db8:1000:1001::/64 #route = default # Subsets of the routes above that will not be routed by # the server. #no-route = 192.168.5.0/255.255.255.0
通过按Ctrl + X并在出现提示时输入Y来保存文件。
第 6 步 - 启动 OpenConnect 服务器
启动 OpenConnect VPN 服务器。
$ sudo systemctl start ocserv
检查服务的状态。
$ sudo systemctl status ocserv
您将获得类似的输出。
? ocserv.service - OpenConnect SSL VPN server Loaded: loaded (/etc/systemd/system/ocserv.service; disabled; vendor preset: enabled) Active: active (running) since Thu 2023-04-20 08:52:18 UTC; 2s ago Docs: man:ocserv(8) Main PID: 19965 (ocserv-main) Tasks: 2 (limit: 1026) Memory: 1.4M CPU: 9ms CGroup: /system.slice/ocserv.service ??19965 ocserv-main ??19966 ocserv-sm Apr 20 08:52:18 openconnect ocserv[19965]: note: skipping 'pid-file' config option Apr 20 08:52:18 openconnect ocserv[19965]: note: vhost:default: setting 'plain' as primary authentication method Apr 20 08:52:18 openconnect ocserv[19965]: error connecting to sec-mod socket '/var/run/ocserv-socket.a4413bc9': No such file or directory Apr 20 08:52:18 openconnect ocserv[19965]: note: setting 'file' as supplemental config option Apr 20 08:52:18 openconnect ocserv[19965]: listening (TCP) on 0.0.0.0:443... Apr 20 08:52:18 openconnect ocserv[19965]: listening (TCP) on [::]:443... Apr 20 08:52:18 openconnect ocserv[19966]: ocserv[19966]: sec-mod: reading supplemental config from files Apr 20 08:52:18 openconnect ocserv[19966]: sec-mod: reading supplemental config from files Apr 20 08:52:18 openconnect ocserv[19966]: ocserv[19966]: sec-mod: sec-mod initialized (socket: /var/run/ocserv-socket.a4413bc9.0) Apr 20 08:52:18 openconnect ocserv[19966]: sec-mod: sec-mod initialized (socket: /var/run/ocserv-socket.a4413bc9.0)
如果您看到有关连接到 的错误sec-mod socket
,请忽略它。这是正常的。如果找不到文件,它将初始化文件。
第 7 步 - 创建 VPN 帐户
您可以使用该实用程序创建 VPN 帐户ocpasswd
。运行以下命令创建一个新的 VPN 帐户。
$ sudo ocpasswd -c /etc/ocserv/ocpasswd username Enter password: Re-enter password:
密码将保存到/etc/ocserv/ocpasswd
文件中。要重置 的密码username
,请再次运行上述命令。使用不同的用户运行上述命令以创建另一个帐户。
第 8 步 - 启用 IP 转发
为了让 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.conf $ echo "net.ipv4.tcp_congestion_control=bbr" | sudo tee -a /etc/sysctl.d/60-custom.conf
使用以下命令使更改永久生效。
$ sudo sysctl -p /etc/sysctl.d/60-custom.conf
第 9 步 - 配置 IP 伪装
下一步是在防火墙中设置 IP 伪装,以便 VPN 服务器可以作为客户端的虚拟路由器。查找服务器主网络接口的名称。
$ ip addr
您将获得类似的输出。
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq state UP group default qlen 1000 link/ether 56:00:04:67:7e:79 brd ff:ff:ff:ff:ff:ff inet 95.179.138.135/23 metric 100 brd 95.179.139.255 scope global dynamic enp1s0 valid_lft 66999sec preferred_lft 66999sec inet6 2a05:f480:1400:2381:5400:4ff:fe67:7e79/64 scope global dynamic mngtmpaddr noprefixroute valid_lft 2591657sec preferred_lft 604457sec inet6 fe80::5400:4ff:fe67:7e79/64 scope link valid_lft forever preferred_lft forever
在我们的例子中,enp1s0
是接口的名称。通过打开它进行编辑,在 UFW 配置文件中添加 iptables 命令。
$ sudo nano /etc/ufw/before.rules
在文件末尾添加以下行。用您的网络接口替换enp1s0
代码。
# NAT table rules *nat :POSTROUTING ACCEPT [0:0] -A POSTROUTING -s 10.10.10.0/24 -o enp1s0 -j MASQUERADE # End each table with the 'COMMIT' line or these rules won't be processed COMMIT
在文件中找到以下行。
# ok icmp code for FORWARD -A ufw-before-forward -p icmp --icmp-type destination-unreachable -j ACCEPT -A ufw-before-forward -p icmp --icmp-type time-exceeded -j ACCEPT -A ufw-before-forward -p icmp --icmp-type parameter-problem -j ACCEPT -A ufw-before-forward -p icmp --icmp-type echo-request -j ACCEPT
在其后粘贴以下行。
# 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
通过按Ctrl + X并在出现提示时输入Y来保存文件。
重新启动防火墙。
$ sudo systemctl restart ufw
您可以使用以下命令检查 Masquerade 规则。
$ sudo iptables -t nat -L POSTROUTING
您将获得以下输出。
Chain POSTROUTING (policy ACCEPT) target prot opt source destination MASQUERADE all -- 10.10.10.0/24 anywhere
第 10 步 - 使用 OpenConnect 客户端连接
我们将在 Ubuntu 22.04 机器上安装 OpenConnect 客户端。运行以下命令安装客户端。
$ sudo apt install openconnect
接下来,使用以下命令连接到 VPN 服务器。该-b
标志使客户端在连接建立后在后台运行。
$ sudo openconnect -b vpn.example.com:443
系统将要求您输入 VPN 用户名和密码。输入在步骤 7 中创建的凭据。
POST https://vpn.example.com/ Connected to 95.179.138.135:443 SSL negotiation with vpn.example.com Connected to HTTPS on vpn.example.com with ciphersuite (TLS1.3)-(ECDHE-SECP256R1)-(ECDSA-SECP256R1-SHA256)-(AES-256-GCM) XML POST enabled Please enter your username. Username:navjot POST https://vpn.example.com/auth Please enter your password. Password: POST https://vpn.example.com/auth
您将在成功连接时看到以下输出。DTLS 被禁用是因为我们禁用了 UDP。
Got CONNECT response: HTTP/1.1 200 CONNECTED CSTP connected. DPD 90, Keepalive 60 No DTLS address Set up UDP failed; using SSL instead Configured as 192.168.1.13, with SSL connected and DTLS disabled Continuing in background; pid 1650
运行以下命令以停止连接。
$ sudo pkill openconnect
让我们为 OpenConnect 创建一些 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' KillSignal=SIGINT Restart=always RestartSec=2 [Install] WantedBy=multi-user.target
通过按Ctrl + X并在出现提示时输入Y来保存文件。
启用服务。
$ sudo systemctl enable openconnect.service
启动服务。
$ sudo systemctl start openconnect.service
要在您的 PC 从挂起状态恢复时自动重启您的 VPN 连接,您需要创建另一个 systemd 脚本。
创建并打开重启脚本进行编辑。
$ sudo nano /etc/systemd/system/openconnect-restart.service
将以下代码粘贴到其中。
[Unit] Description=Restart OpenConnect client when resuming from suspend After=suspend.target [Service] Type=simple ExecStart=/bin/systemctl --no-block restart openconnect.service [Install] WantedBy=suspend.target
通过按Ctrl + X并在出现提示时输入Y来保存文件。
启用服务。
$ sudo systemctl enable openconnect-restart.service
我们还可以创建一个服务,在 VPN 连接断开时自动重新启动它。创建并打开 VPN 检查服务进行编辑。
$ sudo nano /etc/systemd/system/openconnect-check.service
将以下代码粘贴到其中。
[Unit] Description=OpenConnect VPN Connectivity Checker After=openconnect.service [Service] Type=simple ExecStart=/bin/bash -c 'for ((; ; )) do (ping -c9 10.10.10.1 || systemctl restart openconnect) done' [Install] WantedBy=multi-user.target
通过按Ctrl + X并在出现提示时输入Y来保存文件。
启用并启动服务。
$ sudo systemctl enable enable openconnect-check.service --now
这将永远运行 ping 命令以检查 VPN 连接。如果掉线,它会自动重启 OpenConnect。
如果需要,您可以下载OpenConnect GUI 客户端。但是,它们已经有一段时间没有更新了。如果您想要更新的 GUI 客户端,您可以访问OpenConnect GUI GitLab 存储库并自行编译。
结论
我们关于在 Ubuntu 22.04 服务器上安装 OpenConnect VPN 服务器并使用命令行客户端连接到它的教程到此结束。如果您有任何问题,请在下面的评论中发表。