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 allow=@xq 表示容许来自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(安全账户管理)的简写。

  1. smbpasswd:该方式是使用smb自己的工具smbpasswd来给系统用户(真实 用户或者虚拟用户)设置一个Samba密码,客户端就用这个密码来访问Samba的资源。smbpasswd文件默认在/etc/samba目录下,不过有时候要手工建立该文件。

  2. 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

[root@vm3 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

[smb2@vm3 ~]$df

//172.25.48.3/project          6926264 1052264   5522156  17% /mnt

# su - smb1

[smb1@vm3 ~]$ 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