跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / SUSE Linux Enterprise Desktop 文档 / 安全和强化指南 / 网络安全性 / 配置 VPN 服务器
适用范围 SUSE Linux Enterprise Desktop 15 SP5

24 配置 VPN 服务器

现今,互联网连接费用低廉,几乎在任何地方都可以上网,但并非所有连接都是安全的。利用虚拟专用网 (VPN),您可以在不安全的网络(例如互联网或 Wi-Fi)内创建安全网络。VPN 可通过不同的方式实现,并用于多种目的。本章重点介绍如何实施 OpenVPN 来通过安全广域网 (WAN) 链接各分支办公室。

24.1 概念概述

本节定义了 VPN 相关的一些术语,并简要概述了一些方案。

24.1.1 术语

端点

隧道的两:源客户端和目标客户端。

Tap 设备

Tap 设备可模拟以太网设备(OSI 模型中的第 2 层包,例如以太网帧)。Tap 设备用于创建网桥,可处理以太网帧。

Tun 设备

Tun 设备可模拟点对点网络(OSI 模型中的第 3 层包,例如 IP 包)。Tun 设备用于路由,可处理 IP 帧。

隧道

通过主公共网络链接两个位置。从技术角度看,隧道是客户端设备与服务器设备之间的连接。隧道经过加密,但按定义它确实需要加密。

24.1.2 VPN 方案

每当您设置 VPN 连接时,您的 IP 包就会通过安全隧道传输。隧道可以使用 tuntap 设备。这些设备是虚拟网络内核驱动程序,用于实现以太网帧或 IP 帧/包的传输。

任何用户空间程序(例如 OpenVPN)都可以将自身挂接到 tun 或 tap 设备,以接收操作系统发送的包。该程序还可以向此类设备写入包。

设置和构建 VPN 连接的解决方案有许多。本节重点介绍 OpenVPN 软件包。不像其他 VPN 软件,OpenVPN 可在两种模式下运行:

路由式 VPN

路由是可设置的简易解决方案。它的效率比桥接式 VPN 更高,缩放能力更强。此外,它允许用户调整 MTU(最大传输单元)以提高效率。但在异构环境中,如果您的网关上没有 Samba 服务器,NetBIOS 广播不会正常工作。如果您需要 IPv6,两端上 tun 设备的驱动程序必须显式支持此协议。图 24.1 “路由式 VPN”中描绘了此方案。

路由式 VPN
图 24.1︰ 路由式 VPN
桥接式 VPN

桥接是更复杂的解决方案。如果您需要在不设置 Samba 或 WINS 服务器的情况下通过 VPN 浏览 Windows 文件共享,则建议使用桥接。使用非 IP 协议(例如 IPX)或依赖于网络广播的应用程序也需要用到桥接式 VPN。但是,桥接式 VPN 的效率比路由式 VPN 要低。另一项劣势是它的缩放能力不强。下列插图描绘了此方案。

桥接式 VPN - 方案 1
图 24.2︰ 桥接式 VPN - 方案 1
桥接式 VPN - 方案 2
图 24.3︰ 桥接式 VPN - 方案 2
桥接式 VPN - 方案 3
图 24.4︰ 桥接式 VPN - 方案 3

桥接与路由之间的主要差别在于,路由式 VPN 无法进行 IP 广播,而桥接式 VPN 则可以。

24.2 设置简单测试方案

在以下示例中,我们将创建一个点对点 VPN 隧道。该示例说明如何在一个客户端与某个服务器之间创建 VPN 隧道。假设您的 VPN 服务器使用私用 IP 地址(例如 IP_OF_SERVER),客户端使用 IP 地址 IP_OF_CLIENT。请确保选择的地址与其他 IP 地址不冲突。

警告
警告:仅用于测试

下面的方案仅为示例,旨在帮助您熟悉 VPN 技术。请勿使用此示例作为真实方案,因为它可能会损害 IT 基础架构的安全性。

提示
提示:配置文件的名称

为了简化 OpenVPN 配置文件的处理,我们建议采取以下做法:

  • 将 OpenVPN 配置文件放在目录 /etc/openvpn 中。

  • 将配置文件命名为 MY_CONFIGURATION.conf

  • 如果有多个文件属于同一配置,请将这些文件放在某个子目录(例如 /etc/openvpn/MY_CONFIGURATION)中。

24.2.1 配置 VPN 服务器

要配置 VPN 服务器,请执行以下操作:

