如何使用 EFS DNS 名称在加入了 AWS Managed Microsoft AD 的 Linux 计算机上挂载 Amazon EFS?

上次更新日期: 2022 年 3 月 21 日

我正在使用 AWS Directory Service for AWS Managed Microsoft AD。我将我的 Amazon Elastic Compute Cloud (Amazon EC2) Linux 实例加入到 Active Directory 域中。因此,我无法使用 EFS DNS 名称挂载 Amazon Elastic File System (Amazon EFS)。如何解决此问题?

简短描述

当您将 Linux 计算机加入 AWS Managed Microsoft AD 时,请配置您的实例以将 DNS 服务器用于您的 Active Directory。

对于 AWS Managed Microsoft AD,所有的 DNS 请求都会被转发到 Amazon 为您 VPC 提供的 DNS 服务器的 IP 地址。这些 DNS 服务器将解析在 Amazon Route 53 私有托管区域中配置的名称。如果您没有使用 Route 53 私有托管区域,则您的 DNS 请求将转发到公有 DNS 服务器。如果您的 AWS 服务不存在私有托管区域,则 DNS 请求将转发到公有 DNS 服务器。这意味着它们只能将 AWS 服务 DNS 解析为公有 IP 地址。有关更多信息,请参阅配置 DNS

借助 Amazon EFS,文件系统 DNS 名称会自动解析为连接 Amazon EC2 实例的可用区中挂载目标的 IP 地址。这是一个私有 IP 地址,仅能在同一 VPC 内解析。通过更改 VPC 提供的默认 DNS 中的 DNS 服务器,EFS 将无法再解析 IP 地址,因此通过 DNS 挂载失败。有关更多信息,请参阅使用 DNS 名称在 Amazon EC2 上挂载

问题示例

此示例使用 AWS Managed Microsoft AD。提供的 DNS 服务器为 172.31.28.100 和 172.31.4.147。EFS 文件系统在具有挂载目标 172.31.47.69 的同一 VPC 中创建。

1.    使用 netcat,确认 EC2 实例可以与 EFS 挂载目标 172.31.47.69 建立连接:

$ nc -vz 172.31.47.69 2049
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 172.31.47.69:2049.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.

2.    在 EC2 Linux 服务器上,您可以使用 DNS 名称挂载 EFS。然后取消挂载 EFS。

sudo mount -t efs -o tls fs-123456:/ efs
df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs  475M     0  475M   0% /dev
tmpfs          tmpfs     483M     0  483M   0% /dev/shm
tmpfs          tmpfs     483M  516K  483M   1% /run
tmpfs          tmpfs     483M     0  483M   0% /sys/fs/cgroup
/dev/xvda1     xfs       8.0G  1.6G  6.5G  19% /
tmpfs          tmpfs      97M     0   7M   0% /run/user/0
tmpfs          tmpfs      97M     0   97M   0% /run/user/1000
127.0.0.1:/    nfs4      8.0E     0  8.0E   0% /home/ec2-user/efs
sudo umount /efs

3.    /etc/resolv.conf 文件显示了 Amazon 提供的 DNS 和名称服务器:

cat /etc/resolv.conf 
        ; generated by /usr/sbin/dhclient-script
        search eu-west-2.compute.internal
        options timeout:2 attempts:5
        nameserver 172.31.0.2

4.    在 EC2 Linux 服务器上,集成 Microsoft AD,然后配置 Active Directory DNS 服务器:

echo 'supersede domain-name-servers 172.31.28.100, 172.31.4.147;' | sudo tee --append /etc/dhcp/dhclient.conf
echo 'supersede domain-search "rachel.com";' | sudo tee --append /etc/dhcp/dhclient.conf
sudo dhclient -r
sudo dhclient

5.    通过检查 resolv.conf 文件确认 DNS 服务器已配置:

cat /etc/resolv.conf 
options timeout:2 attempts:5
; generated by /usr/sbin/dhclient-script
search rachel.com. eu-west-2.compute.internal
nameserver 172.31.28.100
nameserver 172.31.4.147

