24.1 概念概述 #
本节定义了与 VPN 相关的一些术语,并简要概述了一些方案。
24.1.1 术语 #
- 端点
- 隧道的两“端”:源客户端和目标客户端。 
- Tap 设备
- Tap 设备可模拟以太网设备(OSI 模型中的第 2 层包,例如以太网帧)。Tap 设备用于创建网桥,可处理以太网帧。 
- Tun 设备
- Tun 设备可模拟点对点网络(OSI 模型中的第 3 层包,例如 IP 包)。Tun 设备用于路由,可处理 IP 帧。 
- 隧道
- 通过主公共网络链接两个位置。从技术角度看,隧道是客户端设备与服务器设备之间的连接。隧道经过加密,但按定义它确实需要加密。 
24.1.2 VPN 方案 #
每当您设置 VPN 连接时,您的 IP 包就会通过安全隧道传输。隧道可以使用 tun 或 tap 设备。这些设备是虚拟网络内核驱动程序,用于实现以太网帧或 IP 帧/包的传输。
任何用户空间程序(例如 OpenVPN)都可以将自身挂接到 tun 或 tap 设备,以接收操作系统发送的包。该程序还可以向此类设备写入包。
设置和构建 VPN 连接的解决方案有许多。本节重点介绍 OpenVPN 软件包。不像其他 VPN 软件,OpenVPN 可在两种模式下运行:
- 路由式 VPN
- 路由是可设置的简易解决方案。它的效率比桥接式 VPN 更高,缩放能力更强。此外,它允许用户调整 MTU(最大传输单元)以提高效率。但在异构环境中,如果您的网关上没有 Samba 服务器,NetBIOS 广播不会正常工作。如果您需要 IPv6,两端上 tun 设备的驱动程序必须明确支持此协议。图 24.1 “路由式 VPN”中描绘了此方案。 图 24.1︰ 路由式 VPN #
- 桥接式 VPN
- 桥接是更复杂的解决方案。如果您需要在不设置 Samba 或 WINS 服务器的情况下通过 VPN 浏览 Windows 文件共享,则建议使用桥接。桥接 VPN 使用网络 TAP 设备模拟 VPN 端点之间的链路层,并在第 2 层传输以太网帧。因此可以使用非 IP 协议(例如 IPX)或依赖于网络广播的应用程序。但是,桥接式 VPN 的效率比路由式 VPN 要低。另一项劣势是它的缩放能力不强。下列插图描绘了此方案。 - 方案 1
- TAP 设备只能用于 VPN 端点本身。第 2 层 VPN 流量由服务器(机器 1)或客户端(机器 2)直接发起。 
- 方案 2
- 服务器端(机器 1)的 TAP 设备 - tap0被桥接到连接 LAN 1 的网络接口- eth1。通过网桥- br0到达- tap0的第 2 层流量将通过 VPN 网桥转发到客户端(机器 2)系统。
- 方案 3
- 在服务器(机器 1)和客户端(机器 2)两端,TAP 设备 - tap0都被桥接到本地网络接口- eth1。来自客户端网络 LAN 2 的第 2 层流量将被转发到服务器网络 LAN 1,反之亦然。
 图 24.2︰ 桥接式 VPN - 方案 1 #图 24.3︰ 桥接式 VPN - 方案 2 #图 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 服务器,请执行以下操作:
- 在稍后要用作 VPN 服务器的计算机上安装 - openvpn软件包。
- 在外壳上,以 - root身份创建 VPN 机密密钥:- #openvpn --genkey secret /etc/openvpn/secret.key
- 将机密密钥复制到客户端: - #scp /etc/openvpn/secret.key root@IP_OF_CLIENT:/etc/openvpn/
- 创建包含以下内容的 - /etc/openvpn/server.conf文件:- dev tun ifconfig IP_OF_SERVER IP_OF_CLIENT secret secret.key 
- 通过创建包含以下内容的 - /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。
- 如果您使用防火墙,请启动 YaST 并打开 UDP 端口 1194( › › )。 
- 通过将 tun 设备设置为 - up启动 OpenVPN 服务器服务:- >- sudo- wicked ifup tun0- 此时应会看到确认消息: - tun0 up 
24.2.2 配置 VPN 客户端 #
要配置 VPN 客户端,请执行以下操作:
- 在客户端 VPN 计算机上安装 - openvpn软件包。
- 创建包含以下内容的 - /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 地址。 
- 通过创建包含以下内容的 - /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' 
- 如果您使用防火墙,请按过程 24.1 “VPN 服务器配置”的步骤 6 所述启动 YaST 并打开 UDP 端口 1194。 
- 通过将 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 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 配置文件中提供相应的文件名(请参见例 24.1 “VPN 服务器配置文件”)。
24.3.2 配置 VPN 服务器 #
    将 /usr/share/doc/packages/openvpn/sample-config-files/server.conf 复制到 /etc/openvpn/ 作为配置文件的基础。然后根据需要对其进行自定义。
   