过程 24.1︰ VPN 服务器配置
  1. 在稍后要用作 VPN 服务器的计算机上安装 openvpn 软件包。

  2. 在外壳上,以 root 身份创建 VPN 机密密钥:

    # openvpn --genkey --secret /etc/openvpn/secret.key
  3. 将机密密钥复制到客户端:

    # scp /etc/openvpn/secret.key root@IP_OF_CLIENT:/etc/openvpn/
  4. 创建包含以下内容的 /etc/openvpn/server.conf 文件:

    dev tun
    ifconfig IP_OF_SERVER IP_OF_CLIENT
    secret secret.key
  5. 通过创建包含以下内容的 /etc/sysconfig/network/ifcfg-tun0 文件设置 tun 设备配置:

    STARTMODE='manual'
    BOOTPROTO='static'
    TUNNEL='tun'
    TUNNEL_SET_OWNER='nobody'
    TUNNEL_SET_GROUP='nobody'
    LINK_REQUIRED=no
    PRE_UP_SCRIPT='systemd:openvpn@server'
    PRE_DOWN_SCRIPT='systemd:openvpn@service'

    openvpn@server 标记指向 /etc/openvpn/server.conf 中的 OpenVPN 服务器配置文件。有关详细信息,请参见/usr/share/doc/packages/openvpn/README.SUSE

  6. 如果您使用防火墙,请启动 YaST 并打开 UDP 端口 1194(安全和用户 › 防火墙 › 允许的服务)。

  7. 通过将 tun 设备设置为 up 启动 OpenVPN 服务器服务:

    > sudo wicked ifup tun0

    此时应会看到确认消息:

    tun0            up

24.2.2 配置 VPN 客户端

要配置 VPN 客户端,请执行以下操作:

过程 24.2︰ VPN 客户端配置
  1. 在客户端 VPN 计算机上安装 openvpn 软件包。

  2. 创建包含以下内容的 /etc/openvpn/client.conf

    remote DOMAIN_OR_PUBLIC_IP_OF_SERVER
    dev tun
    ifconfig IP_OF_CLIENT IP_OF_SERVER
    secret secret.key

    请将第一行中的占位符 IP_OF_CLIENT 替换为服务器的域名或公共 IP 地址。

  3. 通过创建包含以下内容的 /etc/sysconfig/network/ifcfg-tun0 文件设置 tun 设备配置:

    STARTMODE='manual'
    BOOTPROTO='static'
    TUNNEL='tun'
    TUNNEL_SET_OWNER='nobody'
    TUNNEL_SET_GROUP='nobody'
    LINK_REQUIRED=no
    PRE_UP_SCRIPT='systemd:openvpn@client'
    PRE_DOWN_SCRIPT='systemd:openvpn@client'
  4. 如果您使用防火墙,请按过程 24.1 “VPN 服务器配置”步骤 6 中所述启动 YaST 并打开 UDP 端口 1194。

  5. 通过将 tun 设备设置为 up 启动 OpenVPN 服务器服务:

    > sudo wicked ifup tun0

    此时应会看到确认消息:

    tun0            up

24.2.3 测试 VPN 示例方案

OpenVPN 成功启动后,使用以下命令测试 tun 设备的可用性:

ip addr show tun0

要校验 VPN 连接,请在客户端和服务器端使用 ping 来确定它们能否相互连接。从客户端 ping 服务器:

ping -I tun0 IP_OF_SERVER

从服务器 ping 客户端:

ping -I tun0 IP_OF_CLIENT

24.3 使用证书颁发机构设置 VPN 服务器

第 24.2 节 中的示例用于测试,但不可用于日常工作。本节说明如何构建一个同时允许多个连接的 VPN 服务器。此过程使用公共密钥基础架构 (PKI) 完成。PKI 由以下组件构成:服务器和每个客户端的一对公共密钥和私用密钥,以及一个用来为每个服务器证书和客户端证书签名的证书颁发机构 (CA)。

此设置涉及以下基本步骤:

24.3.1 创建证书

在可以建立 VPN 连接之前,客户端必须对服务器证书进行身份验证。相对地,服务器也必须对客户端证书进行身份验证。此过程称为相互身份验证

SUSE Linux Enterprise Desktop 不支持创建证书。以下内容假设您已在另一个系统上创建了 CA 证书、服务器证书和客户端证书。

服务器证书需要采用 PEM 格式,未加密的密钥需采用 PEM 格式。将 PEM 版本复制到 VPN 服务器上的 /etc/openvpn/server_crt.pem 中。未加密版本需要放入 /etc/openvpn/server_key.pem

客户端证书需采用 PKCS12(首选)或 PEM 格式。PKCS12 格式的证书需要包含 CA 链,并且需要复制到 /etc/openvpn/CLIENT.p12 中。如果您有包含 CA 链的 PEM 格式客户端证书,请将其复制到 /etc/openvpn/CLIENT.pem 中。如果您已将 PEM 证书分割成客户端证书 (*.ca)、客户端密钥 (*.key) 和 CA 证书 (*.ca),请将这些文件复制到每个客户端上的 /etc/openvpn/ 中。

CA 证书需复制到服务器和每个客户端上的 /etc/openvpn/vpn_ca.pem 中。

重要
重要:分割客户端证书

如果您要将客户端证书分割成客户端证书、客户端密钥和 CA 证书,需要在相应客户端上的 OpenVPN 配置文件中提供相应的文件名(请参见例 24.1 “VPN 服务器配置文件”)。

24.3.2 配置 VPN 服务器

/usr/share/doc/packages/openvpn/sample-config-files/server.conf 复制到 /etc/openvpn/ 作为配置文件的基础。然后根据需要对其进行自定义。

