如何在 Ubuntu 22.04 上安装 OpenConnect VPN 服务器

2023年 5月 4日 96.9k 0

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-crtserver-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

如何在 Ubuntu 22.04 上安装 OpenConnect VPN 服务器
通过按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 服务器并使用命令行客户端连接到它的教程到此结束。如果您有任何问题,请在下面的评论中发表。

相关文章

服务器端口转发,带你了解服务器端口转发
服务器开放端口,服务器开放端口的步骤
产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
如何使用 WinGet 下载 Microsoft Store 应用
百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

发布评论