如何在Ubuntu16.04上为小型组织设置Samba共享

来自菜鸟教程
跳转至:导航、​搜索

作为 Write for DOnations 计划的一部分,作者选择了 Tech Education Fund 来接受捐赠。

介绍

SambaSMB/CIFS 网络协议 的开源实现,在 Windows 环境中用于共享服务,例如文件和打印机访问以及 Active Directory。 Samba 还可用于在称为 独立服务器 的配置中创建跨平台文件共享。

在本指南中,您将安装和配置一个独立的 Samba 服务器,为一个名为 Example.com 的假设小型组织提供网络文件存储或 共享 。 该组织对其文件共享有几个要求: 1. 每个员工都需要个人的私人文件共享; 2. 所有员工都应该对公共文件共享具有读写权限; 3. 管理用户应具有对所有个人共享的读写访问权限以及公共共享的所有权。

您的 Samba 服务器将满足所有这些要求。 您还将学习如何从 Windows、Linux 和 macOS 访问共享。

先决条件

在开始本指南之前,您需要以下内容:

  • 具有非 root sudo 用户的 Ubuntu 16.04 服务器。 请参阅 Ubuntu 16.04 初始服务器设置 指南了解更多信息。 Samba 对 RAM 和 CPU 的要求适中,在 1GB 的服务器上运行良好。 您更有可能用完存储空间,因此这应该是您选择服务器大小时的首要考虑因素。
  • 端口 445 上允许传入的 TCP 连接。 如果您使用的是 UFW 防火墙,请参阅 如何在 Ubuntu 和 Debian 云服务器 上使用 UFW 设置防火墙以获得指导。 如果您使用其他防火墙或外部防火墙,请参阅相关文档。

第 1 步 — 安装 Samba

让我们从使用 Ubuntu 的包管理系统安装 Samba 开始。

在安装新包之前,让我们更新本地包索引以包含来自 Ubuntu 存储库的最新版本:

sudo apt-get update

接下来,安装 Samba:

sudo apt-get install samba

此命令将安装并启动 Samba 服务器 smbd 和 Samba NetBIOS 服务器 nmbd。 本教程不需要 nmbd,因此为了安全起见,您可以使用 systemctl 停止并禁用它:

sudo systemctl stop nmbd.service
sudo systemctl disable nmbd.service

sudo systemctl disable nmbd.service 命令在运行时将产生以下输出:

Outputnmbd.service is not a native service, redirecting to systemd-sysv-install
Executing /lib/systemd/systemd-sysv-install disable nmbd
insserv: warning: current start runlevel(s) (empty) of script `nmbd' overrides LSB defaults (2 3 4 5).
insserv: warning: current stop runlevel(s) (0 1 2 3 4 5 6) of script `nmbd' overrides LSB defaults (0 1 6).

此输出表明,由于 nmbd 没有本机 systemd 管理配置,它被旧的 SysV 初始化系统禁用。

为了避免运行未配置的、启用网络的服务可能出现的安全问题,让我们停止 Samba 服务器,直到配置详细信息到位:

sudo systemctl stop smbd.service

Samba 现在已安装并准备好进行配置。

第 2 步 — 设置 Samba 的全局选项

让我们通过修改位于 /etc/samba/smb.conf 的配置文件来定义 Samba 服务器的行为方式。 该文件有两个部分:[global] 部分和 [shares] 部分。 [global] 部分配置 Samba 服务器的行为,而 [shares] 部分配置文件共享。 让我们首先在 [global] 部分中设置指令。

与其直接编辑 /etc/samba/smb.conf,不如将其重命名为 smb.conf.original 并创建一个名为 smb.conf 的新文件:

sudo mv /etc/samba/smb.conf /etc/samba/smb.conf.orig

在编辑 /etc/samba/smb.conf 之前,让我们检查可用的接口以便告诉 Samba 它应该识别哪个。 键入以下内容:

ip link
Output1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 02:21:2c:03:ef:e2 brd ff:ff:ff:ff:ff:ff

此输出表明 lo 是环回接口,eth0 是外部网络接口,但您的外部接口可能不同。 请注意这两者:您将在 smb.conf 文件的 [global] 部分中将它们包含在 interfaces 指令中。

