第三十二章 网络服务器

32.1. 简介

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

到本章结束时,读者将知道:

• 如何管理inetd守护进程。 • 如何设置网络文件系统(Network File System,NFS)。 • 如何设置网络信息服务器(Network Information Server,NIS)以集中和共享用户帐户。 • 如何将FreeBSD设置为LDAP服务器或客户端 • 如何使用DHCP设置自动网络设置。 • 如何设置域名服务器(DNS)。 • 如何设置Apache HTTP服务器。 • 如何设置文件传输协议(FTP)服务器。 • 如何使用Samba为Windows®客户端设置文件和打印服务器。 • 如何同步时间和日期,并使用网络时间协议(NTP)设置时间服务器。 • 如何设置iSCSI。

本章假设您具备以下基本知识:

/etc/rc 脚本。 • 网络术语。 • 安装其他第三方软件(【4. 安装应用程序:软件包和端口】)。

32.2. inetd超级服务器

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

主要是,inetd 用于生成其他守护进程,但内部处理了几个琐碎的协议,如 chargenauthtimeechodiscarddaytime

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

32.2.1. 配置文件

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

保存编辑后,通过编辑 /etc/rc.confinetd 配置为在系统启动时启动:

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

一旦启动了 inetd ,每当对 /etc/inetd.conf 进行修改时都需要通知它:

例41. 重新加载inetd配置文件

通常,除了删除 # 之外,不需要编辑应用程序的默认条目。在某些情况下,编辑默认条目可能是合适的。

例如,这是IPv4上 ftpd(8) 的默认条目:

条目中的七列如下:

其中:

32.2.2. 命令行选项

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

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

可用的速率限制选项包括:

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

32.2.3. 安全考虑

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

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

32.3. 网络文件系统(NFS)

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

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

• 否则会在每个客户端上重复的数据可以保存在一个位置,并由网络上的客户端访问。 • 几个客户端可能需要访问 /usr/ports/distfiles 目录。共享该目录可以快速访问源文件,而无需将其下载到每个客户端。 • 在大型网络上,配置一个存储所有用户主目录的中央NFS服务器通常更方便。用户可以在网络上的任何地方登录到客户端,并访问他们的主目录。 • 简化了NFS导出的管理。例如,只有一个文件系统必须设置安全或备份策略。 • 可移动媒体存储设备可供网络上的其他机器使用。这减少了整个网络中的设备数量,并提供了一个集中位置来管理其安全性。从集中式安装介质在多台机器上安装软件通常更方便。

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

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

守护进程描述
nfsd为来自NFS客户端的请求提供服务的NFS守护进程。
mountd执行从nfsd收到的请求的NFS装载守护进程。
rpcbind此守护进程允许NFS客户端发现NFS服务器正在使用哪个端口。

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

32.3.1. 配置服务器

NFS服务器将共享的文件系统在 /etc/exports 中指定。此文件中的每一行都指定了要导出的文件系统、哪些客户端可以访问该文件系统以及任何访问选项。向此文件添加条目时,每个导出的文件系统、其属性和允许的主机必须出现在一行中。如果条目中没有列出客户端,则网络上的任何客户端都可以挂载该文件系统。

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

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

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

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

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

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

对于这种情况,正确的格式是使用一个条目:

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

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

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

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

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

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

32.3.2. 配置客户端

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

然后,在每个NFS客户端上运行以下命令:

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

/home 中的文件和目录现在可以在 client/mnt 目录中使用。

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

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

32.3.3. 锁定

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

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

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

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

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

autofs(5) 虚拟文件系统通过 automount(8) 挂载到指定的挂载点上,通常在引导过程中调用。

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

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

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

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

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

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

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

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

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

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

32.4. 网络信息系统(NIS)

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

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

FreeBSD使用NIS协议的版本2。

32.4.1. NIS条款和流程

下表总结了NIS使用的术语和重要过程:

术语描述
NIS domain nameNIS服务器和客户端共享一个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共享。master.passwd、group和hosts文件通常通过NIS共享。每当客户端上的进程需要通常在本地这些文件中找到的信息时,它都会向绑定到的NIS服务器发出查询。

32.4.3. 规划考虑因素

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

实验室的配置如下:

机器名称IP地址机器角色
ellington10.0.0.2NIS master
coltrane10.0.0.3NIS slave
basie10.0.0.4Faculty workstation
bird10.0.0.5Client machine
cli[1-11]10.0.0.[6-17]Other client machines

如果这是第一次开发NIS方案,则应提前进行彻底规划。无论网络规模如何,在规划过程中都需要做出几个决定。

