一、 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
:确保网络可用后再挂载(避免开机时网络未就绪导致挂载失败)。- 可添加额外选项,如
ro
、soft
(允许挂载失败)、hard
(强制重试,默认)等。
4. 卸载挂载
sudo umount /本地挂载点
三、防火墙与安全配置
1. 开放 NFS 相关端口(传统模式)
NFS 使用 RPC 服务,端口通常由 rpcbind
动态分配,建议开启以下端口:
111/tcp
和111/udp
(rpcbind 端口)2049/tcp
和2049/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 |
匿名用户映射的系统用户(如 nobody 或 guest )。 |
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 users
、read only
、write 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 密码:****
登陆使用