让我们开始使用 nano 或您喜欢的编辑器编辑此文件:

sudo nano /etc/samba/smb.conf

此文件的 [global] 部分将定义服务器的名称、角色和其他详细信息,包括网络接口:

/etc/samba/smb.conf

[global]
        server string = samba_server
        server role = standalone server
        interfaces = lo your_network_interface
        bind interfaces only = yes
        disable netbios = yes
        smb ports = 445
        log file = /var/log/samba/smb.log
        max log size = 10000

这些指令指定以下内容:

  • server string - 这是在连接期间将提供给用户的识别信息。 您可以使用 samba_server 或其他名称来标识您的服务器。 在本教程中,您将看到字符串 samba.example.com 来表示组织 Example.com 的 Samba 共享。
  • server role - 这定义了将创建什么类型的 Samba 服务器。 在这种情况下,它是 standalone server,即 文件共享。 其他服务器类型包括域成员服务器和域控制器。
  • interfaces - 这些是 Samba 将绑定到的网络接口。 lo 是环回接口 (127.0.0.1) 并且是必需的。 您还需要包含您之前输出的外部网络接口。 这通常是 eth0
  • bind interfaces only - 这确保 Samba 只绑定到 interfaces 行中列出的接口。 作为一种安全措施,这会导致 Samba 忽略与指定的 interfaces 不对应的数据包。
  • disable netbios - 这将禁用独立服务器中不需要的所有 NetBIOS 功能。 这样做可以简化服务器名称解析过程和 SMB 流量的传输。
  • smb ports - 这将设置 Samba 将侦听的端口。 端口 445 是 Samba 的标准端口。
  • log file - 设置 Samba 日志文件的名称和位置。
  • max log size - 这设置了日志文件的大小限制。 列出的数字以字节为单位,等于 10MB。 设置此大小限制时要记住的一些事项: 当达到此大小限制时,Samba 将生成一个新日志文件并将旧内容移动到具有 .old 扩展名的副本中。 如果再次超出限制,现有的 .old 文件将被销毁。 这可以防止磁盘/分区空间被单个日志文件的内容所淹没。 因此,您应该定义一个对您的系统资源有意义的文件大小。

如果您在设置服务器时需要更详细的日志记录,请将以下行附加到 [global] 部分:

/etc/samba/smb.conf

        log level = 3 passdb:5 auth:5

这会将日志级别设置为 3(信息),从默认设置 1 增加日志信息的粒度。 passdbauth 调试类的较高设置 5 提供了与用户身份验证相关的更多信息。

完成创建此部分后,保存并关闭文件。

每当您编辑 smb.conf 时,您应该运行 Samba 实用程序 testparm 以检查是否没有语法错误:

testparm

smb.conf 文件上运行 testparm 命令会产生以下输出:

OutputLoad smb config files from /etc/samba/smb.conf
Loaded services file OK.
Server role: ROLE_STANDALONE

Press enter to see a dump of your service definitions

ENTER 会产生以下输出:

Output# Global parameters
[global]
        server string = samba_server
        interfaces = lo your_network_interface
        bind interfaces only = Yes
        server role = standalone server
        log file = /var/log/samba/smb.log
        max log size = 10000
        smb ports = 445
        disable netbios = Yes
        idmap config * : backend = tdb

如果 testparm 报告 Loaded services file OK.,则不存在会阻止 Samba 服务器启动的语法错误。

配置 [global] 部分是启动 Samba 服务器所需的全部内容。 但是,如果没有共享配置,其功能将受到限制。 共享由两部分组成,一个用户和一个目录,必须创建和配置这两个部分以允许登录和测试。 下一节将解释如何创建可以访问共享的用户。

第三步——创建用户

在这一步中,我们将创建可以访问共享的用户。 他们需要以 Samba 和系统用户身份访问,以便在登录和读取和写入文件系统时通过 Samba 服务器进行身份验证。

在假设的公司 Example.com 中有四名员工需要添加到 Samba 服务器并在 Linux 系统上创建为用户:davidmike露西。 除了这四个之外,还有一个 admin 用户将能够访问和管理个人共享。 该用户还将拥有每个人都可以访问的普通共享。