# /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
| OpenVPN 侦听的 TCP/UDP 端口。需要在防火墙中打开该端口,具体请参见第 23 章 “伪装和防火墙”。VPN 的标准端口为 1194,因此您可以将此设置保持不变。 | |
| 协议 UDP 或 TCP。 | |
| Tun 或 tap 设备。有关两者的差异,请参见第 24.1.1 节 “术语”。 | |
| 
      以下行包含根服务器 CA 证书 ( | |
| 要求依照 RFC3280 TLS 规则明确使用密钥和扩展密钥为对等证书签名。 | |
| Diffie-Hellman 参数。使用以下命令创建所需的文件: openssl dhparam -out /etc/openvpn/dh2048.pem 2048 | |
| 
      提供 VPN 子网。可通过  | |
| 在给定文件中记录客户端及其虚拟 IP 地址的映射。当服务器关闭以及客户端(在重启动后)获取以前分配的 IP 地址时很有用。 | |
| 
      出于安全原因,请以降级的特权运行 OpenVPN 守护程序。为此,请指定应使用组和用户  | |
|  多个配置选项 — 请参见示例配置文件中的注释: | |
| 启用此选项可将包含统计数据的简短状态更新(“操作状态转储”)写入命名的文件。默认不会启用此选项。 
      所有输出将写入到可通过  | |
| 
      默认情况下,日志消息将写入 syslog。去除井号字符可重写此行为。在这种情况下,所有消息将写入  | 
    完成此配置后,可以在 /var/log/openvpn.log 下查看 OpenVPN 服务器的日志消息。首次启动此配置后,最后应会显示:
   
... Initialization Sequence Completed
如果未看到此消息,请仔细检查日志,确定其中是否有任何提示指出了配置文件中的错误。
24.3.3 配置 VPN 客户端 #
    将 /usr/share/doc/packages/openvpn/sample-config-files/client.conf 复制到 /etc/openvpn/ 作为配置文件的基础。然后根据需要对其进行自定义。
   
# /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
| 指定此计算机是客户端。 | |
| 网络设备。客户端和服务器必须使用相同的设备。 | |
| 协议。使用与服务器上相同的设置。 | |
| 这是客户端的一个安全选项,确保客户端连接到的主机是指定的服务器。 | |
| 
       请将占位符 IP_OR_HOST_NAME 替换为 VPN 服务器的相应主机名或 IP 地址。主机名后面提供了服务器端口。您可以设置指向不同 VPN 服务器的多行  | |
| 
       出于安全原因,请以降级的特权运行 OpenVPN 守护程序。为此,请指定应使用组和用户  | |
| 包含客户端文件。出于安全原因,请为每个客户端单独使用一对文件。 | |
| 开启压缩。请仅在服务器上也启用了压缩时,才使用此参数。 | 
24.4 使用 YaST 设置 VPN 服务器或客户端 #
您还可以使用 YaST 来设置 VPN 服务器,但 YaST 模块不支持 OpenVPN,却提供对 IPsec 协议的支持(在软件 StrongSwan 中实现)。与 OpenVPN 一样,IPsec 是广受支持的 VPN 模式。
- 要启动 YaST VPN 模块,请选择 › 。 
- 在下,选中。 
- 要创建新 VPN,请单击,然后输入连接名称。 
- 在下,选择。 
- 然后选择方案: - 和方案最适合 Linux 客户端设置。 
- 方案会设置新版本的 Android、iOS 和 macOS 原生支持的配置。此方案以使用附加用户名和口令身份验证的预共享密钥设置为基础。 
- 方案是 Windows 和 BlackBerry 设备原生支持的配置。此方案以使用附加用户名和口令身份验证的证书设置为基础。 
 - 在本示例中选择。 
- 要指定密钥,请单击。选中,然后键入机密密钥。单击进行确认。 
- 在下选择是否以及如何限制 VPN 内部的访问权限。要仅启用特定的 IP 范围,请在 中以 CIDR 格式指定这些范围并以逗号分隔。有关 CIDR 格式的详细信息,请参见 https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing。 
- 在下,指定 VPN 应向其客户端提供的 IP 地址的格式。 
- 单击完成此过程。YaST VPN 模块会自动添加并启用防火墙规则,以允许客户端连接到新 VPN。 - 要查看连接状态,请在随后的确认窗口中单击。您会看到对 VPN 运行 - systemctl status后的输出,并可在其中检查 VPN 是否正在运行且已正确配置。
24.5 更多信息 #
有关 VPN 的详细信息,请参见:
- https://openvpn.net:OpenVPN 主页 
- man- openvpn
- /usr/share/doc/packages/openvpn/sample-config-files/:不同方案的示例配置文件。
- /usr/src/linux/Documentation/networking/tuntap.txt:用于安装- kernel-source软件包。



