SAMBA 服务
SAMBA 简介
Linux 上面使用 NFS 服务器来共享文件,Windows 上使用的是 CIFS(Common Internet File System)服务(网上邻居)来共享文件。这两种服务都不能跨系统共享文件,SAMBA 就是为了解决这一问题而存在。
SAMBA(Server Message Block)服务的主要功能:
- 共享文件与打印机服务。
- 提供用户登录 SAMBA 主机时的身份认证。
- 可以进行 Windows 网络上的主机名解析(NetBIOS Name)。
- 可以进行设备的共享(例如 CD-ROM)。
NetBIOS 协议
SAMBA 构架在 NetBIOS(Network Basic Input/Output System)通信协议上。
NetBIOS 是无法跨路由(Router/Gateway)使用,只能用于局域网。数据传输时使用 NetBIOS Name 而不是 IP 来识别对方。后来发展出 NetBIOS over TCP/IP 技术突破了这一限制。
Windows 网上邻居也使用 NetBIOS,工作流程如下:
- 要想在网上邻居访问某台主机时,必须加入对方主机的工作组(Workgroup),并且本机要设置一个主机名。这个主机名是构架在 NetBIOS 协议上的,也叫 NetBIOS Name。在同一个工作组,NetBIOS Name 必须唯一。
- 找到对方主机后,能否登录或使用主机资源,还要看对方主机上的权限配置。
SAMBA 通过两个服务来控制上面两步骤:
- nmbd:用来管理工作组,NetBIOS Name 的解析,主要利用 UDP 协议开启 137 和 138 端口来做名称解析。
- smbd:用来管理 SAMBA 主机共享的目录,文件与打印机等。主要利用 TCP 协议开机 139 和 445 端口来传输数据。
连接模式
局域网内最常见的连接模式有两种:对等模式和主控模式。这两种模式 SAMBA 都可以实现。
对等模式
对等模式(Workgroup Model, Peer/Peer)指局域网内两台主机的地位相等,均有各自的账号,可以独立工作。当两台主机之间需要共享数据时,需要使用对方主机内记录的账号来访问对方主机。
这种模式比较适合小型网络内数据共享。
主控模式
主控模式(Domain Model)是将所有账号密码都放置在一台主控计算机(PDC, Primary Domain Controller)上面,任何人使用计算机时需要通过 PDC 服务器认证后,给与对应权限。
这种模式适合企业构架,只需维护好 PDC 上面的账号资源,再分配给人员使用。
SAMBA 安装
SAMBA 所需的基本组件有下面三个:
- samba:提供 SMB 服务器所需各项服务程序(smbd 和 nmbd),其他与 SAMBA 相关的 logrotate 配置文件及开机默认选项文件等。
- samba-client:提供 SAMBA 客户端所需工具命令,例如 mout.cifs,smbtree 等。
- samba-common:提供客户端和服务端通用数据,例如 smb.conf,testparm 等。
- cifs-utils:提供挂载 cifs 支持等。
可以使用 yum
来安装:
[root@server2 ~]$ yum install -y samba
[root@server2 ~]$ yum install -y samba-client
[root@server2 ~]$ yum -y install cifs-utils
samba 包内已包含 samba-common。
配置文件路径
和 SAMBA 有关的配置文件有下面这些:
-
/etc/samba/smb.conf
SAMBA 的主要配置文件。主要内容有全局设置和共享目录相关设置。
-
/etc/samba/lmhosts
早期 NetBIOS Name 所需额外设置,用来设置 NetBIOS Name 对应的 IP 地址。现在 SAMBA 默认使用 hostname 作为 NetBIOS Name,因此可以不用设置。
-
/etc/sysconfig/samba
设置启动 smbd,nmbd 时,想要加入的额外服务参数。
-
/etc/samba/smbusers
可以用来设置 Windows 与 Linux 中管理员与匿名用户名称之间的对应关系。例如 administrator 对应 root 用户。
-
/var/lib/samba/private/{passdb.tdb,secrets.tdb}
管理 SAMBA 账号与密码的数据库文件。
-
/usr/share/doc/samba-*
这个目录包含 SAMBA 的所有相关技术手册。
SAMBA 命令
和 SAMBA 有关的命令如下:
命令 | 说明 |
---|---|
smbd |
服务器权限管理。 |
nmbd |
NetBIOS Name 查询。 |
tdbdump |
查询 SAMBA 数据库 TDB(Trivial-DataBase)的内容。 |
tdbtool |
直接修改数据库中账号和密码参数,需要安装 tdb-tools。 |
smbstatus |
服务端列出当前 SAMBA 的连接状态。 |
smbpasswd |
早期修改 SAMBA 用户密码的命令,已被 pdbedit 取代。 |
pdbedit |
修改 SAMBA 用户密码命令。 |
testparm |
服务端用来检验配置文件语法错误工具。 |
mount.cifs |
客户端用来挂载远程共享目录的命令。 |
smbclient |
客户端用来搜索其他主机共享目录命令。 |
nmblookup |
客户端查询 NetBIOS Name 的命令。 |
smbtree |
客户端用来查询工作组与计算机名称树形目录分布图。 |
服务器配置流程
SAMBA 服务器配置流程如下:
- 服务器全局设置:在
smb.conf
中设置好工作组,NetBIOS 主机名,密码使用状态等; - 规划共享目录参数:在
smb.conf
中设置好预计要共享的目录或设备以及可供使用的账号数据; - 奖励所需文件系统:在系统中建立好共享出去的目录或设备,设置好权限参数;
- 建立 SAMBA 用账号:在系统中建立好共享时使用的账号,用
pdbedit
建立 SAMBA 密码; - 启动服务:启动
smbd
和nmbd
服务。
配置文件参数
配置文件 smb.conf
中全局配置 [global] 部分主要设置参数如下:
- workgroup:工作组名称。
- netbios name:主机 NetBIOS 名称。
- server string:主机的简易说明。
- display charset:终端所使用的编码。
- unix charset:在 Linux 服务器上使用的编码。
- dos charset:在 Windows 客户端的编码。
- log file:日志文件名。
- max log size:日志大小限制,达到最大值会被 rotate 掉。
- security:有三种设置 share(不用密码,已废弃),user(用 SAMBA 服务器认证),domain(指定认证 SAMBA 服务器)。
- encrypt passwords:Yes(密码加密)。
- passdb backend:数据库格式,默认为 tdbsam。
配置文件 smb.conf
中共享资源 [homes] 部分相关设置参数如下:
- comment:目录的说明。
- path:共享的实际目录。
- browseable:是否让所有用户可见。
- writable:是否可写入。
- create mode/directory mode:设置权限。
- writelist:设置可使用此资源的用户或用户组(@ 开头)。
配置文件 smb.conf
中可用的变量功能:
- %S:取代当前的设置项目值。
- %m:代表客户端的 NetBIOS 主机名。
- %M:代表客户端的 Hostname。
- %I:代表客户端的 IP
- %L:代表 SAMBA 主机的 NetBIOS 主机名。
- %h:代表 SAMBA 主机的 Hostname。
- %H:代表用户的主目录。
- %U:代表当前登录的用户名。
- %g:代表登录的用户组名。
- %T:代表当前的日期和时间。
另外在配置文件内除了 #
代表注释,还可以使用分号 ;
代表注释。
服务端配置示例
下面列出一些常见的使用场景和对应 smb.conf
配置文件内容。
无密码共享
假设 SMB 服务器(192.168.2.254)要配置成如下参数:
- 局域网内计算机工作组为 WORKGROUP。
- 服务器的 NetBIOS 为 smbserver2。
- 用户认证等级设置为无密码 share。
- 取消原本有共享的
[homes]
目录。 - 仅共享
/tmp
目录,取名也为 temp。 - Linux 服务器的编码格式设置为 utf8。
- Windows 客户端的编码格式设置为 GB2312。
整个配置文件如下:
[root@server2 ~]$ cat /etc/samba/smb.conf
[global]
workgroup = WORKGROUP
netbios name = smbserver2
server string = This is OPEN SAMBA server
security = user
map to guest = Bad User
unix charset = utf8
display charset = utf8
dos charset = cp936
log file = /var/log/samba/log.%m
max log size = 50
passdb backend = tdbsam
load printers = no
[temp]
comment = TEMP DIR
path = /tmp
writable = yes
browseable = yes
guest ok = yes
可以使用 testparm
检查下 smb.conf
配置文件语法设置:
[root@server2 ~]$ testparm
Load smb config files from /etc/samba/smb.conf
Unknown parameter encountered: "display charset"
Ignoring unknown parameter "display charset"
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions
有密码共享
假设要设置基于用户密码访问的 SAMBA 服务器:
- 用户认证等级设置为 user。
- 用户密码文件使用 TDB 数据库格式,存放于
/var/lib/samba/private/
内。 - 密码需要加密。
- 每个 SAMBA 的用户拥有自己的用户主目录。
- 设置一个用户 smbuser,登录密码为 1111,SAMBA 密码为 4444。
- 共享
/home/sharedir
目录,共享资源名称为 sharedir。 - 用户组 smbuser 对
/home/sharedir
具有写入权限。
先建立相关用户和目录:
[root@server2 ~]$ useradd smbuser -p 1111
[root@server2 ~]$ mkdir /home/sharedir
[root@server2 ~]$ chgrp smbuser /home/sharedir/
[root@server2 ~]$ chmod 2770 /home/sharedir/
[root@server2 ~]$ ll -d /home/sharedir/
drwxrws---. 2 root smbuser 6 Oct 11 23:25 /home/sharedir/
需要使用 pdbedit
来处理 SAMBA 用户,命令常用选项如下:
参数 | 说明 |
---|---|
-L | 列出数据库中对应账号与 UID 等信息 |
-v | 搭配 -L 参数显示更多详细信息 |
-w | 搭配 -L 参数显示 smbpasswd 格式数据 |
-a | 设置一个可使用 SAMBA 的用户账号 |
-r | 修改一个账号相关信息 |
-x | 删除一个可使用 SAMBA 的用户账号 |
-m | 后接机器的代码(machine account),与 PDC 有关 |
例如将用户 smbuser 加入到 SAMBA 的数据库:
[root@server2 ~]$ pdbedit -a -u smbuser
new password:
retype new password:
Unix username: smbuser
NT username:
Account Flags: [U ]
User SID: S-1-5-21-4293618527-3344052101-3349617220-1000
Primary Group SID: S-1-5-21-4293618527-3344052101-3349617220-513
Full Name:
Home Directory: \\smbserver2\smbuser
HomeDir Drive:
Logon Script:
Profile Path: \\smbserver2\smbuser\profile
Domain: SMBSERVER2
Account desc:
Workstations:
Munged dial:
Logon time: 0
Logoff time: Wed, 06 Feb 2036 23:06:39 CST
Kickoff time: Wed, 06 Feb 2036 23:06:39 CST
Password last set: Mon, 11 Oct 2021 23:36:23 CST
Password can change: Mon, 11 Oct 2021 23:36:23 CST
Password must change: never
Last bad password : 0
Bad password count : 0
Logon hours : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
[root@server2 ~]$ pdbedit -L
smbuser:1001:
修改密码与删除用户示例:
[root@server2 ~]$ smbpasswd smbuser
New SMB password:
Retype new SMB password:
[root@server2 ~]$ pdbedit -x -u smbuser
共享用户目录需要在 SELinux 中放行:
[root@server2 ~]$ setsebool -P samba_enable_home_dirs on
局域网内可完全放开 SAMBA 对文件系统的读写:
[root@server2 ~]$ setsebool -P samba_export_all_rw 1
否则需要修改目录的类型:
[root@server2 ~]$ chcon -t samba_share_t /home/sharedir
smb.conf
配置文件如下:
[root@server2 ~]$ cat /etc/samba/smb.conf
[global]
workgroup = WORKGROUP
netbios name = smbserver2
server string = This is OPEN SAMBA server
security = user
unix charset = utf8
display charset = utf8
dos charset = cp936
log file = /var/log/samba/log.%m
max log size = 50
passdb backend = tdbsam
load printers = no
[homes]
comment = Home DIR
writable = yes
browseable = no
create mode = 0664
directory mode = 0775
[sharedir]
comment = sharedir(server2)
path = /home/sharedir
browseable = yes
writable = yes
write list = @smbuser
服务端启动
设置好配置文件和相关账号权限后,就可以启动 SAMBA 服务了(nmb 有可能被 SELinux 阻拦):
[root@server2 ~]$ systemctl enable --now smb
[root@server2 ~]$ systemctl enable --now nmb
[root@server2 ~]$ netstat -ntulp | grep mbd
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:445 0.0.0.0:* LISTEN 80761/smbd
tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN 80761/smbd
udp 0 0 0.0.0.0:137 0.0.0.0:* 80786/nmbd
udp 0 0 0.0.0.0:138 0.0.0.0:* 80786/nmbd
服务状态查询
在启动后和运行中可以使用 smbstatus
命令来查看 SAMBA 服务的状态:
[root@server2 samba]$ smbstatus
Samba version 4.10.16
PID Username Group Machine Protocol Version Encryption Signing
-----------------------------------------------------------------------------------------
85520 smbuser smbuser 192.168.2.101 (ipv4:192.168.2.101:62317) SMB3_11 - partial(AES-128-CMAC)
84217 smbuser smbuser 192.168.2.234 (ipv4:192.168.2.234:41716) SMB3_02 - partial(AES-128-CMAC)
Service pid Machine Connected at Encryption Signing
-----------------------------------------------------------------------------------------
smbuser 84217 192.168.2.234 Mon Oct 11 11:48:11 PM 2021 CST - -
IPC$ 85520 192.168.2.101 Tue Oct 12 12:10:30 AM 2021 CST - -
sharedir 84217 192.168.2.234 Tue Oct 12 12:02:55 AM 2021 CST - -
IPC$ 84217 192.168.2.234 Mon Oct 11 11:48:11 PM 2021 CST - -
sharedir 85520 192.168.2.101 Tue Oct 12 12:40:25 AM 2021 CST - -
Locked files:
Pid User(ID) DenyMode Access R/W Oplock SharePath Name Time
-----------------------------------------------------------------------------------------
85520 1001 DENY_NONE 0x100081 RDONLY NONE /home/sharedir . Tue Oct 12 00:40:32 2021
85520 1001 DENY_NONE 0x100081 RDONLY NONE /home/sharedir . Tue Oct 12 01:06:15 2021
客户端操作
一些最常见的客户端操作命令。
查询
可以通过 nmblookup
命令来查询 NetBIOS Name 与 IP 对应信息,例如查询 I5-103 对应的 IP 地址:
[root@server1 sss]$ nmblookup -S I5-103
192.168.2.103 I5-103<00>
Looking up status of 192.168.2.103
I5-103 <00> - B <ACTIVE>
WORKGROUP <00> - <GROUP> B <ACTIVE>
I5-103 <20> - B <ACTIVE>
WORKGROUP <1e> - <GROUP> B <ACTIVE>
WORKGROUP <1d> - B <ACTIVE>
..__MSBROWSE__. <01> - <GROUP> B <ACTIVE>
MAC Address = 30-85-A9-4C-F1-86
可以使用 smbtree
用树状图列出 SAMBA 服务器情况:
[root@server1 sss]$ smbtree
Enter SAMBA\root's password:
WORKGROUP
\\X9-102
\\SMBSERVER2 This is OPEN SAMBA server
\\SMBSERVER2\IPC$ IPC Service (This is OPEN SAMBA server)
\\SMBSERVER2\sharedir sharedir(server2)
\\I5-103
\\DESKTOP-QU8VM21
操作
可以通过 smbclient
程序来查询 SAMBA 服务是否正常:
[root@server1 ~]$ smbclient -L //192.168.2.254
Enter SAMBA\root's password:
Anonymous login successful
Sharename Type Comment
--------- ---- -------
sharedir Disk sharedir(server2)
IPC$ IPC IPC Service (This is OPEN SAMBA server)
Reconnecting with SMB1 for workgroup listing.
Anonymous login successful
Server Comment
--------- -------
Workgroup Master
--------- -------
WORKGROUP
指定使用 smbuser 账号连接 smb 服务器 192.168.2.254:
[root@server1 sss]$ smbclient //192.168.2.254/sharedir -U smbuser
Enter SAMBA\smbuser's password:
Try "help" to get a list of possible commands.
smb: \>
挂载
可以直接使用 mount
命令来挂载:
[root@server1 ~]$ mount -t cifs //192.168.2.254/temp /root/111/
Password for root@//192.168.2.254/temp:
[root@server1 ~]$ mount -t cifs //192.168.2.254/smbuser /root/myhome -o username=smbuser
Password for smbuser@//192.168.2.254/smbuser: ****
[root@server1 ~]$ mount -t cifs //192.168.2.254/sharedir /root/sss -o username=smbuser
[root@server1 ~]$ df
Filesystem 1K-blocks Used Available Use% Mounted on
//192.168.2.254/temp 1020580 33092 987488 4% /root/111
//192.168.2.254/smbuser 5109760 33084 5076676 1% /root/myhome
//192.168.2.254/sharedir 5109760 33120 5076640 1% /root/sss
针对 Windows 下文件系统中使用中文字符,可以指定 mount
挂载参数:
[root@server1 ~]$ mount -t ntfs -o iocharset=utf8,codepage=936 //192.168.2.101/temp 222
Windows 下也可以直接使用 \\192.168.2.254\
来访问 SAMBA 服务器(不支持匿名模式)。
PDC 服务器搭建
SAMBA PDC 的作用很简单,就是让 PDC 成为整个局域网的域管理员(Domain Controller),然后把主机加入到这个域中。域内的用户账户和用户数据都由 PDC 来管理。
PDC 服务器的搭建步骤如下。
设置本地解析
将 NetBIOS Name 与 IP 的对应填入 /etc/samba/lmosts
文件中:
[root@server2 ~]$ echo "192.168.2.254 smbserver2" >> /etc/samba/lmhosts
[root@server2 ~]$ echo "192.168.2.234 smblinux" >> /etc/samba/lmhosts
[root@server2 ~]$ echo "192.168.2.101 DESKTOP-QU8VM21" >> /etc/samba/lmhosts
由于 NetBIOS Name 和 Hostname 不一样,因此还要修改 /etc/hosts
文件:
[root@server2 ~]$ sed -i "s/192.168.2.254 server2/192.168.2.254 server2 smbserver2/g" /etc/hosts
[root@server2 ~]$ sed -i "s/192.168.2.234 server1/192.168.2.234 server1 smblinux/g" /etc/hosts
[root@server2 ~]$ echo "192.168.2.101 DESKTOP-QU8VM21" >> /etc/hosts
配置 smb.conf
需要让 PDC 客户端登录时可以取得用户主目录。smb.conf
文件内容如下:
[root@server2 ~]$ cat /etc/samba/smb.conf
[global]
workgroup = WORKGROUP
netbios name = smbserver2
server string = This is OPEN SAMBA server
security = user
unix charset = utf8
dos charset = cp936
log file = /var/log/samba/log.%m
max log size = 50
passdb backend = tdbsam
load printers = no
preferred master = yes
domain master = yes
local master = yes
wins support = yes
os level = 100
domain logons = yes
logon drive = K:
logon script = startup.bat
time server = yes
admin users = root
logon path = \\%N\%U\profile
logon home = \\%N\%U
[netlogon]
comment = Network Logon
path = /winhome/netlogon
writable = no
write list = root
follow symlinks = yes
guest ok = yes
[homes]
comment = Home DIR
writable = yes
browseable = no
create mode = 0664
directory mode = 0775
[sharedir]
comment = sharedir(server2)
path = /home/sharedir
browseable = yes
writable = yes
write list = @smbuser
[root@server2 ~]$ testparm
Load smb config files from /etc/samba/smb.conf
Loaded services file OK.
idmap range not specified for domain '*'
ERROR: Invalid idmap range for domain *!
Server role: ROLE_DOMAIN_PDC
和 PDC 有关的参数:
- time server:设置 SAMBA 与 Windows 主机的时间同步。
- logon script:当用户通过 Windows 客户端登录后运行的批处理文件。文件需要放置到指定目录内。
- logon drive:用户主目录挂载到的分区盘符。
- admin users:指定 SAMBA PDC 的管理员身份。
- [netlogon]:指定利用网络登录后使用的目录资源。
- logon path:用户登录后,环境配置文件所在目录。
- logon home:用户的主目录,默认放置到与 Linux 的用户主目录相同位置。
配置文件没问题后重启 smb 和 nmb 服务:
[root@server2 ~]$ systemctl restart smb
[root@server2 ~]$ systemctl restart nmb
建立对应目录
预计将所有的 PDC 数据放到 /winhome
内:
[root@server2 ~]$ mkdir -p /winhome/netlogon
建立用户脚本文件,主要设置时间同步和用户目录挂载:
[root@server2 ~]$ vi /winhome/netlogon/startup.bat
net time \\smbserver2 /set /yes
net use K: /home
[root@server2 ~]$ unix2dos /winhome/netlogon/startup.bat
unix2dos: converting file /winhome/netlogon/startup.bat to DOS format ...
建立对应用户
建立一个 smbwin 的用户并指定用户目录:
[root@server2 ~]$ useradd -d /winhome/smbwin -p 3333 smbwin
[root@server2 ~]$ mkdir /winhome/smbwin/profile
[root@server2 ~]$ chown -R smbwin:smbwin /winhome/smbwin/profile
将用户加入到 SAMBA 数据库,设置密码为 2222:
[root@server2 ~]$ smbpasswd -a root
New SMB password:
Retype new SMB password:
Added user root.
[root@server2 ~]$ smbpasswd -a smbwin
New SMB password:
Retype new SMB password:
Added user smbwin.
建立机器码账号
由于 PDC 会针对 Windows 客户端的主机名(NetBIOS Name)进行主机账号检查,所以要为客户端的主机名进行账号的设置。主机账号在主机名后加个 $
即可:
[root@server2 ~]$ useradd -M -s /sbin/nologin -d /dev/null DESKTOP-QU8VM21$
账号被设置为不能登录,将其加入到 SAMBA 数据库中:
[root@server2 ~]$ smbpasswd -a -m DESKTOP-QU8VM21$
Added user DESKTOP-QU8VM21$.
修改安全性配置
由于 /winhome
为自建目录,需要修改目录的 SELinux 类型为 samba_share_t
:
[root@server2 ~]$ chcon -R -t samba_share_t /winhome
PDC 客户端操作
客户端需要一些系统设置才能登录。
修改注册表
在 Win10 中需要修改注册表才支持通过 SAMBA 登录。修改位置为:计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters
。
添加两个 DWORD 值:DomainCompatibilityMode = 1
和 DNSNameResolutionRequired = 0
。
设置主机名与域名
在 “计算机属性 – 高级系统设置 – 计算机名” 页面中,点击 “网络 ID” 按钮进入加入域或工作组页面。
在描述网络选项中,选择办公网络,单击下一步。
选择使用域的网络,单击下一步两次。
在键入域账户的用户名,密码和域名页面,填写用户名 root,密码为记录在 SAMBA 中的 root 密码。单击下一步。
在填写计算机名和域名页面,填写计算机域名 WORKGROUP。单击下一步。
在弹出域用户名和密码页面,填入 root 用户和密码,域名依然是 WORKGROUP。单击确定按钮。
在是否要启用域用户账户页面,选择目前不添加,由 PDC 来管控。单击下一步。
单击完成后重启计算机。
用户登录
重启之后便可选择域名,以及使用 PDC 记录的用户名 smbwin 来登录,本机账号不受影响。
用户登陆后,会将 K 盘挂载成用户主目录,可以在里头工作,数据将直接保存在 /winhome/smbwin
中。
用户注销之后,在桌面上进行的各项个人化设置会被移动到 /winhome/smbwin/profile.v6
目录中:
[root@server2 smbwin]$ ll profile.V6/Desktop/
total 16
-rw-rw-r--+ 1 smbwin smbwin 282 Oct 12 03:38 desktop.ini
-rw-rw----+ 1 smbwin smbwin 11613 Oct 12 03:44 新建 Microsoft Word 文档.docx