连接 NFS 客户端

本页面介绍如何连接 NFS 客户端。

准备工作

如果您使用防火墙来控制网络流量,并且想要允许 NFS 流量, 请参阅适用于 NFS 卷访问的防火墙规则

根据您的 Linux 发行版类型安装 NFS 客户端工具,以准备客户端:

RedHat

运行以下命令:

sudo yum install -y nfs-utils

SuSe

运行以下命令:

sudo yum install -y nfs-utils

Debian

运行以下命令:

sudo apt-get install nfs-common

Ubuntu

运行以下命令:

sudo apt-get install nfs-common

使用导出政策控制卷访问权限

NFSv3 和 NFSv4.1 中的卷访问权限控制基于客户端的 IP 地址。 卷的导出政策最多包含 20 条导出规则。每条规则都是以逗号分隔的 IP 或网络 CIDR 列表,用于定义能够装载卷的允许的客户端 。规则还定义了客户端拥有的访问权限类型,例如读写只读

使用以下标签页根据 NFS 版本查看政策:

不使用 Kerberos 的 NFS

所有不使用 Kerberos 的 NFS 版本都使用 AUTH_SYS 安全风格。在此模式下,您必须严格管理导出规则,仅允许您信任且能够确保用户 ID 和群组 ID 完整性的客户端。

作为一项安全措施,NFS 服务器会自动将 UID=0(根用户)的 NFS 调用映射到 UID=65534(匿名用户),后者对文件系统具有有限的权限。如需了解详情,请参阅用户 ID 废除

使用 Kerberos 的 NFSv4.1

使用 Kerberos 的 NFSv4.1 使用导出政策,并使用 Kerberos 进行额外的身份验证来访问卷。您可以配置导出规则以应用于以下内容:

  • 仅限 Kerberos (krb5)

  • Kerberos 签名 (krb5i)

  • Kerberos 隐私 (krb5p)

导出政策的最佳实践

我们建议在制定导出政策时采用以下最佳实践:

  • 按从最具体到最不具体的顺序排列导出规则。

  • 仅导出到受信任的客户端,例如具有受信任客户端的特定客户端或 CIDR。

  • 将根访问权限限制为一小部分受信任的管理客户端。

规则 允许的客户端 访问 根访问权限 说明
1 10.10.5.3,
10.10.5.9
读写 开启 管理客户端。根用户保持为根用户,并且可以管理
所有文件权限。
2 10.10.5.0/24 读写 关闭 允许来自 10.10.5.0/24 网络的所有其他客户端进行装载,
但根访问权限会映射到 nobody。
3 10.10.6.0/24 只读 关闭 允许另一个网络从卷中读取数据,但
不能写入。

客户端装载卷后,文件级访问权限会决定用户可以执行的操作 。如需了解详情,请参阅适用于 UNIX 风格卷的 NFS 文件级访问权限控制

管理导出政策

按照以下说明使用 Google Cloud CLI 更新卷的导出政策。

gcloud

使用一项导出政策更新卷

使用一项导出政策规则更新卷:

gcloud netapp volumes update VOLUME_ID \
  --project=PROJECT_ID \
  --location=LOCATION \
  --export-policy=access-type=ACCESS_TYPE,allowed-clients=ALLOWED_CLIENTS_IP_ADDRESSES,has-root-access=TRUE_OR_FALSE,nfsv3=NFSV3,nfsv4=NFSV4

替换以下信息:

  • VOLUME_ID:卷的 ID。

  • PROJECT_ID:卷所在项目的名称。

  • LOCATION:卷的位置。

  • ACCESS_TYPE:访问权限类型必须是 READ_WRITEREAD_ONLYREAD_NONE 中的一个。

  • ALLOWED_CLIENTS_IP_ADDRESSES:以英文逗号分隔的允许的客户端 IP 地址或范围的列表。

  • NFSV3:设置为 truefalse,以将此规则应用于 NFSv3。

  • NFSV4:设置为 truefalse,以将此规则应用于 NFSv4。

添加多条导出政策规则

如需添加多条导出规则,请重复 export-policy 参数块。 每个 export-policy 参数块都包含多个键值对,格式如下:

--export-policy=KEY1=VALUE1,KEY2=VALUE2,KEY3=VALUE3...

示例:使用英文冒号和英文逗号作为分隔符

