章节简述:
本章节为读者讲述文件共享系统的作用,了解Samba与NFS服务程序的开发背景以及用法。
详细逐条讲解Samba服务配置参数,演示安全共享文件的配置策方法,并使用autofs服务程序自动挂载设备,
学会后即可实现Linux系统之间或与Windows系统之间的文件共享,以及在共享文件时如何配置防火墙与SELinux策略规则。
12.1 了解文件共享服务
早期网络想要在不同主机之间共享文件大多要用FTP协议来传输,但FTP协议仅能做到传输文件却不能直接修改对方主机的资料数据,这样确实不太方便,于是便出现了NFS开源文件共享程序:NFS(NetworkFile System)是一个能够将多台Linux的远程主机数据挂载到本地目录的服务,属于轻量级的文件共享服务,不支持Linux与 Windows系统间的文件共享。
随后在1991年时大学生Tridgwell为了解决Linux与Windows系统之间共享文件的问题,便开发出了SMB协议与Samba服务程序。
SMB(Server Messages Block)协议:实现局域网内文件或打印机等资源共享服务的协议。
当时Tridgwell想要注册SMBServer这个商标,但却被因为SMB是没有意义的字符被拒绝了,经过Tridgwell不断翻看词典,终于找到了一个拉丁舞蹈的名字——SAMBA,而这个热情舞蹈的名字中又恰好包含了SMB(SAMBA),于是这便是Samba程序名字的由来。
Samba服务程序是一款基于SMB协议并由服务端和客户端组成的开源文件共享软件,实现了Linux与Windows系统间的文件共享。
12.2 Samba服务
12.2.1 安装服务程序
通过安装Samba服务程序后细致的分析其配置文件参数,更能够帮助读者们理解Samba服务的安全验证方式。
安装Samba服务软件包:
[root@linuxprobe Desktop]# yum install samba Loaded plugins: langpacks, product-id, subscription-manager ………………省略部分安装过程……………… Installing: samba x86_64 4.1.1-31.el7 rhel7 527 k ………………省略部分安装过程……………… Complete!
[root@linuxprobe ~]# cat/etc/samba/smb.conf
备份原始的配置文件:
[root@linuxprobe ~]# mv /etc/samba/smb.conf /etc/samba/smb.conf.bak
过滤掉无用的内容:
先使用cat命令读入Smb配置文件后通过grep命令-v参数(反向选择)去掉所有注释信息,然后分别删选掉包含#号的行("#"),包含;号的行(";")以及所有的空白行("^$"),最后最后将过滤后的信息覆盖写入到/etc/samba/smb.conf文件中。
cat /etc/samba/smb.conf.bak | grep -v "#" | grep -v ";" | grep -v "^$" > /etc/samba/smb.conf
[global] | #全局参数。 | |
workgroup = MYGROUP | #工作组名称。 | |
server string = Samba Server Version %v | #服务器介绍信息,参数%v为显示SMB版本号。 | |
log file = /var/log/samba/log.%m | #定义日志文件存放位置与名称,参数%m为来访的主机名。 | |
max log size = 50 | #定义日志文件最大容量为50Kb。 | |
security = user | #安全验证的方式,总共有4种。 | |
#share:来访主机无需验证口令,更加方便,但安全性很差。 | ||
#user:需由SMB服务验证来访主机提供的口令后才可建立访问,更加的安全。 | ||
#server:使用独立的远程主机验证来访主机提供的口令(集中管理帐号)。 | ||
#domain:使用PDC来完成验证 | ||
passdb backend = tdbsam | #定义用户后台的类型,共有3种。 | |
#smbpasswd:使用SMB服务的smbpasswd命令给系统用户设置SMB密码。 | ||
#tdbsam:创建数据库文件并使用pdbedit建立SMB独立的用户。 | ||
#ldapsam:基于LDAP服务进行帐户验证。 | ||
load printers = yes | #设置是否当Samba服务启动时共享打印机设备。 | |
cups options = raw | #打印机的选项 | |
[homes] | #共享参数 | |
comment = Home Directories | #描述信息 | |
browseable = no | #指定共享是否在“网上邻居”中可见。 | |
writable = yes | #定义是否可写入操作,与"read only"相反。 | |
[printers] | #打印机共享参数 | |
comment = All Printers | ||
path = /var/spool/samba | #共享文件的实际路径(重要)。 | |
browseable = no | ||
guest ok = no | #是否所有人可见,等同于"public"参数。 | |
writable = no | ||
printable = yes |
参数 | 作用 |
[linuxprobe] | 共享名称为linuxprobe |
comment = Do not arbitrarily modify the database file | 警告用户不要随意修改数据库 |
path = /home/database | 共享文件夹在/home/database |
public = no | 关闭所有人可见 |
writable = yes | 允许写入操作 |
12.2.2 安全共享文件
使用Samba服务口令验证方式可以让共享文件更加的安全,做到仅让信任的用户访问,而且验证过程也很简单,要想使用口令验证模式,我们需要先需要创建Samba服务独立的数据库。
第1步:检查当前是否为user验证模式。
[root@linuxprobe ~]# cat /etc/samba/smb.conf
第2步:创建共享文件夹:
[root@linuxprobe ~]# mkdir /database
第3步:描述共享文件夹信息。
在SMB服务主配置文件的最下面追加共享文件夹的配置参数:
[database]
comment = Do not arbitrarily modify the database file
path = /database
public = no
writable = yes
保存smb.conf文件后重启启动SMB服务:
[root@linuxprobe ~]# systemctl restart smb
添加到开机启动项:
ln -s '/usr/lib/systemd/system/smb.service' '/etc/systemd/system/multi-user.target.wants/smb.service'
第4步:使用Windows主机尝试访问
读者按照下表的IP地址规划动手配置下Windows的网卡参数,应该都会吧~
主机名称 | 操作系统 | IP地址 |
Samba共享服务器 | 红帽RHEL7操作系统 | 192.168.10.10 |
客户端 | 红帽RHEL7操作系统 | 192.168.10.20 |
客户端 | 微软Windows7操作系统 | 192.168.10.30 |
在Windows主机的运行框中输入远程主机的信息
此时访问Samba服务报错
此时访问Samba服务是报错的,如果读者已经看完Apache(httpd)服务程序的章节,应该还记得防火墙和SELinux规则吧。
第5步:清空防火墙规则链:
Windows访问Samba主机提示报错,我们怀疑是Iptables阻止了访问操作,于是执行:
[root@linuxprobe ~]# Iptables -F [root@linuxprobe ~]# service iptables save
因为Windows系统的缓存关系,可能需要先重启下Windows主机再尝试访问Samba共享。
Windows系统被要求验证帐户口令
那么这个问题就是出在Iptables防火墙的默认规则中了,所以请对SELinux多一点耐心,不要直接关闭SELinux。
第6步:创建SMB服务独立的帐号。
现在Windows系统要求先验证后才能访问共享,而SMB服务配置文件中密码数据库后台类型为"tdbsam",所以这个帐户和口令是Samba服务的独立帐号信息,我们需要使用pdbedit命令来创建SMB服务的用户数据库。
pdbedit命令用于管理SMB服务的帐户信息数据库,格式为:“pdbedit [选项] 帐户”。
参数 | 作用 |
-a 用户名 | 建立Samba用户 |
-x 用户名 | 删除Samba用户 |
-L | 列出用户列表 |
-Lv | 列出用户详细信息的列表 |
创建系统用户:
[root@linuxprobe ~]# useradd smbuser
将此系统用户提升为SMB用户:
[root@linuxprobe ~]# pdbedit -a -u smbuser new password:设置SMB服务独立的密码 retype new password: Unix username: smbuser NT username: Account Flags: [U ] User SID: S-1-5-21-4146456071-3435711857-2069708454-1000 Primary Group SID: S-1-5-21-4146456071-3435711857-2069708454-513 Full Name: Home Directory: \linuxprobesmbuser HomeDir Drive: Logon Script: Profile Path: \linuxprobesmbuserprofile Domain: LINUXPROBE Account desc: Workstations: Munged dial: Logon time: 0 Logoff time: Wed, 06 Feb 2036 23:06:39 CST Kickoff time: Wed, 06 Feb 2036 23:06:39 CST Password last set: Sat, 11 Jul 2015 18:27:04 CST Password can change: Sat, 11 Jul 2015 18:27:04 CST Password must change: never Last bad password : 0 Bad password count : 0 Logon hours : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
使用Windows主机访问Samba共享果然可以使用smbuser用户登入,但对于共享文件这么重要的事情,SELinux一定会强制管理,刚刚没有妥当的配置好SELinux,现在果然又报错了。
将共享目录的所有者和所有组设置为smbuser用户:
[root@linuxprobe ~]# chown -Rf smbuser:smbuser /database
允许SELinux对于SMB用户共享家目录的布尔值:
[root@linuxprobe ~]# setsebool -P samba_enable_home_dirs on
将共享目录的SELinux安全上下文设置妥当:
[root@linuxprobe ~]# semanage fcontext -a -t samba_share_t /database
使新的安全上下文立即生效:
[root@linuxprobe ~]# restorecon -Rv /database/
主机名称 | 操作系统 | IP地址 |
Samba共享服务器 | 红帽RHEL7操作系统 | 192.168.10.10 |
客户端 | 红帽RHEL7操作系统 | 192.168.10.20 |
客户端 | 微软Windows7操作系统 | 192.168.10.30 |
在客户端安装cifs-utils软件包:
[root@linuxprobe ~]# yum install -y cifs-utils Loaded plugins: langpacks, product-id, subscription-manager ………………省略部分安装过程……………… Installing: cifs-utils x86_64 6.2-6.el7 rhel7 83 k ………………省略部分安装过程……………… Complete!
创建挂载目录:
[root@linuxprobe ~]# mkdir /database
在root家目录创建认证文件(依次为SMB用户名、SMB用户密码、SMB共享域):
[root@linuxprobe ~]# vim auth.smb username=smbuser password=redhat domain=MYGROUP
此文件太重要了,权限应该给小一些:
[root@linuxprobe ~]# chmod -Rf 600 auth.smb
配置其挂载信息(内容依次为远程共享信息、本地挂载目录、文件系统类型、认证文件以及开机自检选项):
[root@linuxprobe ~]# vim /etc/fstab //192.168.10.10/database /database cifs credentials=/root/auth.smb 0 0
使用mount命令的-a参数挂载所有在fstab文件中定义的文件信息:
[root@linuxprobe ~]# mount -a
成功挂载Samba的共享目录(能够看到共享文件了):
[root@linuxprobe ~]# cat /database/Memo.txt i can edit it .
出现问题?大胆提问!
因读者们硬件不同或操作错误都可能导致实验配置出错,请耐心再仔细看看操作步骤吧,不要气馁~
Linux技术交流请加A群:560843(满),B群:340829(推荐),C群:463590(推荐),点此查看全国群。
*本群特色:通过口令验证确保每一个群员都是《Linux就该这么学》的读者,答疑更有针对性,不定期免费领取定制礼品。
12.3 NFS网络文件系统
NFS(Network Files System)即网络文件系统,NFS文件系统协议允许网络中的主机通过TCP/IP协议进行资源共享,NFS客户端可以像使用本地资源一样读写远端NFS服务端的资料,需要注意NFS服务依赖于RPC服务与外部通信,所以必需保证RPC服务能够正常注册服务的端口信息才能正常使用NFS服务。
有个学员问过NFS是不是need for speed的缩写啊?哈哈,NFS配置和使用都是非常快捷,所以这么说也是有道理的。
红帽RHEL7系统已经默认安装NFS服务:
[root@linuxprobe ~]# yum install nfs-utils Loaded plugins: langpacks, product-id, subscription-manager (1/2): rhel7/group_gz | 134 kB 00:00 (2/2): rhel7/primary_db | 3.4 MB 00:00 Package 1:nfs-utils-1.3.0-0.el7.x86_64 already installed and latest version Nothing to do
本次的实验需要两台Linux主机,网络配置情况:
主机名称 | 操作系统 | IP地址 |
NFS服务端 | 红帽RHEL7操作系统 | 192.168.10.10 |
NFS客户端 | 红帽RHEL7操作系统 | 192.168.10.20 |
第1步:创建NFS服务端的共享目录。
清空iptables默认的规则链:
[root@linuxprobe ~]# iptables -F
保存清空后的iptables规则:
[root@linuxprobe ~]# service iptables save
创建nfsfile共享目录:
[root@linuxprobe ~]# mkdir /nfsfile
为共享目录设置权限(让其他人可以有写入权限):
[root@linuxprobe ~]# chmod -Rf 777 /nfsfile
写入一个文件,用于NFS客户端读取:
[root@linuxprobe ~]# echo "welcome to linuxprobe.com" > /nfsfile/readme
NFS服务端配置文件是"/etc/exports",用于定义要共享的目录以及相应权限。
[root@linuxprobe ~]# vim /etc/exports //格式为:共享目录的绝对路径 允许访问NFS资源的客户端(权限参数) /nfsfile 192.168.10.* (rw,sync,root_squash)
NFS配置共享的参数有:
参数 | 作用 |
ro | 只读默认 |
rw | 读写模式 |
root_squash | 当NFS客户端使用root用户访问时,映射为NFS服务端的匿名用户。 |
no_root_squash | 当NFS客户端使用root用户访问时,映射为NFS服务端的root用户。 |
all_squash | 不论NFS客户端使用任何帐户,均映射为NFS服务端的匿名用户。 |
sync | 同时将数据写入到内存与硬盘中,保证不丢失数据。 |
async | 优先将数据保存到内存,然后再写入硬盘,效率更高,但可能造成数据丢失。 |
看完后来分析下/etc/exports文件中参数作用吧“/nfsfile 192.168.10.* (rw,sync,no_root_squash)”(答案模式)。
答案:将/nfsfile目录共享给192.168.10.0/24网段,运行NFS客户端读写数据、同步数据并映射为NFS服务器的root用户。
第2步:启动NFS服务端
刚刚讲到NFS服务是依赖于RPC服务的,但在红帽RHEL7系统中RPC服务已经默认运行(active)了,所以无需再配置RPC服务啦。
[root@linuxprobe ~]# systemctl status rpcbind
启动nfs-server程序:
[root@linuxprobe ~]# systemctl start nfs-server
设置NFS服务端为开机启动:
[root@linuxprobe ~]# systemctl enable nfs-server
第3步:配置NFS客户端
如果NFS客户端也是红帽RHEL7系统,那么软件包nfs-utils一定也是已经默认安装,直接挂载共享就可以了。
showmount命令用于查询NFS服务端共享信息,格式为:“showmount [参数] [远程主机]”。
参数 | 作用 |
-e | 显示NFS服务端的共享列表 |
-a | 显示本机挂载NFS资源的情况 |
-v | 显示版本号 |
查询远程NFS服务端中可用的共享资源:
[root@linuxprobe ~]# showmount -e 192.168.10.10 Export list for 192.168.10.10: /nfsfile (everyone)
创建本地挂载目录:
[root@linuxprobe ~]# mkdir /nfsfile [root@linuxprobe ~]# mount -t nfs 192.168.10.10:/nfsfile /nfsfile
顺利查看到刚刚写入文件内容:
[root@linuxprobe ~]# cat /nfsfile/readme welcome to linuxprobe.com
如果希望开机后自动将NFS资源挂载到本地,那么就可以通过修改fstab文件来实现:
[root@linuxprobe ~]# vim /etc/fstab 192.168.10.10:/nfsfile /nfsfile nfs defaults 0 0
12.4 AutoFs自动挂载服务
AutoFs服务与Mount/Umount命令不同之处在于它是一种守护进程,只有检测到用户试图访问一个尚未挂载的文件系统时才自动的检测并挂载该文件系统,换句话说,将挂载信息填入/etc/fstab文件后系统将在每次开机时都自动将其挂载,而运行AutoFs后则是当用户需要使用该文件系统了才会动态的挂载,节约网络与系统资源。
模拟训练:每次进入/media/iso目录时都会自动挂载镜像。
主机名称 | 操作系统 | IP地址 |
NFS服务端 | 红帽RHEL7操作系统 | 192.168.10.10 |
NFS客户端 | 红帽RHEL7操作系统 | 192.168.10.20 |
安装autofs服务:
[root@linuxprobe ~]# yum install autofs ………………省略部分安装过程……………… Installing: autofs x86_64 1:5.0.7-40.el7 rhel 550 k Installing for dependencies: hesiod x86_64 3.2.1-3.el7 rhel 30 k ………………省略部分安装过程……………… Complete!
启动autofs服务并加入到开机启动项中:
[root@linuxprobe ~]# systemctl enable autofs
ln -s '/usr/lib/systemd/system/autofs.service' '/etc/systemd/system/multi-user.target.wants/autofs.service'
修改autofs主配置文件(格式为:挂载目录 映射配置文件):
[root@linuxprobe ~]# vim /etc/auto.master /media /etc/iso.misc
编辑挂载配置参数文件(映射文件):
[root@linuxprobe ~]# vim /etc/iso.misc iso -fstype=iso9660,ro,nosuid,nodev :/dev/cdrom
重新加载启动autofs服务:
[root@linuxprobe ~]# systemctl restart autofs
进入自动挂载目录中:
[root@linuxprobe ~]# cd /media/iso
查看当前目录下的文件:
[root@linuxprobe iso]# ls addons images Packages RPM-GPG-KEY-redhat-release EFI isolinux release-notes TRANS.TBL EULA LiveOS repodata GPL media.repo RPM-GPG-KEY-redhat-beta