32.4.3.1. 选择NIS域名

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

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

但是,一些非FreeBSD操作系统要求NIS域名与Internet域名相同。如果网络上的一台或多台计算机有此限制,则必须将Internet域名用作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 中添加以下行即可启用:

① 此行将NIS域名设置为 test-domain ② 这将在系统启动时自动启动NIS服务器进程。 ③ 这将启用 rpc.yppasswdd(8) 守护进程,以便用户可以从客户端计算机更改其NIS密码。

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

通过在 /etc/rc.conf 中添加以下附加行,可以强制既是客户端的服务器绑定到特定的服务器:

① 这也允许运行客户端内容。 ② 此行将NIS域名设置为 test-domain 并绑定到其自身。

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

32.4.4.1. 初始化NIS映射

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

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

完成此任务后,初始化NIS映射。FreeBSD包含 ypinet(8) 脚本来实现这一点。在为主服务器生成映射时,请包含 -m 并指定NIS域名:

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

32.4.4.2. 添加新用户

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

也可以使用 adduser jsmith 替代 pw useradd smith 添加用户。

32.4.5. 设置NIS从属服务器

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

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

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

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

32.4.6. 设置NIS客户端

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

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

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

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

    此行配置客户端,为任何人提供NIS服务器中的有效帐户。密码映射客户端上的帐户。有很多方法可以通过修改此行来配置NIS客户端。【32.4.8. 使用网络组】中描述了一种方法。有关更详细的阅读,请参阅O'Reilly Media出版的《管理NFS和NIS》一书。

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

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

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

32.4.7. NIS安全

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

如果 ypserv(8) 从与这些规则之一匹配的地址接收到请求,它将正常处理该请求。如果地址与规则不匹配,则将忽略请求并记录警告消息。如果安全网络不存在, ypserv 将允许来自任何主机的连接。

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

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

使用TCP Wrapper会增加NIS服务器的延迟。额外的延迟可能长到足以导致客户端程序超时,特别是在NIS服务器速度较慢的繁忙网络中。如果一个或多个客户端出现延迟,请将这些客户端转换为NIS从属服务器,并强制它们绑定到自己。

32.4.7.1. 禁止某些用户

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

为了防止指定用户登录到系统,即使他们存在于NIS数据库中,也可以使用 vipw 在客户端的 /etc/master.passwd 末尾添加带有正确冒号数的 -username ,其中 username 是禁止登录的用户的用户名。被阻止用户的行必须在允许NIS用户的 + 行之前。在这个例子中,bill 被禁止登录 basie

32.4.8. 使用网络组

禁止指定用户登录到单个系统在较大的网络上变得无法跟踪,并迅速失去NIS的主要好处:集中管理。

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

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

其他用户:

用户名描述
alpha,betaIT部门员工
charlie,deltaIT部门学徒(apprentices)
echo,foxtrott,golf,...员工
able,baker,....实习生

附加系统:

机器名称描述
war,death,famine,pollution只有IT员工才允许登录这些服务器。
pride,greed,envy,wrath,lust,slothIT部门的所有成员都可以登录到这些服务器上。
one,tow,three,four,...员工使用的普通工作站。
trashcan一台没有任何关键数据的非常旧的机器。即使是实习生也可以使用这个系统。

当使用网络组配置此场景时,每个用户都被分配到一个或多个网络组,然后允许或禁止网络组的所有成员登录。添加新计算机时,必须为所有网络组定义登录限制。添加新用户时,必须将帐户添加到一个或多个网络组中。如果NIS设置经过仔细规划,则只需要修改一个中央配置文件来授予或拒绝对计算机的访问。

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

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

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

  1. 表示用户的其他字段有效的主机名。如果未指定主机名,则该条目在所有主机上都有效。
  2. 属于此网络组的帐户的名称。
  3. 帐户的NIS域。帐户可以从其他NIS域导入到网络组中。

如果一个组包含多个用户,请用空格分隔每个用户。此外,每个字段可能包含通配符。详见 netgroup(5)

不应使用长度超过8个字符的网络组名称。这些名称区分大小写,使用大写字母作为网络组名称是区分用户、机器和网络组名称的一种简单方法。

一些非FreeBSD NIS客户端无法处理包含超过15个条目的网络组。通过创建几个用户数不超过15个的子网组和一个由子网组组成的真实网组,可以绕过这一限制,如本例所示:

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

要激活和分发新的NIS映射,请执行以下操作:

