20.1 概念概述 #
本节定义了 VPN 相关的一些术语,并简要概述了一些方案。
20.1.1 术语 #
- 端点
隧道的两“端”:源客户端和目标客户端。
- Tap 设备
Tap 设备可模拟以太网设备(OSI 模型中的第 2 层包,例如以太网帧)。Tap 设备用于创建网桥,可处理以太网帧。
- Tun 设备
Tun 设备可模拟点对点网络(OSI 模型中的第 3 层包,例如 IP 包)。Tun 设备用于路由,可处理 IP 帧。
- 隧道
通过主公共网络链接两个位置。从技术角度看,隧道是客户端设备与服务器设备之间的连接。隧道通常会加密,但按定义它确实需要加密。
20.1.2 VPN 方案 #
每当您设置 VPN 连接时,您的 IP 包就会通过安全隧道传输。隧道可以使用 tun 或 tap 设备。这些设备是虚拟网络内核驱动程序,用于实现以太网帧或 IP 帧/包的传输。
任何用户空间程序(例如 OpenVPN)都可以将自身挂接到 tun 或 tap 设备,以接收操作系统发送的包。该程序还可以向此类设备写入包。
设置和构建 VPN 连接的解决方案有许多。本节重点介绍 OpenVPN 软件包。不像其他 VPN 软件,OpenVPN 可在两种模式下运行:
- 路由式 VPN
路由是可设置的简易解决方案。它的效率比桥接式 VPN 更高,缩放能力更强。此外,它允许用户调整 MTU(最大传输单元)以提高效率。但在异构环境中,如果您的网关上没有 Samba 服务器,NetBIOS 广播不会正常工作。如果您需要 IPv6,两端上 tun 设备的驱动程序必须显式支持此协议。图 20.1 “路由式 VPN”中描绘了此方案。
图 20.1︰ 路由式 VPN #- 桥接式 VPN
桥接是更复杂的解决方案。如果您需要在不设置 Samba 或 WINS 服务器的情况下通过 VPN 浏览 Windows 文件共享,则建议使用桥接。使用非 IP 协议(例如 IPX)或依赖于网络广播的应用程序也需要用到桥接式 VPN。但是,桥接式 VPN 的效率比路由式 VPN 要低。另一项劣势是它的缩放能力不强。下列插图描绘了此方案。
图 20.2︰ 桥接式 VPN - 方案 1 #图 20.3︰ 桥接式 VPN - 方案 2 #图 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 服务器,请执行以下操作:
在稍后要用作 VPN 服务器的计算机上安装
openvpn
软件包。在外壳上,以
root
身份创建 VPN 机密密钥:root #
openvpn --genkey --secret /etc/openvpn/secret.key将机密密钥复制到客户端:
root #
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 服务器服务:tux >
sudo
wicked ifup tun0
此时应会看到确认消息:
tun0 up
20.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'
如果您使用防火墙,请按过程 20.1 “VPN 服务器配置”的步骤 6 中所述启动 YaST 并打开 UDP 端口 1194。
通过将 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/
中以作为配置文件的基础。然后根据需要对其进行自定义。
# /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 端口。需要在防火墙中打开该端口,具体请参见第 19 章 “伪装和防火墙”。VPN 的标准端口为 1194,因此您通常可以将此设置保持不变。 | |
协议 UDP 或 TCP。 | |
Tun 或 tap 设备。有关两者的差异,请参见第 20.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
如果未看到此消息,请仔细检查日志,确定其中是否有任何提示指出了配置文件中的错误。
20.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 守护程序。为此,请指定应使用组和用户 | |
包含客户端文件。出于安全原因,请为每个客户端单独使用一对文件。 | |
开启压缩。请仅在服务器上也启用了压缩时,才使用此参数。 |
20.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 是否正在运行且已正确配置。
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
软件包。