如果您为 allowed-clients 指定了多个 IP 地址或 CIDR,Google Cloud CLI 可能无法正确解析值,因为 --export-policy 标志使用英文逗号作为不同键(例如 access-typenfsv3)之间的默认分隔符。如果某个值(例如 allowed-clients)也包含英文逗号,则解析器无法区分新的键值对和 allowed-clients 列表中的其他 IP 地址。如需 区分这些英文逗号,请将 Google Cloud CLI 配置为使用 不同的参数分隔符,并使用 Google Cloud CLI 转义

以下命令显示了 导出政策的最佳实践中的示例。 第一条规则使用英文冒号作为参数分隔符,以正确解析以英文逗号分隔的 allowed-clients 列表。第二条和第三条规则使用默认的英文逗号作为分隔符。

gcloud netapp volumes update my_volume --location=us-east4 \
--export-policy=^:^access-type=READ_WRITE:allowed-clients="10.10.5.3,10.10.5.9":nfsv3=true:nfsv4=true:has-root-access=true \
--export-policy=access-type=READ_WRITE,allowed-clients=10.0.5.0/24,nfsv3=true,has-root-access=false \
--export-policy=access-type=READ_ONLY,allowed-clients=10.0.6.0/24,nfsv3=true,has-root-access=false

示例:使用 squash-mode 作为参数

以下示例使用替代 squash-mode 参数为管理员主机创建 NO_ROOT_SQUASH 规则,并为 CIDR 范围创建 ALL_SQUASH 规则。

gcloud netapp volumes update my_volume --location=us-east4 \
--export-policy=^:^allowed-clients="10.10.5.3,10.10.5.9":nfsv3=true:access-type=READ_WRITE:squash-mode=NO_ROOT_SQUASH \
--export-policy=allowed-clients=10.0.2.0/24,nfsv3=true,access-type=READ_WRITE,squash-mode=ALL_SQUASH,anon-uid=2000

如需详细了解其他可选标志,请参阅 适用于卷导出政策的 Google Cloud SDK

用户 ID 废除

NFS 导出政策提供 用户和群组 ID 废除的控制机制,可让您出于安全目的将用户和 群组 ID 重新映射到匿名用户 ID。

根用户废除

NFS 服务器通过将根用户 (UID=0) 重新映射到 nobody (UID=65534) 来提高安全性,这使得根用户成为对卷具有文件访问权限的非特权用户。此功能称为“根用户废除” 。在 NFS 服务器上,停用此功能并保留根用户权限的选项称为 no_root_squash

默认情况下,没有定义导出政策的卷无法供客户端 IP 地址访问。在 Google Cloud 控制台中创建导出政策规则时, 默认设置包括读写访问权限和根用户废除。 Google Cloud API、Google Cloud CLI 和 Terraform 之前支持使用 has-root-access 参数控制根用户废除。虽然系统仍接受 has-root-access,但它已被 squash-mode 参数取代。

最佳实践是创建一个专用导出规则,为受信任的管理员主机启用根访问权限,并为其他客户端停用根访问权限。 将此规则放在更通用的规则之前。

用户和群组 ID 废除

squash-mode 参数可控制将用户和群组 ID 废除为匿名 UID,这对于公共 SFTP Dropbox 目录非常有用。此参数还会取代 has-root-access 参数,并且在 API、Google Cloud CLI 和 Terraform 中均受支持。

squash-mode 参数接受以下值:

  • no-root-squash:在此模式下,根用户仍为根用户,不会 重新映射到 nobody (UID=65534)。

  • root-squash:此设置会将根用户重新映射到 nobody。

  • all-squash:此选项为所有用户(包括根用户)提供匿名访问权限。所有用户都会重新映射到 anon-uid 参数指定的 UID 和 GID。使用 all-squash 时,您还必须指定 anon-uid,并将 access-type 设置为 READ_WRITE

注意事项

对于具有 squash mode 的导出政策规则,请考虑以下事项:

  • 导出政策仅支持一条 all-squash 规则。

  • 启用 all-squash 后,根用户会被废除为匿名用户。这可以被使用 no-root-squash 的优先级更高的规则覆盖。

  • 具有 squash-mode 样式的导出政策规则的卷不支持卷复制。

  • 对于 Flex File 服务等级,all-squash 不会自动更改卷的根 inode 的所有权。如需实现此目的,请添加 no-root-squash 导出规则,允许根用户使用 chown 将根 inode 的所有权更改为所需的 UID。

  • 支持 has-root-access 参数。使用 has-root-accesssquash-mode,但不要同时使用这两个参数。

  • 对于 Flex Unified 服务等级,不支持 all-squash