6.    在文件系统上运行 dig 以查看挂载目标私有 IP 是否没有返回:

$ dig fs-123456.efs.eu-west-2.amazonaws.com 
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.5.2 <<>> fs-123456.efs.eu-west-2.amazonaws.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 57378
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;fs-123456.efs.eu-west-2.amazonaws.com. IN A

注意: DNS 请求不会解析为任何 A 记录,状态显示 NXDOMAIN。

7.    使用 DNS 名称挂载 EFS 失败:

sudo mount -t efs -o tls fs-123456:/ efs
Failed to resolve "fs-123456.efs.eu-west-2.amazonaws.com" - check that your file system ID is correct, and ensure that the VPC has an EFS mount target for this file system ID.
See https://docs.aws.amazon.com/console/efs/mount-dns-name for more detail.
Attempting to lookup mount target ip address using botocore. Failed to import necessary dependency botocore, please install botocore first.

如果您为 VPC 使用 Amazon 提供的名称服务器,请注意,它已成功解决:

dig @172.31.0.2 fs-123456.efs.eu-west-2.amazonaws.com
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.5.2 <<>> fs-123456.efs.eu-west-2.amazonaws.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24926
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;fs-123456.efs.eu-west-2.amazonaws.com. IN A

;; ANSWER SECTION:
fs-123456.efs.eu-west-2.amazonaws.com. 60 IN A 172.31.25.79

解决方法

注意:如果您在运行 AWS 命令行界面 (AWS CLI) 命令时遇到错误,请确保您使用的是最新版的 AWS CLI

为您的 Microsoft AD 配置条件转发器,以将请求转发到 Amazon VPC 提供的 DNS 中。如果您使用 Active Directory 提供的 DNS,此方法还可用于将其他 AWS 服务 DNS 解析为其私有 IP 地址。

为此,请使用 AWS CLI 命令创建条件转发器规则。这会将域的所有子域转发到特定的 DNS 服务器 IP。例如,您可以将所有对 amazonaws.com 子域名的 DNS 请求转发到 Amazon VPC 提供的 DNS 的私有 IP。

注: Amazon VPC 提供的 DNS IP 是在 VPC IPv4 网络范围 + 2 的基础上保留的 IP 地址。

创建条件转发器规则,请在要挂载 EFS 的 Linux 实例的命令行上运行 AWS CLI 命令 create-conditional-forwarder:

aws ds create-conditional-forwarder --directory-id d-9c671fb35f --remote-domain-name amazonaws.com --dns-ip-addrs 172.31.0.2 --region eu-west-2

使用以下参数:

  • directory-id - 输入 AD 目录 ID。
  • remote-domain-name - 您可以指定任何域。此规则适用于与此域或子域匹配的所有 FQDN。
  • dns-ip-addrs - 输入 Amazon VPC 提供的 DNS IP。

这允许对 EFS DNS 进行 DNS 解析,现在可以使用 DNS 名称挂载 EFS。

dig fs-123456.efs.eu-west-2.amazonaws.com 

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.amzn2.5.2 <<>> fs-123456.efs.eu-west-2.amazonaws.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24926
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;fs-123456.efs.eu-west-2.amazonaws.com. IN A
;; ANSWER SECTION:
fs-123456.efs.eu-west-2.amazonaws.com. 60 IN A 172.31.25.79

现在可以使用 DNS 名称挂载 EFS。

sudo mount -t efs -o tls fs-123456:/ efs
[ec2-user@ip-172-31-35-167 ~]$ df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs  475M     0  475M   0% /dev
tmpfs          tmpfs     483M     0  483M   0% /dev/shm
tmpfs          tmpfs     483M  520K  483M   1% /run
tmpfs          tmpfs     483M     0  483M   0% /sys/fs/cgroup
/dev/xvda1     xfs       8.0G  1.6G  6.5G  19% /
tmpfs          tmpfs      97M     0   97M   0% /run/user/0
tmpfs          tmpfs      97M     0   97M   0% /run/user/1000
127.0.0.1:/    nfs4      8.0E     0  8.0E   0% /home/ec2-user/efs