这将生成三个NIS映射netgroup、netgroup.byhost和netgroup.byuser。使用 ypcat(1) 的map键选项检查新NIS映射是否可用:

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

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

换成:

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

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

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

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

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

工作站的相应行为:

NIS支持从其他网络组创建网络组,如果有关用户访问的策略发生变化,这可能会很有用。一种可能是创建基于角色的网络组。例如,可以创建一个名为 BIGSRV 的网络组来定义重要服务器的登录限制,另一个称为 SMALLSRV 的网络组用于不太重要的服务器,第三个网络组称为 USERBOX 用于工作站。这些网络组中的每一个都包含允许登录到这些机器上的网络组。NIS“netgroup”映射的新条目如下:

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

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

一旦在所有机器上完成此任务,就不再需要再次修改 /etc/master.passwd 的本地版本。所有进一步的更改都可以通过修改NIS映射来处理。以下是此场景下可能的网络组映射示例:

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

32.4.9. 密码格式

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

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

在这个例子中,系统使用DES格式进行密码散列。其他可能的值包括Blowfish的 blf 、MD5的 md5 、SHA-256和SHA-512的 sha256sha512 。有关更多信息和系统上可用内容的最新列表,请参阅 crypt(3) 手册页。

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

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

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

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

32.5.1. LDAP术语和结构

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

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

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

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

32.5.2. 配置LDAP服务器

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

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

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

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

提示的条目可能是通用的,但 Common Name 除外。此条目必须与系统主机名不同。如果这将是一个自签名证书,请在主机名前添加CA作为证书颁发机构的前缀。

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

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

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

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

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

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

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

第二部分是关于后端模块的,可以配置如下:

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

接下来,前端配置部分:

另一节专门介绍配置后端,以后访问OpenLDAP服务器配置的唯一方法是作为全局超级用户。

默认管理员用户名为 cn=config 。在shell中键入 slappasswd ,选择密码并在 olcRootPW 中使用其哈希值。如果现在不指定此选项,在导入 slapd.ldif 之前,以后任何人都无法修改全局配置部分。

最后一节是关于数据库后端的:

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

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

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

导入配置数据库:

启动 slapd 守护进程:

选项 -d 可用于调试,如 slapd(8) 中所述。要验证服务器是否正在运行和工作,请执行以下操作:

服务器必须仍然是可信的。如果以前从未这样做过,请遵循这些说明。安装OpenSSL软件包或端口:

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

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

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

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

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

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

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

然后,应用修改:

当被询问时,请提供在配置后端部分中选择的密码。用户名不是必需的:在这里, cn=config 表示要修改的数据库部分的DN。或者,使用 ldapmodify 删除数据库的一行,使用 ldapdelete 删除整个条目。

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

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

这只是服务器的配置。同一台机器还可以承载LDAP客户端,并具有自己的单独配置。

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

动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)允许系统连接到网络,以便为该网络上的通信分配必要的地址信息。FreeBSD包括OpenBSD版本的 dhclient ,客户端使用它来获取地址信息。FreeBSD不安装DHCP服务器,但FreeBSD端口集合中有几个服务器。DHCP协议在 RFC 2131 中有详细描述。信息资源也可在 https://isc.org/downloads/dhcp/ 上获得。

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

32.6.1. 配置DHCP客户端

FreeBSD安装程序中包含DHCP客户端支持,这使得配置新安装的系统以自动从现有的DHCP服务器接收其网络地址信息变得容易。有关网络配置的示例,请参阅【28. 帐户、时区、服务和强化】。

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

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

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

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

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

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

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

DHCP客户端使用以下文件:

32.6.2. 安装和配置DHCP服务器

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

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

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