NFS 客户端的装载说明

按照以下说明使用 控制台、Google Cloud CLI 或 ONTAP 模式获取 NFS 客户端的装载说明。 Google Cloud

控制台

  1. 在 Google Cloud 控制台中,前往 NetApp Volumes 页面。

    转到“NetApp Volumes”

  2. 点击

  3. 点击 显示更多

  4. 选择装载说明

  5. 按照 Google Cloud 控制台中显示的装载说明进行操作。

  6. 确定装载命令并使用装载选项,除非您的工作负载有特定的装载选项要求。

    仅限 NFSv3:如果您的应用不使用锁,或者您未将客户端配置为启用 NSM 通信,我们建议您添加 nolock 装载选项。

gcloud

查找卷的装载说明:

 gcloud netapp volumes describe VOLUME_NAME \
    --project=PROJECT_ID \
    --location=LOCATION \
    --format="value(mountOptions.instructions)"

替换以下信息:

  • VOLUME_NAME:卷的名称。

  • PROJECT_ID:卷所在项目的名称。

  • LOCATION:卷的位置。

如需详细了解其他可选标志,请参阅 有关卷的 Google Cloud SDK 文档

ONTAP 模式

按照以下步骤确定卷的主机名或 IP 地址以及导出路径:

  1. 查找全部网络接口 以用于 data_cifs 服务。

  2. 确定导出路径,该路径与您为卷指定的 联接路径 相对应。

  3. 创建装载路径,格式为 <var>IP</var>:<var>junction-path</var>。添加任何所需的装载选项。

确定所需的命令后,请参阅 ONTAP 模式 ,了解如何向存储池提交 ONTAP 命令。

其他 NFSv4.1 说明

当您为 Flex Unified、Standard、Premium 和 Extreme 服务等级的卷启用 NFSv4.1 时,系统会自动为这些卷启用 NFSv4.2。Linux 装载命令始终会装载可用的最高 NFS 版本,除非您指定要装载的版本。如果您想使用 NFSv4.1 进行装载,请在装载命令中使用 -o vers=4.1 参数。

在 NFSv3 中,用户和群组由通过 NFSv3 协议发送的用户 ID (UID) 和群组 ID (GID) 标识。务必确保相同的 UID 和 GID 在访问卷的所有客户端上代表相同的用户和群组。NFSv4 通过使用安全标识符消除了对显式 UID 和 GID 映射的需求。 安全标识符是格式为 <username|groupname>@<full_qualified_domain>. 的字符串。安全标识符的示例为 bob@example.com。 客户端需要先将内部使用的 UID 和 GID 转换为安全 标识符,然后才能向服务器发送 NFSv4 请求。服务器需要将传入请求的安全标识符转换为 UID 和 GID,并将其响应的安全标识符转换为 UID 和 GID。使用转换的优势在于,每个客户端和服务器都可以使用不同的内部 UID 和 GID。 不过,缺点是所有客户端和服务器都需要维护 UID 和 GID 与用户和群组名称之间的映射列表。客户端上的映射信息可以来自本地文件(例如 /etc/passwd/etc/groups)或 LDAP 目录。此映射的配置由 rpc.idmapd 管理,该配置必须在您的客户端上运行。

在 NetApp Volumes 上,LDAP 必须提供映射信息,其中 Active Directory 是唯一受支持的 RFC2307bis 兼容 LDAP 服务器。 将 Kerberos 用于 NFSv4 时,安全标识符会以 username@DOMAINNAME 格式存储 Kerberos 主账号,其中 DOMAINNAME(大写)会成为领域名称。

数值 ID

对于不想配置名称映射而是使用 NFSv4 来替代 NFSv3 的用户,NFSv4 引入了一个名为numeric ID的选项, 该选项会将 UID 和 GID 编码的文本字符串作为安全标识符发送。这简化了用户的配置过程。

您可以使用以下命令检查客户端设置:

     cat /sys/module/nfs/parameters/nfs4_disable_idmapping
   

