NFS-anonuid 认证!
规划
服务端:192.168.10.10 /data/nfs_share
客户端:192.168.10.0/24(取10.11为例) /mnt/nfs_share
服务端:
服务器端查看版本
cat /proc/fs/nfsd/versions
-2 +3 +4 +4.1 +4.2
说明不支持NFSv2,但支持NFSv3、NFSv4.1和NFSv4.2
NFS协议/服务
│
├── rpcinfo (RPC服务诊断工具)
├── nfsstat (NFS性能统计工具)
└── nfs (NFS客户端工具/内核模块)
# 1. 安装NFS服务
sudo yum -y install nfs-utils rpcbind(看情况,可选) # CentOS/RHEL
# 或 sudo apt install nfs-kernel-server -y # Ubuntu/Debian
# 2. 创建用户
sudo useradd -u 1000 -m boco4a
sudo useradd -u 1010 -m appuser
sudo useradd -u 1020 -m testuser
# 3. 创建NFS共享目录
sudo mkdir -p /data/nfs_share
sudo chown appuser:appuser /data/nfs_share
sudo chmod 755 /data/nfs_share
# 4. 配置NFS导出
sudo vim /etc/exports
# 添加以下内容:
#普通一般的配置
/data/nfs_share B服务器IP(rw,sync,no_subtree_check)
#/data/nfs_share 192.168.10.0/24(rw,sync,no_root_squash,anonuid=1010,anongid=1010)
#把所有用户都映射成 nfs用户appuser的配置
#/data/nfs_share 192.168.10.0/24(rw,sync,all_squash,anonuid=1010,anongid=1010)
# 5. 启动NFS服务
sudo systemctl enable nfs-server rpcbind
sudo systemctl start nfs-server rpcbind
sudo exportfs -rav
客户端:
nfs 版本不一样,处理会不一样。如果是默认mount是可以看下 nfs是什么版本
# 客户端查看挂载的NFS版本
nfsstat -m | grep vers=
案例1普通配置时:
mount -t nfs 192.168.10.10:/data/nfs_share /mnt/nfs_share
[root@k8s-ha2 ~]# df -h
192.168.10.10:/data/nfs_share 15G 7.4G 6.8G 52% /mnt/nfs_share
[root@k8s-ha2 ~]# showmount -e 192.168.10.10
Export list for 192.168.10.10:
/data/nfs_share 192.168.10.0/24
此时对于将192.168.10.10:/data/nfs_share 挂载到 本地的/mnt/nfs_share 只有用户id是1010:1010的appuser有权利可以读写,其他都没有权力,就是root也会被当作是 nobody。
案例2
案例:
假如我有个一个平台用户4a用户boco4a,只能用他来从电脑上来上传文件,但是共享目录是只有appuser有/data/nfs_share的权限
我上传的目录是/home/boco4a 或者这个账号对于 /mnt/nfs_share 或者 /data/fs_share 都没有权限,该怎么办?
1,setfacl或者建一个组让boco4a和appuser都是这个组的成员。
2,建一个目录权限是775,这个目录是有组来管理。
3,anonuid映射用户
第一种就是利用root权限将 /home/boco4a 给 appuser 加一个setfacl权限
命令:
1,
setfacl -R -m u:appuser:rx /home/boco4a/data
setfacl -d -m u:appuser:rx /home/boco4a/data
2,
su - appuser
mv(或cp) /home/boco4a/data/a.tar /data/nfs_share
案例3 anonuid映射nfs用户
第二种
服务端:
ls -la /data/nfs_share/
# 确保目录属于appuser且有写权限
chown appuser:appuser /data/nfs_share
chmod 755 /data/nfs_share
vim /etc/exports
/data/nfs_share 192.168.10.0/24(rw,sync,all_squash,anonuid=1010,anongid=1010)
#/data/nfs_share 192.168.10.0/24(rw,sync,no_root_squash,anonuid=1010,anongid=1010)
# 重新加载配置
sudo exportfs -rav
客户端:
# 在客户端重新挂载
umount /mnt/nfs_share
mount -t nfs -o rw,vers=3 192.168.10.10:/data/nfs_share /mnt/nfs_share
# 测试权限
sudo -u boco4a touch /mnt/nfs_share/test_from_boco4a.txt
sudo -u testuser touch /mnt/nfs_share/test1.txt
ls -la /mnt/nfs_share/
(任何user 都可以映射成appuser 在/mnt/nfs_share/ 读和写)
# 卸载并重新挂载
如果版本问题可以指定 版本3来挂载
sudo umount /mnt/nfs_share
sudo mount -t nfs -o rw,vers=3 192.168.10.10:/data/nfs_share /mnt/nfs_share
# 测试不同用户的权限
echo "=== 权限测试 ==="
# 测试1:root用户创建文件
sudo touch /mnt/nfs_share/test_root.txt
echo "root测试" > /mnt/nfs_share/test_root.txt
# 测试2:boco4a用户创建文件
sudo -u boco4a touch /mnt/nfs_share/test_boco4a.txt
sudo -u boco4a echo "boco4a测试" > /mnt/nfs_share/test_boco4a.txt
# 测试3:检查文件属主
ls -la /mnt/nfs_share/
###一般用不到###
如果是版本4的话上面的操作没有作用,需要再修改一个配置
b客户端 修改配置
vim /etc/idmapd.conf
[General]
Domain = localdomain # 关键:服务端和客户端必须相同,可自定义(如公司域名)
\# 可选:调试模式(排查问题时开启,正常后注释)
\# Verbosity = 1
\# Pipefs-Directory = /var/lib/nfs/rpc_pipefs
\# Cache-Expiration = 3600
[Mapping]
Nobody-User = nobody
Nobody-Group = nobody
[Translation]
Method = nsswitch # 使用系统用户数据库(/etc/passwd, /etc/group)
# 以下部分保持默认或注释(非LDAP环境无需配置)
#[Static]
#[UMICH_SCHEMA]
#LDAP_server = ldap-server.local.domain.edu
#LDAP_base = dc=local,dc=domain,dc=edu
systemctl restart rpcidmapd
bcclinux系统:
systemctl restart nfs-dmap
umount /mnt/a_share
mount -t nfs A服务器IP:/a /mnt/a_share
或者
mount -t nfs -o vers=3 A服务器IP:/a /mnt/a_share (指定nfs版本,需要客户端服务端)
vim /etc/fstab
A服务器IP:/a /mnt/a_share nfs vers=3 0 0
测试:
su - nfs_client
touch /mnt/a_share/test_by_b.txt
报错:
1、若使用 NFSv4,idmapd服务可能会将 UID/GID 映射为用户名,若配置不当会导致权限失效。
检查 NFS 版本(客户端挂载时默认版本可能为 v4)
# 客户端查看挂载的NFS版本
nfsstat -m | grep vers=
2、若为 NFSv4,检查idmapd配置(是否禁用了 ID 映射):
# 查看idmapd配置 ##如果不使用NFSV4就不用改这个配置,就能成功。
cat /etc/idmapd.conf | grep -v '^#' | grep -v '^$'
若Domain不一致,会导致 ID 映射失败,需统一修改后重启rpcidmapd:
sudo systemctl restart rpcidmapd
临时尝试用 NFSv3 挂载(绕过 v4 的 id 映射问题):
# 客户端卸载现有挂载
sudo umount /mnt/a_share
# 用v3版本重新挂载
su - b
sudo mount -t nfs -o vers=3 A服务器IP:/a /mnt/a_share
(选择v3还是选择v4可以看看默认defaults的时候的版本是v3还是v4,客户端与服务端最好一致。)
3、Domain配置的重要性: NFSv4 通过Domain判断客户端和服务器是否属于同一信任域。只有Domain完全一致,UID/GID 才能正确映射(即使 UID/GID 数值相同,Domain不同也会被视为不同用户)。
简化配置: 非 LDAP 环境下,[UMICH_SCHEMA]等与 LDAP 相关的配置需注释或删除,避免干扰本地用户映射。
若仍有问题: 可临时改用 NFSv3 挂载(绕过idmapd),命令:
sudo mount -t nfs -o vers=3 A服务器IP:/a /mnt/a_share
还有一个问题 如果各方面都没问题还是报错 权限问题
1,排查 服务端和客户端的 gid uid 是否一致,所共享的目录的权限所有者是不是这个 gid uid
2,如果客户端在mount之后 服务端的gid uid 发生了改变,此时只需要再客户端mount后在服务端 chown uid:gid /nfs_share 再在客户端 umount mount 即可。
挂载
vim /etc/fstab
A服务器IP:/a /mnt/a_share nfs defaults,nofail,_netdev,soft 0 0
# 格式:服务器IP:共享路径 本地挂载点 文件系统类型 挂载选项 dump fsck A服务器IP:/a /mnt/a_share nfs defaults,nofail,_netdev,soft,vers=4 0 0
如果再改良一下:
为了防止任何用户都映射成appuser 我只指定boco4a(平台监管用户)用户映射成appuser(程序用户兼nfs用户)
思路:
正常挂载:server:/data/nfs --挂载–> client:/mnt/nfs (df -h 发现挂载目录是/mnt/nfs)
映射:再将 /mnt/nfs --映射–> /mnt/nfs_share (df -h 查看挂载的目录变成了 /mnt/nfs_share)
案例4 bindfs重新映射UID
# 先挂载NFS
sudo mount -t nfs server:/data /mnt/nfs_raw
# 使用bindfs重新映射UID
sudo bindfs -u 1010 -g 1010 /mnt/nfs_raw /mnt/nfs_for_noco4a
server:
/data 192.168.10.0/24(rw,sync,root_squash,no_subtree_check)
rw:允许读写。
sync:确保数据同步写入硬盘,提升数据一致性。
root_squash:将客户端的 root 用户映射为匿名用户,重要安全设置。
no_subtree_check:可略微提升性能
# 首先挂载原始的NFS共享
sudo mount -t nfs server:/data /mnt/nfs_raw
# 然后使用 bindfs 创建映射视图,将客户端的UID 1014映射为访问时的UID 1010
bindfs --map=1014/1010 --map=@1014/@1010 -o perms=0777 /mnt/nfs_share /home/boco4a/nfs_upload


被折叠的 条评论
为什么被折叠?