添加系统用户的第一步是为每个用户创建主目录。 Samba 目录和数据将位于 /samba/,而不是使用 /home/user 的标准主目录。 将 Samba 数据保存在一个位置并与其他用户数据分开将使未来的管理任务(例如备份)更加容易。

注意: 本指南中创建的用户并非旨在拥有 SSH 登录。 如果您的用户已经在服务器上拥有帐户,您应该为他们创建一个专用的 Samba 用户,以便遵循本指南。


下一节将解释添加第一个用户 david 的过程,但您需要对 mikejane重复此过程露西

第一步是在文件系统的根目录下创建存储 Samba 数据的目录。 此目录将称为 /samba/,其组所有权将设置为 sambashare,这是在您安装 Samba 时创建的组。

执行以下命令创建/samba/目录并将组属主设置为sambashare

sudo mkdir /samba/
sudo chown :sambashare /samba/

接下来,在 /samba/ 目录下创建 david 的主目录:

sudo mkdir /samba/david

现在,使用以下命令将 david 添加为系统用户:

sudo adduser --home /samba/david --no-create-home --shell /usr/sbin/nologin --ingroup sambashare david

这些选项执行以下操作:

  • --home - 设置用户主目录的位置。
  • --no-create-home - 这会阻止 adduser 命令创建 david 的主目录。 如果系统要创建此目录,它将填充当前设置不需要的配置文件,例如 .bash_history
  • --shell- 设置当他通过 SSH 登录时将分配哪个 shell david。 访问 Samba 共享不需要 SSH 登录; 将此设置为 /usr/sbin/nologin 将禁用 SSH 登录。
  • --in-group sambashare - 这会将用户添加到 sambashare 组,授予他们对自己的共享和公共共享的读写访问权限。

运行此命令时,系统将提示您输入密码。 选择 10 个或更多字符的唯一、非基于字典的密码。

现在系统用户 david 已经存在,您可以设置他的 Samba 主目录的所有权和权限:

sudo chown david:sambashare /samba/david/
sudo chmod 2770 /samba/david/

将目录的权限设置为2770意味着在/samba/david/下创建的新文件或目录将继承父目录的组所有权,而不是创建文件或目录的用户的主组. 这意味着,例如,如果 admin 用户要在 david 的共享中创建一个新目录,则 david 将能够读取和写入它。

接下来,将 david 添加到 Samba 服务器。 Samba 拥有自己的用户和密码数据库,用于验证登录。 为了登录,必须将所有用户添加到 Samba 服务器并启用。 执行以下 smbpasswd 命令来完成这两项任务:

sudo smbpasswd -a david
sudo smbpasswd -e david

此处使用的选项执行以下操作:

  • -a - 这会将用户添加到 Samba 服务器而不启用它们。
  • -e - 这将启用先前添加的用户。

您在此处输入的密码将用于访问 Samba 共享,并且可以与系统密码不同。

用户 david 现在作为系统用户存在,无法通过 SSH 连接到服务器。 他在 /samba/david 有一个主目录,并已注册并启用为 Samba 用户。

对每个 Samba 用户(mikejanelucy)重复此过程。

要创建 admin 用户,请运行以下命令,将主目录更改为 /samba/everyone/

sudo mkdir /samba/everyone
sudo adduser --home /samba/everyone --no-create-home --shell /usr/sbin/nologin --ingroup sambashare admin
sudo chown admin:sambashare /samba/everyone/
sudo chmod 2770 /samba/everyone/
sudo smbpasswd -a admin
sudo smbpasswd -e admin

除了创建 admin 用户之外,让我们创建一个名为 admins 的组,以便更轻松地管理服务器。 通过对每个共享的读取和写入权限,该组可以简化添加和删除用户的工作。 例如,如果个人用户充当 admin 用户,然后离开组织,则需要从每个共享中单独删除他们。 还需要手动将新管理员添加到每个共享中。 创建一个 admins 组并授予该组对共享的读写访问权限意味着添加和删除用户只需要一个命令。

