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

20 配置 VPN 服务器

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

20.1 概念概述

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

20.1.1 术语

端点

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

Tap 设备

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

Tun 设备

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

隧道

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

20.1.2 VPN 方案

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

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

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

路由式 VPN

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

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

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

桥接式 VPN - 方案 1
图 20.2︰ 桥接式 VPN - 方案 1
桥接式 VPN - 方案 2
图 20.3︰ 桥接式 VPN - 方案 2
桥接式 VPN - 方案 3
图 20.4︰ 桥接式 VPN - 方案 3

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

20.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)中。

20.2.1 配置 VPN 服务器

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

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

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

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

    root # 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 服务器服务:

    tux > sudo wicked ifup tun0

    此时应会看到确认消息:

    tun0            up

20.2.2 配置 VPN 客户端

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

过程 20.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. 如果您使用防火墙,请按过程 20.1 “VPN 服务器配置”步骤 6 中所述启动 YaST 并打开 UDP 端口 1194。

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

    tux > sudo wicked ifup tun0

    此时应会看到确认消息:

    tun0            up

20.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

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

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

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

20.3.1 创建证书

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

SUSE Linux Enterprise Server 不支持创建证书。以下内容假设您已在另一个系统上创建了 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 配置文件中提供相应的文件名(请参见例 20.1 “VPN 服务器配置文件”)。

20.3.2 配置 VPN 服务器

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

例 20.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 端口。需要在防火墙中打开该端口,具体请参见第 19 章 “伪装和防火墙。VPN 的标准端口为 1194,因此您通常可以将此设置保持不变。

2

协议 UDP 或 TCP。

3

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

4

下面的行包含根服务器 CA 证书 (ca)、根 CA 密钥 (cert) 和服务器私用密钥 (key) 的相对或绝对路径。这些项是在第 20.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

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

20.3.3 配置 VPN 客户端

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

例 20.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

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

20.4 使用 YaST 设置 VPN 服务器或客户端

您还可以使用 YaST 来设置 VPN 服务器,但 YaST 模块不支持 OpenVPN,却提供对 IPsec 协议的支持(在软件 StrongSwan 中实现)。与 OpenVPN 一样,IPsec 是广受支持的 VPN 模式。

过程 20.3︰ 设置 IPsec 服务器
  1. 要启动 YaST VPN 模块,请选择应用程序 › VPN 网关和客户端

  2. 全局配置下,选中启用 VPN 守护程序

  3. 要创建新 VPN,请单击新建 VPN,然后输入连接名称。

  4. 类型下,选择网关(服务器)

  5. 然后选择方案:

    • 使用预共享密钥的安全通讯使用证书的安全通讯方案最适合 Linux 客户端设置。

    • 提供 Android、iOS、MacOS X 客户端的访问权方案会设置现代版本的 Android、iOS 和 macOS 原生支持的配置。此方案以使用附加用户名和口令身份验证的预共享密钥设置为基础。

    • 提供 Windows 7、Windows 8 客户端的访问权方案是 Windows 和 BlackBerry 设备原生支持的配置。此方案以使用附加用户名和口令身份验证的证书设置为基础。

    对于本示例,请选择使用预共享密钥的安全通讯

  6. 要指定密钥,请单击编辑身份凭证。选中显示密钥,然后键入机密密钥。单击确定进行确认。

  7. 提供以下项目的 VPN 客户端访问权下选择是否以及如何限制 VPN 内部的访问权限。要仅启用特定的 IP 范围,请在有限的 CIDR 中以 CIDR 格式指定这些范围并以逗号分隔。有关 CIDR 格式的详细信息,请参见 https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing

  8. 客户端的地址池下,指定 VPN 应向其客户端提供的 IP 地址的格式。

  9. 要完成该过程,请单击确定。现在,YaST VPN 模块会自动添加并启用防火墙规则,以允许客户端连接到新 VPN。

    要查看连接状态,请在随后的确认窗口中单击。然后,您将看到对 VPN 运行 systemctl status 后的输出,并可在其中检查 VPN 是否正在运行且已正确配置。

20.5 更多信息

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

  • http://www.openvpn.net:OpenVPN 主页

  • man openvpn

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

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