例 24.1︰ VPN 服务器配置文件
# /etc/openvpn/server.conf
port 1194 1
proto udp 2
dev tun0 3

# Security 4

ca    vpn_ca.pem
cert  server_crt.pem
key   server_key.pem

# ns-cert-type server 
remote-cert-tls client 5
dh   server/dh2048.pem 6

server 192.168.1.0 255.255.255.0 7
ifconfig-pool-persist /var/run/openvpn/ipp.txt 8

# Privileges 9
user nobody
group nobody

# Other configuration 10
keepalive 10 120
comp-lzo
persist-key
persist-tun
# status      /var/log/openvpn-status.tun0.log 11
# log-append  /var/log/openvpn-server.log 12
verb 4

1

OpenVPN 监听的 TCP/UDP 端口。需要在防火墙中打开该端口,具体请参见第 23 章 “掩蔽和防火墙。VPN 的标准端口为 1194,因此您通常可以将此设置保持不变。

2

协议 UDP 或 TCP。

3

Tun 或 tap 设备。有关两者的差异,请参见第 24.1.1 节 “术语”

4

以下行包含根服务器 CA 证书 (ca)、根 CA 密钥 (cert) 和服务器私用密钥 (key) 的相对或绝对路径。这些项是在第 24.3.1 节 “创建证书”中生成的。

5

要求基于 RFC3280 TLS 规则使用显式密钥和扩展密钥为对等证书签名。

6

Diffie-Hellman 参数。使用以下命令创建所需的文件:

openssl dhparam -out /etc/openvpn/dh2048.pem 2048

7

提供 VPN 子网。可通过 192.168.1.1 访问该服务器。

8

在给定文件中记录客户端及其虚拟 IP 地址的映射。当服务器关闭以及客户端(在重启动后)获取以前指派的 IP 地址时很有用。

9

出于安全原因,请以降级的特权运行 OpenVPN 守护程序。为此,请指定应使用组和用户 nobody

10

多个配置选项 — 请参见示例配置文件中的注释:/usr/share/doc/packages/openvpn/sample-config-files

11

启用此选项可将包含统计数据的简短状态更新(操作状态转储)写入命名的文件。默认不会启用此选项。

所有输出将写入到可通过 journalctl 显示的系统日志中。如果您有多个配置文件(例如,一个在家里使用,一个在工作时使用),我们建议在文件名中包含设备名。这可以避免意外重写输出文件。在本例中,设备名是 tun0(取自 dev 指令)— 请参见3

12

默认情况下,日志消息将写入 syslog。去除井号字符可重写此行为。在这种情况下,所有消息将写入 /var/log/openvpn-server.log。不要忘记配置 logrotate 服务。有关更多详细信息,请参见man 8 logrotate

完成此配置后,可以在 /var/log/openvpn.log 下查看 OpenVPN 服务器的日志消息。首次启动此配置后,最后应会显示:

... Initialization Sequence Completed

如果未看到此消息,请仔细检查日志,确定其中是否有任何提示指出了配置文件中的错误。

24.3.3 配置 VPN 客户端

/usr/share/doc/packages/openvpn/sample-config-files/client.conf 复制到 /etc/openvpn/ 作为配置文件的基础。然后根据需要对其进行自定义。

例 24.2︰ VPN 客户端配置文件
# /etc/openvpn/client.conf
client 1
dev tun 2
proto udp 3
remote IP_OR_HOST_NAME 1194 4
resolv-retry infinite
nobind

remote-cert-tls server 5

# Privileges 6
user nobody
group nobody

# Try to preserve some state across restarts.
persist-key
persist-tun

# Security 7
pkcs12 client1.p12

comp-lzo 8

1

指定此计算机是客户端。

2

网络设备。客户端和服务器必须使用相同的设备。

3

协议。使用与服务器上相同的设置。

5

这是客户端的一个安全选项,确保客户端连接到的主机是指定的服务器。

4

请将占位符 IP_OR_HOST_NAME 替换为 VPN 服务器的相应主机名或 IP 地址。主机名后面提供了服务器端口。您可以设置指向不同 VPN 服务器的多行 remote 项。此设置可用来在不同 VPN 服务器之间进行负载平衡。

6

出于安全原因,请以降级的特权运行 OpenVPN 守护程序。为此,请指定应使用组和用户 nobody

7

包含客户端文件。出于安全原因,请为每个客户端单独使用一对文件。

8

开启压缩。请仅在服务器上也启用了压缩时,才使用此参数。

24.4 更多信息

有关使用 NetworkManager 设置 VPN 连接的详细信息,请参见第 31.3.5 节 “NetworkManager 和 VPN”

有关 VPN 的详细信息,请参见:

  • https://openvpn.net:OpenVPN 主页

  • man openvpn

  • /usr/share/doc/packages/openvpn/sample-config-files/:不同方案的示例配置文件。

  • /usr/src/linux/Documentation/networking/tuntap.txt:用于安装 kernel-source 软件包。