执行以下命令创建一个名为 admins 的新组,并将用户 admin 添加到该组:

sudo groupadd admins
sudo usermod -G admins admin

通过运行第二个命令 sudo usermod -G admins admin 并用另一个用户代替 admin,可以将其他用户添加到 admins 组。

系统配置现已完成,组织 Example.com 的用户设置为系统和 Samba 用户。 让我们继续配置 Samba 服务器,以便这些用户可以访问他们的共享目录。

第 4 步 — 配置 Samba 共享

每个共享在主 Samba 配置文件中都有自己的部分,/etc/samba/smb.conf,遵循全局参数。 这些部分将定义每个共享的工作方式。

再次使用 nano 文本编辑器打开并编辑此文件:

sudo nano /etc/samba/smb.conf

以下配置块将定义每个用户的个人共享:

/etc/samba/smb.conf

...
[share_name]
        path =
        browseable =
        read only =
        force create mode =
        force directory mode =
        valid users =

这些选项包括:

  • share_name - 这是您在登录时将使用的共享名称。
  • path - 这是文件系统中共享的绝对路径。
  • browsable - 设置其他用户是否能够看到共享。 启用此选项仅允许 Samba 服务器的其他用户看到共享的存在。 它不授予任何读取或写入权限。
  • read only - 设置 valid users 是否能够写入共享。
  • force create mode - 这强制写入共享的任何文件的权限。
  • force directory mode - 这会强制在共享中创建的任何目录的权限。
  • valid users - 这是有权访问共享的用户列表。 此设置可以采用用户名或系统组,例如 admins。 组必须在前面列出 @ 例如 @admins

david 添加以下共享配置块,定义他的主目录、该目录的组所有权的权限以及应该有权访问他的共享的用户:

/etc/samba/smb.conf

[david]
        path = /samba/david
        browseable = no
        read only = no
        force create mode = 0660
        force directory mode = 2770
        valid users = david @admins

请注意,目录权限将组所有权设置为父目录的所有权。

mikejanelucy 创建一个共享块。 仅更改共享 [name]pathvalid users 以反映每个用户的名称。

[everyone] 共享在 [name]pathvalid usersbrowsable 选项中与其他共享不同,看起来像这样:

/etc/samba/smb.conf

...
[everyone]
        path = /samba/everyone
        browseable = yes
        read only = no
        force create mode = 0660
        force directory mode = 2770
        valid users = @sambashare @admins

授予 sambashare 组对该共享的读写访问权限可以使所有用户都可以访问该共享,因为他们是在创建时添加到该组的。

完整的 smb.conf 文件将如下所示:

/etc/samba/smb.conf

[global]
        server string = samba_server
        server role = standalone server
        interfaces = lo your_network_interface
        bind interfaces only = yes
        disable netbios = yes
        smb ports = 445
        log file = /var/log/samba/smb.log
        max log size = 10000

[david]
        path = /samba/david
        browseable = no
        read only = no
        force create mode = 0660
        force directory mode = 2770
        valid users = david @admins

[mike]
        path = /samba/mike
        browseable = no
        read only = no
        force create mode = 0660
        force directory mode = 2770
        valid users = mike @admins

[jane]
        path = /samba/jane
        browseable = no
        read only = no
        force create mode = 0660
        force directory mode = 2770
        valid users = jane @admins

[lucy]
        path = /samba/lucy
        browseable = no
        read only = no
        force create mode = 0660
        force directory mode = 2770
        valid users = lucy @admins

[everyone]
        path = /samba/everyone
        browseable = yes
        read only = no
        force create mode = 0660
        force directory mode = 2770
        valid users = @sambashare @admins

完成编辑后保存并关闭文件。

再次测试配置:

testparm

这将产生如下所示的输出:

OutputLoad smb config files from /etc/samba/smb.conf
rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)
Processing section "[david]"
Processing section "[jane]"
Processing section "[mike]"
Processing section "[lucy]"
Processing section "[everyone]"
Loaded services file OK.
Server role: ROLE_STANDALONE

Press enter to see a dump of your service definitions

配置检查完成后,让我们用 systemctl 启动 Samba 服务器:

sudo systemctl start smbd.service

