NFS和Samba服务


一、 NFS服务

NFS一种网络文件系统,它允许网络中的计算机通过TCP/IP网络共享资源。客户端可以像访问本地文件系统一样访问NFS文件系统。

1. 安装 NFS 服务端软件

  • CentOS/RHEL
sudo yum install -y nfs-utils rpcbind
  • Ubuntu/Debian
sudo apt-get install -y nfs-kernel-server rpcbind

2. 配置共享目录(核心文件:/etc/exports

格式:

<共享目录> <客户端地址>(选项1,选项2,...)

常用选项说明

选项 描述
rw 允许客户端读写(默认ro只读)。
ro 只读权限。
sync 数据同步写入磁盘(默认,安全但性能稍低)。
async 数据先缓存到内存,再写入磁盘(性能高,但可能丢失数据)。
no_root_squash 客户端以 root 身份访问时,映射为服务端的 root 用户(危险,慎用)。
root_squash 客户端 root 用户映射为服务端的 nfsnobody 用户(默认,安全)。
all_squash 所有客户端用户映射为服务端的 nfsnobody 用户(适合公共共享)。
anonuid=UID 将客户端用户映射为服务端指定 UID 的用户(需配合 all_squash)。
anongid=GID 将客户端用户映射为服务端指定 GID 的用户组(需配合 all_squash)。
subtree_check 检查共享目录的子目录权限(默认开启,可关闭用 no_subtree_check)。
insecure 允许客户端通过非安全端口(大于 1024)连接(部分旧客户端需此选项)。

示例配置:

# 允许子网内主机读写
/data/nfs 192.168.8.0/24(rw,sync,root_squash,no_subtree_check)

# 所有人只读,用户映射为 nfsnobody
/data/public *(ro,sync,all_squash)

3. 启动服务并刷新配置

  • 启动服务(CentOS/Ubuntu 通用,基于 systemd):
sudo systemctl start rpcbind nfs-server
sudo systemctl enable rpcbind nfs-server  # 开机自启
  • 重新导出共享目录(修改 exports 后需执行):
sudo exportfs -avr
  • -a:导出所有目录
  • -v:显示详细信息
  • -r:重新读取配置文件

4. 查看共享状态

  • 查看本机导出的共享列表:
sudo showmount -e localhost

二、NFS 客户端配置

1. 安装 NFS 客户端软件

  • CentOS/RHEL/Ubuntu/Debian
sudo apt install nfs-common  # Ubuntu/Debian
sudo yum install nfs-utils   # CentOS/RHEL

2. 临时挂载共享目录

sudo mount -t nfs <服务端IP>:/共享目录 /本地挂载点 [选项]

示例

sudo mount -t nfs 192.168.8.101:/data/nfs /mnt/nfs

3. 永久挂载(写入 /etc/fstab

<服务端IP>:/共享目录 /本地挂载点 nfs defaults,_netdev 0 0
  • _netdev:确保网络可用后再挂载(避免开机时网络未就绪导致挂载失败)。
  • 可添加额外选项,如 rosoft(允许挂载失败)、hard(强制重试,默认)等。

4. 卸载挂载

sudo umount /本地挂载点

三、防火墙与安全配置

1. 开放 NFS 相关端口(传统模式)

NFS 使用 RPC 服务,端口通常由 rpcbind 动态分配,建议开启以下端口:

  • 111/tcp111/udp(rpcbind 端口)
  • 2049/tcp2049/udp(NFS 主端口,固定)
  • 其他动态端口(如 NFS 辅助服务,可通过 rpcinfo -p 查看)

CentOS 防火墙示例

sudo firewall-cmd --add-port={111/tcp,111/udp,2049/tcp,2049/udp} --permanent
sudo firewall-cmd --reload

2. 安全增强(SELinux)

  • 若启用 SELinux,需允许 NFS 共享:
sudo setsebool -P nfs_export_all_rw on  # 允许读写共享(按需调整)

四、常用命令总结

命令 描述
exportfs -a 导出/取消所有共享目录
exportfs -r 重新读取 exports 并应用配置
showmount -e <服务端IP> 查看服务端导出的共享目录
mount -t nfs <IP>:/path /mnt 临时挂载 NFS 共享
umount /mnt 卸载挂载点
rpcinfo -p 查看 RPC 服务注册的端口

五、注意事项

1.权限问题:共享目录的服务端权限需至少为 755,且 nfsnobody 用户(或映射的 UID/GID)需有对应权限。

2.性能优化:高并发场景可使用 async,但需承担数据丢失风险;no_subtree_check 可提升目录访问性能。

3.版本兼容性:确保服务端和客户端的 NFS 版本一致(默认 v4,可通过 mount -o vers=3 指定版本)。

通过以上配置,可实现安全、高效的 NFS 文件共享。实际使用时需根据场景调整权限和安全策略。

案例:

节点:

ip address hostname nfs服务
192.168.8.32 nfs01 服务端
192.168.8.33 nfs02 客户端

1、准备工作

  • 所有主机操作
# 1.查看系统版本
cat /etc/redhat-release
# 2.查看并关闭防火墙
systemctl status firewalld
systemctl stop firewalld
systemctl disable firewalld
# 3.永久关闭
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config

2.安装 NFS 和 RPC

  • 所有主机操作
rpm -qa | grep nfs
rpm -qa | grep rpcbind
yum install -y nfs-utils rpcbind

3、服务端配置

  • 192.168.8.32
mkdir  /data
echo "/data *(rw,sync,no_root_squash)" >> /etc/exports
  • “rw” 表示将目录以可读写的方式导出。
  • “sync” 表示将数据同步写入到磁盘,确保写入的一致性。
  • “no_root_squash” 表示允许 root 用户以 root 身份访问导出的目录。
# 1.生效配置
exportfs -r
# 2.启动
systemctl enable rpcbind
systemctl restart rpcbind
systemctl enable nfs
systemctl restart nfs
# 3.服务器注册端口:111
rpcinfo -p
# 4.查看是否成功
showmount -e localhost

Export list for localhost:
/data *

# 5.查看启动挂载
cat /var/lib/nfs/etab
/data  *(rw,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,fsid=0,anonuid=65534,anongid=65534,sec=sys,rw,secure,no_root_squash,no_all_squash)

4、客户端配置

  • 192.168.8.33
# 1.创建挂载目录
mkdir  /data
# 2.查看挂载ip
showmount -e 192.168.8.32
# 3.挂载
mount -t nfs 192.168.8.32:/data /data
# 4.查看磁盘
df -h
# 5.配置启动挂载
vim /etc/fstab
192.168.8.32:/data  /data  nfs  defaults  0  0

五、测试同步

# 1.客户端
cd /data
touch 1.txt

# 2.服务端
cd /data
ls

autofs

自动按需挂载nfs、光盘、磁盘。在用户需要使用该文件系统时才去动态挂载,从而节约了网络资源和服务器的硬件资源

nfs客户端安装配置。

主配置文件/etc/auto.master

子配置文件/etc/auto.nfs

(autofs默认自动卸载时间为300s即5分钟)

# 查看当前服务开发的端口号
status -lnutp
ss -lnutp
[root@Clinet ~]#mkdir -p /data/nfs1
[root@Clinet ~]#yum install autofs -y
[root@Clinet ~]#systemctl start autofs
[root@Clinet ~]#grep -Ev "^$|^#" /etc/auto.master
/misc   /etc/auto.misc
# 添加配置,nfs挂载的所有父目录
/data   /etc/auto.nfs   --timeout=60
#####################################
/net    -hosts
+dir:/etc/auto.master.d
+auto.master

# 子配置文件,具体的nfs服务链接信息
[root@Clinet ~]#vim /etc/auto.nfs 
nfs1  -fstype=nfs  192.168.8.12:/data

[root@Clinet ~]#systemctl restart autofs
# 触发自动挂载
[root@Clinet ~]#cd /data/nfs1

Samba 服务

Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成。

SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。

一、Samba 服务端基础配置

1. 安装 Samba 服务

  • Debian/Ubuntu
sudo apt-get install -y samba smbclient
  • CentOS/RHEL
sudo yum install -y samba samba-client

2. 核心配置文件:/etc/samba/smb.conf

配置文件分为 全局设置共享定义 两部分,以下是添加了详细注释后的 Samba 配置文件内容:

# [global] 部分定义了 Samba 服务器的全局配置选项
[global]
    # 设置工作组名称,这里将 Samba 服务器所在的工作组设置为 "SAMBA"
    workgroup = SAMBA
    # 指定 Samba 的安全模式为 "user",即需要用户进行身份验证才能访问共享资源
    security = user

    # 设置密码数据库的后端为 "tdbsam",这意味着 Samba 使用 TDB(Trivial Database)来存储用户密码
    passdb backend = tdbsam

    # 配置打印服务,指定使用 CUPS(通用 Unix 打印系统)作为打印服务
    printing = cups
    # 设置打印能力文件的名称为 "cups",让 Samba 使用 CUPS 的打印能力信息
    printcap name = cups
    # 开启打印机自动加载功能,使 Samba 服务器启动时自动加载打印机
    load printers = yes
    # 设置 CUPS 选项为 "raw",表示以原始格式打印文件
    cups options = raw

# [homes] 部分定义了用户主目录的共享配置
[homes]
    # 对该共享的描述信息,说明这是用户主目录的共享
    comment = Home Directories
    # 定义允许访问该共享的用户,%S 表示当前用户名,%D%w%S 表示域名+用户名
    valid users = %S, %D%w%S
    # 设置该共享在网络浏览中不可见,防止普通用户随意浏览他人主目录
    browseable = No
    # 设置该共享不是只读的,允许用户对其主目录进行读写操作
    read only = No
    # 允许继承访问控制列表(ACLs),确保共享目录的权限设置能够正确继承
    inherit acls = Yes

# [printers] 部分定义了打印机共享的配置
[printers]
    # 对该共享的描述信息,说明这是所有打印机的共享
    comment = All Printers
    # 指定打印机共享的路径为 "/var/tmp",通常用于临时存储打印文件
    path = /var/tmp
    # 设置该共享为可打印的,允许用户通过该共享提交打印任务
    printable = Yes
    # 设置新创建文件的权限掩码为 0600,即只有文件所有者有读写权限
    create mask = 0600
    # 设置该共享在网络浏览中不可见,防止普通用户随意浏览打印机共享
    browseable = No

# [print$] 部分定义了打印机驱动程序的共享配置
[print$]
    # 对该共享的描述信息,说明这是打印机驱动程序的共享
    comment = Printer Drivers
    # 指定打印机驱动程序共享的路径为 "/var/lib/samba/drivers"
    path = /var/lib/samba/drivers
    # 定义允许对该共享进行写操作的用户和用户组,这里允许 "@printadmin" 组和 "root" 用户进行写操作
    write list = @printadmin root
    # 强制设置创建文件和目录时的所属组为 "@printadmin"
    force group = @printadmin
    # 设置新创建文件的权限掩码为 0664,即文件所有者和所属组有读写权限,其他用户有读权限
    create mask = 0664
    # 设置新创建目录的权限掩码为 0775,即目录所有者和所属组有读写执行权限,其他用户有读和执行权限
    directory mask = 0775

全局设置([global] 部分)

选项 描述
workgroup Windows 工作组名称(默认 WORKGROUP)。
server string 服务器描述(显示在 Windows 网络邻居中)。
netbios name Samba 服务器的 NetBIOS 名称(默认取主机名,可自定义)。
security 安全模式(user:用户验证,推荐;share:共享密码验证,不安全)。
passdb backend 用户数据库类型(默认 tdbsam,使用 smbpasswd 管理用户)。
guest account 匿名用户映射的系统用户(如 nobodyguest)。
hosts allow 允许访问的客户端 IP/子网(格式:192.168.1.0/24 10.0.0.0/8)。
dos charset 文件名称字符集(解决跨平台乱码,如 cp936 对应简体中文)。

示例全局配置

[global]
    workgroup = MYGROUP
    server string = Samba File Server
    security = user
    passdb backend = tdbsam
    hosts allow = 192.168.1.0/24 127.0.0.1
    dos charset = cp936
    unix charset = utf8

共享定义(自定义共享段,如 [share_name])

选项 描述
path 共享目录的本地路径(如 /data/samba/share)。
browseable 是否在网络邻居中可见(yes/no)。
read only 是否只读(yes/no,配合 writable = yes 使用)。
guest ok 是否允许匿名用户访问(yes 时需设置 guest account)。
valid users 允许访问的用户(格式:user1, user2@group)。
write list 允许写入的用户/组(优先级高于 read only)。
create mask 新建文件权限(如 0664,对应 Linux 权限)。
directory mask 新建目录权限(如 0775)。
force user 强制所有访问映射为指定用户(如 root,慎用)。

示例共享配置

[public]
    path = /data/samba/public
    browseable = yes
    guest ok = yes
    read only = no
    create mask = 0664
    directory mask = 0775

[private]
    path = /data/samba/private
    valid users = @samba_group
    write list = user1, user2
    read only = no

二、用户管理与权限控制

1. 添加 Samba 用户

  • 步骤 1:先创建系统用户(Samba 用户需对应系统用户):
sudo useradd -m -s /sbin/nologin samba_user  # 创建不允许登录系统的用户
  • 步骤 2:将系统用户添加到 Samba 用户数据库并设置密码:
sudo smbpasswd -a samba_user

2. 权限三层控制

1.Linux 文件系统权限:通过 chmod/chown 控制底层文件访问(最终权限由 Linux 权限和 Samba 配置共同决定)。

2.Samba 共享权限:通过 valid usersread onlywrite list 等参数控制。

3.ACL 权限(可选):支持 Windows 风格的访问控制列表(需启用 vfs objects = acl_xattr 并安装 acl 工具)。

三、服务操作与测试

1. 启动与重启服务

  • systemd 管理(通用)
sudo systemctl start smbd nmbd  # 启动 Samba 服务(smbd 处理文件共享,nmbd 处理 NetBIOS 名称解析)
sudo systemctl enable smbd nmbd  # 开机自启
sudo systemctl restart smbd nmbd  # 修改配置后重启

2. 检查配置语法

testparm /etc/samba/smb.conf  # 验证配置文件是否有误

3. 查看共享状态

smbstatus  # 查看当前连接的客户端和打开的文件

四、客户端访问方法

1. Windows 客户端

  • 方法 1:通过网络邻居访问 打开 网络 → 找到 Samba 服务器 → 输入用户名密码(若禁用匿名访问)。
  • 方法 2:映射网络驱动器 右键 此电脑映射网络驱动器 → 输入路径 \\服务器IP或域名\共享名 → 登录。

2. Linux 客户端

  • 临时挂载(使用 mount.cifs
sudo mount -t cifs //服务器IP/共享名 /本地挂载点 -o username=用户名,password=密码
  • 使用 smbclient 访问
smbclient //服务器IP/共享名 -U 用户名  # 交互式访问,类似 FTP 命令

3. macOS 客户端

通过 Finder前往连接服务器 → 输入 smb://服务器IP/共享名 并登录。

五、防火墙与安全配置

1. 开放端口

Samba 使用以下端口:

  • 139/tcp(NetBIOS 会话端口)
  • 445/tcp(直接 TCP 会话端口,Windows 10+ 主要使用此端口)

防火墙示例(CentOS)

sudo firewall-cmd --add-port={139/tcp,445/tcp} --permanent
sudo firewall-cmd --reload

2. 安全最佳实践

  • 避免使用 guest ok = yes 共享敏感数据,优先使用用户验证(security = user)。
  • 定期更新 Samba 版本,修复安全漏洞(Samba 历史上存在远程代码执行漏洞,需关注补丁)。
  • 禁用匿名用户写入:guest ok = yes 时配合 read only = yes 或严格限制目录权限。

六、常见场景配置

1. 公共匿名共享(无需密码)

[public]
    path = /data/public
    guest ok = yes
    read only = no  # 允许写入时需确保目录对 guest account 用户有写入权限(如 chown nobody:nobody /data/public)
    create mask = 0664
    directory mask = 0775

2. 用户专属共享

[user_share]
    path = /home/%u  # %u 自动替换为用户名,需提前创建对应目录并设置权限
    valid users = %S  # %S 表示共享名,即用户名
    browseable = no
    writable = yes
    create mask = 0600  # 仅用户自己可读写
    directory mask = 0700

3. 解决中文文件名乱码

在全局配置中添加:

dos charset = cp936  # 简体中文(GBK)
unix charset = utf8

七、常用命令总结

命令 描述
smbpasswd -a 用户名 添加/修改 Samba 用户密码
testparm 检查 smb.conf 语法错误
smbclient -L //服务器IP 列出服务器共享列表
mount -t cifs //IP/共享 挂载点 在 Linux 中挂载 Samba 共享
systemctl restart smbd 重启 Samba 服务

通过以上配置,可实现跨平台(Linux ↔ Windows)的文件共享,兼顾安全性和易用性。实际部署时需根据共享需求(匿名/认证、读写权限、用户隔离)调整配置,并注意底层文件系统权限与 Samba 策略的协同。

案例:

前置操作

# 1.查看并关闭防火墙
systemctl status firewalld
systemctl stop firewalld
systemctl disable firewalld
# 2.永久关闭SELinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config

安装服务

yum -y install samba samba-client

启动服务

systemctl start smb nmb

新建一个用户,用于文件共享

useradd -s /sbin/nologin  test

创建smb共享密码

smbpasswd -a  test

设置访问权限

chmod -R 755 /home/test/

修改配置文件

vim /etc/samba/smb.conf

配置文件类似如下

[test]  # 共享名
comment = "samba test"   # 描述信息
path = /home/test     # 共享目录
browseable = yes      # 所有人可见
public = yes          # 是否公开
writable = yes        # 是否允许修改

重启服务

systemctl restart smb nmb

客户端

windows: 运行 -> \\192.168.8.101\test 用户名:test 密码:**** 登陆使用