CentOS6.5下搭建Samba服务实现与Windows系统之间共享文件资源
FTP文件传输服务确实可以让主机之间的文件传输变得简单方便,但是FTP协议的本质是传输文件,而非共享文件,因此要想通过客户端直接在服务器上修改文件内容还是一件比较麻烦的事情。
1987年,微软公司和英特尔公司共同制定了SMB(Server Messages Block,服务器消息块)协议,旨在解决局域网内的文件或打印机等资源的共享问题,这也使得在多个主机之间共享文件变得越来越简单。到了1991年,当时还在读大学的Tridgwell为了解决Linux系统与Windows系统之间的文件共享问题,基于SMB协议开发出了SMBServer服务程序。这是一款开源的文件共享软件,经过简单配置就能够实现Linux系统与Windows系统之间的文件共享工作。当时,Tridgwell想把这款软件的名字SMBServer注册成为商标,但却被商标局以SMB是没有意义的字符而拒绝了申请。后来Tridgwell不断翻看词典,突然看到一个拉丁舞蹈的名字—Samba,而且这个热情洋溢的舞蹈名字中又恰好包含了“SMB”,于是Samba服务程序的名字由此诞生。Samba服务程序现在已经成为在Linux系统与Windows系统之间共享文件的最佳选择。
一、安装Samba服务:
首先使用 rpm -qa | grep samba 命令查看系统有没有安装Samba服务
如果没有,使用 yum install samba 命令进行安装
。。。中间部分输出信息省略。。。
使用 rpm -qa | grep samba 命令查看安装的Samba信息
service smb start # 启动Samba服务
service smb stop # 停止Samba服务
service smb restart # 重新启动Samba服务
service smb status # 查看Samba服务的状态
chkconfig smb on # 加入开机启动项
二、编辑Samba服务的配置文件:
由于在Samba服务程序的主配置文件中,注释信息行实在太多,不便于分析里面的重要参数,因此先把主配置文件用mv命令改个名字,然后使用cat命令读入主配置文件,再在grep命令后面添加-v参数(反向选择),分别去掉所有以井号(#)和分号(;)开头的注释信息行,对于剩余的空白行可以使用^$参数来表示并进行反选过滤,最后把过滤后的可用参数信息通过重定向符覆盖写入到原始文件名称中。执行过滤后剩下的Samba服务程序的参数并不复杂,为了更方便读者查阅参数的功能,下面的表中罗列了这些参数以及相应的注释说明。
mv /etc/samba/smb.conf /etc/samba/smb.conf-backup
cat /etc/samba/smb.conf-backup | grep -v "#" | grep -v ";" | grep -v "^$" > /etc/samba/smb.conf
vim /etc/samba/smb.conf
Samba服务程序中的参数以及作用
[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:需验证来访主机提供的口令后才可以访问;提升了安全性 | ||
#server:使用独立的远程主机验证来访主机提供的口令(集中管理账户) | ||
#domain:使用域控制器进行身份验证 | ||
passdb backend = tdbsam | #定义用户后台的类型,共有3种 | |
#smbpasswd:使用smbpasswd命令为系统用户设置Samba服务程序的密码 | ||
#tdbsam:创建数据库文件并使用pdbedit命令建立Samba服务程序的用户 | ||
#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 |
三、配置共享资源
第1步:创建用于访问共享资源的账户信息。在CentOS 6和7系统中,Samba服务程序默认都使用的是用户口令认证模式(user)。这种认证模式可以确保仅让有密码且受信任的用户访问共享资源,而且验证过程也十分简单。不过,只有建立账户信息数据库之后,才能使用用户口令认证模式。另外,Samba服务程序的数据库要求账户必须在当前系统中已经存在,否则日后创建文件时将导致文件的权限属性混乱不堪,由此引发错误。
pdbedit命令用于管理SMB服务程序的账户信息数据库,格式为“pdbedit [选项] 账户”。在第一次把账户信息写入到数据库时需要使用-a参数,以后在执行修改密码、删除账户等操作时就不再需要该参数了。pdbedit命令中使用的参数以及作用如下表所示。
用于pdbedit命令的参数以及作用
参数 | 作用 |
-a 用户名 | 建立Samba用户 |
-x 用户名 | 删除Samba用户 |
-L | 列出用户列表 |
-Lv | 列出用户详细信息的列表 |
useradd samba # 创建账户
pdbedit -a -u samba # 把用来连接SMB服务的账户信息写入到数据库
第2步:创建用于共享资源的文件目录。在创建时,不仅要考虑到文件读写权限的问题,而且由于/home目录是系统中普通用户的家目录,因此还需要考虑应用于该目录的SELinux安全上下文所带来的限制。在前面对Samba服务程序配置文件中的注释信息进行过滤时,这些过滤的信息中就有关于SELinux安全上下文策略的说明,我们只需按照过滤信息中有关SELinux安全上下文策略中的说明中给的值进行修改即可。修改完毕后执行restorecon命令,让应用于目录的新SELinux安全上下文立即生效。
mkdir /home/database/
chown -Rf samba:samba /home/database/
restorecon -Rv /home/database
第3步:设置SELinux服务与策略,使其允许通过Samba服务程序访问普通用户家目录。执行getsebool命令,筛选出所有与Samba服务程序相关的SELinux域策略,根据策略的名称(和经验)选择出正确的策略条目进行开启即可:
getsebool -a | grep samba
setsebool -P samba_enable_home_dirs on
getsebool -a | grep samba
第4步:在Samba服务程序的主配置文件中,根据下表所提到的格式写入共享信息。在原始的配置文件中,[homes]参数为来访用户的家目录共享信息,[printers]参数为共享的打印机设备。这两项如果在今后的工作中不需要,完全可以注释掉。
用于设置Samba服务程序的参数以及作用
参数 | 作用 |
[database] | 共享名称为database |
comment = Do not arbitrarily modify the database file | 警告用户不要随意修改数据库 |
path = /home/database | 共享目录为/home/database |
public = no | 关闭“所有人可见” |
writable = yes | 允许写入操作 |
vim /etc/samba/smb.conf
第5步:Samba服务程序的配置工作基本完毕。接下来重启smb服务(Samba服务程序在Linux系统中的名字为smb)并配置iptables防火墙,放通Samba服务使用的四个端口(tcp/139,445,udp/137,138),然后就可以检验配置效果了。
service smb restart #重新启动Samba服务
service smb status #查看Samba服务的状态
iptables -A INPUT -p tcp --dport 139 -j ACCEPT
iptables -A INPUT -p tcp --dport 445 -j ACCEPT
iptables -A INPUT -p udp --dport 137 -j ACCEPT
iptables -A INPUT -p udp --dport 138 -j ACCEPT
使用iptables命令配置的防火墙默认会在系统下一次重启时失效,如果想让配置的防火墙策略永久生效,执行保存命令:
service iptables save
CentOS7下添加端口的操作:
firewall-cmd --zone=public --add-port=139/tcp --permanent(--permanent永久生效,没有此参数重启后失效)
firewall-cmd --zone=public --add-port=445/tcp --permanent
firewall-cmd --zone=public --add-port=137/udp --permanent
firewall-cmd --zone=public --add-port=138/udp --permanent
firewall-cmd --reload # 重新加载防火墙
systemctl restart firewalld.service # 重启防火墙
接下来就是在Windows系统下连接Samba服务了,只需在Windows的“运行”命令框中(用快捷键“Win+R”就可以打开)输入两个反斜杠,然后再加服务器的IP地址即可。
正确输入新建的samba账户名以及使用pdbedit命令设置的密码后,就可以登录到共享界面中了,如下图所示。此时,我们可以尝试执行查看、写入、更名、删除文件等操作。
四、扩展
Samba为什么会使用四个端口,都是用来干什么的?
SMB是基于客户机/服务器型的协议,因而一台Samba服务器既可以充当文件共享服务器,也可以充当一个Samba的客户端,例如,一台在Linux下已经架设好的Samba服务器,Windows客户端就可以通过SMB协议共享Samba服务器上的资源文件,同时,Samba服务器也可以访问网络中其它Windows系统或者Linux系统共享出来的文件。
Samba在Windows下使用的是NetBIOS协议,如果你要使用Linux下共享出来的文件,请确认你的Windows系统下是否安装了NetBIOS协议。
组成Samba运行的有两个服务,一个是SMB,另一个是NMB;SMB是Samba的核心启动服务,监听139 TCP端口,主要负责建立Linux Samba服务器与Samba客户机之间的对话,验证用户身份并提供对文件和打印系统的访问,只有SMB服务启动,才能实现文件的共享;而NMB服务是负责解析用的,监听137和138 UDP端口,类似与DNS实现的功能,NMB可以把Linux系统共享的工作组名称与其IP对应起来,如果NMB服务没有启动,就只能通过IP来访问共享文件。
例如,某台Samba服务器的IP地址为192.168.0.162,对应的工作组名称为MYWORKGROUP,那么在Windows的IE浏览器输入下面两条指令都可以访问共享文件。其实这就是Windows下查看Linux Samba服务器共享文件的方法。
\\192.168.0.162\共享目录名称
\\MYWORKGROUP\共享目录名称
Samba服务所使用的端口和协议:
1)Port 137(UDP)- NetBIOS名字服务;nmbd
2)Port 138(UDP)- NetBIOS数据报服务
3)Port 139(TCP)- 文件和打印共享;smbd(基于SMB(Server Message Block)协议,主要在局域网中使用,文件共享协议)
4)Port 389(TCP)- 用于LDAP(Active Directory Mode)
5)Port 445(TCP)- NetBIOS服务在Windows 2000及以后版本使用此端口,(Common Internet File System,CIFS,它是SMB协议扩展到Internet后,实现Internet文件共享)
6)Port 901(TCP)- 用于SWAT,用于网页管理Samba
本文参考自:
(2)https://www.cnblogs.com/muscleape/p/6385583.html
(3)http://www.mrliangqi.com/804.html