Samba 服务器现在正在运行并准备好接受登录。 下一步是登录 Samba 服务器以测试它是否按预期工作。 以下部分将介绍从 Windows、Linux 和 macOS 登录 Samba 服务器。

第 5 步 — 登录 Samba 服务器

在本节中,我们将介绍如何访问我们从 Linux、Windows 和 macOS 创建的 Samba 共享。

Linux——命令行

您可以使用名为 smbclient 的工具从命令行访问 Samba。 大多数 Linux 发行版默认不包含此包,因此您需要使用本地包管理器安装它。

在 Debian 和 Ubuntu 服务器上,使用以下命令安装 smbclient

sudo apt-get update
sudo apt-get install smbclient

在 Fedora 系统上,使用以下命令:

sudo dnf update
sudo samba-client

在 CentOS 上:

sudo yum update
sudo yum install samba-client

注意: 在某些 Linux 发行版上 smbclient 将失败并显示以下错误消息:

Outputsmbclient: Can't load /etc/samba/smb.conf - run testparm to debug it

如果您看到此错误消息,请检查以确保您已在 /etc/samba/smb.conf 中创建了文件。


smbclient 使用以下格式访问 Samba 共享:

smbclient //your_samba_hostname_or_server_ip/share -U username

您可以使用服务器的 IP 或在 /etc/samba/smb.conf 中定义的主机名来访问共享。 此示例使用主机名 samba.example.com 访问您在前面步骤中创建的 Samba 服务器上的 david 共享:

smbclient //samba.example.com/david -U david

如果 david 想要访问公共共享 (everyone),请将命令更改为:

smbclient //samba.example.com/everyone -U david

运行 smbclient 命令后,系统将提示您输入 Samba 密码并登录到类似于 FTP 文本界面的命令行界面:

smb: \>

该接口对于测试用户名和密码以及读写访问最有用。 例如,您可以创建一个目录并列出其内容,如下所示:

mkdir test
ls

您应该看到以下输出:

Output  .                                   D        0  Fri Feb  2 14:49:01 2018
  ..                                  D        0  Wed Jan 24 12:11:33 2018
  test                                D        0  Fri Feb  2 14:49:01 2018

通过键入以下内容删除目录:

rmdir test

使用 GUI 工具管理共享中的数据通常更容易。 下一节将介绍 KDE 的内置 GUI 工具。

Linux — 带有 Dolphin 的 KDE

Dolphin 是 KDE 中的默认文件管理器,并具有访问 Samba 共享的内置功能。

打开 Dolphin 后,执行以下步骤:

  1. Places 列表中选择 Network
  2. 单击添加网络文件夹
  3. 选择 Microsoft Windows 网络驱动器 选项。
  4. 点击下一步
  5. 输入 Samba 共享的详细信息: 名称 - 这是一个令人难忘的名称,将在 Dolphin 中显示为共享的书签。 服务器 - 这是 Samba 服务器的主机名或 IP 地址。 在本例中,它将是 samba.example.com。 文件夹 - 这是在 smb.conf 中设置的共享名称。
  6. 点击保存并连接 .
  7. 输入您要访问 Samba 共享的用户的用户名和密码。
  8. 单击确定

Dolphin 现在将连接并打开 Samba 共享,如下所示:

您现在可以像使用本地目录一样使用 Samba 共享来复制、删除和重命名文件和目录。 共享也将作为永久书签出现在 Network 位置。

MacOS——命令行

MacOS 预装了可用于访问 Samba 共享的命令行工具。 通过单击 Terminal 图标,使用 Launchpad 打开终端。

这将在您的主目录中打开一个命令行终端。 要挂载 Samba 共享,您可以创建一个新目录作为共享的挂载点。 挂载点是两个文件系统连接的位置:在这种情况下,您的本地文件系统和远程 Samba 文件系统。

创建一个名为 samba 的新目录:

mkdir samba

接下来,在新的 samba 目录下挂载 Samba 共享。 此命令具有以下形式:

sudo mount_smbfs //username@your_samba_hostname_or_server_ip/share ./mount_point

Example.com 中的详细信息替换为用户 david 如下所示:

