安装
Samba用来windows之间共享文档,linux可以使用NFS进行文件共享,linux安装samba就可以给windows共享文档了。samba是一种C/S结构,必须在服务提供端安装server,客户端安装client。服务端使用使用TCP协议的445端口。
Samba是一套程序,其中最重要的两个进程是nmbd和smbd:
smbd:提供SMB / CIFS服务(Common Internet File System文件共享和打印)的守护进程,使用SMB协议与客户进行连接,完成用户认证,权限管理和文件共享任务。
nmbd:提供NetBIOS名称服务的守护进程,可以帮助客户端定位服务器和域,相当于WindowsNT中的WINS服务器,如果只是单纯的共享文件可以关闭这个服务,这样就不用在防火墙中开发137、138端口,但是在Windows中“桌面”上的“网络”里不会在显示共享的主机,只能通过“运行” 打开 \IP 的方式连接到共享的目录。
在家用samba将linux文件进行共享时,所需程序很简单,samba(smbd及nmbd)和samba-common(主要提供了SAMBA的主要配置文件smb.conf)。
安装命令:
sudo apt install samba #安装的同时会一起把samba-common软件一起安装
如果需要了文件共享服务器上安装客户端,可以使用如下命令,一般不需要,只是用来测试。
sudo apt install smbclient
配置
samba的配置文件位置:/etc/samba/smb.conf
可以用 cat /etc/samba/smb.conf看看结构。
[global]全局配置
[homes] 共享目录
[printers] 共享打印机
里面还有很多设置,但都有英文说明。看起来很复杂,可以将其改名保存,然后自己根据下面说明生成一个。
sudo mv /etc/samba/smb.conf /etc/samba/smb.conf.backup
首先提供官网文档说明链接: Setting up Samba as a Standalone Server.
目前的samba很强大,在企业内部可以设置为Active Directory Domain Controller等,但家用就只需要单独的文件共享服务器(as a standalone server)。所以看这部分就可以了。
这个文档主要描述两种模式
1)a share that is accessible anonymously (guest access).匿名访问模式
2)a share that requires authentication against a local user database on the Samba host.需要认证的用户模式。
试用1)模式
家里访问估计不想每次都输入密码吧,可以选用1)匿名访问模式。
首先确定需要共享的目录,我的目录是/mnt/sda6,如何将共享硬盘启动后自动挂载到合适目录请查mount、fstab。
目录能够被共享读写取决于目录本身的可读可写可执行权限,还要看共享的时候设置的权限。
所以第一步,将其此目录设置成可读可写可浏览:sudo chmod 777 /mnt/sda6,否则即使共享设置了可读写,同样访问不了。
然后配置samba的访问权限:最小的匿名guest访问模式的配置文件
使用vi或nano生成smb.conf:sudo vi /etc/samba/smb.conf或sudo nano /etc/samba/smb.conf,按照下列文档输入,或拷贝。最后保存。
用命令:testparm测试参数是否可用,这个命令最后可以打印配置到显示。如果使用testparm -v显示全部参数。
然后重启smbd服务:sudo service smbd restart就可以匿名访问了。
其中:[mnt-sda6]是共享名称,也就是网络共享中能看到的名称,这个名称可以任意取。
[global]
map to guest = Bad User #这一句很关键,无密码登录就靠它了。意思是将所有samba系统主机所不能正确识别的用户都映射成guest用户
log file = /var/log/samba/%m
log level = 1 #告警的时候记录
max log size = 1000 #单位是KB
[mnt-sda6]
# This share allows anonymous (guest) access
# without authentication!
path = /mnt/sda6 #这里需要改成自己需要共享的目录。
browseable = Yes #在网络邻居中能看到共享名
create mask = 0666 #设定新建文件的权限为-rw-rw-rw-,新建文件可读可写
directory mask = 0777 #设定新建目录的权限为drwxrwxrwx,新建文件夹可读可写可浏览
guest ok = Yes
guest only = Yes
read only = No
试用2)模式
认证模式
首先用vi或nano创建配置文件smb.conf,这个配置文件是最简单的配置文件。共享名称为demo,共享目录是/srv/samba/demo.
[global]
workgroup = WORKGROUP
log file = /var/log/samba/%m
log level = 1
[demo]
# This share requires authentication to access
path = /srv/samba/demo/
read only = no
其次,创建用户
首先需要说一下,系统用户和samba用户之间关系。首先需要linux系统中存在的用户才能使用samba共享。guest是默认用户,所以不需要创建。如果是root共享就不需要创建,但一般也不会用root进行共享。如果只用来samba共享的用户可以不需要用户目录和shell,用nologin参数来创建。
所以认证模式需要第一步确认用什么用户进行共享。如果存在非root用户,并且想要进行共享可以跳过下面创建用户这个环节。
共享文件的权限:首先,用来共享的这个用户,本身对共享目录存在什么样的权限,samba中设置的权限不能高于系统中权限,高了也没用。
第一步,系统内创建用户
sudo useradd -M -s /sbin/nologin demoUser
如果不用-M参数,demoUser可以由自己的用户目录。
第二步,在系统内启用这个用户
sudo passwd demoUser
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
密码是必须的,否则不能激活这个用户。samba也会拒绝使用没有密码的用户进行共享。
到此,demoUser在系统上已经存在这样的用户了,可以看/etc/passwd中看到。
第三步,将这个用户添加到samba共享列表中
samba用tdbsam加密用户表,用户表保存在/usr/local/samba/private/passdb.tdb。这个保存位置可以通过smb.conf中passdb backend项进行更改。所以samba中的密码可以和系统中的密码不一样。
sudo smbpasswd -a demoUser
New SMB password:
Retype new SMB password:
Added user demoUser.
到此,成功添加samba的用户了。
可以用sudo pdbedit -L命令查看共享用户。
用户映射
由于Samba用户必须要与操作系统用户同名,所以samba客户端用户就知道系统用这么一个用户存在。使用用户映射,就会让客户端不知道系统中真实存在的用户是什么。例如我们可以把上面的demoUser用户映射为admin用户,这时客户端就用admin来登录了,但linux系统中实际没有admin这个用户。
方法:
- 创建用来保存映射关系的文件,通常保存在/etc/samba中,文件名可以为linkusers。
touch /etc/samba/linkusers
vi /etc/samba/linkusers
增加一行
demoUser = admin
如果多个用户,需要空格分隔,如demoUser = admin temp zhangshan。之后保存文件。 - 编辑smb.conf文件,在[global]部分用username map参数添加用户映射文件
username map = /etc/samba/linkusers - 重启smbd:service smdb restart。
防火墙设置
Samba中默认会启用多个端口,这包括数据传输的TCP端口139、445,如果使用NetBIOS,使用UDP端口137、138。
为了弄清楚端口,需要查看一下samba实际侦听哪些端口就可以:
sudo netstat -ntulp | grep smbd
tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN 3600/smbd
tcp 0 0 0.0.0.0:445 0.0.0.0:* LISTEN 3600/smbd
tcp6 0 0 :::139 :::* LISTEN 3600/smbd
tcp6 0 0 :::445 :::* LISTEN 3600/smbd
可以看到使用139/445端口,所以放行即可。
sudo iptables -A INPUT -p tcp --dport 445 -j ACCETP
sudo iptables -A INPUT -p tcp --dport 139 -j ACCETP
补充
smb.conf参数说明
1、workgroup
该选项设置Samba服务器所属工作组名称,通过网上邻居可以从该工作组中找到该Samba服务器。默认设置如下:
workgroup = WORKGROUP
2、wins support
该选项设置Samba服务器是否作为WINS服务器。如果要启用该选项,则不能设置wins server选项,默认设置如下:
#wins support = no #选项默认都是被注释掉了
3、wins serve
该选项指定WINS服务器的IP地址或主机名。默认设置如下:
; wins server = w.x.y.z #选项默认都是被注释掉了
4、interfaces 和bind interfaces only = yes
如果服务器有多个IP地址或网络接口,可以使用interfaces选项把IP地址或网络接口列出来。如果bind interfaces only选项设置为yes,则表示Samba将绑定(监听)interfaces选项所设置的IP地址或网络接口,只通过这个些IP地址或网络接口提供服务,默认设置如下:
; interfaces = 127.0.0.0/8 eth0
; bind interfaces only = yes
上面两个选项默认都是被注释掉了
5、dns proxy
该选项设置是否启用DNS代理功能,默认设置如下:
dns proxy = no
6、log file
该选项用来设置Samba日志文件的存放位置和文件名称,默认设置如下:
log file = /var/log/samba/log.%m
这个选项中的.%m是Samba配置文件的保留变量,表示客户端的NetBIOS名称。
7、max log size
日志文件最大能达到多少Kbytes,如果超过该限制,则Samba自动在当前的日志文件名后面加上“.old”然后创建一个新的日志文件继续写入。如果为0,则表示没有大小限制。默认设置如下:
max log size = 1000
8、syslog only
设置Samba只通过syslog进行日志记录。默认设置如下:
#syslog only = no #默认这个选项被注销掉
9、syslog
syslog的日志级(0,err)(1,warning)(2,notice)(3,ifno)(4或以上,debug)。默认设置如下:
syslog = 0
10、server role
服务器角色。定义Samba将以何种模式操作。可能的值是“独立服务器”、“成员服务器”、“经典主域服务器”、“经典备份域控制器”、“活动目录域控制器",默认设置如下:
server role = standalone server
11、passdb backend
密码数据库格式,之前samba服务器的用户信息都是以数据文件信息存放,为了加快速度, 目前密码文件已经转为使用数据库了! 默认的数据库格式为tdbsam ,存放在/var/lib/samba/private/passdb.tdb,早期使用smbpasswd命令来管理用户密码, 后来使用 TDB 数据库,因此建议使用新的 pdbedit 指令来管理用户数据smbpasswd仍然可以使用。默认设置如下:
passdb backend = tdbsam
12、obey pam restrictions
在Samba中集成PAM的访问控制功能。默认设置如下:
obey pam restrictions = yes
13、 unix password sync = yes
当用户改变samba加密的密码时,SAMBA会试着更新UNIX用户密码。默认设置如下:
unix password sync = yes
14、passwd program
这个就指定更改密码的命令。默认设置如下:
passwd program = /usr/bin/passwd %u
15、passwd chat
更改密码时的对话。默认设置如下:
passwd chat = Enter\snew\s\spassword:* %n\n Retype\snew\s\spassword:* %n\n password\supdated\ssuccessfully .
16、pam password change
为samba打开pam改变密码控制机制的支持。默认设置如下:
pam password change = yes
17、map to guest
这个配置的意思是将所有samba系统主机所不能正确识别的用户都映射成guest用户。默认设置如下:
map to guest = bad user
18、usershare max shares
最大用户共享数量,0表示禁用用户共享。默认设置如下:
usershare max shares = 100
19、usershare allow guests
是否允许guest用户访问,这相当于在共享定义中设置guest ok = yes选项,最终以共享中的设置为准。
usershare allow guests = yes
以下是smb.conf配置文件中没有提到的,但是可以通过testparm -v 命令查看到默认设置,如果不符合自己的实际设置,可以在配置文件中加入相应的选项。
20、netbios name = DEBIAN
设置Samba Server的NetBIOS名称,在“网上邻居”中显示的主机名,如果不填,则默认会使用该服务器的DNS名称的第一部分。
21、server string = Samba 4.5.12-Debian
设定 Samba Server 的注释,可以是任何字符串,也可以不填。宏%v表示显示Samba的版本号。
22、hosts allow = 127. 192.168.1. 192.168.10.1
设置允许连接到Samba Server的客户端,多个参数以空格隔开。可以用一个IP表示,也可以用一个网段表示。这选项也可以在共享段起作用,只对某个共享的目录单独起作用。
hosts deny 与hosts allow 刚好相反。
ALL 表示所有用户,例如:hosts allow = ALL
EXCEPT 表示排除,例如:允许除192.168.1.100以为的所有主机访问,格式为 hosts allow = ALL EXCEPT 192.168.1.100
23、max connections = 0
max connections用来指定连接Samba Server的最大连接数目。如果超出连接数目,则新的连接请求将被拒绝。0表示不限制。
24、deadtime = 0
deadtime用来设置断掉一个没有打开任何文件的连接的时间。单位是分钟,0代表Samba Server不自动切断任何连接。
25、time server = yes/no
time server用来设置让nmdb成为windows客户端的时间服务器
26、security = user
设置用户访问Samba Server的验证方式,一共有四种验证方式。
- user:Samba Server共享目录只能被授权的用户访问,由Samba Server负责检查账号和密码的正确性。账号和密码要在本Samba Server中建立。
- domain:域安全级别,使用主域控制器(PDC)来完成认证。
- auto:这是Samba中的默认安全设置,Samba会通过服务器角色参数(如果设置)来确定安全模式。
- ads:在此模式下,Samba将充当ADS领域中的域成员
在samba4中share 和 server验证方式已被弃用
27、encrypt passwords = yes/no
是否将认证密码加密。因为现在windows操作系统都是使用加密密码,所以一般要开启此项。不过配置文件默认已开启。
28、username map = /etc/samba/smbusers
用来定义用户名映射,比如可以将root换成administrator、admin等。不过要事先在smbusers文件中定义好。比如:root = administrator admin,这样就可以用administrator或admin这两个用户来代替root登陆Samba Server,更贴近windows用户的习惯。
29、guest account = nobody
用来设置Samba中guest用户对用的系统用户名。
30、load printers = yes/no
设置是否在启动Samba时就共享打印机。现行几乎都是网络打印机了,默认关闭就可以,这里也不讨论打印机的问题。
31、 smb ports = 139 445
指定服务监听SMB流量的端口。
共享项目说明
在该段中指定了一个通过Samba进行共享的目录,定义用户访问该目录的各种设置。如下所示:
[共享名称]:这个共享名称很重要,它是一个代号而已,用户在“网上邻居”中所看到的共享目录名
comment = 任意字符串
说明:comment是对该共享的描述,可以是任意字符串。
path = 共享目录路径
说明:path用来指定共享目录的路径。可以用%u、%m这样的宏来代替路径里的unix用户和客户机的Netbios名,用宏表示主要用于[homes]共享域。例如:如果我们不打算用home段做为客户的共享,而是在/home/share/下为每个Linux用户以他的用户名建个目录,作为他的共享目录,这样path就可以写成:path = /home/share/%u; 。用户在连接到这共享时具体的路径会被他的用户名代替,要注意这个用户名路径一定要存在,否则,客户机在访问时会找不到网络路径。同样,如果我们不是以用户来划分目录,而是以客户机来划分目录,为网络上每台可以访问samba的机器都各自建个以它的netbios名的路径,作为不同机器的共享资源,就可以这样写:path = /home/share/%m 。
browseable = yes/no
说明:browseable用来指定该共享是否在“网上邻居”中可见。
writable = yes/no
说明:writable用来指定该共享路径是否可写。
read only = yes/no
说明:设置共享目录为只读,这个选项和writable是互斥的,最好不要两个同时出现如果同时出现,那么最后出现的那个设置为主要的设置。
available = yes/no
说明:available用来指定该共享资源是否可用。
admin users = 该共享的管理者
说明:admin users用来指定该共享的管理员(对该共享具有完全控制权限)。在samba 3.0中,如果用户验证方式设置成“security=share”时,此项无效。
例如:admin users =bobyuan,jane(多个用户中间用逗号隔开)。
valid users = 允许访问该共享的用户
说明:valid users用来指定允许访问该共享资源的用户。
例如:valid users = bobyuan,@bob,@tech(多个用户或者组中间用逗号隔开,如果要加入一个组就用“@+组名”表示。)
invalid users = 禁止访问该共享的用户
说明:invalid users用来指定不允许访问该共享资源的用户。
例如:invalid users = root,@bob(多个用户或者组中间用逗号隔开。)
write list = 允许写入该共享的用户
说明:write list用来指定可以在该共享下写入文件的用户。
例如:write list = bobyuan,@bob
public = yes/no
说明:public用来指定该共享是否允许guest账户访问。
guest ok = yes/no
说明:意义同“public”。
create mask = 0666
说明:指定用户通过Samba在该共享目录中创建文件的默认权限。0600代表创建文件的权限为rw-rw-rw-
directory mask = 0777
说明:指定用户通过Samba在该共享目录中创建目录的默认权限。0600代表创建目录的权限为drwxrwxrwx