第 32 章 网络服务器

目录

32.1. 概述

本章涵盖了 UNIX® 系统上一些更常用的网络服务。这包括安装、配置、测试和维护许多不同类型的网络服务。为了参考,本章中包含了多个配置示例文件。

  • 在本章结束时,读者将了解

  • 如何管理 inetd 守护进程。

  • 如何设置网络文件系统 (NFS)。

  • 如何设置网络信息服务 (NIS) 以集中和共享用户帐户。

  • 如何设置 FreeBSD 作为 LDAP 服务器或客户端

  • 如何使用 DHCP 设置自动网络设置。

  • 如何设置域名服务器 (DNS)。

  • 如何设置 Apache HTTP 服务器。

  • 如何设置文件传输协议 (FTP) 服务器。

  • 如何使用 Samba 为 Windows® 客户端设置文件和打印服务器。

  • 如何同步时间和日期,以及使用网络时间协议 (NTP) 设置时间服务器。

如何设置 iSCSI。

  • 本章假设读者具备以下基本知识

  • /etc/rc 脚本。

  • 网络术语。

安装额外的第三方软件 (安装应用程序:软件包和端口)。

32.2. inetd 超级服务器

inetd(8) 守护进程有时被称为超级服务器,因为它管理许多服务的连接。它无需启动多个应用程序,只需要启动 inetd 服务即可。当接收到对其管理的服务的连接请求时,它会确定该连接的目标程序,为此程序生成一个进程,并将套接字委托给该程序。与以独立模式单独运行每个守护进程相比,对于不经常使用的服务使用 inetd 可以降低系统负载。

inetd 主要用于生成其他守护进程,但它内部处理一些简单的协议,如 chargen、auth、time、echo、discard 和 daytime。

本节介绍 inetd 配置的基本知识。

32.2.1. 配置文件

