diff options
Diffstat (limited to 'zh_CN.GB2312/books')
-rw-r--r-- | zh_CN.GB2312/books/handbook/network-servers/chapter.sgml | 2624 |
1 files changed, 2504 insertions, 120 deletions
diff --git a/zh_CN.GB2312/books/handbook/network-servers/chapter.sgml b/zh_CN.GB2312/books/handbook/network-servers/chapter.sgml index cfea8fff63..5c63c4c2eb 100644 --- a/zh_CN.GB2312/books/handbook/network-servers/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/network-servers/chapter.sgml @@ -2,7 +2,7 @@ The FreeBSD Documentation Project The FreeBSD Simplified Chinese Project - Original Revision: 1.31 + Original Revision: 1.64 $FreeBSD$ --> @@ -32,8 +32,7 @@ <itemizedlist> <listitem> - <para>如何管理<application>inetd</application> - 。</para> + <para>如何管理 <application>inetd</application>。</para> </listitem> <listitem> @@ -105,22 +104,25 @@ <sect2 id="network-inetd-overview"> <title>总览</title> - <para>&man.inetd.8; 被称为<quote>Internet - Super-Server</quote>, 因为它管理几个守护程序的链接。提供网络 - 服务的程序被称为守护进程。<application>inetd</application> - 作为一个为其他服务的管理服务器,当一个被<application>inetd</application> - 收到后,它将决定连接将前往哪个程序,然后拉起对应的守护进程, - 并将socket转交过去。 比起来将所有守护进程以stand-alone模式 - 运行,运行单个<application>inetd</application>实例可以降低 - 系统开销。</para> - - <para>一般说来,<application>inetd</application> 被用来拉起 - 其他守护进程,不过有些细碎的协议被直接接管,比如<application>chargen</application>, - <application>auth</application>,和 - <application>daytime</application>。</para> - - <para>这一部分将通过命令行选项和<filename>/etc/inetd.conf</filename> - 文件来介绍配置<application>inetd</application> 的基础知识。</para> + <para>&man.inetd.8; 被叫做 <quote>超级 Internet + 服务器</quote>, 因为它能够管理许多不同的服务程序的连接。 + 当 <application>inetd</application> 接到连入的连接时, + 它就会判断连接所需要启动的服务程序, 并运行它们, + 然后将连接转交给这些服务程序 (在启动程序时, + 这些程序的标准输入、输出和错误输出描述符被替换为连入的连接)。 + 与一个一个地运行单独的服务程序相比, + 只启动一个 <application>inetd</application> 能够削减平均的系统负荷。</para> + + <para>一般说来, <application>inetd</application> + 会被用来启动其他服务程序。 但一些非常简单的协议, + 例如 <application>chargen</application>、 + <application>auth</application>, 以及 + <application>daytime</application>, + 则会由它自行处理。</para> + + <para>这一节将介绍如何通过命令行选项, 以及配置文件 + <filename>/etc/inetd.conf</filename> 来配置 + <application>inetd</application> 的一些基本知识。</para> </sect2> <sect2 id="network-inetd-settings"> @@ -307,7 +309,7 @@ server-program-arguments</programlisting> <listitem> <para>下列之一:</para> - <informaltable frame="none"> + <informaltable frame="none" pgwide="1"> <tgroup cols="2"> <thead> <row> @@ -516,16 +518,16 @@ server-program-arguments</programlisting> <sect2> <title><acronym>NFS</acronym>是如何工作的</title> - <para><acronym>NFS</acronym>至少有两个主要部分:一台服务器和一 - 台(或者更多)客户机。客户机远程访问存放在服务器上的数据。为了 - 正常工作,一些进程需要被配置并运行。</para> + <para><acronym>NFS</acronym> 至少包括两个主要的部分: 一台服务器, + 以及至少一台客户机, 客户机远程地访问保存在服务器上的数据。 + 要让这一切运转起来, 需要配置并运行几个程序。</para> - <note><para>在 &os; 5.X上面,<application>portmap</application> - 被<application>rpcbind</application>替换了。而且,在&os; 5.X上面, - the user is required to replace every instance of - <application>portmap</application> with - <application>rpcbind</application> in the forthcoming - examples。</para></note> + <note><para>在 &os; 4.X 中, <application>portmap</application> + 工具将发挥后续版本中 + <application>rpcbind</application> 工具的作用。 因此, + 在 &os; 4.X 中, 您可能需要把后续例子中的 + <application>rpcbind</application> 改成 + <application>portmap</application> 以便使用。</para></note> <para>服务器必须运行以下服务:</para> <indexterm> @@ -533,11 +535,14 @@ server-program-arguments</programlisting> <secondary>server</secondary> </indexterm> <indexterm> - <primary>file server </primary> - <secondary>unix clients </secondary> + <primary>文件服务器</primary> + <secondary>UNIX 客户机</secondary> </indexterm> <indexterm> + <primary><application>rpcbind</application></primary> + </indexterm> + <indexterm> <primary><application>portmap</application></primary> </indexterm> <indexterm> @@ -569,9 +574,9 @@ server-program-arguments</programlisting> <entry><acronym>NFS</acronym>挂载服务,处理&man.nfsd.8;递交过来的请求。</entry> </row> <row> - <entry><application>portmap</application></entry> - <entry> portmap服务允许 - <acronym>NFS</acronym>客户端查看<acronym>NFS</acronym>服务在用的端口。</entry> + <entry><application>rpcbind</application></entry> + <entry> 此服务允许 + <acronym>NFS</acronym> 客户程序查询正在被 <acronym>NFS</acronym> 服务使用的端口。</entry> </row> </tbody> </tgroup> @@ -598,7 +603,7 @@ server-program-arguments</programlisting> <para>在<acronym>NFS</acronym>服务器这端,确认<filename>/etc/rc.conf</filename> 文件里头以下开关都配上了:</para> - <programlisting>portmap_enable="YES" + <programlisting>rpcbind_enable="YES" nfs_server_enable="YES" mountd_flags="-r"</programlisting> @@ -657,7 +662,8 @@ mountd_flags="-r"</programlisting> 一个远程主机每次只能对应一个文件系统。而且只能有一个默认入口。比如,假设 <filename>/usr</filename> 是独立的文件系统。这个 <filename>/etc/exports</filename> 就是无效的:</para> - <programlisting>/usr/src client + <programlisting># Invalid when /usr is one file system +/usr/src client /usr/ports client</programlisting> <para>一个文件系统,<filename>/usr</filename>, 有两行指定输出到同一主机, @@ -695,7 +701,7 @@ mountd_flags="-r"</programlisting> <para>在 <acronym>NFS</acronym> 服务器端:</para> - <screen>&prompt.root; <userinput>portmap</userinput> + <screen>&prompt.root; <userinput>rpcbind</userinput> &prompt.root; <userinput>nfsd -u -t -n 4</userinput> &prompt.root; <userinput>mountd -r</userinput></screen> @@ -770,9 +776,71 @@ mountd_flags="-r"</programlisting> </author> </authorgroup> </sect2info> - <title>使用 <application>amd</application> 自动挂载 ** 翻译进行中 **</title> + <title>通过 <application>amd</application> 自动地挂接</title> + + <indexterm><primary>amd</primary></indexterm> + <indexterm><primary>自动挂接服务</primary></indexterm> + + <para>&man.amd.8; (自动挂接服务) 能够自动地在访问时挂接远程的文件系统。 + 如果文件系统在一段时间之内没有活动, 则会被 + <application>amd</application> 自动卸下。 通过使用 + <application>amd</application>, 能够提供一个持久挂接以外的选择, + 而后者往往需要列入 + <filename>/etc/fstab</filename>。</para> + + <para><application>amd</application> 通过将自己以 NFS 服务器的形式, + 附加到 <filename>/host</filename> 和 + <filename>/net</filename> 目录上来工作。 + 当访问这些目录中的文件时, <application>amd</application> + 将查找相应的远程挂接点, 并自动地挂接。 + <filename>/net</filename> 用于挂接远程 IP 地址上导出的文件系统, + 而 <filename>/host</filename> 则用于挂接远程主机名上的文件系统。</para> + + <para>访问 + <filename>/host/foobar/usr</filename> 中的文件, 相当于告诉 + <application>amd</application> 尝试挂接在主机 + <hostid>foobar</hostid> 上导出的 + <filename>/usr</filename>。</para> + + <example> + <title>通过 <application>amd</application> 来挂接导出的文件系统</title> + + <para>您可以通过使用 <command>showmount</command> + 命令来查看远程主机上导出的文件系统。 例如, + 要查看 <hostid>foobar</hostid> 上导出的文件系统, 可以用:</para> + + <screen>&prompt.user; <userinput>showmount -e foobar</userinput> +Exports list on foobar: +/usr 10.10.10.0 +/a 10.10.10.0 +&prompt.user; <userinput>cd /host/foobar/usr</userinput></screen> + </example> + + <para>如同在前面例子中所看到的, <command>showmount</command> 显示了导出的 + <filename>/usr</filename>。 当进入 + <filename>/host/foobar/usr</filename> 这个目录时, <application>amd</application> + 将尝试解析主机名 <hostid>foobar</hostid> + 并自动地挂接需要的文件系统导出。</para> + + <para><application>amd</application> 可以通过启动脚本来启动, 方法是在 + <filename>/etc/rc.conf</filename> 中加入:</para> + + <programlisting>amd_enable="YES"</programlisting> + + <para>除此之外, 还可以给 + <application>amd</application> 通过 + <varname>amd_flags</varname> 选项来传递额外的参数。 默认情况下, + <varname>amd_flags</varname> 为:</para> - <para></para> + <programlisting>amd_flags="-a /.amd_mnt -l syslog /host /etc/amd.map /net /etc/amd.map"</programlisting> + + <para><filename>/etc/amd.map</filename> + 文件定义了挂接导出文件系统时所使用的默认选项。 + <filename>/etc/amd.conf</filename> 文件, 则定义了更多关于 + <application>amd</application> 的高级功能选项。</para> + + <para>请参考 &man.amd.8; 和 &man.amd.conf.5; 联机手册, + 以了解进一步的情况。</para> </sect2> <sect2 id="network-nfs-integration"> @@ -785,9 +853,95 @@ mountd_flags="-r"</programlisting> </author> </authorgroup> </sect2info> - <title>Problems Integrating with Other Systems ** 翻译进行中 **</title> - - <para></para> + <title>与其他系统集成时的常见问题</title> + + <para>某些特定的 ISA PC 系统上的以太网适配器上有一些限制, + 这些限制可能会导致严重的网络问题, 特别是与 NFS 配合使用时。 + 这些问题并非 FreeBSD 所特有的, 但 FreeBSD 系统会受到这些问题的影响。</para> + + <para>这样的问题, 几乎总是在当 (FreeBSD) PC 系统与高性能的工作站, + 例如 Silicon Graphics, Inc., 和 Sun Microsystems, Inc. 的工作站联网时发生。 + NFS 挂接能够正常工作, 而且一些操作也可能成功, + 但服务器会很快变得对客户机不太理会, + 虽然对其他客户机的请求仍然能够正常处理。 + 这种情况通常发生在客户端, 无论它是一个 FreeBSD 系统或是终端。 + 在许多系统上, 一旦发生了这样的问题, 通常没办法正常地关闭客户机。 + 唯一的办法通常是让终端复位, 因为这一 NFS 状况没有办法被解决。</para> + + <para>尽管 <quote>正确的</quote> 解决办法, 是为 + FreeBSD 系统配备一块高性能的、 适用的以太网适配器, + 然而也有办法绕过问题并得到相对满意的结果。 + 如果 FreeBSD 系统是 + <emphasis>服务器</emphasis>, 则在客户机挂接时, 应该指定 + <option>-w=1024</option>。 如果 + FreeBSD 系统是 <emphasis>客户机</emphasis>, + 则应加入 <option>-r=1024</option> 参数。 这些选项可以通过在对应的 + <filename>fstab</filename> 的第四个字段加入, + 以便让客户机能够自动地挂接, 或者通过 &man.mount.8; 的 + <option>-o</option> 参数在手工挂接时指定。</para> + + <para>还需要注意的是另一个问题, 有时会被误认为是和上面一样的问题。 + 这个问题多见于 NFS 服务器和客户机在不同的网络上时。 如果是这种情况, 一定要 + <emphasis>确定</emphasis> 您的路由器确实把必需的 <acronym>UDP</acronym> + 信息路由到了目的地, 否则您将什么也做不了。</para> + + <para>下面的例子中, <hostid>fastws</hostid> 是主机 + (接口) 的名字, 它是一台高性能的终端, 而 + <hostid>freebox</hostid> 是另一台主机 (接口) 的名字, + 它是一个使用较低性能的以太网适配器的 FreeBSD 系统。 同时, + <filename>/sharedfs</filename> 将被导出成为 NFS + 文件系统 (参见 &man.exports.5;), 而 + <filename>/project</filename> + 将是客户机上挂接这一导出文件系统的挂接点。 所有的应用场景中, + 请注意附加选项, 例如 <option>hard</option> 或 + <option>soft</option> 以及 <option>bg</option> 可能是您的应用所需要的。</para> + + <para>关于 FreeBSD 系统 (<hostid>freebox</hostid>) + 作为客户机的示范 <filename>/etc/fstab</filename> 文件, 见于 + <hostid>freebox</hostid> 之上:</para> + + <programlisting>fastws:/sharedfs /project nfs rw,-r=1024 0 0</programlisting> + + <para>在 <hostid>freebox</hostid> 上手工挂接:</para> + + <screen>&prompt.root; <userinput>mount -t nfs -o -r=1024 fastws:/sharedfs /project</userinput></screen> + + <para>以 FreeBSD 系统作为服务器的例子, 是 <hostid>fastws</hostid> 上的 + <filename>/etc/fstab</filename>:</para> + + <programlisting>freebox:/sharedfs /project nfs rw,-w=1024 0 0</programlisting> + + <para>在 <hostid>fastws</hostid> 上手工挂接的命令是:</para> + + <screen>&prompt.root; <userinput>mount -t nfs -o -w=1024 freebox:/sharedfs /project</userinput></screen> + + <para>几乎所有的 16-位 以太网控制器, + 都能够在没有上述读写尺寸限制的情况下正常工作。</para> + + <para>对于那些关心到底是什么问题的人, 下面是失败如何发生的解释, + 同时这也说明了为什么这是一个无法恢复的问题。 典型情况下, + NFS 会使用一个 <quote>块</quote> 为单位进行操作, 其尺寸是 + 8 K (虽然它可能会将操作分成更小尺寸的分片)。 + 由于最大的以太网包尺寸大约是 1500 字节, + 因此 NFS <quote>块</quote> 会分成多个以太网包, + 虽然在更高层的代码看来它仍然是一个完整的单元, + 并在接收方重新组装, 作为一个整体来 + <emphasis>确认</emphasis>。 高性能的工作站, + 可以将构成 NFS 单元的包迅速发出, 其节奏会快到标准允许的最大限度。 + 在容量较小的卡上, 后来的包会冲掉同一单元内的较早的包, + 因而整个单元无法被重建或确认。 其结果是, + 工作站将超时并重试, 但仍然是完整的 8 K 单元, + 这一过程将无休止地重复下去。</para> + + <para>如果将单元尺寸限制在以太网包尺寸之下, + 我们就能够确保每一个以太网包都能够被独立地接收和确认, + 从而避免了上面的死锁情形。</para> + + <para>溢出在高性能工作站将数据库投向 PC 系统时仍会发生, + 但在更好的网卡上, 能够保证这类溢出不会在每一个 NFS + <quote>单元</quote> 上都发生。 当出现溢出时, + 被影响的单元被重传, 因而此时有很大的机会它将被正确接收、 + 重组, 并确认。</para> </sect2> </sect1> @@ -812,7 +966,752 @@ mountd_flags="-r"</programlisting> </author> </authorgroup> </sect1info> - <title>Network Information System (NIS/YP) ** 翻译进行中 **</title> + <title>网络信息服务 (NIS/YP)</title> + + <sect2> + <title>它是什么?</title> + <indexterm><primary>NIS</primary></indexterm> + <indexterm><primary>Solaris</primary></indexterm> + <indexterm><primary>HP-UX</primary></indexterm> + <indexterm><primary>AIX</primary></indexterm> + <indexterm><primary>Linux</primary></indexterm> + <indexterm><primary>NetBSD</primary></indexterm> + <indexterm><primary>OpenBSD</primary></indexterm> + + <para><acronym role="Network Information System">NIS</acronym>, + 表示网络信息服务 (Network Information Services), + 最初由 Sun Microsystems 开发, 用于 &unix; + (最初是 &sunos;) 系统的集中管理。 目前, + 它基本上已经成为了业界标准; 所有主流的类 &unix; 系统 + (&solaris;, HP-UX, &aix;, Linux, NetBSD, OpenBSD, FreeBSD, + 等等) 都支持 <acronym role="Network Information + System">NIS</acronym>。</para> + + <indexterm><primary>黄页 (yellow pages)</primary><see>NIS</see></indexterm> + + <para><acronym role="Network Information System">NIS</acronym> + 也就是人们所熟知的黄页(Yellow Pages), 但由于商标的问题, + Sun 将其改名为现在的名字。 旧的术语 (以及 yp), + 仍然经常可以看到, 并被广泛使用。</para> + + <indexterm> + <primary>NIS</primary> + <secondary>域</secondary> + </indexterm> + + <para>这是一个基于 RPC 的客户机/服务器系统, + 它允许在一个 NIS 域中的一组机器共享一系列配置文件。 + 这样, 系统管理员就可以配置只包含最基本配置数据的 NIS 客户机系统, + 并在单点上增加、 删除或修改配置数据。</para> + + <indexterm><primary>Windows NT</primary></indexterm> + + <para>尽管实现的内部细节截然不同, 这和 &windowsnt; 域系统非常类似, + 以至于可以将两者的基本功能相互类比。</para> + </sect2> + + <sect2> + <title>您应该知道的术语和进程</title> + + <para>有一系列术语和重要的用户进程将在您在 FreeBSD + 上实现 NIS 时用到, 无论是在创建 + NIS 服务器, 或作为 NIS 客户机:</para> + + <indexterm> + <primary><application>rpcbind</application></primary> + </indexterm> + <indexterm> + <primary><application>portmap</application></primary> + </indexterm> + + <informaltable frame="none" pgwide="1"> + <tgroup cols="2"> + <colspec colwidth="1*"> + <colspec colwidth="3*"> + + <thead> + <row> + <entry>术语</entry> + <entry>说明</entry> + </row> + </thead> + <tbody> + <row> + <entry>NIS 域名</entry> + + <entry>NIS 主服务器和所有其客户机 + (包括从服务器) 会使用同一 NIS 域名。 + 和 &windowsnt; 域名类似, NIS 域名与 + <acronym>DNS</acronym> 无关。</entry> + </row> + <row> + <entry><application>rpcbind</application></entry> + + <entry>必须运行这个程序, 才能够启用 + <acronym>RPC</acronym> (远程过程调用, NIS + 用到的一种网络协议)。 如果没有运行 + <application>rpcbind</application>, + 则没有办法运行 NIS 服务器, + 或作为 NIS 客户机 (对于 &os; 4.X, + <application>portmap</application> 完成 + <application>rpcbind</application> 的功能)。</entry> + </row> + <row> + <entry><application>ypbind</application></entry> + + <entry><quote>绑定(bind)</quote> NIS 客户机到它的 NIS + 服务器上。 这样, 它将从系统中获取 NIS 域名, + 并使用 <acronym>RPC</acronym> 连接到服务器上。 + <application>ypbind</application> 是 NIS 环境中, + 客户机-服务器通讯的核心; 如果客户机上的 + <application>ypbind</application> 死掉的话, 它将无法访问 + NIS 服务器。</entry> + </row> + <row> + <entry><application>ypserv</application></entry> + <entry>只应在 NIS 服务器上运行它; 这是 NIS 的服务器进程。 + 如果 &man.ypserv.8; 死掉的话, + 则服务器将不再具有响应 NIS 请求的能力 (此时, + 如果有从服务器的话, 则会接管操作)。 有一些 NIS + 的实现 (但不是 FreeBSD 的这个) 的客户机上, + 如果之前用过一个服务器, 而那台服务器死掉的话, + 并不尝试重新连接到另一个服务器。 通常, + 发生这种情况时, 唯一的办法就是重新启动服务器进程 + (或者, 甚至重新启动服务器) 或客户机上的 + <application>ypbind</application> 进程。 + </entry> + </row> + <row> + <entry><application>rpc.yppasswdd</application></entry> + <entry>另一个只应在 + NIS 主服务器上运行的进程; 这是一个服务程序, + 其作用是允许 NIS 客户机改变它们的 NIS 口令。 + 如果没有运行这个服务, 用户将必须登录到 NIS + 主服务器上, 并在那里修改口令。</entry> + </row> + </tbody> + </tgroup> + </informaltable> + <!-- XXX Missing: rpc.ypxfrd (not important, though) May only run + on the master --> + + </sect2> + + <sect2> + <title>它是如何工作的?</title> + + <para>在 NIS 环境中, 有三种类型的主机: + 主服务器, 从服务器, 以及客户机。 + 服务器的作用是充当主机配置信息的中央数据库。 + 主服务器上保存着这些信息的权威副本, + 而从服务器则是保存这些信息的冗余副本。 + 客户机依赖于服务器向它们提供这些信息。</para> + + <para>许多文件的信息可以通过这种方式来共享。 + 通常情况下, <filename>master.passwd</filename>、 + <filename>group</filename>, 以及 <filename>hosts</filename> + 是通过 NIS 分发的。 无论什么时候, + 如果客户机上的某个进程请求这些本应在本地的文件中的资料的时候, + 它都会向所绑定的 NIS 服务器发出请求, 而不使用本地的版本。</para> + + <sect3> + <title>机器类型</title> + + <itemizedlist> + <indexterm> + <primary>NIS</primary> + <secondary>主服务器</secondary> + </indexterm> + <listitem> + <para>一台 <emphasis>NIS 主服务器</emphasis>。 + 这台服务器, 和 &windowsnt; 域控制器类似, + 会维护所有 NIS 客户机所使用的文件。 <filename>passwd</filename>, + <filename>group</filename>, 以及许多其他 NIS + 客户机所使用的文件, 都被存放到主服务器上。</para> + + <note><para>可以将一台 NIS 主服务器用在多个 NIS 域中。 + 然而, 本书不打算对这种配置进行介绍, + 因为这种配置, 通常只出现在小规模的 NIS 环境中。</para></note> + </listitem> + <indexterm> + <primary>NIS</primary> + <secondary>从服务器</secondary> + </indexterm> + <listitem> + <para><emphasis>NIS 从服务器</emphasis>。 这一概念, + 与 &windowsnt; 的备份域控制器类似。 NIS 从服务器, + 用于维护 NIS 主服务器的数据文件副本。 + NIS 从服务器提供了一种冗余, + 这在许多重要的环境中是必需的。 此外, + 它也帮助减轻了主服务器的负荷: NIS + 客户机总是挂接到最先响应它们的 NIS 服务器上, + 而这也包括来自从服务器的响应。</para> + </listitem> + <indexterm> + <primary>NIS</primary> + <secondary>客户机</secondary> + </indexterm> + <listitem> + <para><emphasis>NIS 客户机</emphasis>。 NIS 客户机, + 和多数 &windowsnt; 工作站类似, 通过 + NIS 服务器 (或对于 &windowsnt; 工作站, 则是 + &windowsnt; 域控制器) 来完成登录时的身份验证过程。</para> + </listitem> + </itemizedlist> + </sect3> + </sect2> + + <sect2> + <title>使用 NIS/YP</title> + + <para>这一节将通过实例介绍如何配置 NIS 环境。</para> + + <note><para>这一节假定您正运行的是 + FreeBSD 3.3 或更高版本。 这里给出的方法 + <emphasis>或许</emphasis> 可以在 FreeBSD + 3.0 以上的其他版本上使用, 但不保证。</para></note> + + + <sect3> + <title>规划</title> + + <para>假定您正在管理大学中的一个小型实验室。 在这个实验室中, + 有 15 台 FreeBSD 机器, 目前尚没有集中的管理点; + 每一台机器上有自己的 + <filename>/etc/passwd</filename> 和 + <filename>/etc/master.passwd</filename>。 + 这些文件通过人工干预的方法来保持与其他机器上版本的同步; + 目前, 如果您在实验室中增加一个用户, 将不得不在所有 15 + 台机器上手工执行 <command>adduser</command> 命令。 + 毋庸置疑, 这一现状必须改变, + 因此您决定将整个实验室转为使用 NIS, + 并使用两台机器作为服务器。</para> + + <para>因此, 实验室的配置应该是这样的:</para> + + <informaltable frame="none" pgwide="1"> + <tgroup cols="3"> + <thead> + <row> + <entry>机器名</entry> + <entry>IP 地址</entry> + <entry>机器的角色</entry> + </row> + </thead> + <tbody> + <row> + <entry><hostid>ellington</hostid></entry> + <entry><hostid role="ipaddr">10.0.0.2</hostid></entry> + <entry>NIS 主服务器</entry> + </row> + <row> + <entry><hostid>coltrane</hostid></entry> + <entry><hostid role="ipaddr">10.0.0.3</hostid></entry> + <entry>NIS 从服务器</entry> + </row> + <row> + <entry><hostid>basie</hostid></entry> + <entry><hostid role="ipaddr">10.0.0.4</hostid></entry> + <entry>教员工作站</entry> + </row> + <row> + <entry><hostid>bird</hostid></entry> + <entry><hostid role="ipaddr">10.0.0.5</hostid></entry> + <entry>客户机</entry> + </row> + <row> + <entry><hostid>cli[1-11]</hostid></entry> + <entry><hostid role="ipaddr">10.0.0.[6-17]</hostid></entry> + <entry>其他客户机</entry> + </row> + </tbody> + </tgroup> + </informaltable> + + <para>如果您是首次配置 NIS, 仔细思考如何进行规划就十分重要。 + 无论您的网络的大小如何, 都必须进行几个决策。</para> + + <sect4> + <title>选择 NIS 域名</title> + + <indexterm> + <primary>NIS</primary> + <secondary>域名</secondary> + </indexterm> + <para>这可能不是您过去使用的 <quote>域名(domainname)</quote>. + 它的规范的叫法, 应该是 + <quote>NIS 域名</quote>。 当客户机广播对此信息的请求时, + 它会将 NIS 域的名字作为请求的一部分发出。 这样, + 统一网络上的多个服务器, 就能够知道谁应该回应请求。 + 您可以把 NIS 域名想象成以某种方式相关的一组主机的名字。</para> + + <para>一些机构会选择使用它们的 Internet + 域名来作为 NIS 域名。 并不推荐这样做, 因为在调试网络问题时, + 这可能会导致不必要的困扰。 NIS 域名应该是在您网络上唯一的, + 并且有助于了解它所描述的到底是哪一组机器。 例如对于 Acme + 公司的美工部门, 可以考虑使用 + <quote>acme-art</quote> 这样的 NIS 域名。 + 在这个例子中, 您使用的域名是 + <literal>test-domain</literal>。</para> + + <indexterm><primary>SunOS</primary></indexterm> + <para>然而, 某些操作系统 (最著名的是 &sunos;) + 会使用其 NIS 域名作为 Internet 域名。 + 如果您的网络上存在包含这类限制的机器, 就 + <emphasis>必须</emphasis> 使用 Internet 域名来作为您的 NIS 域名。</para> + </sect4> + + <sect4> + <title>服务器的物理要求</title> + + <para>选择 NIS 服务器时, 需要时刻牢记一些东西。 + NIS 的一个不太好的特性就是其客户机对于服务器的依赖程度。 + 如果客户机无法与其 NIS 域的服务器联系, + 则这台机器通常会陷于不可用的状态。 缺少用户和组信息, + 会使绝大多数系统进入短暂的冻结状态。 基于这样的考虑, + 您需要选择一台不经常重新启动, 或用于开发的机器来承担其责任。 + 如果您的网络不太忙, 也可以使用运行着其他服务的机器来安放 NIS + 服务, 只是需要注意, 一旦 NIS 服务器不可用, 则 + <emphasis>所有</emphasis> 的 NIS 客户机都会受到影响。</para> + </sect4> + </sect3> + + <sect3> + <title>NIS 服务器</title> + + <para>所有的 NIS 信息的正规版本, + 都被保存在一台单独的称作 NIS 主服务器的机器上。 + 用于保存这些信息的数据库, 称为 NIS 映射(map)。 + 在 FreeBSD 中, 这些映射被保存在 + <filename>/var/yp/[domainname]</filename> 里, 其中 + <filename>[domainname]</filename> 是提供服务的 NIS + 域的名字。 一台 NIS 服务器, 可以同时支持多个域, + 因此可以建立很多这样的目录, 所支撑一个域对应一个。 + 每一个域都会有一组独立的映射。</para> + + <para>NIS 主和从服务器, 通过 <command>ypserv</command> + 服务程序来处理所有的 NIS 请求。 + <command>ypserv</command> 有责任接收来自 NIS 客户机的请求, + 翻译请求的域, 并将名字映射为相关的数据库文件的路径, + 然后将来自数据库的数据传回客户机。</para> + + <sect4> + <title>配置 NIS 主服务器</title> + <indexterm> + <primary>NIS</primary> + <secondary>服务器配置</secondary> + </indexterm> + <para>配置主 NIS 服务器相对而言十分的简单, + 而其具体步骤则取决于您的需要。 FreeBSD + 提供了一步到位的 NIS 支持。 您需要做的全部事情, 只是在 + <filename>/etc/rc.conf</filename> 中加入一些配置, + 其他工作会由 FreeBSD 完成。</para> + + <procedure> + <step> + <para><programlisting>nisdomainname="test-domain"</programlisting> + 这一行将在网络启动 (例如重新启动) 时, 把 NIS 域名配置为 + <literal>test-domain</literal>。</para> + </step> + <step> + <para><programlisting>nis_server_enable="YES"</programlisting> + 这将要求 FreeBSD 在网络子系统启动之后立即启动 + NIS 服务进程。</para> + </step> + <step> + <para><programlisting>nis_yppasswdd_enable="YES"</programlisting> + 这将启用 <command>rpc.yppasswdd</command> + 服务程序, 如前面提到的, + 它允许用户在客户机上修改自己的 NIS 口令。</para> + </step> + </procedure> + + <note> + <para>随 NIS 配置的不同, 可能还需要增加其他一些项目。 请参见 <link + linkend="network-nis-server-is-client">关于 NIS 服务器同时充当 NIS + 客户机</link> 这一节, 以了解进一步的情况。</para> + </note> + + <para>现在, 所需要做的最后的工作是以超级用户身份执行 + <command>/etc/netstart</command> 命令。 这将依据 + <filename>/etc/rc.conf</filename> + 为您配置好所有的东西。</para> + </sect4> + + <sect4> + <title>初始化 NIS 映射</title> + <indexterm> + <primary>NIS</primary> + <secondary>映射</secondary> + </indexterm> + <para><emphasis>NIS 映射</emphasis> 是一些数据库文件, + 它们位于 <filename>/var/yp</filename> 目录中。 + 这些文件基本上都是根据 NIS 主服务器的 <filename>/etc</filename> + 目录自动生成的, 唯一的例外是: + <filename>/etc/master.passwd</filename> 文件。 一般来说, + 您会有非常充分的理由不将 <username>root</username> + 以及其他管理帐号的口令发到所有 NIS 域上的服务器上。 + 因此, 在开始初始化 NIS 映射之前, 我们应该:</para> + + <screen>&prompt.root; <userinput>cp /etc/master.passwd /var/yp/master.passwd</userinput> +&prompt.root; <userinput>cd /var/yp</userinput> +&prompt.root; <userinput>vi master.passwd</userinput></screen> + + <para>这里, 删除掉和系统有关的帐号对应的项 (<username>bin</username>、 + <username>tty</username>、 <username>kmem</username>、 + <username>games</username>, 等等), + 以及其他不希望被扩散到 NIS 客户机的帐号 + (例如 <username>root</username> 和任何其他 UID 0 + (超级用户) 的帐号)。</para> + + <note><para>确认 + <filename>/var/yp/master.passwd</filename> 这个文件是同组,其他 + 以及其他用户不可读的 (模式 600)! 如果需要的话, 用 + <command>chmod</command> 命令来改它。</para></note> + + <indexterm><primary>Tru64 UNIX</primary></indexterm> + + <para>完成这些工作之后, 就可以初始化 + NIS 映射了! FreeBSD 提供了一个名为 + <command>ypinit</command> 的脚本来帮助您完成这项工作 (详细信息, + 请见其联机手册)。 请注意, 这个脚本在绝大多数 &unix; + 操作系统上都可以找到, 但并不是所有操作系统的都提供。 + 在 Digital UNIX/Compaq Tru64 UNIX 上它的名字是 + <command>ypsetup</command>。 由于我们正在生成的是 NIS + 主服务器的映射, 因此应该使用 <command>ypinit</command> 的 + <option>-m</option> 参数。 如果已经完成了上述步骤, + 要生成 NIS 映射, 只需执行:</para> + + <screen>ellington&prompt.root; <userinput>ypinit -m test-domain</userinput> +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] <userinput>n</userinput> +Ok, please remember to go back and redo manually whatever fails. +If you don't, 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: <userinput>coltrane</userinput> +next host to add: <userinput>^D</userinput> +The current list of NIS servers looks like this: +ellington +coltrane +Is this correct? [y/n: y] <userinput>y</userinput> + +[..output from map generation..] + +NIS Map update completed. +ellington has been setup as an YP master server without any errors.</screen> + + <para><command>ypinit</command> 应该会根据 + <filename>/var/yp/Makefile.dist</filename> 来创建 + <filename>/var/yp/Makefile</filename> 文件。 + 创建完之后, 这个文件会假定您正在操作只有 FreeBSD + 及其德单服务器 NIS 环境。 由于 <literal>test-domain</literal> + 还有一个从服务器, 您必须编辑 + <filename>/var/yp/Makefile</filename>:</para> + + <screen>ellington&prompt.root; <userinput>vi /var/yp/Makefile</userinput></screen> + + <para>应该能够看到这样一行, 其内容是</para> + + <programlisting>NOPUSH = "True"</programlisting> + + <para>(如果还没有注释掉的话)。</para> + </sect4> + + <sect4> + <title>配置 NIS 从服务器</title> + <indexterm> + <primary>NIS</primary> + <secondary>从服务器</secondary> + </indexterm> + <para>配置 NIS 从服务器, 甚至比配置主服务器还要简单。 + 登录到从服务器上, 并按照前面的方法, + 编辑 <filename>/etc/rc.conf</filename> 文件。 唯一的区别是, + 在运行 <command>ypinit</command> 时需要使用 + <option>-s</option> 参数。 + 这里的 <option>-s</option> 选项, 同时要求提供 NIS + 主服务器的名字, 因此我们的命令行应该是:</para> + + <screen>coltrane&prompt.root; <userinput>ypinit -s ellington test-domain</userinput> + +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] <userinput>n</userinput> + +Ok, please remember to go back and redo manually whatever fails. +If you don't, 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. +Don't forget to update map ypservers on ellington.</screen> + + <para>现在应该会有一个叫做 + <filename>/var/yp/test-domain</filename> 的目录。 + 在这个目录中, 应该保存 NIS 主服务器上的映射的副本。 + 接下来需要确定这些文件都及时地同步更新了。 在从服务器上, 下面的 + <filename>/etc/crontab</filename> 项将帮助您确保这一点:</para> + + <programlisting>20 * * * * root /usr/libexec/ypxfr passwd.byname +21 * * * * root /usr/libexec/ypxfr passwd.byuid</programlisting> + + <para>这两行将强制从服务器将映射与主服务器同步。 + 由于主服务器会场时确保所有其 NIS 映射的变动都与从服务器知会, + 因此这些项并不是绝对必需的, 尽管如此, + 强制更新能够保证这些对依赖于服务器的系统至关重要的口令信息及时地同步, + 同时, 在繁忙的网络上, 有时也会出现映射同步更新不完全的情况。</para> + + <para>现在, 在从服务器上执行 <command>/etc/netstart</command>, + 就可以启动 NIS 服务了。</para> + </sect4> + </sect3> + + <sect3> + <title>NIS 客户机</title> + + <para>NIS 客户机会通过 + <command>ypbind</command> 服务程序来与特定的 NIS + 服务器建立一种称作绑定的联系。 + <command>ypbind</command> 会检查系统的默认域 + (这是通过 <command>domainname</command> 命令来设置的), + 并开始在本地网络上广播 RPC 请求。 这些请求会指定 + <command>ypbind</command> 尝试绑定的域名。 + 如果已经配置了服务器, 并且这些服务器接到了广播, 它将回应 + <command>ypbind</command>, 后者则记录服务器的地址。 + 如果有多个可用的服务器 (例如一个主服务器, 加上多个从服务器), + <command>ypbind</command> 将使用第一个响应的地址。 + 从这一时刻开始, 客户机会把所有的 NIS 请求直接发给那个服务器。 + <command>ypbind</command> 偶尔会 <quote>ping</quote> + 服务器以确认其仍然在正常运行。 如果在合理的时间内没有得到响应, 则 + <command>ypbind</command> 会把域标记为未绑定, 并再次发起广播, + 以期找到另一台服务器。</para> + + <sect4> + <title>设置 NIS 客户机</title> + <indexterm> + <primary>NIS</primary> + <secondary>客户机配置</secondary> + </indexterm> + <para>配置一台 FreeBSD 机器作为 NIS 客户机是非常简单的。</para> + + <procedure> + <step> + <para>编辑 <filename>/etc/rc.conf</filename> 文件, + 并在其中加上下面几行, 以设置 NIS 域名, + 并在网络启动时启动 <command>ypbind</command>:</para> + + <programlisting>nisdomainname="test-domain" +nis_client_enable="YES"</programlisting> + </step> + + <step> + <para>要从 NIS 服务器导入所有的口令项, + 需要从您的 + <filename>/etc/master.passwd</filename> 文件中删除所有用户, + 并使用 + <command>vipw</command> 在这个文件的最后一行加入:</para> + + <programlisting>+:::::::::</programlisting> + + <note> + <para>这一行将让 NFS 服务器的口令映射中的帐号能够登录。 + 也有很多修改这一行来配置 NIS 客户机的办法。 + 请参见稍后的 <link linkend="network-netgroups">netgroups + 小节</link> 以了解进一步的情况。 + 要了解更多信息, 可以参阅 O'Reilly 的 + <literal>Managing NFS and NIS</literal> 这本书。</para> + </note> + + <note> + <para>需要至少保留一个本地帐号 (也就是不通过 NIS 导入) 在您的 + <filename>/etc/master.passwd</filename> 文件中, + 而这个帐号应该是 + <groupname>wheel</groupname> 组的成员。 如果 NIS 发生不测, + 这个帐号可以用来远程登录, + 成为 <username>root</username>, 并修正问题。</para> + </note> + </step> + + <step> + <para>要从 NIS 服务器上导入组信息, 需要在 + <filename>/etc/group</filename> 文件末尾加入:</para> + + <programlisting>+:*::</programlisting> + </step> + </procedure> + + <para>完成这些步骤之后, 就应该可以通过运行 + <command>ypcat passwd</command> 来看到 NIS 服务器的口令映射了。</para> + </sect4> + </sect3> + </sect2> + + <sect2> + <title>NIS 的安全性</title> + + <para>基本上, 任何远程用户都可以发起一个 RPC 到 + &man.ypserv.8; 并获得您的 NIS 映射的内容, + 如果远程用户了解您的域名的话。 + 要避免这类未经授权的访问, &man.ypserv.8; + 支持一个称为 <quote>securenets</quote> 的特性, + 用以将访问限制在一组特定的机器上。 在启动过程中, + &man.ypserv.8; 会尝试从 + <filename>/var/yp/securenets</filename> + 中加载 securenet 信息。</para> + + <note> + <para>这个路径随 + <option>-p</option> 参数改变。 这个文件包含了一些项, + 每一项中包含了一个网络标识和子网掩码, 中间用空格分开。 + 以 <quote>#</quote> 开头的行会被认为是注释。 + 示范的 securenets 文件如下所示:</para> + </note> + + <programlisting># 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</programlisting> + + <para>如果 &man.ypserv.8; 接到了来自匹配上述任一规则的地址的请求, + 则它会正常处理请求。 反之, 则请求将被忽略, 并记录一条警告信息。 如果 + <filename>/var/yp/securenets</filename> 文件不存在, 则 + <command>ypserv</command> 会允许来自任意主机的请求。</para> + + <para><command>ypserv</command> 程序也支持 + Wietse Venema 的 <application>TCP Wrapper</application> 软件包。 + 这样, 管理员就能够使用 + <application>TCP Wrapper</application> 的配置文件来代替 + <filename>/var/yp/securenets</filename> 完成访问控制。</para> + + <note> + <para>尽管这两种访问控制机制都能够提供某种程度的安全, + 但是, 和特权端口检查一样, + 它们无法避免 <quote>IP 伪造</quote> 攻击。 您的防火墙应该阻止所有与 + NIS 有关的访问。</para> + + <para>使用 <filename>/var/yp/securenets</filename> 的服务器, + 可能会无法为某些使用陈旧的 TCP/IP 实现的 NIS 客户机服务。 + 这些实现可能会在广播时, 将主机位都设置为 0, + 或在计算广播地址时忽略子网掩码。 + 尽管这些问题可以通过修改客户机的配置来解决, + 其他一些问题也可能导致不得不淘汰那些客户机系统, + 或者不使用 <filename>/var/yp/securenets</filename>。</para> + + <para>在使用陈旧的 TCP/IP 实现的系统上, + 使用 <filename>/var/yp/securenets</filename> 是一个非常糟糕的做法, + 因为这将导致您的网络上的 NIS 丧失大部分功能。</para> + + <indexterm><primary>TCP Wrappers</primary></indexterm> + <para>使用 <application>TCP Wrapper</application> + 软件包, 会导致您的 NIS 服务器的响应延迟增加。 + 而增加的延迟, 则可能会导致客户端程序超时, + 特别是在繁忙的网络或者很慢的 + NIS 服务器上。 如果您的某个客户机因此而产生一些异常, + 则应将这些客户机变为 NIS 从服务器, + 并强制其绑定自己。</para> + </note> + </sect2> + + <sect2> + <title>不允许某些用户登录</title> + + <para>在我们的实验室中, <hostid>basie</hostid> 这台机器, + 是一台教员专用的工作站。 我们不希望将这台机器拿出 NIS 域, + 而主 NIS 服务器上的 <filename>passwd</filename> 文件, + 则同时包含了教员和学生的帐号。 这时应该怎么做?</para> + + <para>有一种办法来禁止特定的用户登录机器, 即使他们身处 NIS 数据库之中。 + 要完成这一工作, 只需要在客户机的 <filename>/etc/master.passwd</filename> + 文件中加入一些 + <literal>-<replaceable>username</replaceable></literal> 这样的项, + 其中, <replaceable>username</replaceable> 是希望禁止登录的用户名。 + 一般推荐使用 <command>vipw</command> 来完成这个工作, + 因为 <command>vipw</command> 会对您在 <filename>/etc/master.passwd</filename> + 文件上所作的修改进行合法性检查, + 并在编辑结束时重新构建口令数据库。 例如, 如果希望禁止用户 + <username>bill</username> 登录 + <hostid>basie</hostid>, 我们应该:</para> + + <screen>basie&prompt.root; <userinput>vipw</userinput> +<userinput>[在末尾加入 -bill, 并退出]</userinput> +vipw: rebuilding the database... +vipw: done + +basie&prompt.root; <userinput>cat /etc/master.passwd</userinput> + +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:/sbin/nologin +operator:*:2:5::0:0:System &:/:/sbin/nologin +bin:*:3:7::0:0:Binaries Commands and Source,,,:/:/sbin/nologin +tty:*:4:65533::0:0:Tty Sandbox:/:/sbin/nologin +kmem:*:5:65533::0:0:KMem Sandbox:/:/sbin/nologin +games:*:7:13::0:0:Games pseudo-user:/usr/games:/sbin/nologin +news:*:8:8::0:0:News Subsystem:/:/sbin/nologin +man:*:9:9::0:0:Mister Man Pages:/usr/share/man:/sbin/nologin +bind:*:53:53::0:0:Bind Sandbox:/:/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:/sbin/nologin +pop:*:68:6::0:0:Post Office Owner:/nonexistent:/sbin/nologin +nobody:*:65534:65534::0:0:Unprivileged user:/nonexistent:/sbin/nologin ++::::::::: +-bill + +basie&prompt.root;</screen> + </sect2> <sect2 id="network-netgroups"> <sect2info> @@ -825,22 +1724,491 @@ mountd_flags="-r"</programlisting> </authorgroup> </sect2info> - <title>Using Netgroups ** 翻译进行中 **</title> - <para></para> + <title>使用 Netgroups</title> + <indexterm><primary>netgroups</primary></indexterm> + + <para>前一节介绍的方法, + 在您需要为非常少的用户和/或机器进行特殊的规则配置时还算凑合。 + 在更大的网络上, 您 + <emphasis>一定会</emphasis> 忘记禁止某些用户登录到敏感的机器上, + 或者, 甚至必须单独地修改每一台机器的配置, 因而丢掉了 NIS 最重要的优越性: + <emphasis>集中式</emphasis> 管理。</para> + + <para>NIS 开发人员为这个问题提供的解决方案, 被称作 + <emphasis>netgroups</emphasis>。 它们的作用和语义, + 基本上可以等同于 &unix; 文件系统上使用的组。 + 主要的区别是它们没有数字化的 ID, 以及可以在 netgroup + 中同时包含用户和其他 netgroup。</para> + + <para>Netgroups 被设计用来处理大的、 复杂的包含数百用户和机器的网络。 + 一方面, 在您不得不处理这类情形时, 这是一个很有用的东西。 + 而另一方面, 它的复杂性又使得通过非常简单的例子很难解释 netgroup + 到底是什么。 这一节的其余部分的例子将展示这个问题。</para> + + <para>假设您在实验室中成功地部署 NIS 引起了上司的兴趣。 + 您接下来的任务是将 NIS 域扩展, 以覆盖校园中的一些其他的机器。 + 下面两个表哥中包括了新用户和新机器, 及其简要说明。</para> + + <informaltable frame="none" pgwide="1"> + <tgroup cols="2"> + <thead> + <row> + <entry>用户名</entry> + <entry>说明</entry> + </row> + </thead> + + <tbody> + <row> + <entry><username>alpha</username>, <username>beta</username></entry> + <entry>IT 部门的普通雇员</entry> + </row> + + <row> + <entry><username>charlie</username>, <username>delta</username></entry> + <entry>IT 部门的学徒</entry> + </row> + + <row> + <entry><username>echo</username>, <username>foxtrott</username>, <username>golf</username>, ...</entry> + <entry>普通雇员</entry> + </row> + + <row> + <entry><username>able</username>, <username>baker</username>, ...</entry> + <entry>目前的实习生</entry> + </row> + </tbody> + </tgroup> + </informaltable> + + <informaltable frame="none" pgwide="1"> + <tgroup cols="2"> + <thead> + <row> + <entry>机器名</entry> + <entry>说明</entry> + </row> + </thead> + + <tbody> + <row> + <!-- Names taken from "Good Omens" by Neil Gaiman and Terry + Pratchett. Many thanks for a brilliant book. --> + + <entry><hostid>war</hostid>, <hostid>death</hostid>, + <hostid>famine</hostid>, + <hostid>pollution</hostid></entry> + <entry>最重要的服务器。 只有 IT + 部门的雇员才允许登录这些机器。</entry> + </row> + <row> + <!-- gluttony was omitted because it was too fat --> + + <entry><hostid>pride</hostid>, <hostid>greed</hostid>, + <hostid>envy</hostid>, <hostid>wrath</hostid>, + <hostid>lust</hostid>, <hostid>sloth</hostid></entry> + <entry>不太重要的服务器, 所有 IT 部门的成员, + 都可以登录这些机器。</entry> + </row> + + <row> + <entry><hostid>one</hostid>, <hostid>two</hostid>, + <hostid>three</hostid>, <hostid>four</hostid>, + ...</entry> + + <entry>普通工作站。 只有 + <emphasis>真正的</emphasis> 雇员才允许登录这些机器。</entry> + </row> + + <row> + <entry><hostid>trashcan</hostid></entry> + <entry>一台不包含关键数据的旧机器。 + 即使是实习生, 也允许登录它。</entry> + </row> + </tbody> + </tgroup> + </informaltable> + + <para>如果您尝试通过一个一个地阻止用户来实现这些限制, + 就需要在每一个系统的 <filename>passwd</filename> 文件中, + 为每一个不允许登录该系统的用户添加对应的 + <literal>-<replaceable>user</replaceable></literal> 行。 + 如果忘记了任何一个, 就可能会造成问题。 在进行初始配置时, + 正确地配置也许不是什么问题, 但随着日复一日地添加新用户, + <emphasis>总有一天</emphasis> 您会忘记为新用户添加某个行。 + 毕竟, Murphy 是一个乐观的人。</para> + + <para>使用 netgroups 来处理这一状况可以带来许多好处。 + 不需要单独地处理每一个用户; 您可以赋予用户一个或多个 netgroups + 身份, 并允许或禁止某一个 netgroup 的所有成员登录。 + 如果添加了新的机器, 只需要定义 netgroup 的登录限制。 + 如果增加了新用户, 也只需要将用户加入一个或多个 netgroup。 + 这些变化是相互独立的: 不再需要 <quote>对每一个用户和机器执行 + ……</quote>。 如果您的 NIS 配置经过了谨慎的规划, + 就只需要修改一个中央的配置文件, 就能够允许或禁止访问某台机器的权限了。</para> + + <para>第一步是初始化 NIS 映射 + netgroup。 FreeBSD 的 &man.ypinit.8; 默认情况下并不创建这个映射, + 但它的 NIS 实现能够在创建这个映射之后立即对其提供支持。 + 要创建空映射, 简单地输入</para> + + <screen>ellington&prompt.root; <userinput>vi /var/yp/netgroup</userinput></screen> + + <para>并开始增加内容。 在我们的例子中, 至少需要四个 nergruop: + IT 雇员, IT 学徒, 普通雇员和实习生。</para> + + <programlisting>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)</programlisting> + + <para><literal>IT_EMP</literal>, <literal>IT_APP</literal> 等等, + 是 netgroup 的名字。 每一个括号中的组中, + 都有一些用户帐号。 组中的三个字段是:</para> + + <orderedlist> + <listitem> + <para>在哪些机器上能够使用这些项。 如果不指定主机名, + 则项在所有机器上都有效。 如果指定了主机, + 则很容易造成混淆。</para> + </listitem> + + <listitem> + <para>属于这个 netgroup 的帐号。</para> + </listitem> + + <listitem> + <para>帐号的 NIS 域。 您可以从其他 NIS + 域中把帐号导入到您的 netgroup 中, + 如果您管理多个 NIS 域的话。</para> + </listitem> + </orderedlist> + + <para>每一个字段都可以包括通配符。 参见 + &man.netgroup.5; 了解更多细节。</para> + + <note> + <indexterm><primary>netgroups</primary></indexterm> + <para>Netgroup 的名字一般来说不应超过 8 个字符, + 特别是当您的 NIS 域中有机器打算运行其它操作系统的时候。 + 名字是区分大小写的; 使用大写字母作为 netgroup 的名字, + 能够让您更容易地区分用户、 机器和 netgroup 的名字。</para> + + <para>某些 NIS 客户程序 (FreeBSD 以外的那些) 可能无法处理含有大量项的 + netgroup。 例如, 某些早期版本的 &sunos; 会在 netgroup + 中包含多于 15 个 <emphasis>项</emphasis> 时出现问题。 + 要绕过这个问题, 可以创建多个 子netgroup,每一个中包含少于 15 个用户, + 以及一个包含所有 子netgroup 的真正的 netgroup:</para> + + <programlisting>BIGGRP1 (,joe1,domain) (,joe2,domain) (,joe3,domain) [...] +BIGGRP2 (,joe16,domain) (,joe17,domain) [...] +BIGGRP3 (,joe31,domain) (,joe32,domain) +BIGGROUP BIGGRP1 BIGGRP2 BIGGRP3</programlisting> + + <para>如果需要超过 225 个用户, 可以继续重复上面的过程。</para> + </note> + + <para>激活并分发新的 NIS 映射非常简单:</para> + + <screen>ellington&prompt.root; <userinput>cd /var/yp</userinput> +ellington&prompt.root; <userinput>make</userinput></screen> + + <para>这个操作会生成三个 NIS 映射, 即 + <filename>netgroup</filename>、 + <filename>netgroup.byhost</filename> 和 + <filename>netgroup.byuser</filename>。 用 &man.ypcat.1; + 可以检查这些 NIS 映射是否可用了:</para> + + <screen>ellington&prompt.user; <userinput>ypcat -k netgroup</userinput> +ellington&prompt.user; <userinput>ypcat -k netgroup.byhost</userinput> +ellington&prompt.user; <userinput>ypcat -k netgroup.byuser</userinput></screen> + + <para>第一个命令的输出, + 应该与 <filename>/var/yp/netgroup</filename> 的内容相近。 + 第二个命令, 如果没有指定本机专有的 netgroup, + 则应该没有输出。 第三个命令, + 则用于显示某个用户对应的 netgroup 列表。</para> + + <para>客户机的设置也很简单。 要配置服务器 + <hostid>war</hostid>, 只需进入 + &man.vipw.8; 并把</para> + + <programlisting>+:::::::::</programlisting> + + <para>改为</para> + + <programlisting>+@IT_EMP:::::::::</programlisting> + + <para>现在, 只有 netgroup + <literal>IT_EMP</literal> 中定义的用户会被导入到 + <hostid>war</hostid> 的口令数据库中, + 因此只有这些用户能够登录。</para> + + <para>不过, 这个限制也会作用于 shell 的 + <literal>~</literal>, 以及所有在用户名和数字用户 ID + 之间实施转换的函数的功能。 换言之, <command>cd + ~<replaceable>user</replaceable></command> 将不会正常工作, 而 + <command>ls -l</command> 也将显示数字的 ID 而不是用户名, + 并且 <command>find . -user joe -print</command> + 将失败, 并给出 <errorname>No such user</errorname> 的错误信息。 + 要修正这个问题, 您需要导入所有的用户项, 而 + <emphasis>不允许他们登录服务器</emphasis>。</para> + + <para>这可以通过在 + <filename>/etc/master.passwd</filename> 加入另一行来完成。 + 这行的内容是:</para> + + <para><literal>+:::::::::/sbin/nologin</literal>, 意思是 + <quote>导入所有的项, 但导入项的 shell 则替换为 + <filename>/sbin/nologin</filename></quote>。 + 通过在 <filename>/etc/master.passwd</filename> + 中增加默认值, 可以替换掉 + <literal>passwd</literal> 中的任意字段。</para> + + <!-- Been there, done that, got the scars to prove it - ue --> + <warning> + <para>务必确认 + <literal>+:::::::::/sbin/nologin</literal> 这一行出现在 + <literal>+@IT_EMP:::::::::</literal> 之后。 + 否则, 所有从 NIS 导入的用户帐号将以 <filename>/sbin/nologin</filename> + 作为登录 shell。</para> + </warning> + + <para>完成上面的修改之后, 在 IT 部门有了新员工时, + 只需修改一个 NIS 映射就足够了。 您也可以用类似的方法, + 在不太重要的服务器上, 把先前本地版本的 <filename>/etc/master.passwd</filename> + 中的 <literal>+:::::::::</literal> 改为:</para> + + <programlisting>+@IT_EMP::::::::: ++@IT_APP::::::::: ++:::::::::/sbin/nologin</programlisting> + + <para>相关的用于普通工作站的配置则应是:</para> + + <programlisting>+@IT_EMP::::::::: ++@USERS::::::::: ++:::::::::/sbin/nologin</programlisting> + + <para>一切平安无事, 直到数周后, 有一天策略发生了变化: + IT 部门也开始招收实习生了。 IT 实习生允许使用普通的终端, + 以及不太重要的服务器; 而 IT 学徒, 则可以登录主服务器。 + 您增加了新的 netgroup <literal>IT_INTERN</literal>, 以及新的 IT + IT 实习生到这个 netgroup 并开始修改每一台机器上的配置…… + 老话说得好: <quote>牵一发, 动全身</quote>。</para> + + <para>NIS 通过 netgroup 来建立 netgroup 的能力, + 正可以避免这样的情形。 一种可能的方法是建立基于角色的 netgroup。 + 例如, 您可以创建称为 + <literal>BIGSRV</literal> 的 netgroup, 用于定义最重要的服务器上的登录限制, + 以及另一个成为 <literal>SMALLSRV</literal> 的 netgroup, + 用以定义次重要的服务器, 以及第三个, 用于普通工作站的 netgroup + <literal>USERBOX</literal>。 这三个 netgroup 中的每一个, + 都包含了允许登录到这些机器上的所有 netgroup。 + 您的 NIS 映射中的新项如下所示:</para> + + <programlisting>BIGSRV IT_EMP IT_APP +SMALLSRV IT_EMP IT_APP ITINTERN +USERBOX IT_EMP ITINTERN USERS</programlisting> + + <para>这种定义登录限制的方法, + 在您能够将机器分组并加以限制的时候可以工作的相当好。 + 不行的是, 这是种例外, 而非规律。 多数时候, + 需要按机器去定义登录限制。</para> + + <para>与机器相关的 netgroup 定义, 是处理上述策略改动的另一种可能的方法。 + 此时, 每台机器的 <filename>/etc/master.passwd</filename> 中, + 都包含两个 <quote>+</quote> 开头的行。 第一个用于添加允许登录的 netgroup + 帐号, 而第二个则用于增加其它帐号, 并把 shell + 设置为 <filename>/sbin/nologin</filename>。 使用 <quote>全大写</quote> + 的机器名作为 netgroup 名是个好主意。 换言之, 这些行应该类似于:</para> + + <programlisting>+@<replaceable>BOXNAME</replaceable>::::::::: ++:::::::::/sbin/nologin</programlisting> + + <para>一旦在所有机器上都完成了这样的修改, 就再也不需要修改本地的 + <filename>/etc/master.passwd</filename> 了。 + 所有未来的修改都可以在 NIS 映射中进行。 这里是一个例子, + 其中展示了在这一应用情景中所需要的 netgroup 映射, + 以及其它一些常用的技巧:</para> + + <programlisting># 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]</programlisting> + + <para>如果您正使用某种数据库来管理帐号, + 应该可以使用您的数据库的报告工具来创建映射的第一部分。 + 这样, 新用户就自动地可以访问这些机器了。</para> + + <para>最后的提醒: 使用基于机器的 netgroup 并不是普适的。 + 如果正在为学生实验室部署数十台甚至上百台同样的机器, + 您应该使用基于角色的 netgroup, 而不是基于机器的 netgroup, + 以便把 NIS 映射的尺寸保持在一个合理的范围内。</para> </sect2> <sect2> - <title>Important Things to Remember ** 翻译进行中 **</title> + <title>需要牢记的事项</title> + + <para>这里是一些其它在使用 NIS 环境时需要注意的地方。</para> + + <itemizedlist> + <listitem> + <para>每次需要在实验室中增加新用户时, + 必须 <emphasis>只</emphasis> 在 NIS 服务器上加入用户, + 而且 <emphasis>一定要记得重建 NIS 映射</emphasis>。 + 如果您忘记了这样做, 新用户将无法登录除 NIS + 主服务器之外的任何其它机器。 例如, 如果要在实验室增加新用户 + <username>jsmith</username>, 我们需要:</para> + + <screen>&prompt.root; <userinput>pw useradd jsmith</userinput> +&prompt.root; <userinput>cd /var/yp</userinput> +&prompt.root; <userinput>make test-domain</userinput></screen> + + <para>也可以运行 <command>adduser jsmith</command> 而不是 + <command>pw useradd jsmith</command>.</para> + </listitem> + <listitem> + <para><emphasis>将管理用的帐号排除在 + NIS 映射之外</emphasis>。 一般来说, + 您不希望这些管理帐号和口令被扩散到那些包含不应使用它们的用户的机器上。</para> + </listitem> + <listitem> + <para><emphasis>确保 NIS 主和从服务器的安全, + 并尽可能减少其停机时间</emphasis>。 + 如果有人攻入或简单地关闭这些机器, + 则整个实验室的任也就无法登录了。</para> - <para></para> + <para>这是集中式管理系统中最薄弱的环节。 + 如果没有保护好 NIS 服务器, 您就有大批愤怒的用户需要对付了!</para> + </listitem> + </itemizedlist> </sect2> - <sect2 id="network-nis-server-is-client"> - <title>NIS Servers That Are Also NIS Clients ** 翻译进行中 **</title> + <sect2> + <title>NIS v1 兼容性</title> + + <para>FreeBSD 的 <application>ypserv</application> 提供了某些为 NIS v1 + 客户提供服务的支持能力。 FreeBSD 的 NIS 实现, + 只使用 NIS v2 协议, 但其它实现可能会包含 v1 协议, + 以提供对旧系统的向下兼容能力。 随这些系统提供的 + <application>ypbind</application> 服务将首先尝试绑定 NIS v1 + 服务器, 即使它们并不真的需要它 (有些甚至可能会一直广播搜索请求, + 即使已经从某台 v2 服务器得到了回应也是如此)。 + 注意, 尽管支持一般的客户机调用, 这个版本的 + <application>ypserv</application> 并不能处理 v1 的映射传送请求; + 因而, 它就不能与较早的支持 v1 协议的 NIS 服务器配合使用, + 无论是作为主服务器还是从服务器。 幸运的是, + 现今应该已经没有仍然在用的这样的服务器了。</para> + </sect2> - <para></para> + <sect2 id="network-nis-server-is-client"> + <title>同时作为 NIS 客户机的 NIS 服务器</title> + + <para>在多服务器域的环境中, 如果服务器同时作为 NIS 客户, 在运行 + <application>ypserv</application> 时要特别小心。 + 一般来说, 强制服务器绑定自己要比允许它们广播绑定请求要好, + 因为这种情况下它们可能会相互绑定。 某些怪异的故障, + 很可能是由于某一台服务器停机, 而其它服务器都依赖其服务所导致的。 + 最终, 所有的客户机都会超时并绑定到其它服务器, + 但这个延迟可能会相当可观, + 而且恢复之后仍然存在再次发生此类问题的隐患。</para> + + <para>您可以强制一台机器绑定到特定的服务器, 这是通过 + <command>ypbind</command> 的 <option>-S</option> + 参数来完成的。 如果不希望每次启动 NIS 服务器时都手工完成这项工作, + 可以在 <filename>/etc/rc.conf</filename> 中加入:</para> + + <programlisting>nis_client_enable="YES" # run client stuff as well +nis_client_flags="-S <replaceable>NIS domain</replaceable>,<replaceable>server</replaceable>"</programlisting> + + <para>参见 &man.ypbind.8; 以了解更多情况。</para> </sect2> + <sect2> + <title>口令格式</title> + <indexterm> + <primary>NIS</primary> + <secondary>口令格式</secondary> + </indexterm> + <para>在实现 NIS 时, 口令格式的兼容性问题是一种最为常见的问题。 + 假如您的 NIS 服务器使用 DES 加密口令, 则它只能支持使用 DES + 的客户机。 例如, 如果您的网络上有 + &solaris; NIS 客户机, 则几乎肯定需要使用 DES 加密口令。</para> + + <para>要检查您的服务器和客户机使用的口令格式, + 需要查看 <filename>/etc/login.conf</filename>。 + 如果主机被配置为使用 DES 加密的口令, 则 + <literal>default</literal> class 将包含类似这样的项:</para> + + <programlisting>default:\ + :passwd_format=des:\ + :copyright=/etc/COPYRIGHT:\ + [Further entries elided]</programlisting> + + <para>其他一些可能的 <literal>passwd_format</literal> + 包括 <literal>blf</literal> 和 <literal>md5</literal> + (分别对应于 Blowfish 和 MD5 加密口令)。</para> + + <para>如果修改了 + <filename>/etc/login.conf</filename>, 就必须重建登录性能数据库, + 这是通过以 + <username>root</username> 身份运行下面的程序来完成的:</para> + + <screen>&prompt.root; <userinput>cap_mkdb /etc/login.conf</userinput></screen> + + <note><para>已经在 + <filename>/etc/master.passwd</filename> 中的口令的格式不会被更新, + 直到用户在登录性能数据库重建 + <emphasis>之后</emphasis> 首次修改口令为止。</para></note> + + <para>接下来, 为了确保所有的口令都按照您选择的格式加密了, + 还需要检查 <filename>/etc/auth.conf</filename> + 中 <literal>crypt_default</literal> 给出的优先选择的口令格式。 + 要完成此工作, 将您选择的格式放到列表的第一项。 例如, + 当使用 DES 加密的口令时, 对应项应为:</para> + + <programlisting>crypt_default = des blf md5</programlisting> + + <para>在每一台基于 &os; 的 NIS 服务器和客户机上完成上述工作之后, + 就可以肯定您的网络上它们都在使用同样的口令格式了。 如果在 NIS + 客户机上做身份验证时发生问题, 这也是第一个可能出现问题的地方。 + 注意: 如果您希望在混合的网络上部署 NIS 服务器, + 可能就需要在所有系统上都使用 DES, + 因为这是所有系统都能够支持的最低限度的公共标准。</para> + </sect2> </sect1> <sect1 id="network-dhcp"> @@ -855,6 +2223,181 @@ mountd_flags="-r"</programlisting> </sect1info> <title>网络自动配置 (DHCP)</title> + <sect2> + <title>什么是 DHCP?</title> + <indexterm> + <primary>动态主机配置协议</primary> + <see>DHCP</see> + </indexterm> + <indexterm> + <primary>Internet Software Consortium (ISC)</primary> + </indexterm> + + <para>DHCP, 动态主机配置协议, 是一种让系统得以连接到网络上, + 并获取所需要的配置参数手段。 FreeBSD + 使用的是 ISC (Internet Software Consortium) 的 DHCP + 实现, 因此这里所有和具体实现紧密相关的内容, 都是以 + ISC 软件包为准的。</para> + </sect2> + + <sect2> + <title>这一节都介绍哪些内容</title> + + <para>这一节描述了 ISC DHCP 系统的客户端和服务器端的组件。 + 客户端程序, <command>dhclient</command>, + 是随 FreeBSD 作为它的一部分提供的; 而服务器部分, + 则可以通过 <filename + role="package">net/isc-dhcp3-server</filename> port 得到。 + &man.dhclient.8;、 &man.dhcp-options.5;、 以及 + &man.dhclient.conf.5; 联机手册, 加上下面所介绍的参考文献, + 都是非常有用的资源。</para> + </sect2> + + <sect2> + <title>它如何工作</title> + <indexterm><primary>UDP</primary></indexterm> + <para>当 DHCP 客户程序, <command>dhclient</command> + 在客户机上运行时, 它会开始广播请求配置信息的消息。 默认情况下, + 这些请求是在 UDP 端口 68 上。 服务器通过 UDP 67 + 给出响应, 向客户机提供一个 IP 地址, 以及其他有关的配置参数, + 例如子网掩码、 路由器, 以及 DNS 服务器。 + 所有这些信息都会以 DHCP + <quote>lease</quote> 的形式给出, 并且只在一段特定的时间内有效 + (这是由 DHCP 服务器的维护者配置的)。 这样, + 那些已经断开网络的客户机使用的陈旧的 IP 地址就能被自动地回收了。</para> + + <para>DHCP 客户程序可以从服务器端获取大量的信息。 + 关于能获得的信息的详细列表, 请参考 + &man.dhcp-options.5;。</para> + </sect2> + + <sect2> + <title>FreeBSD 集成</title> + + <para>FreeBSD 完全地集成了 ISC DHCP 客户端, + <command>dhclient</command>。 DHCP 客户端被安装程序直接支持, + 并且是基本系统的一部分。 + 这使得您不再需要去了解那些已经运行了 DHCP 服务器的网络的具体配置参数。 + 从 FreeBSD 3.2 开始, 每一个发行版中均包含 <command>dhclient</command>。</para> + <indexterm> + <primary><application>sysinstall</application></primary> + </indexterm> + + <para><application>sysinstall</application> 能够支持 DHCP。 在 + <application>sysinstall</application> 中配置网络接口时, + 它询问的第二个问题便是: <quote>Do you want to try DHCP configuration of + the interface? (您是否希望在此接口上尝试 DHCP 配置?)</quote>。 + 如果做肯定的回答, 则将运行 <command>dhclient</command>, + 一旦成功, 则将自动地填写网络配置信息。</para> + + <para>要在系统启动时使用 DHCP, 您必须做两件事:</para> + <indexterm> + <primary>DHCP</primary> + <secondary>需求</secondary> + </indexterm> + <itemizedlist> + <listitem> + <para>您的内核中, 必须包含 <devicename>bpf</devicename> + 设备。 如果需要这样做, 需要将 + <literal>device bpf</literal> (对于 &os; 4.X + 来说, 则应该是 <literal>pseudo-device + bpf</literal>) 添加到内核的编译配置文件中, 并重新编译内核。 + 要了解关于编译内核的进一步信息, 请参见 <xref + linkend="kernelconfig">。</para> <para><devicename>bpf</devicename> + 设备已经是 FreeBSD 发行版中默认的 <filename>GENERIC</filename> + 内核的一部分了,, 因此如果您没有对内核进行定制, + 则不用创建一份新的内核配置文件, DHCP 就能工作了。</para> + <note> + <para>对于那些安全意识很强的人来说, + 您应该知道 <devicename>bpf</devicename> + 也是包侦听工具能够正确工作的条件之一 (当然, + 它们还需要以 + <username>root</username> 身份运行才行)。 <devicename>bpf</devicename> + <emphasis>是</emphasis> 使用 DHCP 所必须的, + 但如果您对安全非常敏感, + 则很可能会有理由不把 <devicename>bpf</devicename> + 加入到您的内核配置中, 直到您真的需要使用 DHCP + 为止。</para> + </note> + </listitem> + <listitem> + <para>编辑您的 <filename>/etc/rc.conf</filename> 并加入下面的设置:</para> + + <programlisting>ifconfig_fxp0="DHCP"</programlisting> + + <note> + <para>务必将 <literal>fxp0</literal> + 替换为您希望自动配置的网络接口的名字, 您可以在 + <xref linkend="config-network-setup"> 找到更进一步的介绍。</para> + </note> + + <para>如果您希望使用另一位置的 + <command>dhclient</command>, + 或者需要给 <command>dhclient</command> 传递其他参数, + 还可以添加下面的配置 (根据需要进行修改):</para> + + <programlisting>dhcp_program="/sbin/dhclient" +dhcp_flags=""</programlisting> + </listitem> + </itemizedlist> + + <indexterm> + <primary>DHCP</primary> + <secondary>服务器</secondary> + </indexterm> + <para>DHCP 服务器, <application>dhcpd</application>, + 是作为 <filename + role="package">net/isc-dhcp3-server</filename> port 的一部分提供的。 + 这个 port 包括了 ISC DHCP 服务器及其文档。</para> + </sect2> + + <sect2> + <title>文件</title> + <indexterm> + <primary>DHCP</primary> + <secondary>配置文件</secondary> + </indexterm> + <itemizedlist> + <listitem><para><filename>/etc/dhclient.conf</filename></para> + <para><command>dhclient</command> 需要一个配置文件, + <filename>/etc/dhclient.conf</filename>。 一般说来, + 这个文件中只包括注释, 而默认值基本上都是合理的。 + 这个配置文件在 &man.dhclient.conf.5; 联机手册中进行了进一步的阐述。</para> + </listitem> + + <listitem><para><filename>/sbin/dhclient</filename></para> + <para><command>dhclient</command> 是一个静态连编的, + 它被安装到 <filename>/sbin</filename> 中。 &man.dhclient.8; + 联机手册给出了关于 + <command>dhclient</command> 的进一步细节。</para> + </listitem> + + <listitem><para><filename>/sbin/dhclient-script</filename></para> + <para><command>dhclient-script</command> 是一个 FreeBSD 专用的 + DHCP 客户端配置脚本。 在 + &man.dhclient-script.8; 中对它进行了描述, + 但一般来说, 用户不需要对其进行任何修改, + 就能够让一切正常运转了。</para> + </listitem> + + <listitem><para><filename>/var/db/dhclient.leases</filename></para> + <para>DHCP 客户程序会维护一个数据库来保存有效的 lease, + 它们被以日志的形式保存到这个文件中。 &man.dhclient.leases.5; + 给出了更为细致的介绍。</para> + </listitem> + </itemizedlist> + </sect2> + + <sect2> + <title>进阶读物</title> + + <para>DHCP 协议的完整描述是 + <ulink url="http://www.freesoft.org/CIE/RFC/2131/">RFC 2131</ulink>。 + 关于它的其他信息资源的站点 + <ulink url="http://www.dhcp.org/"></ulink> + 也提供了详尽的资料。</para> + </sect2> + <sect2 id="network-dhcp-server"> <title>安装和配置 DHCP 服务器</title> @@ -868,7 +2411,7 @@ mountd_flags="-r"</programlisting> 因此您需要安装 <filename role="package">net/isc-dhcp3-server</filename> port 才能提供这个服务。 请参见 <xref linkend="ports"> - 以了解关于如何使用 ports collection 的进一步详情。</para> + 以了解关于如何使用 Ports Collection 的进一步详情。</para> </sect3> <sect3> @@ -1077,11 +2620,12 @@ host mailhost { </para> <para> - 这份文档介绍了 BIND 8.x, 它是 FreeBSD 先前版本所采用的稳定版本。 - BIND 9.x 可以通过 <filename role="package">net/bind9</filename> - port 来安装到 FreeBSD 上, 而从 5.3-RELEASE 开始, - 它成为了基本系统的一部分。 - </para> + 这份文档介绍的是 BIND 8.x, 因为它是 &os; 中使用的稳定版本。 + &os; 5.3 以及更高版本则包含了 + <acronym>BIND</acronym>9 及其配置的说明可以在这一章的后一部分找到。 + 使用 &os; 5.2 以及更早版本的用户, + 可以通过 <filename role="package">net/bind9</filename> port + 来安装 <acronym>BIND</acronym>9。</para> <para> RFC1034 和 RFC1035 定义了 DNS 协议。 @@ -1170,8 +2714,8 @@ host mailhost { <para><hostid>org.</hostid> 是一个根域下的域。</para> </listitem> <listitem> - <para><hostid role="domainname">example.org</hostid> 是 - <hostid>org.</hostid> 域之下的域。</para> + <para><hostid role="domainname">example.org.</hostid> 是 + <hostid>org.</hostid> 之下的域。</para> </listitem> <listitem> <para><hostid role="domainname">foo.example.org.</hostid> 是 @@ -1248,7 +2792,7 @@ host mailhost { <para>在 FreeBSD 中, BIND 服务程序被称为 <application>named</application>, 其原因显而易见。</para> - <informaltable frame="none"> + <informaltable frame="none" pgwide="1"> <tgroup cols="2"> <thead> <row> @@ -1809,8 +3353,8 @@ $TTL 6h <listitem> <indexterm><primary>syslog</primary></indexterm> - <indexterm><primary>日志</primary> - <secondary>DNS</secondary></indexterm> + <indexterm><primary>日志文件</primary> + <secondary>named</secondary></indexterm> <para>如果您在运行 &os; 在 4.9-RELEASE 之前的版本, 需要联编一个静态连接的 <application>named-xfer</application>, 并将其复制到沙盒中:</para> @@ -1869,14 +3413,12 @@ $TTL 6h <screen>&prompt.root; <userinput>ln -sf /etc/namedb/var/run/ndc /var/run/ndc</userinput></screen> <note> - <para>这主要是避免每次都不得不指定 &man.ndc.8; - <option>-c</option> 的选项。 由于 - <filename>/var/run</filename> 会在每次启动时删除, - 如果您发现这是您在每次启动时都需要做的事情, - 则可以在 <username>root</username> 的 - <filename>crontab</filename> 中增加相应的条目, 并使用 - <option>@reboot</option> 选项。 参见 &man.crontab.5; - 以了解更多细节。</para> + <para>这个非常简单的措施有效地避免了您每次都必须指定 + <option>-c</option> 参数来启动 &man.ndc.8; 的麻烦。 由于 + <filename>/var/run</filename> 中的内容会在启动时被删除, + 把上述命令加入到 + <username>root</username> 的 &man.crontab.5; 中, 并指定 + <option>@reboot</option> 选项会很有用。</para> </note> </listitem> @@ -1884,7 +3426,7 @@ $TTL 6h <listitem> <indexterm><primary>syslog</primary></indexterm> - <indexterm><primary>日志</primary> + <indexterm><primary>日志文件</primary> <secondary>named</secondary></indexterm> <para>配置 &man.syslogd.8; 来创建一个 <application>named</application> @@ -2081,46 +3623,47 @@ zone "10.168.192.in-addr.arpa" in { <indexterm><primary>bind9</primary> <secondary>安装</secondary></indexterm> - <para>&os; 5.3 将 - <acronym>BIND</acronym>9 <acronym>DNS</acronym> 服务软件引入了发行包。 - 与此同时, 这带来了新的安全特性, 文件布局, 以及自动的 - &man.chroot.8; 配置。 这一节包含两部分, - 第一部分讨论了新特性以及如何配置它们, 而后一部分则介绍了升级的步骤, - 它将帮您顺利地迁移到 &os; 5.3。 从此开始, 服务器将被简写为 - &man.named.8; 而不是 <acronym>BIND</acronym>。 - 这一节跳过了前一节中所介绍的术语以及一些理论上的讨论, 因此, - 建议您阅读前一节然后再看这一节。</para> + <para>随着 &os; 5.3 版本的发布, + <acronym>BIND</acronym>9 <acronym>DNS</acronym> + 服务软件正式成为了发行版本的一部分。 新的安全特性,文件布局, + 以及自动的 &man.chroot.8; 配置也加入进来。 这一节分成两部分, + 第一部分讨论了新增特性以及如何配置它们; 后一部分则讲述了升级过程, + 帮助用户迁移到 &os; 5.3。 从现在起, 服务器将被简单地写作 + &man.named.8; 或 <acronym>BIND</acronym>。 + 这一节跳过了前一节所介绍的那些术语, 以及一些理论上的讨论; + 因此, 建议您在继续阅读之前首先看一看前面的章节。</para> - <para><command>named</command> 的配置文件目前存放在 - <filename role="directory">/var/named/etc/namedb/</filename>, - 在使用前需要进行一些修改。 这也是绝大多数配置所在的位置。</para> + <para>目前, <application>named</application> 的配置文件存放在 + <filename class="directory">/var/named/etc/namedb/</filename>, + 在使用之前需要进行一些修改。 这也是进行绝大多数相关配置的地方。</para> <sect2> - <title>配置主域</title> + <title>主域的配置</title> - <para>要配置主域您需要进入 - <filename role="directory">/var/named/etc/namedb/</filename> + <para>要配置主域, 应首先进入 + <filename class="directory">/var/named/etc/namedb/</filename> 并执行下面的命令:</para> <screen>&prompt.root; <userinput>sh make-localhost</userinput></screen> - <para>如果一切正常, 则将在 - <filename role="directory">master</filename> 目录中建立两个新的文件。 - 它们的文件名是 <filename>localhost.rev</filename> 和 - <filename>localhost-v6.rev</filename>, 分别用来解析本地的名字和 - <acronym>IPv6</acronym> 配置中的名字。 作为默认的配置文件, - 它们已经在 <filename>named.conf</filename> 文件中进行了定义。</para> + <para>如果一切正常, 则在 + <filename class="directory">master</filename> 目录中将出现两个新文件。 + 它们的名字应该是用于本地域名解析的 <filename>localhost.rev</filename>, + 以及用于 <acronym>IPv6</acronym> 配置的 + <filename>localhost-v6.rev</filename>。 作为默认的配置文件, + 关于它们的配置已经在 <filename>named.conf</filename> 文件中定义了。</para> </sect2> <sect2> - <title>配置从域</title> + <title>从域的配置</title> <para>可以通过配置从域来提供额外的域或子域的解析。 多数情况下, <filename>master/localhost.rev</filename> - 可以复制到 <filename role="directory">slave</filename> - 中并进行修改。 一旦完成, 这些文件就可以加入到 - <filename>named.conf</filename> 类似 - <hostid role="fqdn">example.com</hostid> 的配置中:</para> + 文件可以直接复制到 <filename class="directory">slave</filename> + 目录中并进行修改。 此后, + 这些文件应该加入到 <filename>named.conf</filename>, 类似下面的 + <hostid role="domainname">example.com</hostid> + 配置:</para> <programlisting>zone "example.com" { type slave; @@ -2147,15 +3690,15 @@ zone "0.168.192.in-addr.arpa" { <sect2> <title>系统的初始配置</title> - <para>为了让 <command>named</command> 服务能够在系统启动时自动加载, + <para>为了让 <application>named</application> 服务能够在系统启动时自动加载, 需要把下面的选项加到 <filename>rc.conf</filename> 文件中:</para> <programlisting>named_enable="YES"</programlisting> <para>尽管还有其他的一些可用选项, 这是运行域名服务器所需要的最小配置。 - 请参考 &man.rc.conf.5; 联机手册了解更多的选项。 在 - <filename>rc.conf</filename> 中进行了这些配置之后, - 可以通过下面的命令行来启动 <command>named</command>:</para> + 请参考 &man.rc.conf.5; 联机手册了解更多的选项。 如果不需要继续在 + <filename>rc.conf</filename> 文件中进行其他配置了, + 就可以通过下面的命令行来启动 <application>named</application>:</para> <screen>&prompt.root; <userinput>/etc/rc.d/named start</userinput></screen> </sect2> @@ -2163,9 +3706,10 @@ zone "0.168.192.in-addr.arpa" { <sect2> <title><acronym>BIND</acronym>9 的安全</title> - <para>尽管 &os; 会自动地将 <command>named</command> 放到一个 - &man.chroot.8; 环境中, 您仍然可以采取一些更严密的措施来防止可能的针对 - <acronym>DNS</acronym> 服务的攻击。 + <para>尽管 &os; 会自动地将 <application>named</application> + 放到一个 &man.chroot.8; 环境中, + 您仍然可以采取一些更为严密的措施来防止潜在的针对 + <acronym>DNS</acronym> 服务的攻击。</para> <sect3> <title>查询访问控制表</title> @@ -2204,16 +3748,25 @@ zone "0.168.192.in-addr.arpa" { <para>允许查询 <acronym>DNS</acronym> 服务的版本, 可能会给攻击者敞开方便之门。 心存恶意的用户能够利用这一信息找到存在已知漏洞的服务器, - 并对其实施攻击。 在 <filename>named.conf</filename> - 的 <literal>options</literal> 小节中可以伪造版本字符串:</para> + 并利用这些漏洞来实施攻击。</para> + + <warning> + <para>配置伪造的版本号并不能阻止服务器被使用已知的攻击手段进行攻击。 + 唯一能够确保安全的办法是将服务器升级到没有已知问题的版本。</para> + </warning> + + <para>伪造的版本号可以通过 <filename>named.conf</filename> 的 + <literal>options</literal> 小节来指定:</para> <programlisting>options { directory "/etc/namedb"; pid-file "/var/run/named/pid"; dump-file "/var/dump/named_dump.db"; statistics-file "/var/stats/named.stats"; - version "None of your business";</programlisting> + version "None of your business"; +};</programlisting> </sect3> + <!-- Here is where I stopped for now <sect3> <title>Authentication</title> @@ -2234,13 +3787,438 @@ zone "0.168.192.in-addr.arpa" { </author> </authorgroup> </sect1info> - <title>Apache HTTP Server ** 翻译进行中 **</title> + <title>Apache HTTP 服务器</title> - <indexterm><primary>web server</primary> - <secondary>setting up</secondary></indexterm> + <indexterm><primary>web 服务器</primary> + <secondary>配置</secondary></indexterm> <indexterm><primary>Apache</primary></indexterm> - <para></para> + <sect2> + <title>纵览</title> + + <para>&os; 被用于运行许多全球最为繁忙的 web 站点。 + 大多数 Internet 上的 web 服务器, + 都使用 <application>Apache HTTP 服务器</application>。 + <application>Apache</application> 软件包可以在您的 FreeBSD + 安装盘上找到。 如果没有在首次安装时附带安装 + <application>Apache</application>, 则可以通过 <filename + role="package">www/apache13</filename> 或 <filename + role="package">www/apache2</filename> port 来安装。</para> + + <para>一旦成功地安装了 <application>Apache</application>, + 就必须对其进行配置。</para> + + <note><para>这一节介绍了 1.3.X 版本的 + <application>Apache HTTP 服务器</application> 的配置, + 因为它是随 &os; 一同使用的最多的版本。 + <application>Apache</application> 2.X 引入了很多新技术, + 但在此并不讨论。 要了解关于 <application>Apache</application> 2.X + 的更多资料, 请参见 <ulink + url="http://httpd.apache.org/"></ulink>。</para></note> + + </sect2> + + <sect2> + <title>配置</title> + + <indexterm><primary>Apache</primary> + <secondary>配置文件</secondary></indexterm> + + <para>主要的 <application>Apache HTTP Server</application> 配置文件, + 在 &os; 上会安装为 + <filename>/usr/local/etc/apache/httpd.conf</filename>。 + 这是一个典型的 &unix; 文本配置文件, 它使用 <literal>#</literal> + 作为注释符。 关于全部配置选项的详尽介绍超出了本书的范围, + 这里将只介绍最常被修改的那些。</para> + + <variablelist> + <varlistentry> + <term><literal>ServerRoot "/usr/local"</literal></term> + + <listitem> + <para>这指定了 <application>Apache</application> + 安装的顶级目录。 执行文件被放到服务器根目录 (server root) 的 + <filename class="directory">bin</filename> 和 + <filename class="directory">sbin</filename> 子目录中, + 而配置文件则位于 + <filename class="directory">etc/apache</filename>。</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><literal>ServerAdmin you@your.address</literal></term> + + <listitem> + <para>这个地址是在服务器发生问题时应发送电子邮件的地址, + 它会出现在服务器生成的页面上, 例如错误页面。</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><literal>ServerName www.example.com</literal></term> + + <listitem> + <para><literal>ServerName</literal> 允许您配置发送回客户端的主机名, + 如果您的服务器被用户以别的名字访问 (例如, 使用 <hostid>www</hostid> + 而不是主机本身的真实名字)。</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><literal>DocumentRoot "/usr/local/www/data"</literal></term> + + <listitem> + <para><literal>DocumentRoot</literal>: 这个目录是您的文档所在的目录。 + 默认情况下, 所有的请求都会从这个位置去获取, + 但也可以通过符号连接和别名指定其它的位置。</para> + </listitem> + </varlistentry> + </variablelist> + + <para>在修改配置之前备份 + <application>Apache</application> 的配置文件永远是一个好习惯。 + 一旦对初始配置满意了, 就可以开始运行 <application>Apache</application> 了。</para> + +<!-- sect3 for performance tuning directives? maxservers minservers --> +<!-- etc..?? --> + +<!-- Advanced configuration section. + +Performance tuning directives. + +Log file format --> + + </sect2> + + <sect2> + <title>运行 <application>Apache</application></title> + + <indexterm><primary>Apache</primary> + <secondary>启动和停止</secondary></indexterm> + + <para>与许多其它网络服务不同, <application>Apache</application> 并不依赖 + <application>inetd</application> 超级服务器来运行。 + 一般情况下会把它配置为一个独立的服务器, 以期在客户的 web + 浏览器连入 HTTP 请求时, 能够获得更好的性能。 它提供了一个 shell + 脚本来使启动、 停止和重新启动服务器变得尽可能地简单。 + 首次启动 <application>Apache</application>, + 只需执行:</para> + + <screen>&prompt.root; <userinput>/usr/local/sbin/apachectl start</userinput></screen> + + <para>可以在任何时候使用下面的命令来停止服务:</para> + + <screen>&prompt.root; <userinput>/usr/local/sbin/apachectl stop</userinput></screen> + + <para>当由于某种原因修改了配置文件之后, 需要重启服务器:</para> + + <screen>&prompt.root; <userinput>/usr/local/sbin/apachectl restart</userinput></screen> + + <para>要在重启 <application>Apache</application> 服务器时不中断当前的连接, + 则应运行:</para> + + <screen>&prompt.root; <userinput>/usr/local/sbin/apachectl graceful</userinput></screen> + + <para>更多的信息, 可以在 + &man.apachectl.8; 联机手册中找到。</para> + + <para>要在系统启动时启动 <application>Apache</application>, 则应在 + <filename>/etc/rc.conf</filename> 中加入:</para> + + <programlisting>apache_enable="YES"</programlisting> + + <para>如果您希望在系统引导时启动 <application>Apache</application> + <command>httpd</command> 程序并指定其它一些选项, + 则可以把下面的行加到 + <filename>rc.conf</filename>:</para> + + <programlisting>apache_flags=""</programlisting> + + <para>现在 web 服务器就开始运行了, 您可以使用 web 浏览器打开 + <literal>http://localhost/</literal>。 默认显示的 web 页面是 + <filename>/usr/local/www/data/index.html</filename>。</para> + + </sect2> + + <sect2> + <title>虚拟主机</title> + + <para><application>Apache</application> 支持两种不同类型的虚拟主机。 + 第一种方法是基于名字的虚拟主机。 基于名字的虚拟主机使用客户机发来的 + HTTP/1.1 头来辨别主机名。 这使得不同的域得以共享同一个 IP 地址。</para> + + <para>要配置 <application>Apache</application> 来使用基于名字的虚拟主机, + 需要把类似下面的项加到您的 <filename>httpd.conf</filename> 中:</para> + + <programlisting>NameVirtualHost *</programlisting> + + <para>如果您的 web 服务器的名字是 <hostid role="fqdn">www.domain.tld</hostid>, + 而您希望建立一个 + <hostid role="fqdn">www.someotherdomain.tld</hostid> 的虚拟域, + 则应在 + <filename>httpd.conf</filename> 中加入:</para> + + <screen><VirtualHost *> +ServerName www.domain.tld +DocumentRoot /www/domain.tld +<VirtualHost> + +<VirtualHost *> +ServerName www.someotherdomain.tld +DocumentRoot /www/someotherdomain.tld +</VirtualHost></screen> + + <para>您需要把上面的地址和文档路径改为所使用的那些。</para> + + <para>要了解关于虚拟主机的更多信息, + 请参考官方的 <application>Apache</application> 文档, 这些文档可以在 <ulink + url="http://httpd.apache.org/docs/vhosts/"></ulink> 找到。</para> + + </sect2> + + <sect2> + <title>Apache 模块</title> + + <indexterm><primary>Apache</primary> + <secondary>模块</secondary></indexterm> + + <para>有许多不同的 <application>Apache</application> 模块, + 它们可以在基本的服务器基础上提供许多附加的功能。 FreeBSD 的 + Ports Collection 为安装 + <application>Apache</application> + 和常用的附加模块提供了非常方便的方法。</para> + + <sect3> + <title>mod_ssl</title> + + <indexterm><primary>web 服务器</primary> + <secondary>安全</secondary></indexterm> + <indexterm><primary>SSL</primary></indexterm> + <indexterm><primary>密码学</primary></indexterm> + + <para><application>mod_ssl</application> 这个模块使用 OpenSSL 库, + 来提供通过 安全套接字层 (SSL v2/v3) 和 传输层安全 (TLS v1) + 协议的强加密能力。 + 这个模块提供了从某一受信的证书签署机构申请签名证书所需的所有工具, + 您可以藉此在 &os; 上运行安全的 web 服务器。</para> + + <para>如果您未曾安装 + <application>Apache</application>, 也可以直接安装一份包含了 + <application>mod_ssl</application> 的版本的 + <application>Apache</application> + 1.3.X, 其方法是通过 <filename + role="package">www/apache13-modssl</filename> port 来进行。 SSL + 支持已经作为 <application>Apache</application> 2.X 的一部分提供, + 您可以通过 + <filename role="package">www/apache2</filename> port 来安装后者。</para> + +<!-- XXX add more information about configuring mod_ssl here. --> +<!-- Generating keys, getting the key signed, setting up your secure --> +<!-- web server! --> + </sect3> + + <sect3> + <title>mod_perl</title> + + <indexterm><primary>Perl</primary></indexterm> + + <para><application>Apache</application>/Perl 集成计划, 将 Perl + 程序设计语言的强大功能, 与 <application>Apache + HTTP 服务器</application> 紧密地结合到了一起。 + 通过 <application>mod_perl</application> 模块, + 可以完全使用 Perl 来撰写 <application>Apache</application> 模块。 + 此外, 服务器中嵌入的持久性解释器, 消除了由于启动外部的解释器为 Perl + 脚本的启动所造成的性能损失。</para> + + <para>如果您还没有安装 + <application>Apache</application>, + 也可以通过 <filename + role="package">www/apache13-modperl</filename> port 来安装包含了 + <application>mod_perl</application> 的 <application>Apache</application> + 版本。</para> + </sect3> + + <sect3> + <sect3info> + <authorgroup> + <author> + <firstname>Tom</firstname> + <surname>Rhodes</surname> + <contrib>Written by </contrib> + </author> + </authorgroup> + </sect3info> + <title>PHP</title> + + <indexterm><primary>PHP</primary></indexterm> + + <para>在过去的几年中, 更多的企业开始转向 + Internet, 以期扩大它们的收入和影响。 这也使得交互式 + web 内容的需求日益增长。 尽管某些公司, 例如 µsoft;, + 在它们的商业产品中引入了一些解决方案, + 但开放源代码团体也给出了自己的答案。 这其中, + 使用的最为广泛的就是 <acronym>PHP</acronym>。</para> + + <para>PHP, 也成为 <quote>Hypertext Preprocessor</quote>, + 是一种通用的脚本语言, 并且特别适合于 Web 开发。 + 它能够很容易地嵌入到 + <acronym>HTML</acronym> 之中, 其语法接近于 C、 &java;、 + 以及 Perl, 以期让 web 开发人员能够迅速地写出动态生成的 + web 页面。</para> + + <para>要获得 <application>Apache</application> web + 服务器的 <acronym>PHP</acronym>5 支持, 可以从安装 + <filename role="package">www/mod_php5</filename> + port 开始。</para> + + <para>这样, 将安装并配置用于支持动态 web 应用所需要的模块。 + 请再次检查, 以确认在 + <filename>/usr/local/etc/apache/httpd.conf</filename> + 中添加了下面的配置: + + <programlisting>LoadModule php5_module libexec/apache/libphp5.so +AddModule mod_php5.c + <IfModule mod_php5.c> + DirectoryIndex index.php index.html + </IfModule> + + <IfModule mod_php5.c> + AddType application/x-httpd-php .php + AddType application/x-httpd-php-source .phps + </IfModule></programlisting> + + <para>准备停当, 简单地使用 + <command>apachectl</command> 命令完成一次优雅的 (graceful) + 服务重启:</para> + + <screen>&prompt.root; <userinput>apachectl graceful</userinput></screen> + + <para>在 &os; 中的 <acronym>PHP</acronym> 支持是极端模块化的。 + 如果需要安装某个扩展, 管理员只需安装相应的 port, + 并像上面所建议的那样重新启动 <application>Apache</application> + 就可以了。</para> + + <para>例如, 要将对于 + <application>MySQL</application> 数据库服务器的支持加入 + <acronym>PHP</acronym>5, 只需简单地安装 + <filename role="package">databases/php5-mysql</filename> + 并执行下面的命令:</para> + + <screen>&prompt.root; <userinput>apachectl graceful</userinput></screen> + + <para>这样, 就启用了 <acronym>PHP</acronym> + 的 <application>MySQL</application> 支持。</para> + </sect3> + </sect2> + </sect1> + + <sect1 id="network-ftp"> + <sect1info> + <authorgroup> + <author> + <firstname>Murray</firstname> + <surname>Stokely</surname> + <contrib>Contributed by </contrib> + </author> + </authorgroup> + </sect1info> + <title>文件传输协议 (FTP)</title> + + <indexterm><primary>FTP 服务器</primary></indexterm> + + <sect2> + <title>纵览</title> + + <para>文件传输协议 (FTP) 为用户提供了一个简单的, 与 <acronym + role="File Transfer Protocol">FTP</acronym> 服务器交换文件的方法。 &os; + 系统中包含了 <acronym role="File Transfer Protocol">FTP</acronym> + 服务软件, <application>ftpd</application>。 这使得在 &os; + 上建立和管理 <acronym + role="File Transfer Protocol">FTP</acronym> 服务器变得非常简单。</para> + </sect2> + + <sect2> + <title>配置</title> + + <para>最重要的配置步骤是决定允许哪些帐号访问 FTP 服务器。 + 一般的 &os; 系统包含了一系列系统帐号分别用于执行不同的服务程序, + 但未知的用户不应被允许登录并使用这些帐号。 + <filename>/etc/ftpusers</filename> 文件中, 列出了不允许通过 + FTP 访问的用户。 默认情况下, 这包含了前述的系统帐号, + 但也可以在这里加入其它不应通过 FTP 访问的用户。</para> + + <para>您可能会希望限制通过 FTP 登录的某些用户, + 而不是完全阻止他们使用 FTP。 这可以通过 <filename>/etc/ftpchroot</filename> + 文件来完成。 这一文件列出了希望对 FTP 访问进行限制的用户和组的表。 + 而在 &man.ftpchroot.5; 联机手册中, 已经对此进行了详尽的介绍, + 故而不再赘述。</para> + + <indexterm> + <primary>FTP</primary> + <secondary>匿名</secondary> + </indexterm> + + <para>如果您想要在服务器上启用匿名的 FTP 访问, 则必须建立一个名为 + <username>ftp</username> 的 &os; 用户。 这样, 用户就可以使用 + <username>ftp</username> 或 <username>anonymous</username> + 和任意的口令 (习惯上, 应该是以那个用户的邮件地址作为口令) + 来登录和访问您的 FTP 服务器。 FTP 服务器将在匿名用户登录时调用 + &man.chroot.2;, 以便将其访问限制在 + <username>ftp</username> 用户的主目录中。</para> + + <para>有两个文本文件可以用来指定显示在 FTP 客户程序中的欢迎文字。 + <filename>/etc/ftpwelcome</filename> 文件中的内容将在用户连接上之后, + 在登录提示之前显示。 在成功的登录之后, 将显示 + <filename>/etc/ftpmotd</filename> 文件中的内容。 + 请注意后者是相对于登录环境的, 因此对于匿名用户而言, + 将显示 <filename>~ftp/etc/ftpmotd</filename>。</para> + + <para>一旦正确地配置了 FTP 服务器, + 就必须在 <filename>/etc/inetd.conf</filename> 中启用它。 + 这里需要做的全部工作就是将注释符 + <quote>#</quote> 从已有的 + <application>ftpd</application> 行之前去掉:</para> + + <programlisting>ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l</programlisting> + + <para>如 <xref linkend="network-inetd-hangup"> 所介绍的那样, + 修改这个文件之后, 需要向 <application>inetd</application> 发送 + HangUP 信号。</para> + + <para>现在可以通过输入下面的命令来登录您的 FTP 服务器了:</para> + + <screen>&prompt.user; <userinput>ftp localhost</userinput></screen> + + </sect2> + + <sect2> + <title>维护</title> + + <indexterm><primary>syslog</primary></indexterm> + <indexterm><primary>日志文件</primary> + <secondary>FTP</secondary></indexterm> + + <para><application>ftpd</application> 服务程序使用 + &man.syslog.3; 来记录消息。 默认情况下, + 系统日志将把和 FTP 相关的消息记录到 + <filename>/var/log/xferlog</filename> 文件中。 FTP 日志的位置, + 可以通过修改 + <filename>/etc/syslog.conf</filename> 中如下所示的行来修改:</para> + + <programlisting>ftp.info /var/log/xferlog</programlisting> + + <indexterm> + <primary>FTP</primary> + <secondary>匿名</secondary> + </indexterm> + + <para>一定要小心对待在匿名 FTP 服务器中可能遇到的潜在问题。 + 一般而言, 允许匿名用户上传文件应三思。 您可能发现自己的 FTP + 站点成为了交易未经授权的商业软件的论坛, 或发生更糟糕的情况。 + 如果不需要匿名的 FTP 上传, 可以在文件上配置权限, + 使得您能够在其它匿名用户能够下载这些文件之前复查它们。</para> + + </sect2> </sect1> <sect1 id="network-samba"> @@ -2253,23 +4231,218 @@ zone "0.168.192.in-addr.arpa" { </author> </authorgroup> </sect1info> - <title>File and Print Services for µsoft.windows; clients (Samba) ** 翻译进行中 **</title> + <title>为 µsoft.windows; 客户机提供文件和打印服务 (Samba)</title> - <indexterm><primary>Samba server</primary></indexterm> + <indexterm><primary>Samba 服务器</primary></indexterm> <indexterm><primary>Microsoft Windows</primary></indexterm> <indexterm> - <primary>file server</primary> - <secondary>Windows clients</secondary> + <primary>文件服务器</primary> + <secondary>Windows 客户机</secondary> </indexterm> <indexterm> - <primary>print server</primary> - <secondary>Windows clients</secondary> + <primary>打印服务器</primary> + <secondary>Windows 客户机</secondary> </indexterm> <sect2> - <title>Overview ** 翻译进行中 **</title> + <title>纵览</title> + + <para><application>Samba</application> 是一个流行的开远软件包, + 它提供了针对 µsoft.windows; 客户机的文件和打印服务。 + 这类客户机可以连接并使用 FreeBSD 系统上的文件空间, + 就如同使用本地的磁盘一样, 或者像使用本地打印机一样使用 + FreeBSD 上的打印机。</para> + + <para><application>Samba</application> 软件包可以在您的 FreeBSD + 安装盘上找到。 如果您没有在初次安装 FreeBSD + 时安装 <application>Samba</application>, 则可以通过 <filename + role="package">net/samba3</filename> port 或 package 来安装。</para> + +<!-- mention LDAP, Active Directory, WinBIND, ACL, Quotas, PAM, .. --> - <para></para> + </sect2> + + <sect2> + <title>配置</title> + + <para>默认的 <application>Samba</application> 配置文件会以 + <filename>/usr/local/etc/smb.conf.default</filename> 的名字安装。 + 这个文件必须复制为 + <filename>/usr/local/etc/smb.conf</filename> 并进行定制, + 才能开始使用 <application>Samba</application>。</para> + + <para><filename>smb.conf</filename> 文件中包含了 + <application>Samba</application> 的运行时配置信息, + 例如对于打印机的定义, 以及希望共享给 &windows; + 客户机的 <quote>共享文件系统</quote>。 + <application>Samba</application> 软件包包含了一个称为 + <application>swat</application> 的 web 管理工具, + 后者提供了配置 <filename>smb.conf</filename> 文件的简单方法。</para> + + <sect3> + <title>使用 Samba Web 管理工具 (SWAT)</title> + + <para>Samba Web 管理工具 (SWAT) 是一个通过 + <application>inetd</application> 运行的服务程序。 因此, + 需要把 <filename>/etc/inetd.conf</filename> 中下面几行的注释去掉, + 才能够使用 <application>swat</application> + 来配置 <application>Samba</application>:</para> + + <programlisting>swat stream tcp nowait/400 root /usr/local/sbin/swat</programlisting> + <para>如同 <xref linkend="network-inetd-hangup"> 中介绍的那样, + 修改配置文件之后, 需要向 <application>inetd</application> 发送 + HangUP 信号。</para> + + <para>一旦在 <filename>inetd.conf</filename> 中启用了 + <application>swat</application>, 就可以用浏览器访问 + connect to <ulink url="http://localhost:901"></ulink> 了。 + 您将首先使用系统的 <username>root</username> + 帐号登录。</para> + +<!-- XXX screenshots go here, loader is creating them --> + + <para>只要成功地登录进了 + <application>Samba</application> 配置页面, + 就可以浏览系统的文档, 或从 + <guimenu>Globals</guimenu>(全局) 选项卡开始配置了。 + <guimenu>Globals</guimenu> 小节对应于 <literal>[global]</literal> + 小节中的变量, 前者位于 + <filename>/usr/local/etc/smb.conf</filename> 中。</para> + </sect3> + + <sect3> + <title>全局配置</title> + + <para>无论是使用 <application>swat</application>, + 还是直接编辑 <filename>/usr/local/etc/smb.conf</filename>, + 通常首先要配置的 <application>Samba</application> + 选项都是:</para> + + <variablelist> + <varlistentry> + <term><literal>workgroup</literal></term> + + <listitem> + <para>NT 域名或工作组名, + 其他计算机将通过这些名字来找到服务器。</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><literal>netbios name</literal></term> + <indexterm><primary>NetBIOS</primary></indexterm> + + <listitem> + <para>这个选项用于设置 <application>Samba</application> 服务器的 + NetBIOS 名字。 默认情况下, 这是所在主机的 DNS 名字的第一部分。</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><literal>server string</literal></term> + + <listitem> + <para>这个选项用于设置通过 <command>net view</command> + 命令, 以及某些其他网络工具可以查看到的关于服务器的说明性文字。</para> + </listitem> + </varlistentry> + </variablelist> + </sect3> + + <sect3> + <title>安全配置</title> + + <para>在 + <filename>/usr/local/etc/smb.conf</filename> 中的两个最重要的配置, + 是选定的安全模型, 以及客户机上用户的口令存放后端。 + 下面的语句控制这些选项:</para> + + <variablelist> + <varlistentry> + <term><literal>security</literal></term> + + <listitem> + <para>最常见的选项形式是 + <literal>security = share</literal> 和 <literal>security + = user</literal>。 如果您的客户机使用用户名, + 并且这些用户名与您的 &os; 机器一致, + 一般应选择用户级 (user) 安全。 这是默认的安全策略, + 它要求客户机首先登录, 然后才能访问共享的资源。</para> + + <para>如果采用共享级 (share) 安全, + 则客户机不需要用有效的用户名和口令登录服务器, + 就能够连接共享的资源。 这是较早版本的 + <application>Samba</application> 中的默认值。</para> + </listitem> + </varlistentry> + + <varlistentry> + <term><literal>passdb backend</literal></term> + + <indexterm><primary>NIS+</primary></indexterm> + <indexterm><primary>LDAP</primary></indexterm> + <indexterm><primary>SQL 数据库</primary></indexterm> + + <listitem> + <para><application>Samba</application> 提供了若干种不同的验证后端模型。 + 您可以通过 LDAP、 NIS+、 SQL 数据库, 或经过修改的口令文件, + 来完成客户端的身份验证。 默认的验证模式是 + <literal>smbpasswd</literal>, 这也是本章将介绍的全部内容。</para> + </listitem> + </varlistentry> + </variablelist> + + <para>假设您使用的是默认的 <literal>smbpasswd</literal> + 后端, 则必须首先创建一个 + <filename>/usr/local/private/smbpasswd</filename> 文件, + 来允许 <application>Samba</application> 对客户进行身份验证。 + 如果您打算让所有的 &unix; 用户帐号都能够从 &windows; + 客户机上登录, 可以使用下面的命令:</para> + + <screen>&prompt.root; <userinput>grep -v "^#" /etc/passwd | make_smbpasswd > /usr/local/private/smbpasswd</userinput> +&prompt.root; <userinput>chmod 600 /usr/local/private/smbpasswd</userinput></screen> + + <para>请参见 <application>Samba</application> 的文档, + 以了解关于配置选项的进一步信息。 按照前面给出的描述, + 您应该已经可以启动 + <application>Samba</application> 了。</para> + </sect3> + + </sect2> + <sect2> + <title>启动 <application>Samba</application></title> + + <para>要在系统引导时启动 <application>Samba</application>, + 将下面的配置加入 + <filename>/etc/rc.conf</filename>:</para> + + <programlisting>samba_enable="YES"</programlisting> + + <para>现在可以在任何时候通过下面的命令来启动 + <application>Samba</application> 了:</para> + + <screen>&prompt.root; <userinput>/usr/local/etc/rc.d/samba.sh start</userinput> +Starting SAMBA: removing stale tdbs : +Starting nmbd. +Starting smbd.</screen> + + <para><application>Samba</application> 事实上包含了三个相互独立的服务程序。 + 您应该能够看到 + <application>nmbd</application> 和 <application>smbd</application> + 两个服务程序都是通过 <filename>samba.sh</filename> 脚本启动的。 如果在 + <filename>smb.conf</filename> 中启用了 winbind 名字解析服务, + 则应该可以看到 <application>winbindd</application> + 服务被启动起来。</para> + + <para>可以在任何时候通过下面的命令来停止运行 + <application>Samba</application>:</para> + + <screen>&prompt.root; <userinput>/usr/local/etc/rc.d/samba.sh stop</userinput></screen> + + <para><application>Samba</application> 是一个复杂的软件包, + 它提供了用于与 µsoft.windows; 网络进行集成的各式各样的功能。 + 要了解关于这里所介绍的基本安装以外的其它功能, + 请访问 <ulink url="http://www.samba.org"></ulink>。</para> </sect2> </sect1> @@ -2284,9 +4457,220 @@ zone "0.168.192.in-addr.arpa" { </author> </authorgroup> </sect1info> - <title>Clock Synchronization with NTP ** 翻译进行中 **</title> + <title>通过 NTP 进行时钟同步</title> + + <indexterm><primary>NTP</primary></indexterm> + + <sect2> + <title>纵览</title> + + <para>随着时间的推移, 计算机的时钟会倾向于漂移。 + 网络时间协议 (NTP) 是一种确保您的时钟保持准确的方法。</para> - <para></para> + <para>许多 Internet 服务依赖于, 或极大地受益于本地计算机时钟的准确性。 + 例如, web 服务器可能会接收到一个请求, + 要求如果文件在某一时刻之后修改过才发送它。 + 在局域网环境中, 共享文件的计算机之间的时钟是否同步至关重要, + 因为这样才能使时间戳保持一致。 类似 &man.cron.8; + 这样的程序, 也依赖于正确的系统时钟, 才能够准确地执行操作。</para> + + <indexterm> + <primary>NTP</primary> + <secondary>ntpd</secondary> + </indexterm> + <para>FreeBSD 附带了 &man.ntpd.8; <acronym role="Network + Time Protocol">NTP</acronym> 服务器, + 它可以用于查询其它的 <acronym role="Network Time Protocol">NTP</acronym> + 服务器, 并配置本地计算机的时钟, 或者为其它机器提供服务。</para> + </sect2> + + <sect2> + <title>选择合适的 NTP 服务器</title> + + <indexterm> + <primary>NTP</primary> + <secondary>选择服务器</secondary> + </indexterm> + + <para>为了同步您的系统时钟, + 需要首先找到至少一个 <acronym role="Network Time + Protocol">NTP</acronym> 服务器以供使用。 网络管理员, + 或 ISP 都可能会提供用于这样目的的 NTP + 服务器—请查看他们的文档以了解是否是这样。 + 另外, 也有一个在线的 <ulink + url="http://ntp.isc.org/bin/view/Servers/WebHome">公开的 + NTP 服务器列表</ulink>, 您可以从中选一个较近的 NTP 服务器。 + 请确认您选择的服务器的访问策略, 如果需要的话, + 申请一下所需的许可。</para> + + <para>选择多个相互不连接的 NTP 服务器是一个好主意, + 这样在某个服务器不可达, 或者时钟不可靠时就可以有别的选择。 + 这是因为, &man.ntpd.8; + 会智能地选择它收到的响应—它会更倾向于使用可靠的服务器。</para> + </sect2> + + <sect2> + <title>配置您的机器</title> + + <indexterm> + <primary>NTP</primary> + <secondary>配置</secondary> + </indexterm> + + <sect3> + <title>基本配置</title> + <indexterm><primary>ntpdate</primary></indexterm> + + <para>如果只想在系统启动时同步时钟, + 则可以使用 &man.ntpdate.8;。 对于经常重新启动, + 并且不需要经常同步的桌面系统来说这比较适合, + 但绝大多数机器都应该运行 &man.ntpd.8;。</para> + + <para>在引导时使用 &man.ntpdate.8; 来配合运行 &man.ntpd.8; + 也是一个好主意。 &man.ntpd.8; 渐进地修正时钟, + 而 &man.ntpdate.8; 则直接设置时钟, + 无论机器的当前时间和正确时间有多大的偏差。</para> + + <para>要启用引导时的 &man.ntpdate.8;, 需要把 + <literal>ntpdate_enable="YES"</literal> 加到 + <filename>/etc/rc.conf</filename> 中。 此外, + 还需要通过 <varname>ntpdate_flags</varname> + 来设置同步的服务器和选项, + 它们将传递给 &man.ntpdate.8;。</para> + </sect3> + + <sect3> + <indexterm> + <primary>NTP</primary> + <secondary>ntp.conf</secondary> + </indexterm> + + <title>一般配置</title> + + <para>NTP 是通过 + <filename>/etc/ntp.conf</filename> 文件来进行配置的, + 其格式在 &man.ntp.conf.5; 中进行了描述。 + 下面是一个例子:</para> + + <programlisting>server ntplocal.example.com prefer +server timeserver.example.org +server ntp2a.example.net + +driftfile /var/db/ntp.drift</programlisting> + + <para>这里, <literal>server</literal> 选项指定了使用哪一个服务器, + 每一个服务器都列为移行。 如果某一台服务器上指定了 <literal>prefer</literal> + (偏好) 参数, 如上面的 <hostid + role="fqdn">ntplocal.example.com</hostid>, + 则会优先选择这个服务器。 + 如果偏好的服务器和其他服务器的响应存在显著的差别, + 则丢弃它的响应, 否则将使用来自它的响应, + 而不理会其他服务器。 一般来说, + <literal>prefer</literal> 参数应该标注在非常精确的 NTP + 时源, 例如那些包含特殊的时间监控硬件的服务器上。</para> + + <para>而 <literal>driftfile</literal> 选项, + 则指定了用来保存系统时钟频率偏差的文件。 + &man.ntpd.8; 程序使用它来自动地补偿时钟的自然漂移, + 从而使时钟即使在切断了外来时源的情况下, + 仍能保持相当的准确度。</para> + + <para>另外, <literal>driftfile</literal> + 选项也保存上一次响应所使用的 NTP 服务器的信息。 + 这个文件包含了 NTP 的内部信息, 它不应被任何其他进程修改。</para> + </sect3> + + <sect3> + <title>控制您的服务器的访问</title> + + <para>默认情况下, NTP 服务器可以被整个 Internet 上的主机访问。 + 如果在 <filename>/etc/ntp.conf</filename> 中指定 <literal>restrict</literal> + 参数, 则可以控制允许哪些机器访问您的服务器。</para> + + <para>如果希望拒绝所有的机器访问您的 NTP + 服务器, 只需在 + <filename>/etc/ntp.conf</filename> 中加入:</para> + + <programlisting>restrict default ignore</programlisting> + + <para>如果只希望子网内的机器通过您的服务器同步时钟, + 而不允许它们配置为服务器, 或作为同步时钟的节点来时用, + 则加入</para> + + <programlisting>restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap</programlisting> + + <para>这里, 需要把 <hostid role="ipaddr">192.168.1.0</hostid> 改为您网络上的 + IP 地址, 并把 <hostid + role="netmask">255.255.255.0</hostid> 改为您的子网掩码。</para> + + <para><filename>/etc/ntp.conf</filename> 可能包含多个 + <literal>restrict</literal> 选项。 要了解进一步的细节, + 请参见 &man.ntp.conf.5; 的 + <literal>Access Control Support</literal>(访问控制支持) + 小节。</para> + </sect3> + </sect2> + + <sect2> + <title>运行 NTP 服务器</title> + + <para>要让 NTP 服务器在系统启动时随之开启, + 需要把 <literal>ntpd_enable="YES"</literal> 加入到 + <filename>/etc/rc.conf</filename> 中。 + 如果希望向 &man.ntpd.8; 传递更多参数, 需要编辑 + <filename>/etc/rc.conf</filename> 中的 + <varname>ntpd_flags</varname>。</para> + + <para>要在不重新启动机器的前提下启动服务器, 需要手工运行 + <command>ntpd</command>, 并带上 + <filename>/etc/rc.conf</filename> + 中的 <varname>ntpd_flags</varname> 所指定的参数。 + 例如:</para> + + <screen>&prompt.root; <userinput>ntpd -p /var/run/ntpd.pid</userinput></screen> + + <note> + <para>在 &os; 4.X 中, + 需要把上述参数中的 <literal>ntpd</literal> + 改为 <literal>xntpd</literal>。</para></note> + </sect2> + + <sect2> + <title>在临时性的 Internet 连接上使用 ntpd</title> + + <para>&man.ntpd.8; 程序的正常工作并不需要永久性的 Internet 连接。 + 然而, 如果您的临时性连接是配置为按需拨号的, + 那么防止 NTP 通讯频繁触发拨号, 或保持连接就有必要了。 + 如果您使用用户级 PPP, 可以使用 <literal>filter</literal> + 语句, 在 <filename>/etc/ppp/ppp.conf</filename> 中进行必要的设置。 + 例如:</para> + + <programlisting> 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</programlisting> + + <para>要了解进一步的信息, 请参考 &man.ppp.8; 的 <literal>PACKET + FILTERING</literal>(包过滤) 小节, 以及 + <filename>/usr/share/examples/ppp/</filename> 中的例子。</para> + + <note> + <para>某些 Internet 访问提供商会阻止低编号的端口, + 这会导致 NTP 无法正常工作, 因为响应无法到达您的机器。</para> + </note> + </sect2> + + <sect2> + <title>进一步的信息</title> + + <para>关于 NTP 服务器的文档, 可以在 + <filename>/usr/share/doc/ntp/</filename> 找到 HTML + 格式的版本。</para> + </sect2> </sect1> </chapter> |