NFS-anonuid 认证!

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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值