默认值为 Y,用于启用数值 ID。NetApp Volumes 支持使用数值 ID。

在 NFS 客户端上配置 rpc.idmapd

无论您使用哪种类型的 ID 或安全标识符,都必须在 NFS 客户端上配置 rpc.idmapd如果您按照准备工作部分中的客户端实用工具安装说明进行操作,则该实用工具应已安装,但可能未运行。某些发行版会在您装载第一个 NFS 卷时使用 systemd 自动启动它。rpc.idmapd 所需的最低配置是设置网域设置。否则,用户根目录将显示为 nobody,且 UID=65534 or 4294967295

按照以下说明在 NFS 客户端上配置 rpc.idmapd

  1. 在客户端上,打开文件 /etc/idmapd.conf,并将网域参数更改为以下值之一:

    • 如果您的卷未启用 LDAP,则为 domain = defaultv4iddomain.com

    • 如果您的卷已启用 LDAP,则为 domain = <FDQN_of_Windows_Domain>

  2. 运行以下命令,激活对 rpc.idmapd 的更改:

     nfsidmap -c

NFSv4.2 支持

Flex Unified、Standard、Premium 和 Extreme 服务等级现在支持 NFSv4.2 协议,以及已启用 NFSv4.1 的卷上的 NFSv4.1。

装载 NFS 卷时,Linux 装载命令会自动选择可用的最高 NFS 版本。装载已启用 NFSv4.1 的卷会自动默认为 NFSv4.2,除非明确指定 vers=4.1 装载选项。

NetApp Volumes 支持将 NFS 扩展属性 xattrs 与 NFSv4.2 搭配使用。TR-4962

适用于 NFS 卷访问的防火墙规则

NFS 使用多个端口在客户端和服务器之间进行通信。对于 Google Compute Engine 和 NetApp Volumes 之间的通信,默认情况下不会屏蔽这些端口。如果您使用防火墙,则必须为完整的 NetApp Volume PSA CIDR或各个卷 IP 地址启用对以下端口的访问权限:

  • 111 TCP/UDP portmapper

  • 635 TCP/UDP mountd

  • 2049 TCP/UDP nfsd

  • 4045 TCP/UDP nlockmgr(仅限 NFSv3)

  • 4046 TCP/UDP status(仅限 NFSv3)

NetApp Volumes 的 IP 地址会自动从您在网络对等互连期间分配给服务的 CIDR 范围分配。如需了解详情,请参阅配置专用服务访问通道

将建议性锁与 NFSv3 搭配使用

如果您将建议性锁与 NFSv3 搭配使用,则必须在客户端上运行 rpc.statd 守护程序以支持 Network Lock Manager,后者与 NFS 协同工作,以通过网络提供 System V 样式的建议性文件和记录锁定。您的 NFS 客户端必须为 rpc.statd 打开入站端口,以接收 Network Lock Manager 回调。在大多数 Linux 发行版中,rpc.statd 会在您装载第一个 NFS 共享时启动。它使用随机端口,您可以使用 rpcinfo -p 命令来识别该端口。如需使 rpc.statd 与防火墙兼容,请将其配置为使用静态端口。

如需为 rpc.statd 设置静态端口,请参阅以下资源:

如果您不使用 NFSv3 建议性锁或 Network Lock Manager,则可以使用 nolock 装载选项装载 NFSv3 共享。

NFSv4.1 在 NFSv4.1 协议中实现了锁定功能,该协议通过客户端发起的 TCP 连接在端口 2049 上运行到 NFSv4.1 服务器。 客户端无需为入站流量打开防火墙端口。

将 Linux 连接到 LDAP

如果您使用的是 NFSv3 扩展群组或使用安全标识符的 NFSv4.1,则您已将 NetApp Volumes 配置为使用附加到存储池的 Active Directory 作为 LDAP 服务器。

如需在 NFS 客户端和服务器之间保持一致的用户信息,您可能需要将客户端配置为使用 Active Directory 作为 LDAP 名称服务,以获取用户和群组信息。

使用以下资源配置 LDAP:

使用 Kerberized NFS 时,您可能需要使用本部分中提到的部署指南来配置 LDAP,并确保客户端和服务器之间的一致性。

后续步骤

连接具有多个存储端点的大容量卷