sudo mount_smbfs //david@samba.example.com/david ./samba

samba 目录现在将显示 Example.com Samba 服务器上 david 共享的内容。 文件和目录可以使用lsrmmkdir等普通工具进行操作; 但是,samba 目录将在共享挂载后归 root 所有。 因此,您需要使用 sudo 来访问 samba 目录及其内容。

要卸载 Samba 共享,请从运行 mkdir 命令的同一目录中运行 umount 命令:

umount samba

下一节将介绍使用 macOS 中的桌面 GUI 应用程序访问 Samba 共享。

MacOS——桌面

MacOS 还能够使用 Finder 应用程序访问 Samba 共享。

采取以下步骤:

  1. 打开Finder,点击菜单栏中的Go
  2. 从选项列表中单击 连接到服务器
  3. 使用包含您的用户名、主机名或服务器 IP 以及您的共享名称的 smb:// 格式 URL:smb://username@your_samba_hostname_or_server_ip/share。 在此处显示的示例中,您将看到用户名 david 和主机名 samba.example.com
  4. 单击带有 + 符号的按钮,将 Samba 共享添加为书签。
  5. 点击连接
  6. 选择注册用户
  7. 输入 Samba 共享用户的用户名和密码。
  8. 确定您是否希望 macOS 存储密码。
  9. 单击 连接

成功连接到 Samba 共享后,它将出现在 Finder 中,如下所示:

下一节将探讨如何从 Windows 10 访问 Samba 共享。

Windows 10 — 命令行

从 Windows 命令行挂载 Samba 共享只需要一个命令:

net use drive_letter \\your_samba_hostname_or_server_ip\share

替换用户 david 共享的变量并将驱动器号设置为 X:

net use X: \\samba.example.com\david

输入此命令后,系统将提示您输入 david 的用户名和密码。 输入这些后,您将收到共享已成功挂载的确认:

OutputEnter the user name for 'samba.example.com': david
Enter the password for samba.example.com:
The command completed successfully.

您现在可以在文件资源管理器中浏览 Samba 共享并像在您的计算机本地一样操作文件和目录。

下一节将介绍使用 Windows GUI 工具访问 Samba 共享。

Windows 10 — 桌面

Windows 10 还具有连接到 Samba 共享的本机功能。 以下步骤会将您连接到您的 Samba 共享,并使用 Windows 文件资源管理器将其保存为书签。 通过打开文件资源管理器开始这些步骤:

  1. 右键单击 这台电脑
  2. 单击添加网络位置,然后在随后的页面上单击下一步
  3. 单击选择自定义网络位置
  4. 点击下一步
  5. 输入 Samba 服务器的 Windows 样式地址和共享名称。 Windows 使用以下形式的 Samba URL:\\your_samba_hostname_or_server_ip\share\。 在示例图像中,服务器名称为 samba.example.com,共享名称为 david\\samba.example.com\david
  6. 单击下一步
  7. 输入用户的用户名和密码。
  8. 决定是否希望 Windows 记住密码。
  9. 单击确定

文件资源管理器现在将连接到 Samba 共享。 连接成功完成后,将在文件资源管理器的 This PC 下创建一个新位置:

您现在可以使用此文件夹来管理 Samba 共享中的文件和文件夹,就像它是本地文件夹一样。

结论

在本文中,您使用 Samba 服务器创建了跨平台在线文件共享。 您还可以从 Windows、Linux 和 macOS 访问这些共享。

Samba 共享变得如此普遍,以至于许多应用程序都能够访问存储在其中的数据。 这些应用程序可以扩展 Samba 共享的功能和用途。 例如,移动版的媒体播放器 VLC 可以连接到您的 Samba 共享并流式传输音乐和视频。 要访问它,请选择 open MRL 并使用标准 Samba URL:smb://username@your_samba_hostname_or_server_ip/share。 您还可以使用 Samba 共享作为跨平台备份实用程序 BackupPC 的备份目标。

除了充当简单的文件共享之外,Samba 还可以作为域控制器或域成员与 Windows Active Directory 一起使用。 Samba Wiki 用户文档 包含有关如何执行此操作的更多信息。