inetd 的配置通过编辑 /etc/inetd.conf 完成。此配置文件的每一行都代表一个可以由 inetd 启动的应用程序。默认情况下,每行开头都有一个注释 (#),这意味着 inetd 未侦听任何应用程序。要配置 inetd 以侦听某个应用程序的连接,请删除该应用程序行开头的 #

inetd_enable="YES"

保存编辑内容后,通过编辑 /etc/rc.conf 配置 inetd 在系统启动时启动。

# service inetd start

要立即启动 inetd,使其侦听您配置的服务,请键入

一旦 inetd 启动,则需要在每次修改 /etc/inetd.conf 时通知它。
# service inetd reload

示例 1. 重新加载 inetd 配置文件

通常,应用程序的默认条目无需在删除 # 后进行编辑。在某些情况下,编辑默认条目可能是合适的。

ftp     stream  tcp     nowait  root    /usr/libexec/ftpd       ftpd -l

例如,这是 ftpd(8) 通过 IPv4 的默认条目

service-name
socket-type
protocol
{wait|nowait}[/max-child[/max-connections-per-ip-per-minute[/max-child-per-ip]]]
user[:group][/login-class]
server-program
server-program-arguments

条目中的七列如下

其中

服务名称

要启动的守护进程的服务名称。它必须与 /etc/services 中列出的服务相对应。这决定了 inetd 侦听传入连接的端口。使用自定义服务时,必须先将其添加到 /etc/services 中。

套接字类型

streamdgramrawseqpacket 之一。对于 TCP 连接,使用 stream;对于 UDP 服务,使用 dgram

协议

使用以下协议名称之一协议名称

说明

tcp 或 tcp4

TCP IPv4

udp 或 udp4

UDP IPv4

tcp6

TCP IPv6

udp6

UDP IPv6

tcp46

TCP IPv4 和 IPv6

udp46

UDP IPv4 和 IPv6

{wait|nowait}[/max-child[/max-connections-per-ip-per-minute[/max-child-per-ip]]]

在此字段中,必须指定 waitnowaitmax-childmax-connections-per-ip-per-minutemax-child-per-ip 是可选的。

wait|nowait 指示服务是否能够处理自己的套接字。dgram 套接字类型必须使用 wait,而通常是多线程的 stream 守护进程应该使用 nowaitwait 通常将多个套接字传递给单个守护进程,而 nowait 为每个新套接字生成一个子守护进程。

inetd 可以生成的子守护进程的最大数量由 max-child 设置。例如,要限制守护进程的十个实例,请在 nowait 后放置 /10。指定 /0 允许无限数量的子进程。

max-connections-per-ip-per-minute 限制每分钟来自任何特定 IP 地址的连接数。一旦达到限制,来自该 IP 地址的进一步连接将被丢弃,直到分钟结束。例如,值 /10 会将任何特定 IP 地址每分钟的连接尝试限制为十次。max-child-per-ip 限制可以代表任何单个 IP 地址在任何时刻启动的子进程数量。这些选项可以限制过度的资源消耗,并有助于防止拒绝服务攻击。

finger stream  tcp     nowait/3/10 nobody /usr/libexec/fingerd fingerd -k -s
可以在 fingerd(8) 的默认设置中看到一个示例。

用户

守护进程将以该用户名运行。守护进程通常以 rootdaemonnobody 运行。

服务器程序

守护进程的完整路径。如果守护进程是由 inetd 内部提供的服务,则使用 internal

服务器程序参数

用于指定在调用时传递给守护进程的任何命令参数。如果守护进程是内部服务,则使用 internal

32.2.2. 命令行选项

与大多数服务器守护进程一样,inetd 有一些选项可用于修改其行为。默认情况下,inetd 以 -wW -C 60 启动。这些选项为所有服务(包括内部服务)启用 TCP 包装器,并防止任何 IP 地址每分钟向任何服务请求超过 60 次。

要更改传递给 inetd 的默认选项,请在 /etc/rc.conf 中添加 inetd_flags 的条目。如果 inetd 正在运行,请使用 service inetd restart 重新启动它。

可用的速率限制选项为

-c 最大值

指定每项服务的默认最大同时调用次数,其中默认值为无限制。可以通过在 /etc/inetd.conf 中使用 max-child 在每项服务的基础上进行覆盖。

-C 速率

指定每分钟来自单个 IP 地址可以调用服务的默认最大次数。可以通过在 /etc/inetd.conf 中使用 max-connections-per-ip-per-minute 在每项服务的基础上进行覆盖。

-R 速率

指定一分钟内可以调用服务的最大次数,其中默认值为 256。速率 0 允许无限次数。

-s 最大值

指定来自单个 IP 地址在任何时间可以调用服务的最大次数,其中默认值为无限制。可以通过在 /etc/inetd.conf 中使用 max-child-per-ip 在每项服务的基础上进行覆盖。

还有其他选项可用。有关选项的完整列表,请参阅 inetd(8)

32.2.3. 安全注意事项

许多可以由 inetd 管理的守护进程都没有安全意识。某些守护进程(如 fingerd)可以提供可能对攻击者有用的信息。仅启用所需的服务,并监视系统是否有过多的连接尝试。max-connections-per-ip-per-minutemax-childmax-child-per-ip 可用于限制此类攻击。

默认情况下,启用 TCP 包装器。有关在各种 inetd 调用的守护进程上放置 TCP 限制的更多信息,请参阅 hosts_access(5)

32.3. 网络文件系统 (NFS)

FreeBSD 支持网络文件系统 (NFS),它允许服务器通过网络与客户端共享目录和文件。使用 NFS,用户和程序可以访问远程系统上的文件,就像它们存储在本地一样。

  • NFS 有许多实际用途。一些更常见的用途包括

  • 否则将在每个客户端上复制的数据可以保存在一个位置,并由网络上的客户端访问。

  • 多个客户端可能需要访问 /usr/ports/distfiles 目录。共享该目录允许快速访问源文件,而无需将其下载到每个客户端。

  • 在大型网络中,通常更方便在所有用户主目录都存储在其上的中央 NFS 服务器上进行配置。用户可以登录网络上的任何客户端并访问其主目录。

  • NFS 导出的管理得到简化。例如,只有一个文件系统需要设置安全或备份策略。

可移动媒体存储设备可供网络上的其他机器使用。这减少了整个网络中的设备数量,并提供了一个集中位置来管理其安全性。通常,从集中式安装介质中安装多个机器上的软件更方便。

NFS 由一个服务器和一个或多个客户端组成。客户端远程访问存储在服务器机器上的数据。为了使这能够正常工作,必须配置和运行一些进程。

这些守护进程必须在服务器上运行守护进程

说明

nfsd

NFS 守护进程,它为 NFS 客户端的服务请求提供服务。

mountd

NFS 挂载守护进程,它执行从 nfsd 收到的请求。

rpcbind

此守护进程允许 NFS 客户端发现 NFS 服务器正在使用哪个端口。

在客户端上运行 nfsiod(8) 可以提高性能,但不是必需的。

32.3.1. 配置服务器

以下 /etc/exports 条目演示了如何导出文件系统。这些示例可以修改以匹配读者网络上的文件系统和客户端名称。此文件中可以使用许多选项,但这里只提及其中几个。有关选项的完整列表,请参阅 exports(5)

此示例显示了如何将 /cdrom 导出到三个名为 alphabravocharlie 的主机。

/cdrom -ro alpha bravo charlie

-ro 标志使文件系统只读,防止客户端对导出的文件系统进行任何更改。此示例假设主机名位于 DNS 或 /etc/hosts 中。如果网络没有 DNS 服务器,请参阅 hosts(5)

下一个示例通过 IP 地址将 /home 导出到三个客户端。这对于没有 DNS 或 /etc/hosts 条目的网络很有用。-alldirs 标志允许子目录成为挂载点。换句话说,它不会自动挂载子目录,但允许客户端根据需要挂载所需的目录。

/usr/home  -alldirs  10.0.0.2 10.0.0.3 10.0.0.4

下一个示例导出 /a,以便来自不同域的两个客户端可以访问该文件系统。-maproot=root 允许远程系统上的 root 用户以 root 身份在导出的文件系统上写入数据。如果未指定 -maproot=root,则客户端的 root 用户将映射到服务器的 nobody 帐户,并受 nobody 定义的访问限制约束。

/a  -maproot=root  host.example.com box.example.org

每个文件系统只能指定一个客户端。例如,如果 /usr 是一个单一文件系统,则以下条目无效,因为两个条目都指定了相同的主机

# Invalid when /usr is one file system
/usr/src   client
/usr/ports client

此情况下的正确格式是使用一个条目

/usr/src /usr/ports  client

以下是有效导出列表的示例,其中 /usr/exports 是本地文件系统

# Export src and ports to client01 and client02, but only
# client01 has root privileges on it
/usr/src /usr/ports -maproot=root    client01
/usr/src /usr/ports               client02
# The client machines have root and can mount anywhere
# on /exports. Anyone in the world can mount /exports/obj read-only
/exports -alldirs -maproot=root      client01 client02
/exports/obj -ro

要在启动时启用 NFS 服务器所需的进程,请将这些选项添加到 /etc/rc.conf

rpcbind_enable="YES"
nfs_server_enable="YES"
mountd_enable="YES"

现在可以通过运行以下命令启动服务器

# service nfsd start

每当 NFS 服务器启动时,mountd 也会自动启动。但是,mountd 只在启动时读取 /etc/exports。要使后续的 /etc/exports 编辑立即生效,请强制 mountd 重新读取它

# service mountd reload

有关使用 sharenfs ZFS 属性而不是 exports(5) 文件通过 NFS 导出 ZFS 数据集的说明,请参阅 zfs-share(8)

有关 NFS 版本 4 设置的说明,请参阅 nfsv4(4)

32.3.2. 配置客户端

要启用 NFS 客户端,请在每个客户端的 /etc/rc.conf 中设置此选项

nfs_client_enable="YES"

然后,在每个 NFS 客户端上运行此命令

# service nfsclient start

客户端现在拥有挂载远程文件系统所需的一切。在这些示例中,服务器的名称为 server,客户端的名称为 client。要将 server 上的 /home 挂载到 client 上的 /mnt 挂载点

# mount server:/home /mnt

现在可以在 client 上的 /mnt 目录中访问 /home 中的文件和目录。

要每次客户端启动时都挂载远程文件系统,请将其添加到 /etc/fstab

server:/home	/mnt	nfs	rw	0	0

有关所有可用选项的说明,请参阅 fstab(5)

32.3.3. 锁定

某些应用程序需要文件锁定才能正确运行。要启用锁定,请在客户端和服务器上执行以下命令

# sysrc rpc_lockd_enable="YES"

然后启动 rpc.lockd(8) 服务

# service lockd start

如果服务器上不需要锁定,则可以通过在运行 mount 时包含 -L 来配置 NFS 客户端在本地锁定。有关更多详细信息,请参阅 mount_nfs(8)

32.3.4. 使用 autofs(5) 自动挂载

从 FreeBSD 10.1-RELEASE 开始支持 autofs(5) 自动挂载功能。要在旧版本的 FreeBSD 中使用自动挂载功能,请改用 amd(8)。本章仅描述 autofs(5) 自动挂载程序。

autofs(5) 功能是几个组件的通用名称,这些组件共同允许在访问该文件系统内的文件或目录时自动挂载远程和本地文件系统。它包括内核组件 autofs(5) 和几个用户空间应用程序:automount(8)automountd(8)autounmountd(8)。它作为以前 FreeBSD 版本中 amd(8) 的替代方案。amd 仍然为了向后兼容的目的而提供,因为两者使用不同的映射格式;autofs 使用的格式与其他 SVR4 自动挂载程序(例如 Solaris、MacOS X 和 Linux 中的自动挂载程序)相同。

autofs(5) 虚拟文件系统由 automount(8) 挂载到指定的挂载点,通常在启动期间调用。

每当进程尝试访问 autofs(5) 挂载点内的文件时,内核将通知 automountd(8) 守护进程并暂停触发进程。 automountd(8) 守护进程将通过查找正确的映射并根据该映射挂载文件系统来处理内核请求,然后向内核发出信号以释放阻塞的进程。 autounmountd(8) 守护进程会在一段时间后自动卸载自动挂载的文件系统,除非它们仍在使用。

主要的 autofs 配置文件是 /etc/auto_master。它将各个映射分配到顶级挂载点。有关 auto_master 和映射语法的说明,请参阅 auto_master(5)

/net 上挂载了一个特殊的自动挂载程序映射。当访问此目录中的文件时,autofs(5) 会查找相应的远程挂载并自动挂载它。例如,尝试访问 /net/foobar/usr 中的文件将告诉 automountd(8) 挂载主机 foobar 上的 /usr 导出。

示例 2. 使用 autofs(5) 挂载导出

在此示例中,showmount -e 显示可以从 NFS 服务器 foobar 挂载的导出文件系统

% showmount -e foobar
Exports list on foobar:
/usr                               10.10.10.0
/a                                 10.10.10.0
% cd /net/foobar/usr

showmount 的输出显示 /usr 作为导出。当更改到 /host/foobar/usr 目录时,automountd(8) 会拦截请求并尝试解析主机名 foobar。如果成功,automountd(8) 会自动挂载源导出。

要启用 autofs(5) 在启动时,请将此行添加到 /etc/rc.conf

autofs_enable="YES"

然后可以通过运行以下命令启动 autofs(5)

# service automount start
# service automountd start
# service autounmountd start

autofs(5) 映射格式与其他操作系统中的相同。来自其他来源的关于此格式的信息可能会有用,例如 Mac OS X 文档

有关更多信息,请查阅 automount(8)automountd(8)autounmountd(8)auto_master(5) 手册页。

32.4. 网络信息系统 (NIS)

网络信息系统 (NIS) 旨在集中管理类似 UNIX® 的系统,例如 Solaris™、HP-UX、AIX®、Linux、NetBSD、OpenBSD 和 FreeBSD。NIS 最初被称为黄页,但由于商标问题而更名为 NIS。这就是 NIS 命令以 yp 开头的原因。

NIS 是一个基于远程过程调用 (RPC) 的客户端/服务器系统,它允许 NIS 域中的机器组共享一组通用的配置文件。这允许系统管理员仅使用最少的配置数据设置 NIS 客户端系统,并从单个位置添加、删除或修改配置数据。

FreeBSD 使用 NIS 协议的版本 2。

32.4.1. NIS 术语和进程

表 28.1 总结了 NIS 使用的术语和重要进程

表 1. NIS 术语
术语守护进程

NIS 域名

NIS 服务器和客户端共享一个 NIS 域名。通常,此名称与 DNS 无关。

rpcbind(8)

此服务启用 RPC,并且必须运行才能运行 NIS 服务器或充当 NIS 客户端。

ypbind(8)

此服务将 NIS 客户端绑定到其 NIS 服务器。它将获取 NIS 域名并使用 RPC 连接到服务器。它是 NIS 环境中客户端/服务器通信的核心。如果此服务未在客户端机器上运行,则它将无法访问 NIS 服务器。

ypserv(8)

这是 NIS 服务器的进程。如果此服务停止运行,则服务器将不再能够响应 NIS 请求,因此希望有一个从服务器接管。一些非 FreeBSD 客户端不会尝试使用从服务器重新连接,并且可能需要在这些客户端上重新启动 ypbind 进程。

rpc.yppasswdd(8)

此进程仅在 NIS 主服务器上运行。此守护进程允许 NIS 客户端更改其 NIS 密码。如果此守护进程未运行,则用户必须登录到 NIS 主服务器并在那里更改其密码。

32.4.2. 机器类型

NIS 环境中有三种类型的主机

  • NIS 主服务器

    此服务器充当主机配置信息的中央存储库,并维护所有 NIS 客户端使用文件的权威副本。NIS 客户端使用的 passwdgroup 和其他各种文件都存储在主服务器上。虽然一台机器可以充当多个 NIS 域的 NIS 主服务器,但这类型的配置不会在本节中介绍,因为它假设了一个相对小规模的 NIS 环境。

  • NIS 从服务器

    NIS 从服务器维护 NIS 主服务器的数据文件的副本,以提供冗余。从服务器还有助于平衡主服务器的负载,因为 NIS 客户端始终连接到首先响应的 NIS 服务器。

  • NIS 客户端

    NIS 客户端在登录期间针对 NIS 服务器进行身份验证。

许多文件中的信息可以使用 NIS 共享。 master.passwdgrouphosts 文件通常通过 NIS 共享。每当客户端上的进程需要通常在本地这些文件中找到的信息时,它都会向其绑定的 NIS 服务器发出查询。

32.4.3. 计划注意事项

本节描述了一个示例 NIS 环境,该环境由 15 台 FreeBSD 计算机组成,没有集中式管理点。每台机器都有自己的 /etc/passwd/etc/master.passwd。这些文件仅通过手动干预才能保持同步。目前,当用户添加到实验室时,必须在所有 15 台机器上重复此过程。

实验室的配置如下

机器名称IP 地址机器角色

ellington

10.0.0.2

NIS 主服务器

coltrane

10.0.0.3

NIS 从服务器

basie

10.0.0.4

教师工作站

bird

10.0.0.5

客户端机器

cli[1-11]

10.0.0.[6-17]

其他客户端机器

如果这是第一次开发 NIS 方案,则应提前进行充分的计划。无论网络规模如何,都需要在计划过程中做出一些决策。

32.4.3.1. 选择 NIS 域名

当客户端广播其信息请求时,它会包含其所属 NIS 域的名称。这就是一个网络上的多个服务器如何确定哪个服务器应该回答哪个请求的方式。可以将 NIS 域名视为一组主机的名称。

一些组织选择使用其互联网域名作为其 NIS 域名。不建议这样做,因为它在尝试调试网络问题时可能会造成混淆。NIS 域名在网络中应该是唯一的,如果它描述了它所代表的机器组,则会很有帮助。例如,Acme Inc. 的艺术部门可能位于“acme-art”NIS 域中。此示例将使用域名 test-domain

但是,某些非 FreeBSD 操作系统要求 NIS 域名与互联网域名相同。如果网络上的一台或多台机器有此限制,则 *必须* 使用互联网域名作为 NIS 域名。

32.4.3.2. 物理服务器要求

在选择用作 NIS 服务器的机器时,需要牢记以下几点。由于 NIS 客户端依赖于服务器的可用性,因此选择一台不经常重新引导的机器。NIS 服务器理想情况下应该是一台独立的机器,其唯一目的是作为 NIS 服务器。如果网络使用量不大,则可以将 NIS 服务器放在运行其他服务的机器上。但是,如果 NIS 服务器不可用,则会对所有 NIS 客户端产生不利影响。

32.4.4. 配置 NIS 主服务器

所有 NIS 文件的规范副本都存储在主服务器上。用于存储信息的数据库称为 NIS 映射。在 FreeBSD 中,这些映射存储在 /var/yp/[domainname] 中,其中 [domainname] 是 NIS 域的名称。由于支持多个域,因此可以有多个目录,每个域一个。每个域都将拥有自己独立的映射集。

NIS 主服务器和从服务器通过 ypserv(8) 处理所有 NIS 请求。此守护程序负责接收来自 NIS 客户端的传入请求,将请求的域和映射名称转换为相应数据库文件的路径,并将数据从数据库传输回客户端。

设置主 NIS 服务器相对简单,具体取决于环境需求。由于 FreeBSD 提供了内置的 NIS 支持,因此只需要通过将以下几行添加到 /etc/rc.conf 中来启用它即可

nisdomainname="test-domain"	(1)
nis_server_enable="YES"		(2)
nis_yppasswdd_enable="YES"	(3)
1此行将 NIS 域名设置为 test-domain
2这会在系统启动时自动启动 NIS 服务器进程。
3这启用了 rpc.yppasswdd(8) 守护程序,以便用户可以从客户端机器更改其 NIS 密码。

在服务器机器也是 NIS 客户端的多服务器域中必须小心。通常最好强制服务器绑定到自身,而不是允许它们广播绑定请求并可能相互绑定。如果一台服务器宕机而其他服务器依赖于它,则可能会导致奇怪的故障模式。最终,所有客户端都将超时并尝试绑定到其他服务器,但涉及的延迟可能相当大,并且故障模式仍然存在,因为服务器可能会再次相互绑定。

可以通过将以下附加行添加到 /etc/rc.conf 中来强制服务器也是客户端绑定到特定服务器

nis_client_enable="YES"				(1)
nis_client_flags="-S test-domain,server"	(2)
1这还允许运行客户端程序。
2此行将 NIS 域名设置为 test-domain 并绑定到自身。

保存编辑后,键入 /etc/netstart 以重新启动网络并应用 /etc/rc.conf 中定义的值。在初始化 NIS 映射之前,启动 ypserv(8)

# service ypserv start

32.4.4.1. 初始化 NIS 映射

NIS 映射是从 NIS 主服务器上的 /etc 中的配置文件生成的,只有一个例外:/etc/master.passwd。这是为了防止密码传播到 NIS 域中的所有服务器。因此,在初始化 NIS 映射之前,请配置主密码文件

# cp /etc/master.passwd /var/yp/master.passwd
# cd /var/yp
# vi master.passwd

建议删除所有系统帐户的条目以及任何不需要传播到 NIS 客户端的用户帐户,例如 root 和任何其他管理帐户。

确保 /var/yp/master.passwd 不被组或世界可读,方法是将其权限设置为 600

完成此任务后,初始化 NIS 映射。FreeBSD 包括 ypinit(8) 脚本来执行此操作。为主服务器生成映射时,请包含 -m 并指定 NIS 域名

ellington# ypinit -m test-domain
Server Type: MASTER Domain: test-domain
Creating an YP server will require that you answer a few questions.
Questions will all be asked at the beginning of the procedure.
Do you want this procedure to quit on non-fatal errors? [y/n: n] n
Ok, please remember to go back and redo manually whatever fails.
If not, something might not work.
At this point, we have to construct a list of this domains YP servers.
rod.darktech.org is already known as master server.
Please continue to add any slave servers, one per line. When you are
done with the list, type a <control D>.
master server   :  ellington
next host to add:  coltrane
next host to add:  ^D
The current list of NIS servers looks like this:
ellington
coltrane
Is this correct?  [y/n: y] y

[..output from map generation..]

NIS Map update completed.
ellington has been setup as an YP master server without any errors.

这将从 /var/yp/Makefile.dist 创建 /var/yp/Makefile。默认情况下,此文件假设环境只有一个 NIS 服务器,并且只有 FreeBSD 客户端。由于 test-domain 有一个从服务器,因此请编辑 /var/yp/Makefile 中的这一行,使其以注释 (#) 开头

NOPUSH = "True"

32.4.4.2. 添加新用户

每次创建新用户时,都必须将用户帐户添加到主 NIS 服务器并重建 NIS 映射。在此之前,新用户将无法登录到除 NIS 主服务器之外的任何地方。例如,要将新用户 jsmith 添加到 test-domain 域,请在主服务器上运行以下命令

# pw useradd jsmith
# cd /var/yp
# make test-domain

也可以使用 adduser jsmith 而不是 pw useradd smith 来添加用户。

32.4.5. 设置 NIS 从服务器

要设置 NIS 从服务器,请登录到从服务器并像主服务器一样编辑 /etc/rc.conf。不要生成任何 NIS 映射,因为这些映射已存在于主服务器上。在从服务器上运行 ypinit 时,请使用 -s(表示从服务器)而不是 -m(表示主服务器)。此选项需要 NIS 主服务器的名称以及域名,如本例所示

coltrane# ypinit -s ellington test-domain

Server Type: SLAVE Domain: test-domain Master: ellington

Creating an YP server will require that you answer a few questions.
Questions will all be asked at the beginning of the procedure.

Do you want this procedure to quit on non-fatal errors? [y/n: n]  n

Ok, please remember to go back and redo manually whatever fails.
If not, something might not work.
There will be no further questions. The remainder of the procedure
should take a few minutes, to copy the databases from ellington.
Transferring netgroup...
ypxfr: Exiting: Map successfully transferred
Transferring netgroup.byuser...
ypxfr: Exiting: Map successfully transferred
Transferring netgroup.byhost...
ypxfr: Exiting: Map successfully transferred
Transferring master.passwd.byuid...
ypxfr: Exiting: Map successfully transferred
Transferring passwd.byuid...
ypxfr: Exiting: Map successfully transferred
Transferring passwd.byname...
ypxfr: Exiting: Map successfully transferred
Transferring group.bygid...
ypxfr: Exiting: Map successfully transferred
Transferring group.byname...
ypxfr: Exiting: Map successfully transferred
Transferring services.byname...
ypxfr: Exiting: Map successfully transferred
Transferring rpc.bynumber...
ypxfr: Exiting: Map successfully transferred
Transferring rpc.byname...
ypxfr: Exiting: Map successfully transferred
Transferring protocols.byname...
ypxfr: Exiting: Map successfully transferred
Transferring master.passwd.byname...
ypxfr: Exiting: Map successfully transferred
Transferring networks.byname...
ypxfr: Exiting: Map successfully transferred
Transferring networks.byaddr...
ypxfr: Exiting: Map successfully transferred
Transferring netid.byname...
ypxfr: Exiting: Map successfully transferred
Transferring hosts.byaddr...
ypxfr: Exiting: Map successfully transferred
Transferring protocols.bynumber...
ypxfr: Exiting: Map successfully transferred
Transferring ypservers...
ypxfr: Exiting: Map successfully transferred
Transferring hosts.byname...
ypxfr: Exiting: Map successfully transferred

coltrane has been setup as an YP slave server without any errors.
Remember to update map ypservers on ellington.

这将在从服务器上生成一个名为 /var/yp/test-domain 的目录,其中包含 NIS 主服务器映射的副本。在每个从服务器上添加这些 /etc/crontab 条目将强制从服务器与其主服务器上的映射同步

20      *       *       *       *       root   /usr/libexec/ypxfr passwd.byname
21      *       *       *       *       root   /usr/libexec/ypxfr passwd.byuid

这些条目不是强制性的,因为主服务器会自动尝试将其任何映射更改推送到其从服务器。但是,由于客户端可能依赖于从服务器提供正确的密码信息,因此建议强制执行频繁的密码映射更新。这在繁忙的网络中尤其重要,因为映射更新可能并不总是能够完成。

要完成配置,请在从服务器上运行 /etc/netstart 以启动 NIS 服务。

32.4.6. 设置 NIS 客户端

NIS 客户端使用 ypbind(8) 绑定到 NIS 服务器。此守护程序在本地网络上广播 RPC 请求。这些请求指定在客户端上配置的域名。如果同一域中的 NIS 服务器接收到其中一个广播,它将响应 ypbind,后者将记录服务器的地址。如果有多个服务器可用,客户端将使用第一个响应服务器的地址,并将所有 NIS 请求定向到该服务器。客户端将定期自动 ping 服务器以确保它仍然可用。如果在合理的时间内未收到回复,ypbind 将将域标记为未绑定并开始再次广播,以期找到另一个服务器。

要将 FreeBSD 机器配置为 NIS 客户端

  1. 编辑 /etc/rc.conf 并添加以下几行,以便在网络启动期间设置 NIS 域名并启动 ypbind(8)

    nisdomainname="test-domain"
    nis_client_enable="YES"
  2. 要从 NIS 服务器导入所有可能的密码条目,请使用 vipw/etc/master.passwd 中删除除一个用户帐户之外的所有用户帐户。删除帐户时,请记住至少应保留一个本地帐户,并且此帐户应为 wheel 的成员。如果 NIS 出现问题,可以使用此本地帐户远程登录,成为超级用户并解决问题。在保存编辑之前,请将以下行添加到文件的末尾

    +:::::::::

    此行将客户端配置为向 NIS 服务器密码映射中具有有效帐户的任何用户提供客户端上的帐户。可以通过修改此行来配置 NIS 客户端的多种方法。一种方法在 使用 Netgroups 中进行了描述。有关更详细的阅读,请参阅 O’Reilly Media 出版的那本书 Managing NFS and NIS

  3. 要从 NIS 服务器导入所有可能的组条目,请将此行添加到 /etc/group

    +:*::

要立即启动 NIS 客户端,请以超级用户身份执行以下命令

# /etc/netstart
# service ypbind start

完成这些步骤后,在客户端上运行ypcat passwd应该会显示服务器的passwd映射。

32.4.7. NIS 安全性

由于 RPC 是一种基于广播的服务,因此同一域中运行 ypbind 的任何系统都可以检索 NIS 映射的内容。为了防止未经授权的事务,ypserv(8) 支持一个称为“securenets”的功能,该功能可用于限制对给定主机集的访问。默认情况下,此信息存储在/var/yp/securenets中,除非ypserv(8)-p和备用路径启动。此文件包含由网络规范和网络掩码组成的条目,它们之间用空格分隔。以"#"开头的行被视为注释。一个示例securenets可能如下所示

# allow connections from local host -- mandatory
127.0.0.1     255.255.255.255
# allow connections from any host
# on the 192.168.128.0 network
192.168.128.0 255.255.255.0
# allow connections from any host
# between 10.0.0.0 to 10.0.15.255
# this includes the machines in the testlab
10.0.0.0      255.255.240.0

如果ypserv(8) 收到来自与其中一条规则匹配的地址的请求,它将正常处理该请求。如果地址与规则不匹配,则该请求将被忽略,并且会记录警告消息。如果securenets不存在,则ypserv将允许来自任何主机的连接。

TCP Wrapper 是一种替代机制,用于提供访问控制而不是securenets。虽然这两种访问控制机制都增加了一些安全性,但它们都容易受到“IP欺骗”攻击。所有与 NIS 相关的流量都应在防火墙处阻止。

使用securenets的服务器可能无法为具有过时 TCP/IP 实现的合法 NIS 客户端提供服务。其中一些实现会在执行广播时将所有主机位设置为零,或者在计算广播地址时无法遵守子网掩码。虽然其中一些问题可以通过更改客户端配置来解决,但其他问题可能会迫使这些客户端系统退役或放弃securenets

使用 TCP Wrapper 会增加 NIS 服务器的延迟。额外的延迟可能足够长,以至于导致客户端程序超时,尤其是在繁忙的网络中,且 NIS 服务器速度较慢的情况下。如果一个或多个客户端受到延迟的影响,请将这些客户端转换为 NIS 从服务器并强制它们绑定到自身。

32.4.7.1. 禁止某些用户

在此示例中,basie系统是 NIS 域中的一个教师工作站。passwd主 NIS 服务器上的映射包含教师和学生的帐户。本节演示如何在允许此系统上的教师登录的同时拒绝学生登录。

为了防止指定的用户登录到系统(即使他们在 NIS 数据库中存在),请使用vipw在客户端的/etc/master.passwd末尾添加-username以及正确数量的冒号,其中username是要禁止登录的用户帐户名。包含被阻止用户的行必须位于允许 NIS 用户的+行之前。在此示例中,bill被禁止登录到basie

basie# cat /etc/master.passwd
root:[password]:0:0::0:0:The super-user:/root:/bin/csh
toor:[password]:0:0::0:0:The other super-user:/root:/bin/sh
daemon:*:1:1::0:0:Owner of many system processes:/root:/usr/sbin/nologin
operator:*:2:5::0:0:System &:/:/usr/sbin/nologin
bin:*:3:7::0:0:Binaries Commands and Source,,,:/:/usr/sbin/nologin
tty:*:4:65533::0:0:Tty Sandbox:/:/usr/sbin/nologin
kmem:*:5:65533::0:0:KMem Sandbox:/:/usr/sbin/nologin
games:*:7:13::0:0:Games pseudo-user:/usr/games:/usr/sbin/nologin
news:*:8:8::0:0:News Subsystem:/:/usr/sbin/nologin
man:*:9:9::0:0:Mister Man Pages:/usr/share/man:/usr/sbin/nologin
bind:*:53:53::0:0:Bind Sandbox:/:/usr/sbin/nologin
uucp:*:66:66::0:0:UUCP pseudo-user:/var/spool/uucppublic:/usr/libexec/uucp/uucico
xten:*:67:67::0:0:X-10 daemon:/usr/local/xten:/usr/sbin/nologin
pop:*:68:6::0:0:Post Office Owner:/nonexistent:/usr/sbin/nologin
nobody:*:65534:65534::0:0:Unprivileged user:/nonexistent:/usr/sbin/nologin
-bill:::::::::
+:::::::::

basie#

32.4.8. 使用网络组

禁止指定的用户登录到各个系统在较大的网络中变得不可扩展,并且很快就会失去 NIS 的主要优势:集中式管理。

网络组的开发是为了处理拥有数百个用户和机器的大型复杂网络。它们的使用类似于 UNIX® 组,主要区别在于缺少数字 ID 以及能够通过包含用户帐户和其他网络组来定义网络组。

为了扩展本章中使用的示例,NIS 域将扩展以添加表 28.2 和 28.3 中显示的用户和系统

表 2. 其他用户
用户名称(s)守护进程

alphabeta

IT 部门员工

charliedelta

IT 部门学徒

echofoxtrottgolf、…​

员工

ablebaker、…​

实习生

表 3. 其他系统
机器名称(s)守护进程

wardeathfaminepollution

仅允许 IT 员工登录到这些服务器。

pridegreedenvywrathlustsloth

IT 部门的所有成员都允许登录到这些服务器。

onetwothreefour、…​

员工使用的普通工作站。

trashcan

一台非常旧的机器,没有任何关键数据。即使是实习生也可以使用此系统。

在使用网络组配置此方案时,每个用户都分配到一个或多个网络组,然后允许或禁止所有网络组成员登录。添加新机器时,必须为所有网络组定义登录限制。添加新用户时,必须将帐户添加到一个或多个网络组。如果 NIS 设置计划得很周密,则只需要修改一个中央配置文件即可授予或拒绝对机器的访问权限。

第一步是初始化 NIS netgroup映射。在 FreeBSD 中,此映射不会默认创建。在 NIS 主服务器上,使用编辑器创建名为/var/yp/netgroup的映射。

此示例创建四个网络组来表示 IT 员工、IT 学徒、员工和实习生

IT_EMP  (,alpha,test-domain)    (,beta,test-domain)
IT_APP  (,charlie,test-domain)  (,delta,test-domain)
USERS   (,echo,test-domain)     (,foxtrott,test-domain) \
        (,golf,test-domain)
INTERNS (,able,test-domain)     (,baker,test-domain)

每个条目配置一个网络组。条目中的第一列是网络组的名称。每组括号表示一个或多个用户的组或另一个网络组的名称。在指定用户时,每个组中的三个逗号分隔字段表示

  1. 其他字段表示用户有效的宿主机的名称。如果未指定主机名,则该条目在所有主机上均有效。

  2. 属于此网络组的帐户的名称。

  3. 帐户的 NIS 域。帐户可以从其他 NIS 域导入到网络组中。

如果一个组包含多个用户,请用空格分隔每个用户。此外,每个字段都可以包含通配符。有关详细信息,请参阅netgroup(5)

不应使用超过 8 个字符的网络组名称。名称区分大小写,并且对网络组名称使用大写字母是区分用户、机器和网络组名称的简单方法。

一些非 FreeBSD NIS 客户端无法处理包含超过 15 个条目的网络组。可以通过创建几个包含 15 个或更少用户的子网络组以及一个由子网络组组成的真实网络组来规避此限制,如本示例所示

BIGGRP1  (,joe1,domain)  (,joe2,domain)  (,joe3,domain) [...]
BIGGRP2  (,joe16,domain)  (,joe17,domain) [...]
BIGGRP3  (,joe31,domain)  (,joe32,domain)
BIGGROUP  BIGGRP1 BIGGRP2 BIGGRP3

如果单个网络组中存在超过 225(15 乘以 15)个用户,请重复此过程。

要激活并分发新的 NIS 映射

ellington# cd /var/yp
ellington# make

这将生成三个 NIS 映射netgroupnetgroup.byhostnetgroup.byuser。使用ypcat(1)的映射键选项检查新的 NIS 映射是否可用

ellington% ypcat -k netgroup
ellington% ypcat -k netgroup.byhost
ellington% ypcat -k netgroup.byuser

第一个命令的输出应类似于/var/yp/netgroup的内容。第二个命令仅在创建了特定于主机的网络组时才会产生输出。第三个命令用于获取用户的网络组列表。

要配置客户端,请使用vipw(8)指定网络组的名称。例如,在名为war的服务器上,替换此行

+:::::::::

+@IT_EMP:::::::::

这指定只有在网络组IT_EMP中定义的用户才会被导入到此系统的密码数据库中,并且只有这些用户才能登录到此系统。

此配置也适用于 shell 的~函数以及在用户名和数字用户 ID 之间转换的所有例程。换句话说,cd ~user将不起作用,ls -l将显示数字 ID 而不是用户名,并且find . -user joe -print将失败并显示消息No such user。要解决此问题,请导入所有用户条目,但不要允许它们登录到服务器。这可以通过添加额外的一行来实现

+:::::::::/usr/sbin/nologin

此行配置客户端导入所有条目,但将这些条目中的 shell 替换为/usr/sbin/nologin

确保将额外行放在+@IT_EMP:::::::::之后。否则,从 NIS 导入的所有用户帐户都将使用/usr/sbin/nologin作为其登录 shell,并且没有人能够登录到系统。

要配置不太重要的服务器,请使用以下几行替换服务器上的旧+:::::::::

+@IT_EMP:::::::::
+@IT_APP:::::::::
+:::::::::/usr/sbin/nologin

工作站的对应行将是

+@IT_EMP:::::::::
+@USERS:::::::::
+:::::::::/usr/sbin/nologin

NIS 支持从其他网络组创建网络组,如果有关用户访问的策略发生更改,这将非常有用。一种可能性是创建基于角色的网络组。例如,可以创建一个名为BIGSRV的网络组来定义重要服务器的登录限制,另一个名为SMALLSRV的网络组用于不太重要的服务器,以及一个名为USERBOX的网络组用于工作站。这些网络组中的每一个都包含允许登录到这些机器的网络组。NIS`netgroup`映射的新条目将如下所示

BIGSRV    IT_EMP  IT_APP
SMALLSRV  IT_EMP  IT_APP  ITINTERN
USERBOX   IT_EMP  ITINTERN USERS

当可以定义具有相同限制的机器组时,这种定义登录限制的方法效果相当好。不幸的是,这是例外情况,而不是规则。大多数时候,需要能够在每台机器的基础上定义登录限制。

机器特定的网络组定义是处理策略更改的另一种可能性。在这种情况下,每个系统的/etc/master.passwd都包含两行以“+”开头。第一行添加一个网络组,其中包含允许登录到此机器的帐户,第二行添加所有其他帐户,其shell为/usr/sbin/nologin。建议使用主机名的“全大写”版本作为网络组的名称。

+@BOXNAME:::::::::
+:::::::::/usr/sbin/nologin

一旦在所有机器上完成了此任务,就不再需要修改/etc/master.passwd的本地版本。所有进一步的更改都可以通过修改NIS映射来处理。以下是在这种情况下可能的netgroup映射示例。

# Define groups of users first
IT_EMP    (,alpha,test-domain)    (,beta,test-domain)
IT_APP    (,charlie,test-domain)  (,delta,test-domain)
DEPT1     (,echo,test-domain)     (,foxtrott,test-domain)
DEPT2     (,golf,test-domain)     (,hotel,test-domain)
DEPT3     (,india,test-domain)    (,juliet,test-domain)
ITINTERN  (,kilo,test-domain)     (,lima,test-domain)
D_INTERNS (,able,test-domain)     (,baker,test-domain)
#
# Now, define some groups based on roles
USERS     DEPT1   DEPT2     DEPT3
BIGSRV    IT_EMP  IT_APP
SMALLSRV  IT_EMP  IT_APP    ITINTERN
USERBOX   IT_EMP  ITINTERN  USERS
#
# And a groups for a special tasks
# Allow echo and golf to access our anti-virus-machine
SECURITY  IT_EMP  (,echo,test-domain)  (,golf,test-domain)
#
# machine-based netgroups
# Our main servers
WAR       BIGSRV
FAMINE    BIGSRV
# User india needs access to this server
POLLUTION  BIGSRV  (,india,test-domain)
#
# This one is really important and needs more access restrictions
DEATH     IT_EMP
#
# The anti-virus-machine mentioned above
ONE       SECURITY
#
# Restrict a machine to a single user
TWO       (,hotel,test-domain)
# [...more groups to follow]

使用基于机器的网络组可能并不总是明智的。在部署几十或几百个系统时,可以使用基于角色的网络组而不是基于机器的网络组,以将NIS映射的大小保持在合理的范围内。

32.4.9. 密码格式

NIS要求NIS域中的所有主机使用相同的格式加密密码。如果用户在NIS客户端上遇到身份验证问题,可能是由于密码格式不同。在异构网络中,所有操作系统都必须支持该格式,其中DES是最基本的标准。

要检查服务器或客户端正在使用哪种格式,请查看/etc/login.conf的这一部分。

default:\
	:passwd_format=des:\
	:copyright=/etc/COPYRIGHT:\
	[Further entries elided]

在此示例中,系统正在使用DES格式进行密码哈希。其他可能的值包括用于Blowfish的blf,用于MD5的md5,用于SHA-256的sha256和用于SHA-512的sha512。有关更多信息以及系统上可用内容的最新列表,请参阅crypt(3)手册页。

如果需要编辑主机上的格式以使其与NIS域中使用的格式匹配,则在保存更改后必须重建登录功能数据库。

# cap_mkdb /etc/login.conf

现有用户帐户的密码格式将不会更新,直到每个用户在重建登录功能数据库之后更改其密码。

32.5. 轻量级目录访问协议 (LDAP)

轻量级目录访问协议 (LDAP) 是一种应用程序层协议,用于使用分布式目录信息服务访问、修改和验证对象。将其视为电话簿或记录簿,其中存储了多级分层、同类信息。它用于Active Directory和OpenLDAP网络,并允许用户使用单个帐户访问多个级别的内部信息。例如,电子邮件身份验证、提取员工联系信息和内部网站身份验证都可能使用LDAP服务器记录库中的单个用户帐户。

本节提供了在FreeBSD系统上配置LDAP服务器的快速入门指南。它假设管理员已经拥有一个设计计划,其中包括要存储的信息类型、这些信息将用于什么、哪些用户应该访问这些信息以及如何保护这些信息免遭未经授权的访问。

32.5.1. LDAP术语和结构

LDAP使用一些术语,在开始配置之前应该了解这些术语。所有目录条目都由一组属性组成。这些属性集中的每一个都包含一个唯一的标识符,称为可分辨名称 (DN),它通常由其他几个属性(如公共名称或相对可分辨名称 (RDN))构建。类似于目录如何具有绝对路径和相对路径,将DN视为绝对路径,将RDN视为相对路径。

LDAP条目的示例如下所示。此示例搜索指定用户帐户 (uid)、组织单位 (ou) 和组织 (o) 的条目。

% ldapsearch -xb "uid=trhodes,ou=users,o=example.com"
# extended LDIF
#
# LDAPv3
# base <uid=trhodes,ou=users,o=example.com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# trhodes, users, example.com
dn: uid=trhodes,ou=users,o=example.com
mail: [email protected]
cn: Tom Rhodes
uid: trhodes
telephoneNumber: (123) 456-7890

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

此示例条目显示了dnmailcnuidtelephoneNumber属性的值。cn属性是RDN。

有关LDAP及其术语的更多信息,请访问http://www.openldap.org/doc/admin24/intro.html

32.5.2. 配置LDAP服务器

FreeBSD没有提供内置的LDAP服务器。通过安装net/openldap-server包或端口开始配置。

# pkg install openldap-server

中启用了大量默认选项。通过运行pkg info openldap-server查看它们。如果它们不够用(例如,如果需要SQL支持),请考虑使用适当的框架重新编译端口。

安装会创建目录/var/db/openldap-data来保存数据。必须创建用于存储证书的目录。

# mkdir /usr/local/etc/openldap/private

下一阶段是配置证书颁发机构。必须从/usr/local/etc/openldap/private执行以下命令。这很重要,因为文件权限需要限制,用户不应该访问这些文件。有关证书及其参数的更详细信息,请参阅OpenSSL。要创建证书颁发机构,请从以下命令开始并按照提示操作。

# openssl req -days 365 -nodes -new -x509 -keyout ca.key -out ../ca.crt

提示的条目可以是通用的,除了Common Name。此条目必须不同于系统主机名。如果这将是自签名证书,请在主机名前加CA表示证书颁发机构。

下一个任务是创建证书签名请求和私钥。输入此命令并按照提示操作。

# openssl req -days 365 -nodes -new -keyout server.key -out server.csr

在证书生成过程中,确保正确设置Common Name属性。证书签名请求必须使用证书颁发机构签名才能用作有效证书。

# openssl x509 -req -days 365 -in server.csr -out ../server.crt -CA ../ca.crt -CAkey ca.key -CAcreateserial

证书生成过程的最后一部分是生成和签署客户端证书。

# openssl req -days 365 -nodes -new -keyout client.key -out client.csr
# openssl x509 -req -days 3650 -in client.csr -out ../client.crt -CA ../ca.crt -CAkey ca.key

请记住,在出现提示时使用相同的Common Name属性。完成后,确保通过上述命令总共生成了八 (8) 个新文件。

运行OpenLDAP服务器的守护进程是slapd。其配置是通过slapd.ldif执行的:旧的slapd.conf已被OpenLDAP弃用。

配置示例用于slapd.ldif是可用的,也可以在/usr/local/etc/openldap/slapd.ldif.sample中找到。选项在slapd-config(5)中进行了记录。slapd.ldif的每个部分,就像所有其他LDAP属性集一样,都通过DN唯一标识。确保在dn:语句和所需部分的末尾之间没有留下空行。在以下示例中,将使用TLS来实现安全通道。第一部分表示全局配置。

#
# See slapd-config(5) for details on configuration options.
# This file should NOT be world readable.
#
dn: cn=config
objectClass: olcGlobal
cn: config
#
#
# Define global ACLs to disable default read access.
#
olcArgsFile: /var/run/openldap/slapd.args
olcPidFile: /var/run/openldap/slapd.pid
olcTLSCertificateFile: /usr/local/etc/openldap/server.crt
olcTLSCertificateKeyFile: /usr/local/etc/openldap/private/server.key
olcTLSCACertificateFile: /usr/local/etc/openldap/ca.crt
#olcTLSCipherSuite: HIGH
olcTLSProtocolMin: 3.1
olcTLSVerifyClient: never

必须在此处指定证书颁发机构、服务器证书和服务器私钥文件。建议让客户端选择安全密码并省略选项olcTLSCipherSuite(与除openssl之外的其他TLS客户端不兼容)。选项olcTLSProtocolMin允许服务器要求最低安全级别:建议使用。虽然服务器的验证是强制性的,但客户端的验证不是:olcTLSVerifyClient: never

第二部分是关于后端模块,可以按如下方式配置。

#
# Load dynamic backend modules:
#
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulepath:	/usr/local/libexec/openldap
olcModuleload:	back_mdb.la
#olcModuleload:	back_bdb.la
#olcModuleload:	back_hdb.la
#olcModuleload:	back_ldap.la
#olcModuleload:	back_passwd.la
#olcModuleload:	back_shell.la

第三部分用于加载数据库将使用的所需ldif模式:它们是必不可少的。

dn: cn=schema,cn=config
objectClass: olcSchemaConfig
cn: schema

include: file:///usr/local/etc/openldap/schema/core.ldif
include: file:///usr/local/etc/openldap/schema/cosine.ldif
include: file:///usr/local/etc/openldap/schema/inetorgperson.ldif
include: file:///usr/local/etc/openldap/schema/nis.ldif

接下来,是前端配置部分。

# Frontend settings
#
dn: olcDatabase={-1}frontend,cn=config
objectClass: olcDatabaseConfig
objectClass: olcFrontendConfig
olcDatabase: {-1}frontend
olcAccess: to * by * read
#
# Sample global access control policy:
#	Root DSE: allow anyone to read it
#	Subschema (sub)entry DSE: allow anyone to read it
#	Other DSEs:
#		Allow self write access
#		Allow authenticated users read access
#		Allow anonymous users to authenticate
#
#olcAccess: to dn.base="" by * read
#olcAccess: to dn.base="cn=Subschema" by * read
#olcAccess: to *
#	by self write
#	by users read
#	by anonymous auth
#
# if no access controls are present, the default policy
# allows anyone and everyone to read anything but restricts
# updates to rootdn.  (e.g., "access to * by * read")
#
# rootdn can always read and write EVERYTHING!
#
olcPasswordHash: {SSHA}
# {SSHA} is already the default for olcPasswordHash

另一个部分专门用于配置后端,以后访问OpenLDAP服务器配置的唯一方法是以全局超级用户身份访问。

dn: olcDatabase={0}config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcAccess: to * by * none
olcRootPW: {SSHA}iae+lrQZILpiUdf16Z9KmDmSwT77Dj4U

默认管理员用户名是cn=config。在shell中键入slappasswd,选择一个密码并在olcRootPW中使用其哈希值。如果没有现在指定此选项,在导入slapd.ldif之前,以后没有人能够修改全局配置部分。

最后一部分是关于数据库后端。

#######################################################################
# LMDB database definitions
#######################################################################
#
dn: olcDatabase=mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: mdb
olcDbMaxSize: 1073741824
olcSuffix: dc=domain,dc=example
olcRootDN: cn=mdbadmin,dc=domain,dc=example
# Cleartext passwords, especially for the rootdn, should
# be avoided.  See slappasswd(8) and slapd-config(5) for details.
# Use of strong authentication encouraged.
olcRootPW: {SSHA}X2wHvIWDk6G76CQyCMS1vDCvtICWgn0+
# The database directory MUST exist prior to running slapd AND
# should only be accessible by the slapd and slap tools.
# Mode 700 recommended.
olcDbDirectory:	/var/db/openldap-data
# Indices to maintain
olcDbIndex: objectClass eq

此数据库承载LDAP目录的实际内容。除了mdb之外,还有其他类型可用。此处配置其超级用户(不要与全局超级用户混淆):olcRootDN中的(可能自定义的)用户名和olcRootPW中的密码哈希;可以像以前一样使用slappasswd

存储库包含四个slapd.ldif示例。要将现有的slapd.conf转换为slapd.ldif,请参阅此页面(请注意,这可能会引入一些无用的选项)。

完成配置后,必须将slapd.ldif放置在空目录中。建议将其创建为。

# mkdir /usr/local/etc/openldap/slapd.d/

导入配置数据库。

# /usr/local/sbin/slapadd -n0 -F /usr/local/etc/openldap/slapd.d/ -l /usr/local/etc/openldap/slapd.ldif

启动slapd守护进程。

# /usr/local/libexec/slapd -F /usr/local/etc/openldap/slapd.d/

选项-d可用于调试,如slapd(8)中所述。要验证服务器是否正在运行并正常工作。

# ldapsearch -x -b '' -s base '(objectclass=*)' namingContexts
# extended LDIF
#
# LDAPv3
# base <> with scope baseObject
# filter: (objectclass=*)
# requesting: namingContexts
#

#
dn:
namingContexts: dc=domain,dc=example

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

服务器仍然必须受信任。如果以前从未这样做过,请按照以下说明操作。安装OpenSSL包或端口。

# pkg install openssl

从存储ca.crt的目录(在此示例中为/usr/local/etc/openldap)运行。

# c_rehash .

CA和服务器证书现在在其各自的角色中被正确识别。要验证这一点,请从server.crt目录运行此命令。

# openssl verify -verbose -CApath . server.crt

如果slapd正在运行,请重新启动它。如/usr/local/etc/rc.d/slapd中所述,要在启动时正确运行slapd,必须将以下行添加到/etc/rc.conf

slapd_enable="YES"
slapd_flags='-h "ldapi://%2fvar%2frun%2fopenldap%2fldapi/
ldap://0.0.0.0/"'
slapd_sockets="/var/run/openldap/ldapi"
slapd_cn_config="YES"

slapd在启动时不提供调试。为此目的,请检查/var/log/debug.logdmesg -a/var/log/messages

以下示例将组team和用户john添加到domain.example LDAP数据库中,该数据库仍然为空。首先,创建文件domain.ldif

# cat domain.ldif
dn: dc=domain,dc=example
objectClass: dcObject
objectClass: organization
o: domain.example
dc: domain

dn: ou=groups,dc=domain,dc=example
objectClass: top
objectClass: organizationalunit
ou: groups

dn: ou=users,dc=domain,dc=example
objectClass: top
objectClass: organizationalunit
ou: users

dn: cn=team,ou=groups,dc=domain,dc=example
objectClass: top
objectClass: posixGroup
cn: team
gidNumber: 10001

dn: uid=john,ou=users,dc=domain,dc=example
objectClass: top
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
cn: John McUser
uid: john
uidNumber: 10001
gidNumber: 10001
homeDirectory: /home/john/
loginShell: /usr/bin/bash
userPassword: secret

有关更多详细信息,请参阅 OpenLDAP 文档。使用 slappasswd 将纯文本密码 secret 替换为 userPassword 中的哈希值。作为 loginShell 指定的路径必须存在于所有允许 john 登录的系统中。最后,使用 mdb 管理员修改数据库。

# ldapadd -W -D "cn=mdbadmin,dc=domain,dc=example" -f domain.ldif

只有全局超级用户才能对全局配置部分进行修改。例如,假设最初指定了选项 olcTLSCipherSuite: HIGH:MEDIUM:SSLv3,现在必须将其删除。首先,创建一个包含以下内容的文件

# cat global_mod
dn: cn=config
changetype: modify
delete: olcTLSCipherSuite

然后,应用修改

# ldapmodify -f global_mod -x -D "cn=config" -W

当系统提示时,提供在配置后端部分中选择的密码。不需要用户名:此处,cn=config 表示要修改的数据库部分的 DN。或者,使用 ldapmodify 删除数据库的单行,使用 ldapdelete 删除整个条目。

如果出现问题,或者全局超级用户无法访问配置后端,则可以删除并重写整个配置

# rm -rf /usr/local/etc/openldap/slapd.d/

slapd.ldif 然后可以再次编辑和导入。请仅在没有其他解决方案可用时遵循此过程。

这仅是服务器的配置。同一台机器还可以托管具有其自身独立配置的 LDAP 客户端。

32.6. 动态主机配置协议 (DHCP)

动态主机配置协议 (DHCP) 允许系统连接到网络,以便为该网络上的通信分配必要的寻址信息。FreeBSD 包括 OpenBSD 版本的 dhclient,客户端使用它来获取寻址信息。FreeBSD 不安装 DHCP 服务器,但 FreeBSD Ports Collection 中提供了多个服务器。DHCP 协议在RFC 2131中进行了全面描述。信息资源也可在isc.org/downloads/dhcp/找到。

本节介绍如何使用内置的 DHCP 客户端。然后描述如何安装和配置 DHCP 服务器。

在 FreeBSD 中,DHCP 服务器和 DHCP 客户端都需要bpf(4)设备。此设备包含在随 FreeBSD 一起安装的 GENERIC 内核中。如果使用 DHCP,则希望创建自定义内核的用户需要保留此设备。

需要注意的是,bpf 还允许特权用户在该系统上运行网络数据包嗅探器。

32.6.1. 配置 DHCP 客户端

FreeBSD 安装程序中包含 DHCP 客户端支持,从而可以轻松配置新安装的系统以从现有的 DHCP 服务器自动接收其网络寻址信息。有关网络配置示例,请参阅帐户、时区、服务和加固

当在客户端机器上执行 dhclient 时,它会开始广播配置信息请求。默认情况下,这些请求使用 UDP 端口 68。服务器在 UDP 端口 67 上回复,为客户端提供 IP 地址和其他相关的网络信息,例如子网掩码、默认网关和 DNS 服务器地址。此信息以 DHCP “租约”的形式存在,并且在可配置的时间内有效。这允许不再连接到网络的客户端的陈旧 IP 地址自动重复使用。DHCP 客户端可以从服务器获取大量信息。详尽的列表可以在dhcp-options(5)中找到。

默认情况下,当 FreeBSD 系统启动时,其 DHCP 客户端在后台或异步运行。其他启动脚本在 DHCP 进程完成时继续运行,从而加快系统启动速度。

当 DHCP 服务器快速响应客户端的请求时,后台 DHCP 工作良好。但是,DHCP 在某些系统上可能需要很长时间才能完成。如果网络服务在 DHCP 分配网络寻址信息之前尝试运行,则它们将失败。使用同步模式下的 DHCP 可以避免此问题,因为它会在 DHCP 配置完成之前暂停启动。

此行位于 /etc/rc.conf 中,用于配置后台或异步模式

ifconfig_fxp0="DHCP"

如果系统已配置为在安装期间使用 DHCP,则此行可能已存在。将这些示例中显示的 fxp0 替换为要动态配置的接口的名称,如“设置网络接口卡”中所述。

要改为将系统配置为使用同步模式,并在 DHCP 完成期间在启动时暂停,请使用“SYNCDHCP”

ifconfig_fxp0="SYNCDHCP"

其他客户端选项可用。在rc.conf(5)中搜索 dhclient 以获取详细信息。

DHCP 客户端使用以下文件

  • /etc/dhclient.conf

    dhclient 使用的配置文件。通常,此文件仅包含注释,因为默认值适用于大多数客户端。此配置文件在dhclient.conf(5)中进行了描述。

  • /sbin/dhclient

    有关命令本身的更多信息,请参阅dhclient(8)

  • /sbin/dhclient-script

    FreeBSD 特定的 DHCP 客户端配置脚本。它在dhclient-script(8)中进行了描述,但要正常运行,不需要任何用户修改。

  • /var/db/dhclient.leases.interface

    DHCP 客户端在此文件中保留有效租约的数据库,该文件作为日志写入,并在dhclient.leases(5)中进行了描述。

32.6.2. 安装和配置 DHCP 服务器

本节演示如何使用 Internet Systems Consortium (ISC) 实现的 DHCP 服务器将 FreeBSD 系统配置为充当 DHCP 服务器。可以使用net/isc-dhcp44-server包或端口安装此实现及其文档。

安装net/isc-dhcp44-server会安装一个示例配置文件。将 /usr/local/etc/dhcpd.conf.example 复制到 /usr/local/etc/dhcpd.conf 并对该新文件进行任何编辑。

配置文件由子网和主机的声明组成,这些声明定义提供给 DHCP 客户端的信息。例如,这些行配置以下内容

option domain-name "example.org";(1)
option domain-name-servers ns1.example.org;(2)
option subnet-mask 255.255.255.0;(3)

default-lease-time 600;(4)
max-lease-time 72400;(5)
ddns-update-style none;(6)

subnet 10.254.239.0 netmask 255.255.255.224 {
  range 10.254.239.10 10.254.239.20;(7)
  option routers rtr-239-0-1.example.org, rtr-239-0-2.example.org;(8)
}

host fantasia {
  hardware ethernet 08:00:07:26:c0:a5;(9)
  fixed-address fantasia.fugue.com;(10)
}
1此选项指定将提供给客户端的默认搜索域。有关更多信息,请参阅resolv.conf(5)
2此选项指定客户端应使用的逗号分隔的 DNS 服务器列表。它们可以按其完全限定域名 (FQDN) 列出,如示例所示,也可以按其 IP 地址列出。
3将提供给客户端的子网掩码。
4默认租约到期时间(以秒为单位)。可以将客户端配置为覆盖此值。
5租约允许的最大时间长度(以秒为单位)。如果客户端请求更长的租约,仍然会发出租约,但它仅对 max-lease-time 有效。
6none 的默认值禁用动态 DNS 更新。将其更改为 interim 会将 DHCP 服务器配置为在每次分配租约时更新 DNS 服务器,以便 DNS 服务器知道哪些 IP 地址与网络中的哪些计算机相关联。除非 DNS 服务器已配置为支持动态 DNS,否则请勿更改默认设置。
7此行创建一组可用的 IP 地址,这些地址保留用于分配给 DHCP 客户端。地址范围必须对上一行中指定的网络或子网有效。
8声明对在起始 { 括号之前指定的网络或子网有效的默认网关。
9指定客户端的硬件 MAC 地址,以便 DHCP 服务器在客户端发出请求时能够识别客户端。
10指定此主机应始终分配相同的 IP 地址。使用主机名是正确的,因为 DHCP 服务器将在返回租约信息之前解析主机名。

此配置文件支持更多选项。有关详细信息和示例,请参阅随服务器一起安装的 dhcpd.conf(5)。

完成 dhcpd.conf 的配置后,在 /etc/rc.conf 中启用 DHCP 服务器

dhcpd_enable="YES"
dhcpd_ifaces="dc0"

dc0 替换为 DHCP 服务器应监听 DHCP 客户端请求的接口(或接口,用空格分隔)。

通过发出以下命令启动服务器

# service isc-dhcpd start

服务器配置的任何未来更改都需要停止然后使用service(8)启动 dhcpd 服务。

DHCP 服务器使用以下文件。请注意,手册页已随服务器软件一起安装。

  • /usr/local/sbin/dhcpd

    有关 dhcpd 服务器的更多信息,请参阅 dhcpd(8)。

  • /usr/local/etc/dhcpd.conf

    服务器配置文件需要包含应提供给客户端的所有信息,以及有关服务器操作的信息。此配置文件在 dhcpd.conf(5) 中进行了描述。

  • /var/db/dhcpd.leases

    DHCP 服务器在此文件中保留其已发出的租约的数据库,该文件作为日志写入。请参阅 dhcpd.leases(5),其中提供了更长的描述。

  • /usr/local/sbin/dhcrelay

    此守护程序用于高级环境,其中一个 DHCP 服务器将来自客户端的请求转发到另一个位于单独网络上的 DHCP 服务器。如果需要此功能,请安装net/isc-dhcp44-relay包或端口。安装包括 dhcrelay(8),它提供了更多详细信息。

32.7. 域名系统 (DNS)

域名系统 (DNS) 是将域名映射到 IP 地址,反之亦然的协议。DNS 通过权威根、顶级域名 (TLD) 和其他较小规模的名称服务器的复杂系统在整个互联网上进行协调,这些服务器托管和缓存单个域信息。不需要运行名称服务器即可在系统上执行 DNS 查找。

下表描述了与 DNS 相关的一些术语

表 4. DNS 术语
术语定义

正向 DNS

将主机名映射到 IP 地址。

来源

指的是特定区域文件中涵盖的域。

解析器

机器通过它查询名称服务器以获取区域信息的系统进程。

反向 DNS

将 IP 地址映射到主机名。

根区域

互联网区域层次结构的起点。所有区域都属于根区域,类似于文件系统中的所有文件都属于根目录。

区域

由同一机构管理的单个域、子域或 DNS 的一部分。

区域示例

  • . 是文档中通常用来指代根区域的方式。

  • org. 是根区域下的顶级域名 (TLD)。

  • example.org. 是 `org.` 顶级域名 (TLD) 下的一个区域。

  • 1.168.192.in-addr.arpa 是一个区域,引用所有属于 `192.168.1.*` IP 地址空间的 IP 地址。

可以看出,主机名的更具体部分出现在其左侧。例如,example.org.org. 更具体,因为 org. 比根区域更具体。主机名每个部分的布局很像文件系统:/dev 目录位于根目录下,依此类推。

32.7.1. 运行名称服务器的理由

名称服务器通常有两种形式:权威名称服务器和缓存(也称为解析)名称服务器。

当需要权威名称服务器时

  • 希望向世界提供 DNS 信息,对查询进行权威回复。

  • 注册了一个域名,例如 example.org,并且需要为其下的主机名分配 IP 地址。

  • 一个 IP 地址块需要反向 DNS 条目(IP 到主机名)。

  • 一个备份或第二个名称服务器,称为从服务器,将回复查询。

当需要缓存名称服务器时

  • 本地 DNS 服务器可以缓存并比查询外部名称服务器更快地响应。

当查询 www.FreeBSD.org 时,解析器通常会查询上行 ISP 的名称服务器,并检索回复。使用本地缓存 DNS 服务器,查询只需由缓存 DNS 服务器向外部世界发出一次。由于信息缓存在本地,因此其他查询无需转到本地网络之外。

32.7.2. DNS 服务器配置

Unbound 提供在 FreeBSD 基本系统中。默认情况下,它只为本地机器提供 DNS 解析。虽然基本系统软件包可以配置为提供超出本地机器的解析服务,但建议通过从 FreeBSD Ports 集合安装 Unbound 来解决此类需求。

要启用 Unbound,请将以下内容添加到 /etc/rc.conf

local_unbound_enable="YES"

/etc/resolv.conf 中任何现有的名称服务器都将配置为新 Unbound 配置中的转发器。

如果任何列出的名称服务器不支持 DNSSEC,则本地 DNS 解析将失败。请务必测试每个名称服务器并删除任何失败的服务器。以下命令将显示运行在 192.168.1.1 上的名称服务器的信任树或失败信息

% drill -S FreeBSD.org @192.168.1.1

一旦确认每个名称服务器都支持 DNSSEC,就开始 Unbound

# service local_unbound onestart

这将负责更新 /etc/resolv.conf,以便现在可以查询 DNSSEC 安全域名。例如,运行以下命令以验证 FreeBSD.org DNSSEC 信任树

% drill -S FreeBSD.org
;; Number of trusted keys: 1
;; Chasing: freebsd.org. A

DNSSEC Trust tree:
freebsd.org. (A)
|---freebsd.org. (DNSKEY keytag: 36786 alg: 8 flags: 256)
    |---freebsd.org. (DNSKEY keytag: 32659 alg: 8 flags: 257)
    |---freebsd.org. (DS keytag: 32659 digest type: 2)
        |---org. (DNSKEY keytag: 49587 alg: 7 flags: 256)
            |---org. (DNSKEY keytag: 9795 alg: 7 flags: 257)
            |---org. (DNSKEY keytag: 21366 alg: 7 flags: 257)
            |---org. (DS keytag: 21366 digest type: 1)
            |   |---. (DNSKEY keytag: 40926 alg: 8 flags: 256)
            |       |---. (DNSKEY keytag: 19036 alg: 8 flags: 257)
            |---org. (DS keytag: 21366 digest type: 2)
                |---. (DNSKEY keytag: 40926 alg: 8 flags: 256)
                    |---. (DNSKEY keytag: 19036 alg: 8 flags: 257)
;; Chase successful

32.7.3. 权威名称服务器配置

FreeBSD 在基本系统中不提供权威名称服务器软件。鼓励用户安装第三方应用程序,例如 dns/nsddns/bind918 软件包或端口。

32.8. 零配置网络 (mDNS/DNS-SD)

零配置网络(有时称为 zeroconf)是一组技术,通过提供以下功能来简化网络配置

  • 数字网络地址的自动分配 (mDNS),

  • 主机名的自动分发和解析 (mDNS),以及

  • 服务实例的自动发现 (DNS-SD)。

32.8.1. 配置和启动 Avahi

zeroconf 的一个流行实现是 Avahi。可以使用以下命令安装和配置 Avahi

# pkg install avahi-app nss_mdns
# grep -q '^hosts:.*\<mdns\>' /etc/nsswitch.conf || sed -i "" 's/^hosts: .*/& mdns/' /etc/nsswitch.conf
# service dbus enable
# service avahi-daemon enable
# service dbus start
# service avahi-daemon start

32.9. Apache HTTP 服务器

开源 Apache HTTP 服务器是使用最广泛的 Web 服务器。FreeBSD 默认情况下不安装此 Web 服务器,但可以从 www/apache24 软件包或端口安装。

本节总结了如何在 FreeBSD 上配置和启动 Apache HTTP 服务器 2.x 版本。有关 Apache 2.X 及其配置指令的更多详细信息,请参阅 httpd.apache.org

32.9.1. 配置和启动 Apache

在 FreeBSD 中,主要的 Apache HTTP 服务器配置文件安装为 /usr/local/etc/apache2x/httpd.conf,其中 x 表示版本号。此 ASCII 文本文件以 # 开头注释行。最常修改的指令是

ServerRoot "/usr/local"

指定 Apache 安装的默认目录层次结构。二进制文件存储在服务器根目录的 binsbin 子目录中,配置文件存储在 etc/apache2x 子目录中。

ServerAdmin [email protected]

将其更改为接收服务器问题的电子邮件地址。此地址也出现在某些服务器生成的页面上,例如错误文档。

ServerName www.example.com:80

允许管理员设置发送回客户端的服务器主机名。例如,可以使用 www 代替实际主机名。如果系统没有注册的 DNS 名称,则输入其 IP 地址。如果服务器将在备用端口上侦听,则将 80 更改为备用端口号。

DocumentRoot "/usr/local/www/apache2_x_/data"

将从中提供文档的目录。默认情况下,所有请求都来自此目录,但可以使用符号链接和别名指向其他位置。

在进行更改之前,始终备份默认 Apache 配置文件是个好主意。完成 Apache 配置后,保存文件并使用 apachectl 验证配置。运行 apachectl configtest 应返回 Syntax OK

要在系统启动时启动 Apache,请将以下行添加到 /etc/rc.conf

apache24_enable="YES"

如果 Apache 应以非默认选项启动,则可以将以下行添加到 /etc/rc.conf 以指定所需的标志

apache24_flags=""

如果 apachectl 未报告配置错误,则立即启动 httpd

# service apache24 start

可以通过在 Web 浏览器中输入 http://localhost 来测试 httpd 服务,将 localhost 替换为运行 httpd 的机器的完全限定域名。显示的默认网页是 /usr/local/www/apache24/data/index.html

httpd 运行时,可以在进行后续配置更改后使用以下命令测试 Apache 配置是否有错误

# service apache24 configtest

需要注意的是,configtest 不是 rc(8) 标准,不应期望它对所有启动脚本都有效。

32.9.2. 虚拟主机

虚拟主机允许在同一台 Apache 服务器上运行多个网站。虚拟主机可以是基于 IP 的基于名称的。基于 IP 的虚拟主机为每个网站使用不同的 IP 地址。基于名称的虚拟主机使用客户端的 HTTP/1.1 标头来确定主机名,这允许网站共享相同的 IP 地址。

要设置 Apache 以使用基于名称的虚拟主机,请为每个网站添加一个 VirtualHost 块。例如,对于名为 www.domain.tld 且虚拟域为 www.someotherdomain.tld 的 Web 服务器,请将以下条目添加到 httpd.conf

<VirtualHost *>
    ServerName www.domain.tld
    DocumentRoot /www/domain.tld
</VirtualHost>

<VirtualHost *>
    ServerName www.someotherdomain.tld
    DocumentRoot /www/someotherdomain.tld
</VirtualHost>

对于每个虚拟主机,请将 ServerNameDocumentRoot 的值替换为要使用的值。

有关设置虚拟主机的更多信息,请查阅 Apache 官方文档:https://httpd.apache.ac.cn/docs/vhosts/

32.9.3. Apache 模块

Apache 使用模块来增强基本服务器提供的功能。请参阅 https://httpd.apache.ac.cn/docs/current/mod/ 以获取可用模块的完整列表以及配置详细信息。

在 FreeBSD 中,可以使用 www/apache24 端口编译一些模块。在 /usr/ports/www/apache24 中键入 make config 以查看哪些模块可用以及哪些模块默认启用。如果模块未与端口一起编译,则 FreeBSD Ports 集合提供了一种简单的方法来安装许多模块。本节介绍三个最常用的模块。

32.9.3.1. SSL 支持

在某个时候,Apache 内部对 SSL 的支持需要一个名为 mod_ssl 的辅助模块。现在情况已不再如此,Apache 的默认安装附带内置于 Web 服务器中的 SSL。有关如何启用对 SSL 网站支持的示例,可在安装的文件 httpd-ssl.conf 中找到,该文件位于 /usr/local/etc/apache24/extra 目录中。在此目录中还有一个名为 ssl.conf-sample 的示例文件。建议评估这两个文件以在 Apache Web 服务器中正确设置安全网站。

完成 SSL 配置后,必须取消主 http.conf 中的以下行的注释,以在下次重新启动或重新加载 Apache 时激活更改

#Include etc/apache24/extra/httpd-ssl.conf

SSL 版本二和版本三存在已知的漏洞问题。强烈建议启用 TLS 版本 1.2 和 1.3 以代替旧的 SSL 选项。这可以通过在 ssl.conf 中设置以下选项来完成

SSLProtocol all -SSLv3 -SSLv2 +TLSv1.2 +TLSv1.3
SSLProxyProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1

要完成 Web 服务器中 SSL 的配置,请取消以下行的注释以确保在重新启动或重新加载时配置将被拉入 Apache

# Secure (SSL/TLS) connections
Include etc/apache24/extra/httpd-ssl.conf

以下行也必须在 httpd.conf 中取消注释以完全支持 Apache 中的 SSL

LoadModule authn_socache_module libexec/apache24/mod_authn_socache.so
LoadModule socache_shmcb_module libexec/apache24/mod_socache_shmcb.so
LoadModule ssl_module libexec/apache24/mod_ssl.so

下一步是与证书颁发机构合作,在系统上安装相应的证书。这将为站点建立信任链并防止任何自签名证书警告。

32.9.3.2. mod_perl

mod_perl 模块使得用 Perl 编写 Apache 模块成为可能。此外,嵌入到服务器中的持久解释器避免了启动外部解释器的开销以及 Perl 启动时间的损失。

mod_perl 可以使用 www/mod_perl2 软件包或端口进行安装。有关使用此模块的文档,请访问 http://perl.apache.org/docs/2.0/index.html

32.9.3.3. mod_php

PHP: 超文本预处理器 (PHP) 是一种通用脚本语言,特别适合于 Web 开发。它能够嵌入到 HTML 中,其语法借鉴了 C、Java™ 和 Perl,旨在让 Web 开发人员能够快速编写动态生成的网页。

可以通过安装相应的端口来添加对 Apache 的 PHP 支持以及用该语言编写的任何其他功能。

对于所有支持的版本,请使用 pkg 搜索软件包数据库。

# pkg search php

将显示一个列表,其中包括版本以及它们提供的附加功能。这些组件完全模块化,这意味着可以通过安装相应的端口来启用功能。要安装 Apache 的 PHP 7.4 版本,请执行以下命令:

# pkg install mod_php74

如果需要安装任何依赖项软件包,也将一并安装。

默认情况下,PHP 将不会启用。需要将以下几行添加到位于 /usr/local/etc/apache24 中的 Apache 配置文件中以使其生效:

<FilesMatch "\.php$">
    SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch "\.phps$">
    SetHandler application/x-httpd-php-source
</FilesMatch>

此外,还需要更新配置文件中的 DirectoryIndex,并且需要重新启动或重新加载 Apache 以使更改生效。

还可以使用 pkg 安装许多 PHP 功能的支持。例如,要安装对 XML 或 SSL 的支持,请安装其相应的端口:

# pkg install php74-xml php74-openssl

与之前一样,即使只是安装了模块,也需要重新加载 Apache 配置以使更改生效。

要执行优雅重启以重新加载配置,请执行以下命令:

# apachectl graceful

安装完成后,有两种方法可以获取已安装的 PHP 支持模块和构建的环境信息。第一种方法是安装完整的 PHP 二进制文件并运行以下命令以获取信息:

# pkg install php74
# php -i | less

有必要将输出传递给分页器,例如 moreless,以便更容易地消化大量输出。

最后,要对 PHP 的全局配置进行任何更改,都可以使用安装到 /usr/local/etc/php.ini 中的文档齐全的文件。在安装时,此文件将不存在,因为有两个版本可供选择,一个是 php.ini-development,另一个是 php.ini-production。这些是帮助管理员部署的起点。

32.9.3.4. HTTP2 支持

使用 pkg 安装端口时,默认情况下包含对 HTTP2 协议的 Apache 支持。新版本的 HTTP 包含了许多比以前版本改进的功能,包括利用单个连接到网站,减少 TCP 连接的整体往返次数。此外,数据包头数据被压缩,并且 HTTP2 默认情况下需要加密。

当 Apache 配置为仅使用 HTTP2 时,Web 浏览器将需要安全、加密的 HTTPS 连接。当 Apache 配置为使用这两个版本时,如果连接过程中出现任何问题,HTTP1.1 将被视为备用选项。

虽然此更改确实需要管理员进行更改,但这些更改是积极的,并且相当于为每个人提供了一个更安全的互联网。这些更改仅适用于当前未实施 SSL 和 TLS 的站点。

此配置依赖于前面的部分,包括 TLS 支持。建议在继续执行此配置之前,先按照这些说明进行操作。

首先通过取消 /usr/local/etc/apache24/httpd.conf 中行的注释来启用 http2 模块,并将 mpm_prefork 模块替换为 mpm_event,因为前者不支持 HTTP2。

LoadModule http2_module libexec/apache24/mod_http2.so
LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so

还有一个单独的 mod_http2 端口可用。它的存在是为了比捆绑的 apache24 端口中安装的模块更快地提供安全性和错误修复。它不是 HTTP2 支持所必需的,但可用。安装后,应在 Apache 配置中使用 mod_h2.so 代替 mod_http2.so

有两种方法可以在 Apache 中实现 HTTP2;一种方法是全局应用于系统上的所有站点和每个虚拟主机。要全局启用 HTTP2,请在 ServerName 指令下添加以下行:

Protocols h2 http/1.1

要启用明文 HTTP2,请在 httpd.conf 中使用 h2h2chttp/1.1。

这里有 h2c 将允许明文 HTTP2 数据在系统上传输,但不建议这样做。此外,在此处使用 http/1.1 将允许在系统需要时回退到协议的 HTTP1.1 版本。

要为单个虚拟主机启用 HTTP2,请在 httpd.confhttpd-ssl.conf 中的 VirtualHost 指令内添加相同的行。

使用 apachectlreload 命令重新加载配置,并在访问其中一个托管页面后,使用以下任一方法测试配置:

# grep "HTTP/2.0" /var/log/httpd-access.log

这应该返回类似以下内容的结果:

192.168.1.205 - - [18/Oct/2020:18:34:36 -0400] "GET / HTTP/2.0" 304 -
192.0.2.205 - - [18/Oct/2020:19:19:57 -0400] "GET / HTTP/2.0" 304 -
192.0.0.205 - - [18/Oct/2020:19:20:52 -0400] "GET / HTTP/2.0" 304 -
192.0.2.205 - - [18/Oct/2020:19:23:10 -0400] "GET / HTTP/2.0" 304 -

另一种方法是使用 Web 浏览器的内置站点调试器或 tcpdump;但是,使用这两种方法超出了本文档的范围。

通过使用 mod_proxy_http2.so 模块支持 HTTP2 反向代理连接。配置 ProxyPass 或 RewriteRules [P] 语句时,应使用 h2:// 进行连接。

32.9.4. 动态网站

除了 mod_perl 和 mod_php 之外,还可以使用其他语言来创建动态 Web 内容。这些包括 Django 和 Ruby on Rails。

32.9.4.1. Django

Django 是一个获得 BSD 许可的框架,旨在让开发人员能够快速编写高性能、优雅的 Web 应用程序。它提供了一个对象关系映射器,以便将数据类型开发为 Python 对象。为这些对象提供了一个丰富的动态数据库访问 API,而开发人员无需编写 SQL。它还提供了一个可扩展的模板系统,以便将应用程序的逻辑与 HTML 表示分离。

Django 依赖于 mod_python 和 SQL 数据库引擎。在 FreeBSD 中,www/py-django 端口会自动安装 mod_python 并支持 PostgreSQL、MySQL 或 SQLite 数据库,默认情况下为 SQLite。要更改数据库引擎,请在 /usr/ports/www/py-django 中键入 make config,然后安装端口。

安装 Django 后,应用程序将需要一个项目目录以及 Apache 配置才能使用嵌入式 Python 解释器。此解释器用于为站点上的特定 URL 调用应用程序。

要将 Apache 配置为将特定 URL 的请求传递给 Web 应用程序,请将以下内容添加到 httpd.conf 中,并指定项目目录的完整路径:

<Location "/">
    SetHandler python-program
    PythonPath "['/dir/to/the/django/packages/'] + sys.path"
    PythonHandler django.core.handlers.modpython
    SetEnv DJANGO_SETTINGS_MODULE mysite.settings
    PythonAutoReload On
    PythonDebug On
</Location>

有关如何使用 Django 的更多信息,请参阅 https://docs.django.ac.cn

32.9.4.2. Ruby on Rails

Ruby on Rails 是另一个开源 Web 框架,它提供了一个完整的开发堆栈。它经过优化,可以提高 Web 开发人员的生产力,并能够快速编写功能强大的应用程序。在 FreeBSD 上,可以使用 www/rubygem-rails 软件包或端口进行安装。

有关如何使用 Ruby on Rails 的更多信息,请参阅 https://guides.rubyonrails.net.cn

32.10. 文件传输协议 (FTP)

文件传输协议 (FTP) 为用户提供了一种简单的方法来传输到 FTP 服务器和从 FTP 服务器传输文件。FreeBSD 在基本系统中包含 FTP 服务器软件 ftpd。

FreeBSD 提供了多个配置文件来控制对 FTP 服务器的访问。本节总结了这些文件。有关内置 FTP 服务器的更多详细信息,请参阅 ftpd(8)

32.10.1. 配置

最重要的配置步骤是确定哪些帐户将被允许访问 FTP 服务器。FreeBSD 系统具有一些系统帐户,这些帐户不应允许 FTP 访问。不允许任何 FTP 访问的用户列表可以在 /etc/ftpusers 中找到。默认情况下,它包含系统帐户。可以添加不应允许访问 FTP 的其他用户。

在某些情况下,可能希望限制某些用户的访问权限,而不会完全阻止他们使用 FTP。这可以通过创建 /etc/ftpchroot 来实现,如 ftpchroot(5) 中所述。此文件列出了受 FTP 访问限制的用户和组。

要启用对服务器的匿名 FTP 访问,请在 FreeBSD 系统上创建一个名为 ftp 的用户。然后,用户将能够使用 ftpanonymous 作为用户名登录到 FTP 服务器。当提示输入密码时,将接受任何输入,但按照惯例,应使用电子邮件地址作为密码。当匿名用户登录时,FTP 服务器将调用 chroot(2),以将访问权限限制在 ftp 用户的主目录中。

可以创建两个文本文件来指定要显示给 FTP 客户端的欢迎消息。在用户到达登录提示符之前,将显示 /etc/ftpwelcome 的内容。登录成功后,将显示 /etc/ftpmotd 的内容。请注意,此文件的路径相对于登录环境,因此对于匿名用户,将显示 ~ftp/etc/ftpmotd 的内容。

FTP 服务器配置完成后,在 /etc/rc.conf 中设置相应的变量,以便在系统启动时启动该服务。

ftpd_enable="YES"

立即启动服务

# service ftpd start

通过输入以下命令测试与 FTP 服务器的连接:

% ftp localhost

ftpd 守护进程使用 syslog(3) 记录消息。默认情况下,系统日志守护进程会将与 FTP 相关的消息写入 /var/log/xferlog。可以通过修改 /etc/syslog.conf 中的以下行来更改 FTP 日志的位置。

ftp.info      /var/log/xferlog

请注意运行匿名 FTP 服务器可能带来的潜在问题。尤其要仔细考虑是否允许匿名用户上传文件。FTP 站点可能会成为未经许可的商业软件交易论坛,甚至出现更糟的情况。如果需要匿名 FTP 上传功能,请验证权限,确保这些文件在管理员审查之前无法被其他匿名用户读取。

32.11. Microsoft® Windows® 客户端的文件和打印服务 (Samba)

Samba 是一款流行的开源软件包,它使用 SMB/CIFS 协议提供文件和打印服务。此协议内置于 Microsoft® Windows® 系统中。可以通过安装 Samba 客户端库将其添加到非 Microsoft® Windows® 系统中。该协议允许客户端访问共享数据和打印机。这些共享可以映射为本地磁盘驱动器,共享打印机也可以像本地打印机一样使用。

在 FreeBSD 上,可以使用 net/samba416 端口或软件包安装 Samba 客户端库。客户端使 FreeBSD 系统能够访问 Microsoft® Windows® 网络中的 SMB/CIFS 共享。

FreeBSD 系统还可以通过安装相同的 net/samba416 端口或软件包配置为充当 Samba 服务器。这允许管理员在 FreeBSD 系统上创建 SMB/CIFS 共享,运行 Microsoft® Windows® 或 Samba 客户端库的客户端可以访问这些共享。

32.11.1. 服务器配置

Samba 在 /usr/local/etc/smb4.conf 中进行配置。在使用 Samba 之前必须创建此文件。

这是一个简单的 smb4.conf 示例,用于与工作组中的 Windows® 客户端共享目录和打印机。对于涉及 LDAP 或 Active Directory 的更复杂的设置,最好使用 samba-tool(8) 创建初始的 smb4.conf

[global]
workgroup = WORKGROUP
server string = Samba Server Version %v
netbios name = ExampleMachine
wins support = Yes
security = user
passdb backend = tdbsam

# Example: share /usr/src accessible only to 'developer' user
[src]
path = /usr/src
valid users = developer
writable  = yes
browsable = yes
read only = no
guest ok = no
public = no
create mask = 0666
directory mask = 0755

32.11.1.1. 全局设置

描述网络的设置添加到 /usr/local/etc/smb4.conf 中。

workgroup

要服务的 workgroup 的名称。

netbios name

Samba 服务器的 NetBIOS 名称。默认情况下,它与主机 DNS 名称的第一个组件相同。

server string

将在 net view 和一些其他试图显示服务器描述性文本的网络工具的输出中显示的字符串。

wins support

Samba 是否充当 WINS 服务器。不要在网络上的多个服务器上启用 WINS 支持。

32.11.1.2. 安全设置

/usr/local/etc/smb4.conf 中最重要的设置是安全模型和后端密码格式。这些指令控制选项

security

如果客户端使用的用户名与其在 FreeBSD 机器上的用户名相同,则应使用用户级安全。security = user 是默认的安全策略,它要求客户端先登录才能访问共享资源。

请参阅 smb.conf(5) 以了解 security 选项的其他受支持设置。

passdb backend

Samba 有几种不同的后端身份验证模型。客户端可以使用 LDAP、NIS+、SQL 数据库或修改后的密码文件进行身份验证。推荐的身份验证方法 tdbsam 非常适合简单的网络,这里对此进行了介绍。对于更大或更复杂的网络,推荐使用 ldapsamsmbpasswd 以前是默认值,现在已过时。

32.11.1.3. Samba 用户

必须将 FreeBSD 用户帐户映射到 SambaSAMAccount 数据库,以便 Windows® 客户端访问共享。使用 pdbedit(8) 映射现有的 FreeBSD 用户帐户。

# pdbedit -a -u username

本节仅介绍了最常用的设置。有关可用的配置选项的更多信息,请参阅 Samba 官方 Wiki

32.11.2. 启动 Samba

要在启动时启用 Samba,请将以下行添加到 /etc/rc.conf

samba_server_enable="YES"

立即启动 Samba

# service samba_server start
Performing sanity check on Samba configuration: OK
Starting nmbd.
Starting smbd.

Samba 由三个独立的守护进程组成。samba_enable 将启动 nmbd 和 smbd 守护进程。如果还需要 winbind 名称解析,请设置

winbindd_enable="YES"

可以通过输入以下命令随时停止 Samba:

# service samba_server stop

Samba 是一款复杂的软件套件,其功能允许与 Microsoft® Windows® 网络广泛集成。有关此处描述的基本配置之外的功能的更多信息,请参阅 https://www.samba.org

32.12. 使用 NTP 进行时钟同步

随着时间的推移,计算机的时钟容易发生漂移。这是有问题的,因为许多网络服务都需要网络上的计算机共享相同的时间。准确的时间对于确保文件时间戳保持一致也是必需的。网络时间协议 (NTP) 是一种在网络中提供时钟准确性的方法。

FreeBSD 包含 ntpd(8),可以将其配置为查询其他 NTP 服务器以同步该机器上的时钟或为网络中的其他计算机提供时间服务。

本节介绍如何在 FreeBSD 上配置 ntpd。可以在 HTML 格式的 /usr/share/doc/ntp/ 中找到更多文档。

32.12.1. NTP 配置

在 FreeBSD 上,可以使用内置的 ntpd 来同步系统的时钟。ntpd 使用 rc.conf(5) 变量和 /etc/ntp.conf 进行配置,如下节所述。

ntpd 使用 UDP 数据包与其网络对等方通信。您机器与其 NTP 对等方之间的任何防火墙都必须配置为允许在端口 123 上进出 UDP 数据包。

32.12.1.1. /etc/ntp.conf 文件

ntpd 读取 /etc/ntp.conf 以确定要查询哪些 NTP 服务器。建议选择多个 NTP 服务器,以防其中一个服务器无法访问或其时钟不可靠。当 ntpd 接收响应时,它会优先选择可靠的服务器而不是不太可靠的服务器。可以查询的服务器可以是本地网络上的服务器、ISP 提供的服务器或从 公开可访问的 NTP 服务器在线列表 中选择的服务器。在选择公共 NTP 服务器时,请选择一个地理位置靠近的服务器并查看其使用策略。pool 配置关键字从服务器池中选择一个或多个服务器。公开可访问的 NTP 池在线列表 可供使用,按地理区域组织。此外,FreeBSD 提供了一个项目赞助的池,0.freebsd.pool.ntp.org

示例 3. /etc/ntp.conf 示例

这是一个简单的 ntp.conf 文件示例。可以安全地按原样使用;它包含在公开可访问的网络连接上操作的推荐 restrict 选项。

# Disallow ntpq control/query access.  Allow peers to be added only
# based on pool and server statements in this file.
restrict default limited kod nomodify notrap noquery nopeer
restrict source  limited kod nomodify notrap noquery

# Allow unrestricted access from localhost for queries and control.
restrict 127.0.0.1
restrict ::1

# Add a specific server.
server ntplocal.example.com iburst

# Add FreeBSD pool servers until 3-6 good servers are available.
tos minclock 3 maxclock 6
pool 0.freebsd.pool.ntp.org iburst

# Use a local leap-seconds file.
leapfile "/var/db/ntpd.leap-seconds.list"

此文件的格式在 ntp.conf(5) 中进行了描述。以下说明提供了上面示例文件中使用的关键字的简要概述。

默认情况下,任何网络主机都可以访问 NTP 服务器。restrict 关键字控制哪些系统可以访问服务器。支持多个 restrict 条目,每个条目都细化了前面语句中给出的限制。示例中显示的值授予本地系统完全查询和控制访问权限,同时仅允许远程系统查询时间。有关更多详细信息,请参阅 ntp.conf(5) 的“访问控制支持”小节。

server 关键字指定要查询的单个服务器。该文件可以包含多个 server 关键字,每行列出一个服务器。pool 关键字指定一个服务器池。ntpd 会根据需要从该池中添加一个或多个服务器,以达到使用 tos minclock 值指定的对等方数量。iburst 关键字指示 ntpd 在首次建立连接时与服务器执行八次快速数据包交换,以帮助快速同步系统时间。

leapfile 关键字指定包含闰秒信息的文件的位置。该文件由 periodic(8) 自动更新。此关键字指定的文件位置必须与 /etc/rc.confntp_db_leapfile 变量中设置的位置匹配。

32.12.1.2. /etc/rc.conf 中的 NTP 条目

设置 ntpd_enable=YES 以在启动时启动 ntpd。将 ntpd_enable=YES 添加到 /etc/rc.conf 后,可以通过输入以下命令立即启动 ntpd,而无需重新启动系统:

# service ntpd start

仅需设置 ntpd_enable 即可使用 ntpd。可以根据需要设置下面列出的 rc.conf 变量。

设置 ntpd_sync_on_start=YES 以允许 ntpd 在启动时一次性将时钟调整任意数量。通常,如果时钟偏差超过 1000 秒,ntpd 会记录错误消息并退出。此选项在没有电池供电的实时时钟的系统上特别有用。

设置ntpd_oomprotect=YES 以保护ntpd守护进程不被系统尝试从内存不足 (OOM) 条件中恢复时杀死。

设置ntpd_config= 为备用ntp.conf文件的位置。

设置ntpd_flags= 以包含任何其他所需的ntpd标志,但避免使用由/etc/rc.d/ntpd内部管理的这些标志。

  • -p(pid文件位置)

  • -c(改为设置ntpd_config=

32.12.1.3. ntpd和非特权ntpd用户

FreeBSD上的ntpd可以作为非特权用户启动并运行。这样做需要mac_ntpd(4)策略模块。/etc/rc.d/ntpd启动脚本首先检查NTP配置。如果可能,它会加载mac_ntpd模块,然后以非特权用户ntpd(用户ID 123)启动ntpd。为了避免文件和目录访问问题,启动脚本不会在配置包含任何与文件相关的选项时自动以ntpd启动ntpd。

ntpd_flags中存在以下任何内容都需要手动配置,如下所述,才能以ntpd用户身份运行。

  • -f 或 --driftfile

  • -i 或 --jaildir

  • -k 或 --keyfile

  • -l 或 --logfile

  • -s 或 --statsdir

ntp.conf中存在以下任何关键字都需要手动配置,如下所述,才能以ntpd用户身份运行。

  • crypto

  • driftfile

  • key

  • logdir

  • statsdir

要手动配置ntpd以以用户ntpd身份运行,您必须

  • 确保ntpd用户可以访问配置中指定的所有文件和目录。

  • 安排加载mac_ntpd模块或将其编译到内核中。有关详细信息,请参阅mac_ntpd(4)

  • /etc/rc.conf中设置ntpd_user="ntpd"

32.12.2. 使用NTP连接PPP

ntpd不需要永久连接到Internet即可正常工作。但是,如果配置了PPP连接以按需拨出,则应防止NTP流量触发拨出或保持连接活动。这可以通过/etc/ppp/ppp.conf中的filter指令进行配置。例如

set filter dial 0 deny udp src eq 123
# Prevent NTP traffic from initiating dial out
set filter dial 1 permit 0 0
set filter alive 0 deny udp src eq 123
# Prevent incoming NTP traffic from keeping the connection open
set filter alive 1 deny udp dst eq 123
# Prevent outgoing NTP traffic from keeping the connection open
set filter alive 2 permit 0/0 0/0

有关更多详细信息,请参阅ppp(8)中的PACKET FILTERING部分以及/usr/share/examples/ppp/中的示例。

一些互联网接入提供商会阻止低编号端口,从而阻止NTP正常工作,因为回复永远无法到达机器。

32.13. iSCSI发起器和目标配置

iSCSI是一种通过网络共享存储的方式。与在文件系统级别工作的NFS不同,iSCSI在块设备级别工作。

在iSCSI术语中,共享存储的系统称为目标。存储可以是物理磁盘,也可以是表示多个磁盘或物理磁盘一部分的区域。例如,如果磁盘格式化为ZFS,则可以创建zvol用作iSCSI存储。

访问iSCSI存储的客户端称为发起器。对于发起器,通过iSCSI提供的存储显示为一个原始的、未格式化的磁盘,称为LUN。磁盘的设备节点出现在/dev/中,并且必须单独格式化和挂载。

FreeBSD提供了一个本地的、基于内核的iSCSI目标和发起器。本节介绍如何将FreeBSD系统配置为目标或发起器。

32.13.1. 配置iSCSI目标

要配置iSCSI目标,请创建/etc/ctl.conf配置文件,在/etc/rc.conf中添加一行以确保ctld(8)守护进程在启动时自动启动,然后启动守护进程。

以下是一个简单的/etc/ctl.conf配置文件示例。有关此文件可用选项的完整说明,请参阅ctl.conf(5)

portal-group pg0 {
	discovery-auth-group no-authentication
	listen 0.0.0.0
	listen [::]
}

target iqn.2012-06.com.example:target0 {
	auth-group no-authentication
	portal-group pg0

	lun 0 {
		path /data/target0-0
		size 4G
	}
}

第一个条目定义了pg0门户组。门户组定义了ctld(8)守护进程将在其上侦听的网络地址。discovery-auth-group no-authentication条目表示允许任何发起器在没有身份验证的情况下执行iSCSI目标发现。第三行和第四行配置ctld(8)在默认端口3260上的所有IPv4(listen 0.0.0.0)和IPv6(listen [::])地址上侦听。

无需定义门户组,因为有一个名为default的内置门户组。在这种情况下,defaultpg0之间的区别在于,使用default时,始终拒绝目标发现,而使用pg0时,始终允许目标发现。

第二个条目定义了一个目标。目标有两个可能的含义:一台提供iSCSI服务的机器或一组命名的LUN。此示例使用后一种含义,其中iqn.2012-06.com.example:target0是目标名称。此目标名称适用于测试目的。对于实际使用,请将com.example更改为真实的域名,反转。2012-06表示获取该域名控制权的年份和月份,target0可以是任何值。可以在此配置文件中定义任意数量的目标。

auth-group no-authentication行允许所有发起器连接到指定的目标,并且portal-group pg0使目标可以通过pg0门户组访问。

下一节定义了LUN。对于发起器,每个LUN将显示为一个单独的磁盘设备。可以为每个目标定义多个LUN。每个LUN都由一个数字标识,其中LUN 0是强制性的。path /data/target0-0行定义了文件或zvol支持LUN的完整路径。该路径必须在启动ctld(8)之前存在。第二行是可选的,并指定LUN的大小。

接下来,要确保在启动时启动ctld(8)守护进程,请将此行添加到/etc/rc.conf

ctld_enable="YES"

要立即启动ctld(8),请运行以下命令

# service ctld start

ctld(8)守护进程启动时,它会读取/etc/ctl.conf。如果在守护进程启动后编辑了此文件,请使用此命令使更改立即生效

# service ctld reload

32.13.1.1. 身份验证

前面的示例本质上是不安全的,因为它不使用任何身份验证,授予任何人对所有目标的完全访问权限。要要求使用用户名和密码访问目标,请按如下方式修改配置

auth-group ag0 {
	chap username1 secretsecret
	chap username2 anothersecret
}

portal-group pg0 {
	discovery-auth-group no-authentication
	listen 0.0.0.0
	listen [::]
}

target iqn.2012-06.com.example:target0 {
	auth-group ag0
	portal-group pg0
	lun 0 {
		path /data/target0-0
		size 4G
	}
}

auth-group部分定义了用户名和密码对。尝试连接到iqn.2012-06.com.example:target0的发起器必须首先指定定义的用户名和密码。但是,目标发现仍然允许在没有身份验证的情况下进行。要要求目标发现身份验证,请将discovery-auth-group设置为定义的auth-group名称,而不是no-authentication

通常为每个发起器定义一个导出的目标。作为上述语法的简写,可以在目标条目中直接指定用户名和密码

target iqn.2012-06.com.example:target0 {
	portal-group pg0
	chap username1 secretsecret

	lun 0 {
		path /data/target0-0
		size 4G
	}
}

32.13.2. 配置iSCSI发起器

本节中描述的iSCSI发起器从FreeBSD 10.0-RELEASE开始受支持。要使用旧版本中提供的iSCSI发起器,请参阅iscontrol(8)

iSCSI发起器要求iscsid(8)守护进程正在运行。此守护进程不使用配置文件。要使其在启动时自动启动,请将此行添加到/etc/rc.conf

iscsid_enable="YES"

要立即启动iscsid(8),请运行以下命令

# service iscsid start

可以使用或不使用/etc/iscsi.conf配置文件连接到目标。本节演示了两种类型的连接。

32.13.2.1. 不使用配置文件连接到目标

要将发起器连接到单个目标,请指定门户的IP地址和目标的名称

# iscsictl -A -p 10.10.10.10 -t iqn.2012-06.com.example:target0

要验证连接是否成功,请在不带任何参数的情况下运行iscsictl。输出应类似于以下内容

Target name                                     Target portal   State
iqn.2012-06.com.example:target0                 10.10.10.10     Connected: da0

在此示例中,iSCSI会话已成功建立,/dev/da0表示连接的LUN。如果iqn.2012-06.com.example:target0目标导出多个LUN,则输出的该部分将显示多个设备节点

Connected: da0 da1 da2.

任何错误都将在输出中报告,以及系统日志中。例如,此消息通常表示iscsid(8)守护进程未运行

Target name                                     Target portal   State
iqn.2012-06.com.example:target0                 10.10.10.10     Waiting for iscsid(8)

以下消息表明网络问题,例如错误的IP地址或端口

Target name                                     Target portal   State
iqn.2012-06.com.example:target0                 10.10.10.11     Connection refused

此消息表示指定的目标名称错误

Target name                                     Target portal   State
iqn.2012-06.com.example:target0                 10.10.10.10     Not found

此消息表示目标需要身份验证

Target name                                     Target portal   State
iqn.2012-06.com.example:target0                 10.10.10.10     Authentication failed

要指定CHAP用户名和密码,请使用此语法

# iscsictl -A -p 10.10.10.10 -t iqn.2012-06.com.example:target0 -u user -s secretsecret

32.13.2.2. 使用配置文件连接到目标

要使用配置文件连接,请创建/etc/iscsi.conf,其内容如下所示

t0 {
	TargetAddress   = 10.10.10.10
	TargetName      = iqn.2012-06.com.example:target0
	AuthMethod      = CHAP
	chapIName       = user
	chapSecret      = secretsecret
}

t0指定配置文件部分的昵称。发起器将使用它来指定要使用的配置。其他行指定连接期间要使用的参数。TargetAddressTargetName是强制性的,而其他选项是可选的。在此示例中,显示了CHAP用户名和密码。

要连接到定义的目标,请指定昵称

# iscsictl -An t0

或者,要连接到配置文件中定义的所有目标,请使用

# iscsictl -Aa

要使发起器自动连接到/etc/iscsi.conf中的所有目标,请将以下内容添加到/etc/rc.conf

iscsictl_enable="YES"
iscsictl_flags="-Aa"

上次修改时间:2024年9月20日,作者:Fernando Apesteguía