① 此选项指定将提供给客户端的默认搜索域。有关更多信息,请参阅 resolv.conf(5) ② 此选项指定客户端应使用的以逗号分隔的DNS服务器列表。它们可以按其完全限定域名(Fully Qualified Domain Names,FQDN)列出,如示例所示,也可以按其IP地址列出。 ③ 将提供给客户端的子网掩码。 ④ 默认租约到期时间(秒)。客户端可以配置为覆盖此值。 ⑤ 租约允许的最大时间长度(秒)。如果客户要求延长租约,仍将签发租约,但租约仅在 max-lease-time 内有效。 ⑥ 默认值 none 禁用动态DNS更新。将此更改为 interim 配置,可配置DHCP服务器在发出租约时更新DNS服务器,以便DNS服务器知道哪些IP地址与网络中的哪些计算机相关联。除非DNS服务器已配置为支持动态DNS,否则不要更改默认设置。 ⑦ 此行创建了一个可用IP地址池,这些地址保留用于分配给DHCP客户端。地址范围必须对上一行中指定的网络或子网有效。 ⑧ 声明对开头 { 括号之前指定的网络或子网有效的默认网关。 ⑨ 指定客户端的硬件MAC地址,以便DHCP服务器在客户端发出请求时能够识别该客户端。 ⑩ 指定此主机应始终具有相同的IP地址。使用主机名是正确的,因为DHCP服务器将在返回租约信息之前解析主机名。

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

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

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

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

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

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

32.7. 域名系统(DNS)

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

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

术语定义
Forward DNS将主机名映射到IP地址。
Origin指特定区域文件中涵盖的域。
Resolver一种系统进程,机器通过该进程向名称服务器查询区域信息。
Reverse DNS将IP地址映射到主机名。
Root zoneInternet区域层次结构的开始。所有区域都位于根区域下,类似于文件系统中的所有文件都位于根目录下。
Zone由同一机构管理的单个域、子域或DNS的一部分。

区域示例:

. 这是文档中通常引用根区域的方式。 org. 是根区域下的顶级域名(TLD)。 example.org.org. 顶级域名下的一个区域。 1.168.192.in-addr.arpa 是一个引用 192.168.1.* IP地址空间下所有IP地址的区域。

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

32.7.1. 运行名称服务器的原因

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

在以下情况下需要权威名称服务器:

• 人们希望向世界提供DNS信息,权威地回复查询。 • 注册了一个域名,如 example.org ,需要为其下的主机名分配IP地址。 • IP地址块需要反向DNS条目(IP到主机名)。 • 称为从属服务器的备份或第二名称服务器将回复查询。

在以下情况下需要缓存名称服务器:

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

当查询 www.FreeBSD.org 时,解析器通常会查询上行ISP的名称服务器,并检索回复。使用本地缓存DNS服务器,缓存DNS服务器只需向外界进行一次查询。其他查询不必在本地网络之外进行,因为信息是在本地缓存的。

32.7.2. DNS服务器配置

FreeBSD基础系统中提供了Unbound。默认情况下,它将仅向本地计算机提供DNS解析。虽然基本系统包可以配置为在本地计算机之外提供解析服务,但建议通过从FreeBSD端口集合安装Unbound来满足这些要求。

要启用Unbound,请在 /etc/rc.conf 中添加以下内容:

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

确认每个名称服务器支持DNSSEC后,启动Unbound:

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

32.7.3. 权威名称服务器配置

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

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

零配置网络(有时称为 Zeroconf )是一组简化网络配置的技术。Zeroconf的主要部分是:

• 链路本地寻址,提供数字网络地址的自动分配。 • 多播DNS(Multicast DNS,mDNS)提供主机名的自动分发和解析。 • 基于DNS的服务发现(DNS-Based Service Discovery,DNS-SD),提供服务实例的自动发现。

32.8.1. 配置和启动Avahi

zeroconf的一个流行实现是 Avahi 。Avahi可以通过以下命令进行安装和配置:

32.9. Apache HTTP 服务器

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

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

32.9.1. 配置和启动Apache

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

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

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

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

如果apachectl没有报告配置错误,请立即启动 httpd

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

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

32.9.2. 虚拟主机

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

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

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

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

32.9.3. Apache 模块

Apache使用模块来增强基本服务器提供的功能。参见 http://httpd.apache.org/docs/current/mod/ 获取可用模块的完整列表和配置详细信息。

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

32.9.3.1. SSL支持

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

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

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

为了在Apache中完全支持SSL,httpd.conf中还必须取消注释以下行:

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

32.9.3.2. mod_perl

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

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

32.9.3.3. mod_php

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

通过安装适当的端口,可以添加对PHP for Apache和用该语言编写的任何其他功能的支持。

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

将显示一个列表,其中包括它们提供的版本和其他功能。这些组件是完全模块化的,这意味着通过安装适当的端口可以启用功能。要安装Apache的PHP 7.4版本,请发出以下命令:

如果需要安装任何依赖包,它们也会被安装。

默认情况下,PHP不会启用。需要将以下行添加到位于 /usr/local/etc/apache24 中的Apache配置文件中,才能使其处于活动状态:

此外,配置文件中的 DirectoryIndex 也需要更新,Apache需要重新启动或重新加载才能使更改生效。

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

如前所述,Apache配置需要重新加载才能使更改生效,即使在只是模块安装的情况下也是如此。

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

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

有必要将输出传递给寻呼机,例如或多或少地更容易消化输出量。

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

32.9.3.4. HTTP2支持

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

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

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

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

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

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

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

要为单个VirtualHosts启用HTTP2,请在httpd.conf或httpd-ssl.conf的VirtualHost指令中添加相同的行。

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

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

另一种方法是使用web浏览器的内置站点调试器或 tcpdump ;然而,使用任何一种方法都超出了本文的范围。

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

32.9.4. 动态网站

除了 mod_perlmod_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 中添加以下内容,指定项目目录的完整路径:

参见 https://docs.djangoproject.com 了解更多关于如何使用Django的信息。

32.9.4.2. Ruby on Rails

Ruby on Rails是另一个提供完整开发栈的开源web框架。它经过优化,使web开发人员更有效率,能够快速编写功能强大的应用程序。在FreeBSD上,可以使用 www/rubygem-rails 包或端口安装它。

参见 http://guides.rubyonrails.org 有关如何使用Ruby on Rails的更多信息。

32.10. 文件传输协议(FTP)

文件传输协议(File Transfer Protocol,FTP)为用户提供了一种在FTP服务器之间传输文件的简单方法。FreeBSD在基础系统中包含FTP服务器软件ftpd。

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

32.10.1. 配置

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

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

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

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

配置FTP服务器后,在 /etc/rc.conf 中设置适当的变量,以便在启动过程中启动服务:

要立即启动服务,请执行以下操作:

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

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

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

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

在FreeBSD上,Samba客户端库可以使用 net/samba416 端口或软件包安装。客户端允许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的更复杂的设置,使用 sambatool(8) 创建初始 smb4.conf 更容易。

32.11.1.1 全局设置

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

32.11.1.2. 安全设置

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

32.11.1.3. Samba用户

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

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

32.11.2. 启动Samba

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

立即启动Samba:

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

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

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

32.12. NTP时钟同步

随着时间的推移,计算机的时钟很容易漂移。这是有问题的,因为许多网络服务要求网络上的计算机共享相同的准确时间。还需要准确的时间来确保文件时间戳保持一致。网络时间协议(Network Time Protocol,NTP)是在网络中提供时钟精度的一种方式。

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

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

32.12.1. NTP配置

在FreeBSD上,内置的 ntpd 可用于同步系统的时钟。ntpd 是使用 rc.conf(5) 变量和 /etc/ntp.conf 配置的,详见以下部分。

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

32.12.1.1. /etc/ntp.conf 文件

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

例43. 示例/etc/ntp.conf

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

ntp.conf(5) 中描述了此文件的格式。下面的描述提供了上面示例文件中使用的关键字的快速概述。

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

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,而无需重新启动系统:

只有 ntpd_enable 必须设置为使用ntpd。下面列出的 rc.conf 变量也可以根据需要进行设置。

ntpd_sync_on_start=YES 设置为允许ntpd在启动时将时钟步进任意量。通常,如果时钟关闭超过1000秒,ntpd将记录错误消息并退出。此选项在没有电池支持的实时时钟的系统上特别有用。

设置 ntpd_omparotect=YES ,以保护ntpd守护进程不会被试图从内存不足(Out Of Memory,OOM)状态中恢复的系统杀死。

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

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

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 or --driftfile • -i or --jaildir • -k or --keyfile • -l or --logfile • -s or --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 不需要永久连接到互联网才能正常运行。但是,如果PPP连接配置为按需拨出,则应防止NTP流量触发拨出或保持连接活动。这可以在 /etc/ppp/ppp.conf 中使用过滤器指令进行配置。例如:

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

32.13. iSCSI启动器和目标配置

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

在iSCSI术语中,共享存储的系统称为 target(目标)。存储器可以是物理磁盘,也可以是表示多个磁盘或物理磁盘一部分的区域。例如,如果磁盘使用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)

第一个条目定义了 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 行定义了备份LUN的文件或zvol的完整路径。在启动 ctld(8) 之前,该路径必须存在。第二行是可选的,指定LUN的大小。

接下来,为了确保 ctld(8) 守护进程在启动时启动,请在 /etc/rc.conf 中添加以下行:

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

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

32.13.1.1. 认证

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

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

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

32.13.2. 配置iSCSI启动器

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

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

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

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

要将启动器连接到单个目标,请指定入口的IP地址和目标的名称:

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

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

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

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

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

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

要指定CHAP用户名和密码,请使用以下语法:

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

要使用配置文件进行连接,请创建 /etc/iscsi.conf ,内容如下:

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

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

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

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