when someone abandons you,it is him that gets loss because he lost someone who truly loves him but you just lost one who doesn’t love you.
在这个音乐版权纷乱的时代,想听一首歌着实不容易,不是从这个 app 找,就是从那个 app 试听,想要下载还得收费,收费不可怕,可怕的是开了会员还有其他的额外收费项目,于是就想在自己的住处搭建一个本地的音乐播放服务,正好手边有个 debian,鉴于工作用的都是 mac,正好把它当成自己的服务端。可以播放服务端音乐的软件数不胜数,而 smb 往往是其中一个连接服务端的方式
在 debian 上或者说在 Linux 上,比较出名的就是 Samba 了,接下来就是见证 Samba 的时刻
在正式开始见证之前,简单提一下 smb(Server Message Block)网络通信协议,它提供文件共享,网络浏览,打印服务以及网络上的进程间通信
Samba 是一套程序,其中最重要的两个进程是 nmbd 和 smbd:
SAMBA 所需的软件:
查看服务状态,如果没有启动启动他
1 | $ sudo systemctl status nmbd.service |
设置服务器开机启动
1 | $ sudo systemctl enable nmbd.service |
在安装了 Samba 服务软件后,会自动在 Linux 系统中生成一系列的配置文件,了解它们的用途是配置 Samba 服务器所必须的
主要配置文件 /etc/Samba/smb.conf
这是 Samba 服务的主配置文件,文件由一系列段和选项构成,一个段由一对方括号中的段名开始,直到下一个段名结束,主要由全局设置(Global Settings)和共享定义(Share Definitions)两部分组成。其中全局设置定义了对影响整个Samba系统运行的全局选项,用于设置整个系统的规则,如果在其他段中没有再对这些选项进行重新设置的话,就以全局选项为主:共享定义则是对系统中共享资源进行定义,该部分可以由多个段组成,其中常见的包括:用户主目录段,共享目录和打印机段,每个段中可以再定义详细的共享选项。smb.conf 文件的格式如下所示:
1 | #======================= Global Settings ======================= |
smb.conf 配置文件中使用 ;和 #作为注释符,凡是使用这两个符号开头的行都会被 Samba 视为注释行而忽略处理,这个配置文件中,大小写是没关系的,因为 Windows 不分大小写
先说一下 samba 定义的变量:
workgroup
该选项设置 Samba 服务器所属工作组名称,通过网上邻居可以从该工作组中找到该 Samba 服务器。默认设置如下:
1 | workgroup = WORKGROUP |
wins support
该选项设置 Samba 服务器是否作为 WINS 服务器。如果要启用该选项,则不能设置 wins server 选项,默认设置 (默认被注释掉) 如下:
1 | # wins support = no |
wins serve
该选项指定 WINS 服务器的 IP 地址或主机名。默认设置 (默认被注释掉) 如下:
1 | ; wins server = w.x.y.z |
interfaces 和 bind interfaces only = yes
如果服务器有多个 IP 地址或网络接口,可以使用 interfaces 选项把 IP 地址或网络接口列出来。如果 bind interfaces only 选项设置为 yes,则表示 Samba 将绑定(监听)interfaces 选项所设置的 IP 地址或网络接口,只通过这个些 IP 地址或网络接口提供服务,默认设置 (默认被注释掉) 如下:
1 | ; interfaces = 127.0.0.0/8 eth0 |
dns proxy
该选项设置是否启用 DNS 代理功能,默认设置如下:
1 | dns proxy = no |
log file
该选项用来设置 Samba 日志文件的存放位置和文件名称,这个选项中的 .%m 是 Samba 配置文件的保留变量,表示客户端的 NetBIOS 名称。默认设置如下:
1 | log file = /var/log/samba/log.%m |
max log size
日志文件最大能达到多少 Kbytes,如果超过该限制,则 Samba 自动在当前的日志文件名后面加上 “.old” 然后创建一个新的日志文件继续写入。如果为 0 则表示没有大小限制。默认设置如下:
1 | max log size = 1000 |
syslog only
设置Samba只通过syslog进行日志记录。默认设置 (默认被注释掉) 如下:
1 | # syslog only = no |
syslog
syslog 的 日志级 (0,err)(1,warning)(2,notice)(3,ifno)(4 或以上,debug)。默认设置如下:
1 | syslog = 0 |
server role
服务器角色。定义 Samba 将以何种模式操作。可能的值是 “独立服务器”、“成员服务器”、“经典主域服务器”、“经典备份域控制器”、“活动目录域控制器",默认设置如下:
1 | server role = standalone server |
passdb backend
密码数据库格式,之前 samba 服务器的用户信息都是以数据文件信息存放,为了加快速度,目前密码文件已经转为使用数据库了,默认的数据库格式为
tdbsam,存放在/var/lib/samba/private/passdb.tdb,早期使用 smbpasswd 命令来管理用户密码,后来使用 TDB 数据库,因此建议使用新的 pdbedit 指令来管理用户数据,smbpasswd 仍然可以使用。默认设置如下:
1 | passdb backend = tdbsam |
obey pam restrictions
在 Samba 中集成 PAM 的访问控制功能。默认设置如下:
1 | obey pam restrictions = yes |
unix password sync = yes
当用户改变 samba 加密的密码时,SAMBA 会试着更新 UNIX 用户密码。默认设置如下:
1 | unix password sync = yes |
passwd program
指定更改密码的命令。默认设置如下:
1 | passwd program = /usr/bin/passwd %u |
passwd chat
更改密码时的对话。默认设置如下:
1 | passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* . |
pam password change
为 samba 打开 pam 改变密码控制机制的支持。默认设置如下:
1 | pam password change = yes |
map to guest
这个配置的意思是将所有 samba 系统主机所不能正确识别的用户都映射成 guest 用户。默认设置如下:
1 | map to guest = bad user |
usershare max shares
最大用户共享数量,0表示禁用用户共享。默认设置如下:
1 | usershare max shares = 100 |
usershare allow guests
是否允许guest用户访问,这相当于在共享定义中设置guest ok = yes选项,最终以共享中的设置为准。
1 | usershare allow guests = yes |
以下是 smb.conf 配置文件中没有提到的,但是可以通过 testparm -v 命令查看到默认设置,如果不符合自己的实际设置,可以在配置文件中加入相应的选项
netbios name = DEBIAN
设置 Samba Server 的 NetBIOS 名称,在 “网上邻居” 中显示的主机名,如果不填,则默认会使用该服务器的 DNS 名称的第一部分
server string = Samba 4.5.12-Debian
设定 Samba Server 的注释,可以是任何字符串,也可以不填。宏 %v 表示显示 Samba 的版本号
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
max connections = 0
max connections 用来指定连接 Samba Server 的最大连接数目。如果超出连接数目,则新的连接请求将被拒绝。0 表示不限制
deadtime = 0
deadtime 用来设置断掉一个没有打开任何文件的连接的时间。单位是分钟,0 代表 Samba Server 不自动切断任何连接
time server = yes/no
time server 用来设置让 nmdb 成为 windows 客户端的时间服务器
security = user
设置用户访问 Samba Server 的验证方式,一共有四种验证方式:
- user:Samba Server 共享目录只能被授权的用户访问,由 Samba Server 负责检查账号和密码的正确性。账号和密码要在本Samba Server 中建立
- domain:域安全级别,使用主域控制器 (PDC) 来完成认证
- auto:这是 Samba 中的默认安全设置,Samba 会通过服务器角色参数 (如果设置) 来确定安全模式
- ads:在此模式下,Samba 将充当 ADS 领域中的域成员
在 samba4 中 share 和 server 验证方式已被弃用
encrypt passwords = yes/no
是否将认证密码加密。因为现在 windows 操作系统都是使用加密密码,所以一般要开启此项。不过配置文件默认已开启
username map = /etc/samba/smbusers
用来定义用户名映射,比如可以将 root 换成 administrator、admin 等。不过要事先在 smbusers 文件中定义好。比如:root = administrator admin,这样就可以用 administrator 或 admin 这两个用户来代替 root 登陆 Samba Server,更贴近 windows 用户的习惯
guest account = nobody
用来设置 Samba 中 guest 用户对用的系统用户名
load printers = yes/no
设置是否在启动 Samba 时就共享打印机。现行几乎都是网络打印机了,默认关闭就可以,这里也不讨论打印机的问题
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 = 0700
指定用户通过 Samba 在该共享目录中创建文件的默认权限。
0600代表创建文件的权限为rw-------
directory mask = 0700
指定用户通过 Samba 在该共享目录中创建目录的默认权限。
0600代表创建目录的权限为rwx------
与大部分程序配置文件一样,smb.comf 文件被修改后并不会立刻生效,需要重启 smbd 和 nmbd 服务。在完成配置文件我们需要用 testparm 命令来验证文件的格式是否正确,命令如下:
1 | $ testparm # 参数 -v:查阅完整的参数设置,连同默认值也会显示出来 |
如果输出中没有任何错误或警告信息,表示文件格式没有问题。否则,输出结果中将会给出错误的地方以及错误的原因
重启服务,命令如下:
1 | $ systemctl restart smbd.service |
Samba 的用户是与操作系统的用户联系在一起的,在创建 Samba 用户前,必须先添加一个与之同名的操作系统用户。也就是说 Samba 的用户必须是操作系统中已经存在的用户,但两者的密码可以不相同。在来说下用户在 Windows 系统下通过 Samba 访问 Linux 系统的权限问题,当需要通过 Samba 所提供的功能来进行 Linux 的访问时,Linux 上面的文件或目录是否可读写还要取决于 Linux 系统上的用户是否对该文件可读写,所以在 Windows 上访问 Samba 服务器时,要看 Samba 对应的用户对 Linux 系统的文件是否可读写,同时 Samba 配置文件也会限制读写权限
例如:当 Samba 用户 A 要对 Linux 上面的T文件进行写的时候,smb.conf 的配置文件中的共享设置要具有可写的权限,A 用户对应的 Linux 用户也要对T文件有写的权限
Samba 用户通过 pdbedit 命令进行管理。命令用法如下:
1 | $ pdbedit |
举例:
1 | $ pdbedit -L # 查询目前已经存在的 Samba 帐号 |
如果要添加额外的 Samba 用户帐号,若该帐号原本不存在,则先使用 useradd 添加系统帐号,再通过 pdbedit -a 命令添加 Samba 用户帐号
由于 Samba 用户必须要与操作系统用户同名,出于系统安全或使用习惯的考虑,可以把用户映射为 administrator 用户或 admin 用户,映射后就无需在添加 administrator 或 admin 用户了,也可以防止 Samba 用户通过 Samba 帐号来猜测操作系统用户的信息。映射后的用户其权限和密码都和之前一样,映射步骤如下:
编辑 smb.conf 文件,在 [global] 部分添加用户映射文件(该文件由用户手动创建,可以把他放在系统可以访问的任何位置),添加内容如下所示:
1 | username map = /etc/samba/smbusers # 一般文件都放在这里 |
手动创建用户映射文件 /etc/samba/smbusers,该文件的格式如下:
1 | Samba 用户帐号 = 需要映射的用户列表 # 列表中的用户名之间以空格进行分割,如下所示 |
举例:
1 | $ vim.tiny /etc/samba/smbusers |
重启 smbd 和 nmbd 服务
不需要密码的共享,有时候需要将某个目录共享给所有人访问,要求 /home/share1 目录所有人都可以读写,/home/share2 目录所有人只读,需要先把这两个目录的权限给成 777,这样任何人才可以对目录进行操作,smb.conf 配置文件如下:
1 | #======================= Global Settings ======================= |
Samba 中默认会启用多个端口,这包括数据传输的 TCP 端口 139、445,以及进行 NetBIOS 名称解析之类工作的 UDP 端口 137、138,如果只是为了传输数据可以只开放 445 端口,前提是 smb ports = 的选项中有 445 端口,也可以配置 smb ports = 445,这样 Samba 就只监听 445 端口,这样配置完在 Windows 中 “桌面” 上的 “网络” 里不会在显示共享的主机,只能通过 “运行” 打开 \IP 的方式连接到共享的目录
查看 smb ports 选项默认设置的端口:
1 | $ testparm -v | grep port |
查看Samba监听的端口号:
1 | $ netstat -tlunp | grep mbd |
Linux 客户端上访问 Windows 系统或 Samba 服务器上共享资源的方式主要有两种,可以使用 smbclient 程序访问共享资源,也可以使用 mount 命令把共享目录挂载到本地目录上使用
smbclient 是 Samba 所提供的一个类似于 FTP 的客户端程序,使用 smbclient 链接到共享的资源后,可以使用 ls,get,put 等类似于FTP的命令对共享资源进行操作,首先要安装 smbclient 程序:
1 | $ apt install smbclient |
smbclient 命令的格式如下所示:
1 | $ smbclient [选项] //[address]/[共享目录] |
例如:查看共享服务器 192.168.1.30 上的共享资源列表,命令如下:
1 | $ smbclient -L=192.168.1.30 -U administrator |
通过上面的查看可以看到共享的资源为 windd
通过 smbclient 命令登录到共享主机资源,命令如下:
1 | $ smbclient //192.168.1.30/windd -U administrator |
通过 mount 命令挂载共享目录到本地
在使用 smbclient 命令一点也不方便直观,其实除了 smbclient,Linux 客户端也可以像 NFS 一样使用 mount 命令把远程的共享文件夹挂载到本地的目录上进行使用。挂载后对共享文件夹的访问就像操作本地目录一样方便。首先需要安装 cifs-utils 软件包(以及 cifs-utils 依赖的软件包)
挂载命令如下:
1 | $ mount.cifs //[address]/[folder] -o user=[username] [mount point] |
举例:将共享文件 windd 挂载到 linux 系统的 /mnt 目录,共享用户为 administrator
1 | $ mount.cifs //192.168.1.27/windd -o user=administrator /mnt/ |
either I will find a way, or I will make one.