25.1 概念概述 #
本节定义了 VPN 相关的一些术语,并简要概述了一些方案。
25.1.1 术语 #
- 端点
隧道的两“端”:源客户端和目标客户端。
- Tap 设备
Tap 设备可模拟以太网设备(OSI 模型中的第 2 层包,例如以太网帧)。Tap 设备用于创建网桥,可处理以太网帧。
- Tun 设备
Tun 设备可模拟点对点网络(OSI 模型中的第 3 层包,例如 IP 包)。Tun 设备用于路由,可处理 IP 帧。
- 隧道
通过主公共网络链接两个位置。从技术角度看,隧道是客户端设备与服务器设备之间的连接。隧道通常会加密,但按定义它确实需要加密。
25.1.2 VPN 方案 #
每当您设置 VPN 连接时,您的 IP 包就会通过安全隧道传输。隧道可以使用 tun 或 tap 设备。这些设备是虚拟网络内核驱动程序,用于实现以太网帧或 IP 帧/包的传输。
任何用户空间程序(例如 OpenVPN)都可以将自身挂接到 tun 或 tap 设备,以接收操作系统发送的包。该程序还可以向此类设备写入包。
设置和构建 VPN 连接的解决方案有许多。本节重点介绍 OpenVPN 软件包。不像其他 VPN 软件,OpenVPN 可在两种模式下运行:
- 路由式 VPN
路由是可设置的简易解决方案。它的效率比桥接式 VPN 更高,缩放能力更强。此外,它允许用户调整 MTU(最大传输单元)以提高效率。但在异构环境中,如果您的网关上没有 Samba 服务器,NetBIOS 广播不会正常工作。如果您需要 IPv6,两端上 tun 设备的驱动程序必须显式支持此协议。图 25.1 “路由式 VPN”中描绘了此方案。
图 25.1︰ 路由式 VPN #- 桥接式 VPN
桥接是更复杂的解决方案。如果您需要在不设置 Samba 或 WINS 服务器的情况下通过 VPN 浏览 Windows 文件共享,则建议使用桥接。使用非 IP 协议(例如 IPX)或依赖于网络广播的应用程序也需要用到桥接式 VPN。但是,桥接式 VPN 的效率比路由式 VPN 要低。另一项劣势是它的缩放能力不强。下列插图描绘了此方案。
图 25.2︰ 桥接式 VPN - 方案 1 #图 25.3︰ 桥接式 VPN - 方案 2 #图 25.4︰ 桥接式 VPN - 方案 3 #
桥接与路由之间的主要差别在于,路由式 VPN 无法进行 IP 广播,而桥接式 VPN 则可以。
25.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
)中。
25.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
25.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'
如果您使用防火墙,请按过程 25.1 “VPN 服务器配置”的步骤 6 中所述启动 YaST 并打开 UDP 端口 1194。
通过将 tun 设备设置为
up
启动 OpenVPN 服务器服务:>
sudo
wicked ifup tun0
此时应会看到确认消息:
tun0 up
25.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
25.3 使用证书颁发机构设置 VPN 服务器 #
第 25.2 节 中的示例用于测试,但不可用于日常工作。本节说明如何构建一个同时允许多个连接的 VPN 服务器。此过程使用公共密钥基础结构 (PKI) 完成。PKI 由以下组件构成:服务器和每个客户端的一对公共密钥和私用密钥,以及一个用来为每个服务器证书和客户端证书签名的证书颁发机构 (CA)。
此设置涉及以下基本步骤:
25.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 配置文件中提供相应的文件名(请参见例 25.1 “VPN 服务器配置文件”)。
25.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 端口。需要在防火墙中打开该端口,具体请参见第 24 章 “掩蔽和防火墙”。VPN 的标准端口为 1194,因此您通常可以将此设置保持不变。 | |
协议 UDP 或 TCP。 | |
Tun 或 tap 设备。有关两者的差异,请参见第 25.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
如果未看到此消息,请仔细检查日志,确定其中是否有任何提示指出了配置文件中的错误。
25.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 守护程序。为此,请指定应使用组和用户 | |
包含客户端文件。出于安全原因,请为每个客户端单独使用一对文件。 | |
开启压缩。请仅在服务器上也启用了压缩时,才使用此参数。 |
25.4 使用 YaST 设置 VPN 服务器或客户端 #
您还可以使用 YaST 来设置 VPN 服务器,但 YaST 模块不支持 OpenVPN,却提供对 IPsec 协议的支持(在软件 StrongSwan 中实现)。与 OpenVPN 一样,IPsec 是广受支持的 VPN 模式。
要启动 YaST VPN 模块,请选择
› 。在
下,选中 。要创建新 VPN,请单击
,然后输入连接名称。在
下,选择 。然后选择方案:
对于本示例,请选择
。要指定密钥,请单击
。选中 ,然后键入机密密钥。单击 进行确认。在https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing。
下选择是否以及如何限制 VPN 内部的访问权限。要仅启用特定的 IP 范围,请在 中以 CIDR 格式指定这些范围并以逗号分隔。有关 CIDR 格式的详细信息,请参见在
下,指定 VPN 应向其客户端提供的 IP 地址的格式。要完成该过程,请单击
。现在,YaST VPN 模块会自动添加并启用防火墙规则,以允许客户端连接到新 VPN。要查看连接状态,请在随后的确认窗口中单击
。然后,您将看到对 VPN 运行systemctl status
后的输出,并可在其中检查 VPN 是否正在运行且已正确配置。
25.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
软件包。