Linux 故障排查 - AWS 客户端 VPN

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Linux 故障排查

以下部分包含有关使用基于 Linux 客户端时可能遇到的日志记录和问题的信息。请确保您正在运行这些客户端的最新版本。

AWS 提供的客户端

AWS 提供的客户端将日志文件和配置文件存储在系统上的以下位置:

/home/username/.config/AWSVPNClient/

AWS 提供的客户端守护进程将日志文件存储在系统的以下位置:

/var/log/aws-vpn-client/username/
问题

在某些情况下,建立 VPN 连接后,DNS 查询仍会转到默认系统名称服务器,而不是为 ClientVPN 终端节点配置的名称服务器。

原因

客户端与 systemd-resolved 交互,后者是 Linux 系统上提供的一项服务,也是 DNS 管理的核心组件之一。它用于配置从客户端 VPN 终端节点推送的 DNS 服务器。出现问题的原因是 systemd-resolved 未为客户端 VPN 终端节点提供的 DNS 服务器设置最高优先级。相反,它将服务器附加到在本地系统上配置的现有 DNS 服务器列表中。因此,原始 DNS 服务器可能仍具有最高优先级,因此可用于解析 DNS 查询。

解决方案
  1. 在 OpenVPN 配置文件的第一行中添加以下指令,以确保所有 DNS 查询都发送到 VPN 隧道。

    dhcp-option DOMAIN-ROUTE .
  2. 使用 systemd-resolved 提供的存根解析程序。要确保这一点,请通过在系统上运行以下命令将符号链接 /etc/resolv.conf 链接到 /run/systemd/resolve/stub-resolv.conf

    sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
  3. (可选)如果您不想要 systemd-resolved 代理 DNS 查询,而是希望查询直接发送到真正的 DNS 名称服务器,则将符号链接 /etc/resolv.conf 链接到 /run/systemd/resolve/resolv.conf

    sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

    您可能希望执行此操作以绕过 systemd-resolved 配置,例如 DNS 应答缓存、每接口 DNS 配置、DNSSec 实施等。当您需要在连接到 VPN 时使用私有记录覆盖公共 DNS 记录时,此选项特别有用。例如,您的私有 VPC 中可能有一个带有 www.example.com 记录的私有 DNS 解析程序,该记录可解析为私有 IP。此选项可用于覆盖 www.example.com 的公共记录,该记录可解析为公有 IP。

OpenVPN(命令行)

问题

连接无法正常工作,因为 DNS 解析不起作用。

原因

客户端 VPN 终端节点上未配置 DNS 服务器,或者客户端软件未遵循该服务器。

解决方案

使用以下步骤检查 DNS 服务器是否已配置并正常工作。

  1. 确保日志中存在 DNS 服务器条目。在以下示例中,在最后一行中返回 DNS 服务器 192.168.0.2(在客户端 VPN 终端节点中配置)。

    Mon Apr 15 21:26:55 2019 us=274574 SENT CONTROL [server]: 'PUSH_REQUEST' (status=1) WRRMon Apr 15 21:26:55 2019 us=276082 PUSH: Received control message: 'PUSH_REPLY,redirect-gateway def1 bypass-dhcp,dhcp-option DNS 192.168.0.2,route-gateway 10.0.0.97,topology subnet,ping 1,ping-restart 20,auth-token,ifconfig 10.0.0.98 255.255.255.224,peer-id 0

    如果未指定 DNS 服务器,请要求客户端 VPN 管理员修改客户端 VPN 终端节点,并确保已为客户端 VPN 终端节点指定了 DNS 服务器(例如 VPC DNS 服务器)。有关更多信息,请参阅 AWS Client VPN 管理员指南中的客户端 VPN 终端节点

  2. 通过运行以下命令确保已安装 resolvconf 软件包。

    sudo apt list resolvconf

    输出应返回以下内容。

    Listing... Done resolvconf/bionic-updates,now 1.79ubuntu10.18.04.3 all [installed]

    如果未安装,请使用以下命令进行安装。

    sudo apt install resolvconf
  3. 在文本编辑器中打开客户端 VPN 配置文件(.ovpn 文件)并添加以下行。

    script-security 2 up /etc/openvpn/update-resolv-conf down /etc/openvpn/update-resolv-conf

    检查日志以验证是否已调用 resolvconf 脚本。日志应包含类似于以下内容的行。

    Mon Apr 15 21:33:52 2019 us=795388 /etc/openvpn/update-resolv-conf tun0 1500 1552 10.0.0.98 255.255.255.224 init dhcp-option DNS 192.168.0.2

通过 Network Manager 建立 OpenVPN (GUI)

问题

使用 Network Manager OpenVPN 客户端时,连接失败并显示以下错误。

Apr 15 17:11:07 OpenVPN 2.4.4 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Sep 5 2018 Apr 15 17:11:07 library versions: OpenSSL 1.1.0g 2 Nov 2017, LZO 2.08 Apr 15 17:11:07 RESOLVE: Cannot resolve host address: cvpn-endpoint-1234.prod.clientvpn.us-east-1.amazonaws.com:443 (Name or service not known) Apr 15 17:11:07 RESOLVE: Cannot resolve host Apr 15 17:11:07 Could not determine IPv4/IPv6 protocol
原因

未遵守 remote-random-hostname 标志,并且客户端无法使用 network-manager-gnome 软件包进行连接。

解决方案

请参阅 AWS Client VPN 管理员指南中的无法解析客户端 VPN 终端节点 DNS 名称的解决方案。