Windows客户端和linux服务端实现共享文件的方式是运用samba服务器,用的是SMB和CIFS协议以及NETBIOS协议,可以实现不同的系统之间互相共享文件。Linux/Unix之间用的是NFS协议。
服务
nmb :提供NETBIOS域名解析,将计算机的netbios名称解析成ip地址,并提供浏览服务显示网络上的共享资源列表。
smb : 提供目录和打印机共享,支持认证,权限设置,管理网络共享资源。
监听端口
1.NETBIOS协议对于windows来讲监听TCP的139端口和UDP的137,138端口 ,所以nmb在linux上模拟出了udp的137和138端口,以及tcp的139端口,
2.smb模拟出 tcp的445端口。
工作原理
协议协商:客户端访问samba服务器时,发送negprot指令数据包,告知服务器,客户端主机支持smb协议,samba服务器根据客户端的情况,选择最优的smb类型,响应客户端的请求。
客户端——>negprot请求——>samba服务器——>negprot响应——>客户端
建立连接:当smb类型确认后,客户端会发送session setup指令数据包,提交帐号和密码,请求与samba服务器建立连接,如果客户端通过请求,samba服务器作出回应,为客户分配唯一的UID,在客户端与其通信时使用。
客户端——>session setup &x请求——>服务器——>session setup &x响应——>客户端 访问共享资源:客户端访问samba服务器的共享资源时,发送tree connect指令数据包,通知服务器服务器需要访问的共享资源名称,如果设置允许访问,samba服务器会为每个客户端与共享资源连接分配TID,客户端即可访问需要的共享资源。
客户端——>tree connect &x请求——>服务器——>tree connect &x请求——>客户端
断开连接:共享使用完毕,客户端向服务器发送tree disconnect请求,与服务器断开连接。
客户端——>tree disconnect &x请求——>服务器——>tree disconnect &x请求——>客户端
SAMBA服务器在Linux系统上同时监听这4个端口。
防火墙和selinux均处于关闭状态。
所需软件包:
samba-winbind-3.6.9-164.el6.x86_64
samba-3.6.9-164.el6.x86_64
samba-common-3.6.9-164.el6.x86_64
samba-winbind-clients-3.6.9-164.el6.x86_64
samba-client-3.6.9-164.el6.x86_6
cifs-utils
不需要密码的共享测试
配置smb.conf主配置文件。
# vim /etc/samba/smb.conf ##samba服务器的主配置文件
[global] workgroup = WESTOS ##设定samba要加入的工作组或域
server string = MY Samba Server Version %v ##服务器描述,%v表示显示Samba的版本号。
##netbios name = smbserver ##设置Samba Server的NetBIOS名称。如果不填,则默认会使用该服务器的DNS名称的第一部分,netbios name和workgroup名字不要设置成一样的。
##interfaces = lo eth0 192.168.12.2/24 192.168.13.2/24 ##设置Samba Server监听哪些网卡,可以写网卡名,也可以写该网卡的IP地址。
hosts allow = 127. 172.25.48. ##表示允许连接到Samba Server的客户端
例:hosts allow=172.17.2.EXCEPT172.17.2.50
表示容许来自172.17.2.*.*的主机连接,但排除172.17.2.50
hosts allow=172.17.2.0/255.255.0.0
表示容许来自172.17.2.0/255.255.0.0子网中的所有主机连接
hosts allow=M1,M2
表示容许来自M1和M2两台计算机连接
hosts [email protected]
表示容许来自XQ网域的所有计算机连接
##max connections = 0 ##指定连接Samba Server的最大连接数目。如果超出连接数目,则新的连接请求将被拒绝。0表示不限制。
##deadtime = 0 ##设置断掉一个没有打开任何文件的连接的时间。单位是分钟,0代表Samba Server不自动切断任何连接。
##time server = yes/no ##设置让nmdb成为windows客户端的时间服务器。
log file = /var/log/samba/log.%m ##samba的日志文件及命名格式
max log size = 50 ##设置samba日志文件的最大容量,单位为kb
security = share ##设置用户访问Samba Server的验证方式,一共有四种验证方式。 1.share:用户访问Samba Server不需要提供用户名和口令, 安全性能较低。
2. user:Samba Server共享目录只能被授权的用户访问,由Samba Server负责检查账号和密码的正确性。账号和密码要在本Samba Server中建立。
3. server:依靠其他Windows NT/2000或Samba Server来验证用户的账号和密码,是一种代理验证。此种安全模式下,系统管理员可以把所有的Windows用户和口令集中到一个NT系统上,使用Windows NT进行Samba认证, 远程服务器可以自动认证全部用户和口令,如果认证失败,Samba将使用用户级安全模式作为替代的方式。
4. domain:域安全级别,使用主域控制器(PDC)来完成认证。
##passdb backend = tdbsam ##passdb backend就是用户后台的意思。目前有三种后台:smbpasswd、tdbsam和ldapsam。sam应该是security account manager(安全账户管理)的简写。
- smbpasswd:该方式是使用smb自己的工具smbpasswd来给系统用户(真实
用户或者虚拟用户)设置一个Samba密码,客户端就用这个密码来访问Samba的资源。smbpasswd文件默认在/etc/samba目录下,不过有时候要手工建立该文件。 - tdbsam:该方式则是使用一个数据库文件来建立用户数据库。数据库文件叫passdb.tdb,默认在/etc/samba目录下。passdb.tdb用户数据库可以使用smbpasswd –a来建立Samba用户,不过要建立的Samba用户必须先是系统用户。我们也可以使用pdbedit命令来建立Samba账户。pdbedit命令的参数很多,我们列出几个主要的。
pdbedit –a username:新建Samba账户(用户必须是已经存在的系统用户)。
pdbedit –x username:删除Samba账户。
pdbedit –L:列出Samba用户列表,读取passdb.tdb数据库文件。
pdbedit –Lv:列出Samba用户列表的详细信息。
pdbedit –c “[D]” –u username:暂停该Samba用户的账号。
pdbedit –c “[]” –u username:恢复该Samba用户的账号。
ldapsam:该方式则是基于LDAP的账户管理方式来验证用户。首先要建立LDAP服务,然后设置“passdb backend = ldapsam:ldap://LDAP Server”
##smb passwd file = /etc/samba/smbpasswd
用来定义samba用户的密码文件。smbpasswd文件如果没有那就要手工新建。
##username map = /etc/samba/smbuse139 rs ##定义用户名映射,比如可以将root换成administrator、admin等。不过要事先在smbusers文件中定义好。比如:root = administrator admin,这样就可以用administrator或admin这两个用户来代替root登陆Samba Server,更贴近windows用户的习惯。
##guest account = nobody ##用来设置guest用户名
##socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192 ##设置服务器和客户端之间会话的Socket选项,可以优化传输速度
##domain master = yes/no ##设置Samba服务器是否要成为网域主浏览器,网域主浏览器可以管理跨子网域的浏览服务
load printers = no ##是否启用打印机功能,默认为yes
cups options = raw
[homes] ##在客户端显示的共享目录名称
comment = homes directory ##共享目录描述.任意字符串
browseable = yes/no ##指定该共享是否可以浏览
writable = no ##指定该共享路径不可写
read only=yes ##指定改共享路径可读取
##available = yes/no ##指定该共享资源是否可用。
create mode = 0664 samba用户在自己家目录(默认/home/sambauser)下新建文件的默认权限为0644(0为acl权限)
directory mode = 0775 samba用户在自己家目录(默认/home/sambauser)下新建目录的默认权限为0775(0为acl权限)
[printers] ##打印功能共享目录
comment = All Printers
path = /var/spool/samba ##共享目录路径Samba服务器搭建
browseable = no
guest ok = no
writable = no
printable = yes
[temp] ##共享资源名称
comment = yang
path = /myshare ##资源目录
writable = yes ##可写入
browseable = yes ##可以被浏览到资源名称
guest ok = yes ##设置客户可以随意登录
# /etc/init.d/smb restart
Shutting down SMB services: [ OK ]
Starting SMB services: [ OK ]
# /etc/init.d/nmb restart
Shutting down NMB services: [ OK ]
Starting NMB services: [ OK ]
# testparm ##查看samba主配置文件中的配置
[global]
workgroup = WESTOS
server string = Samba Server Version %v
security = SHARE
log file = /var/log/samba/log.%m
max log size = 50 idmap config * : backend = tdb
cups options = raw
[homes]
comment = Home Directories
read only = No
browseable = No
[printers]
comment = All Printers
path = /var/spool/samba
printable = Yes
print ok = Yes
browseable = No
[temp]
comment = yang
path = /myshare
read only = No
guest ok = Yes
# netstat -antpl | grep smb ##查看smb服务开启的端口
tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN 1265/smbd
tcp 0 0 0.0.0.0:445 0.0.0.0:* LISTEN 1265/smbd
tcp 0 0 :::139 :::* LISTEN 1265/smbd
tcp 0 0 :::445 :::* LISTEN 1265/smbd
【主机测试】
# smbclient -L //127.0.0.1 ##本机检测能否共享成功
Enter root‘s password: 无密码,直接回车
Domain=[WESTOS] OS=[Unix] Server=[Samba 3.6.9-164.el6]
Sharename Type Comment IPC$
IPC IPC Service (Samba Server Version 3.6.9-164.el6)
temp Disk yang
Domain=[WESTOS] OS=[Unix] Server=[Samba 3.6.9-164.el6]
Server Comment
VM3 Samba Server Version 3.6.9-164.el6
Workgroup Master
WESTOS VM3
需要密码才能登录的共享
配置用户登录共享:
# vim /etc/samba/smb.conf
[global]
workgroup = vbirdhouse
server string = Samba Server Version %v
netbios name = vbirdserver
log file = /var/log/samba/log.%m
max log size = 50
security = user
passdb backend = tdbsam
load printers = yes
cups options = raw
[homes]
comment = Home Directories
browseable = no
writable = yes
create mode = 0644
create mode = 0755
[project]
comment = smbuser‘s project
path = /home/project
writable = yes
browseable = yes
write list = @users
# testparm ##检测语法
[global]
workgroup = VBIRDHOUSE
netbios name = VBIRDSERVER
server string = Samba Server Version %v
log file = /var/log/samba/log.%m
max log size = 50
idmap config * : backend = tdb
cups options = raw
[homes]
comment = Home Directories
read only = No
create mask = 0755
browseable = No
[project]
comment = smbuser‘s project
path = /home/project
write list = @users
read only = No
创建共享目录:
# mkdir /home/project
# chgrp users /home/project
# chmod 2770 /home/project
创建用户:
# useradd -G users smb1 添加系统用户
# echo 1234 | passwd --stdin smb1
# pdbedit -a -u smb1 添加samba用户
new password: redhat
retype new password:redhat
重启服务:
# /etc/init.d/smb restart
# /etc/init.d/nmb/restart
测试:
本机测试:# smbclient -L //127.0.0.1 ##用非samba用户测试
Enter root‘s password: 回车
Domain=[VBIRDHOUSE] OS=[Unix] Server=[Samba 3.6.9-164.el6]
Sharename Type Comment
project Disk smbuser‘s project
IPC$ IPC IPC Service (Samba Server Version 3.6.9-164.el6)
Anonymous login successful
Domain=[VBIRDHOUSE] OS=[Unix] Server=[Samba 3.6.9-164.el6]
Server Comment VBIRDSERVER
Samba Server Version 3.6.9-164.el6
Workgroup Master
VBIRDHOUSE
# smbclient -L //127.0.0.1 -U smb1 ##samba用户测试
Enter smb1‘s password: redhat
Domain=[VBIRDHOUSE] OS=[Unix] Server=[Samba 3.6.9-164.el6]
Sharename Type Comment
project Disk smbuser‘s project
IPC$ IPC IPC Service (Samba Server Version 3.6.9-164.el6)
smb1 Disk Home Directories
Domain=[VBIRDHOUSE] OS=[Unix] Server=[Samba 3.6.9-164.el6]
Server Comment
VBIRDSERVER Samba Server Version 3.6.9-164.el6
Workgroup Master
VBIRDHOUSE
# mount -t cifs //127.0.0.1/project /mnt -o username=smb1 ##挂载samba用户
Password: redhat
# df
//127.0.0.1/smb1 6926264 1051248 5523172 16% /mnt
# ls -a /mnt ##挂载点的文件和samba用户的原文件同步
. .. passwd
# smbclient //127.0.0.1/project -U smb1 ##使用samba用户登录samba服务器
Enter smb1‘s password: redhat
Domain=[VBIRDHOUSE] OS=[Unix] Server=[Samba 3.6.9-164.el6]
smb: \> ls
. D 0 Tue Mar 22 17:21:38 2016
.. D 0 Tue Mar 22 16:29:45 2016
passwd 1012 Tue Mar 22 17:21:38 2016
54111 blocks of size 131072. 43149 blocks available
smb: \> get passwd ##下载文件
getting file \passwd of size 1012 as passwd (10120000.0 KiloBytes/sec)
(average inf KiloBytes/sec)
smb: \> quit
[[email protected] smb1]# ls
passwd
# touch /file1
# smbclient //127.0.0.1/project -U smb1
Enter smb1‘s password:redhat
Domain=[VBIRDHOUSE] OS=[Unix] Server=[Samba 3.6.9-164.el6]
smb: \> put /file1 .
NT_STATUS_OBJECT_NAME_INVALID opening remote file \.
smb: \> put /file1 上传文件
putting file /file1 as \/file1 (0.0 kb/s) (average -nan kb/s)
smb: \> ls
. D 0 Tue Mar 22 17:26:25 2016
.. D 0 Tue Mar 22 16:29:45 2016
passwd 1012 Tue Mar 22 17:21:38 2016
file1 A 0 Tue Mar 22 17:26:25 2016
54111 blocks of size 131072. 43149 blocks available
smb: \> quit
客户机测试:172.25.48.4:vm4.example.com
# smbclient -L //172.25.48.3
Enter root‘s password: 回车
Anonymous login successful
Domain=[VBIRDHOUSE] OS=[Unix] Server=[Samba 3.6.9-164.el6]
Sharename Type Comment
IPC$ IPC IPC Service (Samba Server Version 3.6.9-164.el6)
project Disk smbuser‘s project
Anonymous login successful
Domain=[VBIRDHOUSE] OS=[Unix] Server=[Samba 3.6.9-164.el6]
Server Comment
VBIRDSERVER Samba Server Version 3.6.9-164.el6
Workgroup Master
MYGROUP VM4
VBIRDHOUSE VBIRDSERVER
# smbclient //172.25.48.3/project -U smb1
smb: \> put /file2
putting file /file2 as \/file2 (0.0 kb/s) (average 0.0 kb/s)
smb: \> ls
. D 0 Tue Mar 22 20:15:19 2016
.. D 0 Tue Mar 22 16:29:45 2016
file2 A 0 Tue Mar 22 20:15:19 2016
passwd 1012 Tue Mar 22 17:21:38 2016
file1 A 0 Tue Mar 22 20:14:54 2016
54111 blocks of size 131072. 43149 blocks available
smb: \> get passwd ##下载
getting file \passwd of size 1012 as passwd (52.0 KiloBytes/sec) (average 52.0 KiloBytes/sec)
smb: \> put /file2 ##上传
putting file /file2 as \/file2 (0.0 kb/s) (average 0.0 kb/s)
smb: \> ls
. D 0 Tue Mar 22 20:15:19 2016
.. D 0 Tue Mar 22 16:29:45 2016
file2 A 0 Tue Mar 22 20:15:19 2016
passwd 1012 Tue Mar 22 17:21:38 2016
file1 A 0 Tue Mar 22 20:14:54 2016
54111 blocks of size 131072. 43149 blocks available
查看登录过samba服务器的主机
# cd /var/log/samba
# ls
cores
log.172.25.48.1 log.nmbd log.vm1 old
log.127.0.0.1 log.172.25.48.2 log.smbd
log.vm2
多用户挂载(针对与客户端设置)
挂载分享目录
# mount //172.25.48.3/project /mnt/ -o username=smb1,smb2,smb3,sec=ntlmssp
Password: redhat
查看是否挂载
# df
//172.25.48.3/project 6926264 1052328 5522092 17% /mnt
切换到其他用户,该用户必须在服务端存在,且信息完全一致,可以使用`id rob`分别在客户端和服务端检查
# su - smb2
[[email protected] ~]$df
//172.25.48.3/project 6926264 1052264 5522156 17% /mnt
# su - smb1
[[email protected] ~]$ df
//172.25.48.3/project 6926264 1052260 5522160 17% /mnt
进入挂载点
# cd /mnt
# touch file6
# ls
file1 file2 file3 file4 file6 passwd
如果可以创建,则说明正确
多用户永久挂载
# vim /etc/fstab
//172.25.48.1/project /cifs cifs defaults,username=smb1,smb2,smb3,sec=ntlmssp 0 0
# mount -a