diff --git a/zh_CN.GB2312/books/handbook/advanced-networking/chapter.sgml b/zh_CN.GB2312/books/handbook/advanced-networking/chapter.sgml index c6a8bb93ba..40c3aa38ca 100644 --- a/zh_CN.GB2312/books/handbook/advanced-networking/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/advanced-networking/chapter.sgml @@ -1,4354 +1,4371 @@ 高级网络 概述 本章将就一系列与网络有关的高级话题进行讨论。 读完这章,您将了解: 关于网关和路由的基础知识。 如何配置 IEEE 802.11 和 蓝牙(&bluetooth;) 设备。 如何用 FreeBSD 做网桥。 如何为无盘机上配置网络启动。 如何配置网络地址转换 (NAT)。 如何使用 PLIP 连接两台计算机。 如何在运行 FreeBSD 的计算机上配置 IPv6。 如何配置 ATM。 在读这章之前, 您应: 理解 /etc/rc 脚本的基本知识。 熟悉基本的网络术语。 了解如何配置和安装新的 FreeBSD 内核 ()。 了解如何安装第三方软件 ()。 Coranth Gryphon 贡献者: 雪平 中文翻译:
zxpmyth@yahoo.com.cn
苏义
网关和路由 路由 网关 子网 要让网络上的两台计算机能够相互通讯, 就必须有一种能够描述如何从一台计算机到另一台计算机的机制, 这一机制称作 路由选择(routing)路由项 是一对预先定义的地址: 目的地(destination)网关(gateway)。 这个地址对所表达的意义是, 通过 网关 能够完成与 目的地 的通信。 有三种类型的目的地址: 单个主机、 子网、 以及 默认。 如果没有可用的其它路由, 就会使用 默认路由, 有关默认路由的内容, 将在稍后的章节中进行讨论。 网关也有三种类型: 单个主机, 网络接口 (也叫 链路 (links)) 和以太网硬件地址 (MAC 地址)。 实例 为了说明路由选择的各个部分, 首先来看看下面的例子。 这是 netstat 命令的输出: &prompt.user; netstat -r Routing tables Destination Gateway Flags Refs Use Netif Expire default outside-gw UGSc 37 418 ppp0 localhost localhost UH 0 181 lo0 test0 0:e0:b5:36:cf:4f UHLW 5 63288 ed0 77 10.20.30.255 link#1 UHLW 1 2421 example.com link#1 UC 0 0 host1 0:e0:a8:37:8:1e UHLW 3 4601 lo0 host2 0:e0:a8:37:8:1e UHLW 0 5 lo0 => host2.example.com link#1 UC 0 0 224 link#1 UC 0 0 默认路由 头两行给出了当前配置中的默认路由 (将在 下一节 中进行介绍) 和 localhost (本机) 路由。 回环设备 这里的路由表中给出的用于 localhost 的接口 (Netif 列) 是 lo0, 也就是大家熟知的 回环设备。 它表示所有以此为 目的地 的通信都留在本机, 而不通过 LAN 发出, 因为这些流量最终会回到起点。 以太网 MAC 地址 接着出现的是以 0:e0: 开头的地址。这些是以太网硬件地址,也称为 MAC 地址。 FreeBSD 会自动识别在同一个以太网中的任何主机 (如 test0), 并为其新增一个路由, 并通过那个以太网接口 — ed0 直接与它通讯 (译者注:那台主机)。与这类路由表相关的也有一个超时项 (Expire列),当我们在指定时间内没有收到从那个主机发来的信息, 这项就派上用场了。这种情况下,到这个主机的路由就会被自动删除。 这些主机被使用一种叫做RIP(路由信息协议--Routing Information Protocol)的机制所识别,这种机制利用基于最短路径选择 (shortest path determination)的办法计算出到本地主机的路由。 子网 FreeBSD 也会为本地子网添加子网路由(10.20.30.255 是子网 10.20.30 的广播地址,而 example.com 是这个子网相联的域名)。 名称 link#1 代表主机上的第一块以太网卡。 您会发现,对于它们没有指定另外的接口。 这两个组(本地网络主机和本地子网)的路由是由守护进程 routed 自动配置的。如果它没有运行, 那就只有被静态定义 (例如,明确输入的) 的路由才存在了。 host1 行代表我们的主机,它通过以太网地址来识别。 因为我们是发送端,FreeBSD知道使用回环接口 (lo0) 而不是通过以太网接口来进行发送。 两个 host2 行是我们使用 &man.ifconfig.8; 别名 (请看关于以太网的那部分就会知道我们为什么这么做) 时产生的一个实例。在 lo0 接口之后的 => 符号表明我们不仅使用了回环 (因为这个地址也涉及了本地主机),而且明确指出它是个别名。 这类路由只有在支持别名的主机上才能显现出来。 所有本地网上的其它的主机对于这类路由只会简单拥有 link#1 最后一行 (目标子网224) 用于处理多播——它会覆盖到其它的区域。 最后,每个路由的不同属性可以在 Flags 列中看到。下边是个关于这些标志和它们的含义的一个简表: U Up: 路由处于活动状态。 H Host: 路由目标是单个主机。 G Gateway: 所有发到目的地的网络传到这一远程系统上, 并由它决定最后发到哪里。 S Static: 这个路由是手工配置的,不是由系统自动生成的。 C Clone: 生成一个新的路由, 通过这个路由我们可以连接上这些机子。 这种类型的路由通常用于本地网络。 W WasCloned: 指明一个路由——它是基于本地区域网络 (克隆) 路由自动配置的。 L Link: 路由涉及到了以太网硬件。 默认路由 默认路由 当本地系统需要与远程主机建立连接时, 它会检查路由表以决定是否有已知的路径存在。 如果远程主机属于一个我们已知如何到达 (克隆的路由) 的子网内,那么系统会检查看沿着那个接口是否能够连接。 如果所有已知路径都失败,系统还有最后一个选择: 默认路由。这个路由是特殊类型的网关路由 (通常只有一个存在于系统里),并且总是在标志栏使用一个 c来进行标识。对于本地区域网络里的主机, 这个网关被设置到任何与外界有直接连接的机子里 (无论是通过 PPP、DSL、cable modem、T1 或其它的网络接口连接)。 如果您正为某台本身就做为网关连接外界的机子配置默认路由的话, 那么该默认路由应该是您的互联网服务商 (ISP)那方的网关机子。 让我们来看一个关于默认路由的例子。这是个很普遍的配置: [Local2] <--ether--> [Local1] <--PPP--> [ISP-Serv] <--ether--> [T1-GW] 主机 Local1Local2 在您那边。Local1 通过 PPP 拨号连接到了 ISP。这个 PPP 服务器通过一个局域网连接到另一台网关机子——它又通过一个外部接口连接到 ISP 提供的互联网上。 您的每一台机子的默认路由应该是: Host Default Gateway Interface Local2 Local1 Ethernet Local1 T1-GW PPP 一个常见的问题是我们为什么 (或怎样) 能将 T1-GW 设置成为 Local1 默认网关,而不是它所连接 ISP 服务器? 记住,因为 PPP 接口使用的一个地址是在 ISP 的局域网里的,用于您那边的连接,对于 ISP 的局域网里的其它机子,其路由会自动产生。 因此,您就已经知道了如何到达机子 T1-GW, 那么也就没必要中那一步了——发送通信给 ISP 服务器。 通常使用地址 X.X.X.1 做为一个局域网的网关。 因此 (使用相同的例子),如果您本地的 C 类地址空间是 10.20.30,而您的 ISP 使用的是 10.9.9, 那么默认路由表将是: Host Default Route Local2 (10.20.30.2) Local1 (10.20.30.1) Local1 (10.20.30.1, 10.9.9.30) T1-GW (10.9.9.1) 您可以很轻易地通过 /etc/rc.conf 文件设定默认路由。在我们的实例里,在主机 Local2 里,我们在文件 /etc/rc.conf 里增加了下边内容: defaultrouter="10.20.30.1" 也可以直接在命令行使用 &man.route.8; 命令: &prompt.root; route add default 10.20.30.1 要了解关于如何手工维护网络路由表的进一步细节, 请参考 &man.route.8; 联机手册。 重宿主机(Dual Homed Hosts) 重宿 主机 还有一种其它的类型的配置是我们要提及的, 这就是一个主机处于两个不同的网络。技术上,任何作为网关 (上边的实例中,使用了 PPP 连接) 的机子就算作是重宿主机。 但这个词实际上仅用来指那种处于两个局域网之中的机子。 有一种情形,一台机子有两个网卡, 对于各个子网都有各自的一个地址。另一种情况, 这台机子仅有一张网卡,但使用 &man.ifconfig.8; 做了别名。如果有两个独立的以太网在使用的情形就使用前者, 如果只有一个物理网段,但逻辑上分成了两个独立的子网, 就使用后者。 每种情况都要设置路由表以便两子网都知道这台主机是到其它子网的网关——入站路由 (inbound route)。将一台主机配置成两个子网间的路由器, 这种配置经常在我们需要实现单向或双向的包过滤或防火墙时被用到。 如果想让主机在两个接口间转发数据包,您需要激活 FreBSD 的这项功能。至于怎么做,请看下一部分了解更多。 建立路由器 路由器 网络路由器只是一个将数据包从一个接口转发到另一个接口的系统。 互联网标准和良好的工程实践阻止了 FreeBSD 计划在 FreeBSD 中把它置成默认值。您在可以在 &man.rc.conf.5; 中改变下列变量的值为 YES,使这个功能生效: gateway_enable=YES # Set to YES if this host will be a gateway 这个选项会把&man.sysctl.8; 变量——net.inet.ip.forwarding 设置成 1。如果您要临时地停止路由, 您可以把它重设为 0 新的路由器需要有路由才知道将数据传向何处。 如果网络够简单,您可以使用静态路由。FreeBSD 也自带一个标准的BSD路由选择守护进程 &man.routed.8;, 称之为 RIP ( version 1和 version 2) 和 IRDP。对 BGP v4,OSPF v2 和其它复杂路由选择协议的支持可以从 net/zebra 包中得到。 像 &gated; 一样的商业产品也提供了更复杂的网络路由解决方案。 BGP RIP OSPF Coranth Gryphon 贡献者: 雪平 中文翻译:
zxpmyth@yahoo.com.cn
苏义
设置静态路由 手动配置 假设如下这样一个网络: INTERNET | (10.0.0.1/24) Default Router to Internet | |Interface xl0 |10.0.0.10/24 +------+ | | RouterA | | (FreeBSD gateway) +------+ | Interface xl1 | 192.168.1.1/24 | +--------------------------------+ Internal Net 1 | 192.168.1.2/24 | +------+ | | RouterB | | +------+ | 192.168.2.1/24 | Internal Net 2 在这里,RouterA 是我们的 &os; 机子,它充当连接到互联网其它部分的路由器的角色。 默认路由设置为10.0.0.1, 它就允许与外界连接。我们假定已经正确配置了 RouterB,并且知道如何连接到想去的任何地方。 (在这个图里很简单。只须在 RouterB 上增加默认路由,使用 192.168.1.1 做为网关。) 如果我们查看一下RouterA的路由表, 我们就会看到如下一些内容: &prompt.user; netstat -nr Routing tables Internet: Destination Gateway Flags Refs Use Netif Expire default 10.0.0.1 UGS 0 49378 xl0 127.0.0.1 127.0.0.1 UH 0 6 lo0 10.0.0/24 link#1 UC 0 0 xl0 192.168.1/24 link#2 UC 0 0 xl1 使用当前的路由表,RouterA 是不能到达我们的内网——Internal Net 2 的。它没有到 192.168.2.0/24 的路由。 一种可以接受的方法是手工增加这条路由。以下的命令会把 Internal Net 2 网络加入到 RouterA 的路由表中,使用192.168.1.2 做为下一个跳跃: &prompt.root; route add -net 192.168.2.0/24 192.168.1.2 现在 RouterA 就可以到达 192.168.2.0/24 网络上的任何主机了。 永久配置 上面的实例对于运行着的系统来说配置静态路由是相当不错了。 只是,有一个问题——如果您重启您的 &os; 机子,路由信息就会消失。 处理附加的静态路由的方法是把它放到您的 /etc/rc.conf 文件里去。 # Add Internal Net 2 as a static route static_routes="internalnet2" route_internalnet2="-net 192.168.2.0/24 192.168.1.2" 配置变量 static_routes 是一串以空格格开的字符串。每一串表示一个路由名字。 在上面的例子中我们中有一个串在 static_routes 里。这个字符串中 internalnet2。 然后我们新增一个配置变量 route_internalnet2, 这里我们把所有传给 &man.route.8;命令的参数拿了过来。 在上面的实例中的我使用的命令是: &prompt.root; route add -net 192.168.2.0/24 192.168.1.2 因此,我们需要的是 "-net 192.168.2.0/24 192.168.1.2" 前边已经提到, 可以把多个静态路由的名称, 放到 static_routes 里边。 接着我们就来建立多个静态路由。 下面几行所展示的, 是在一个假想的路由器上增加 192.168.0.0/24192.168.1.0/24 之间静态路由的例子: static_routes="net1 net2" route_net1="-net 192.168.0.0/24 192.168.0.1" route_net2="-net 192.168.1.0/24 192.168.1.1"
路由传播 路由 传播 我们已经讨论了如何定义通向外界的路由, 但未谈及外界是如何找到我们的。 我们已经知道可以设置路由表, 这样任何指向特定地址空间 (在我们的例子中是一个 C 类子网) 的数据都会被送往网络上特定的主机, 然后由这台主机向地址空间内部转发数据。 当您得到一个分配给您的网络的地址空间时, ISP(网络服务商)会设置它们的路由表, 这样指向您子网的数据就会通过 PPP 连接下传到您的网络。 但是其它跨越国界的网络是如何知道将数据传给您的 ISP 的呢? 有一个系统(很像分布式 DNS 信息系统), 它一直跟踪被分配的地址空间, 并说明它们连接到互联网骨干(Internet backbone)的点。 骨干(Backbone) 指的是负责全世界和跨国的传输的主要干线。 每一台骨干主机(backbone machine)有一份主要表集的副本, 它将发送给特定网络的数据导向相应的骨干载体上(backbone carrier), 从结点往下遍历服务提供商链,直到数据到达您的网络。 服务提供商的任务是向骨干网络广播,以声明它们就是通向您的网点的连接结点 (以及进入的路径)。这就是路由传播。 问题解答 traceroute 有时候,路由传播会有一个问题,一些网络无法与您连接。 或许能帮您找出路由是在哪里中断的最有用的命令就是 &man.traceroute.8;了。当您无法与远程主机连接时, 这个命令一样有用(例如 &man.ping.8; 失败)。 &man.traceroute.8; 命令将以您想连接的主机的名字作为参数执行。 不管是到达了目标,还是因为没有连接而终止, 它都会显示所经过的所有网关主机。 想了解更多的信息,查看 &man.traceroute.8; 的手册。 多播路由 多播路由 内核选项 MROUTING FreeBSD 一开始就支持多播应用软件和多播路由选择。 多播程序并不要求FreeBSD的任何特殊的配置, 就可以工作得很好。多播路由需要支持被编译入内核: options MROUTING 另外,多播路由守护进程——&man.mrouted.8; 必须通过 /etc/mrouted.conf 配置来开启通道和 DVMRP。 更多关于多播路由配置的信息可以在 &man.mrouted.8; 的手册里找到。
陈福康 Marc Fonvieille Murray Stokely 无线网络 wireless networking (无线网络) 802.11 wireless networking (无线网络) 无线网络基础 绝大多数无线网络都采用了 IEEE 802.11 标准。 基本的无线网络中, 都包含多个以 2.4GHz 或 5GHz 频段的无线电波广播的站点 (不过, 随所处地域的不同, 或者为了能够更好地进行通讯, 具体的频率会在 2.3GHz 和 4.9GHz 的范围内变化)。 802.11 网络有两种组织方式: 在 infrastructure 模式 中, 一个通讯站作为主站, 其他通讯站都与其关联; 这种网络称为 BSS, 而主站则成为无线访问点 (AP)。 在 BSS 中, 所有的通讯都是通过 AP 来完成的; 即使通讯站之间要相互通讯, 也必须将消息发给 AP。 在第二种形式的网络中, 并不存在主站, 通讯站之间是直接通讯的。 这种网络形式称作 IBSS, 通常也叫做 ad-hoc 网络 802.11 网络最初在 2.4GHz 频段上部署, 并采用了由 IEEE 802.11 和 802.11b 标准所定义的协议。 这些标准定义了采用的操作频率、 包括分帧和传输速率 (通讯过程中可以使用不同的速率) 在内的 MAC 层特性等。 稍后的 802.11a 标准定义了使用 5GHz 频段进行操作, 以及不同的信号机制和更高的传输速率。 其后定义的 802.11g 标准启用了在 2.4GHz 上如何使用 802.11a 信号和传输机制, 以提供对较早的 802.11b 网络的向前兼容。 802.11 网络中采用的各类底层传输机制提供了不同类型的安全机制。 最初的 802.11 标准定义了一种称为 WEP 的简单安全协议。 这个协议采用固定的预发布密钥, 并使用 RC4 加密算法来对在网络上传输的数据进行编码。 全部通讯站都必须采用同样的固定密钥才能通讯。 这一格局已经被证明很容易被攻破, 因此目前已经很少使用了, 采用这种方法只能让那些接入网络的用户迅速断开。 最新的安全实践是由 IEEE 802.11i 标准给出的, 它定义了新的加密算法, 并通过一种附加的协议来让通讯站向无线访问点验证身份, 并交换用于进行数据通讯的密钥。 更进一步, 用于加密的密钥会定期地刷新, 而且有机制能够监测入侵的尝试 (并阻止这种尝试)。 无线网络中另一种常用的安全协议标准是 WPA。 这是在 802.11i 之前由业界组织定义的一种过渡性标准。 WPA 定义了在 802.11i 中所规定的要求的子集, 并被设计用来在旧式硬件上实施。 特别地, WPA 要求只使用由最初 WEP 所采用的算法派生的 TKIP 加密算法。 802.11i 则不但允许使用 TKIP, 而且还要求支持更强的加密算法 AES-CCM 来用于加密数据。 (在 WPA 中并没有要求使用 AES 加密算法, 因为在旧式硬件上实施这种算法时所需的计算复杂性太高。) 除了前面介绍的那些协议标准之外, 还有一种需要介绍的标准是 802.11e。 它定义了用于在 802.11 网络上运行多媒体应用, 如视频流和使用 IP 传送的语音 (VoIP) 的协议。 与 802.11i 类似, 802.11e 也有一个前身标准, 通常称作 WME (后改名为 WMM), 它也是由业界组织定义的 802.11e 的子集, 以便能够在旧式硬件中使用多媒体应用。 关于 802.11e 与 WME/WMM 之间的另一项重要区别是, 前者允许对流量通过服务品质 (QoS) 协议和增强媒体访问协议来安排优先级。 对于这些协议的正确实现, 能够实现高速突发数据和流量分级。 从 6.0 版本开始, &os; 支持采用 802.11a, 802.11b 和 802.11g 的网络。 类似地, 它也支持 WPA 和 802.11i 安全协议 (与 11a、 11b 和 11g 配合), 而 WME/WMM 所需要的 QoS 和流量分级, 则在部分无线设备上提供了支持。 基本安装 内核配置 要使用无线网络, 您需要一块无线网卡, 并适当地配置内核令其提供无线网络支持。 后者被分成了多个模块, 因此您只需配置使用您所需要的软件就可以了。 首先您需要的是一个无线设备。 最为常用的一种无线配件是 Atheros 生产的。 这些设备由 &man.ath.4; 驱动程序提供支持, 您需要把下面的配置加入到 /boot/loader.conf 文件中: if_ath_load="YES" Atheros 驱动分为三个部分: 驱动部分 (&man.ath.4;)、 用于处理芯片专有功能的支持层 (&man.ath.hal.4;), 以及一组用以选择传输帧速率的算法 (ath_rate_sample here)。 当以模块方式加载这一支持时, 所需的其它模块会自动加载。 如果您使用的不是 Atheros 设备, 则应选择对应的模块; 例如: if_wi_load="YES" 表示使用基于 Intersil Prism 产品的无线设备 (&man.wi.4; 驱动)。 在这篇文挡余下的部分中, 我们将使用一张 &man.ath.4; 卡作示范, 如果您要套用这些配置的话, 就必须根据实际的配置情况来替换设备名。 在联机手册 &man.wlan.4; 的开头部分给出了一份可用的驱动列表。 如果您的无线设备没有专用于 &os; 的驱动程序, 也可以尝试使用 NDIS 驱动封装机制来直接使用 &windows; 驱动。 在配置好设备驱动之后, 您还需要引入驱动程序所需要的 802.11 网络支持。 对于 &man.ath.4; 驱动而言, 至少需要 &man.wlan.4; 模块; 这个模块会自动随无线设备驱动一同加载。 除此之外, 您还需要提供您希望使用的安全协议所需的加密支持模块。 这些模块是设计来让 &man.wlan.4; 模块根据需要自动加载的, 但目前还必须手工进行配置。 您可以使用下面这些模块: &man.wlan.wep.4;、 &man.wlan.ccmp.4; 和 &man.wlan.tkip.4;。 &man.wlan.ccmp.4; 和 &man.wlan.tkip.4; 这两个驱动都只有在您希望采用 WPA 和/或 802.11i 安全协议时才需要。 如果您的网络是完全开放的 (也就是不加密) 则甚至连 &man.wlan.wep.4; 支持也是不需要的。 要在系统引导时加载这些模块, 就需要在 /boot/loader.conf 中加入下面的配置: wlan_wep_load="YES" wlan_ccmp_load="YES" wlan_tkip_load="YES" 通过系统引导配置文件 (也就是 /boot/loader.conf) 中的这些信息生效, 您必须重新启动运行 &os; 的计算机。 如果不想立刻重新启动, 也可以使用 &man.kldload.8; 来手工加载。 如果不想加载模块, 也可以将这些驱动编译到内核中, 方法是在内核的编译配置文件中加入下面的配置: device ath # Atheros IEEE 802.11 wireless network driver device ath_hal # Atheros Hardware Access Layer device ath_rate_sample # John Bicket's SampleRate control algorithm. device wlan # 802.11 support (Required) device wlan_wep # WEP crypto support for 802.11 devices device wlan_ccmp # AES-CCMP crypto support for 802.11 devices device wlan_tkip # TKIP and Michael crypto support for 802.11 devices 将这些信息写到内核编译配置文件中之后, 您需要重新编译内核, 并重新启动运行 &os; 的计算机。 在系统启动之后, 您会在引导时给出的信息中, 找到类似下面这样的关于无线设备的信息: ath0: <Atheros 5212> mem 0xff9f0000-0xff9fffff irq 17 at device 2.0 on pci2 ath0: Ethernet address: 00:11:95:d5:43:62 ath0: mac 7.9 phy 4.5 radio 5.6 Infrastructure 模式 通常的情形中使用的是 infrastructure 模式或称 BSS 模式。 在这种模式中, 有一系列无线访问点接入了有线网络。 每个无线网都会有自己的名字, 这个名字称作网络的 SSID。 无线客户端都通过无线访问点来完成接入。 &os; 客户机 如何查找无线访问点 您可以通过使用 ifconfig 命令来扫描网络。 由于系统需要在操作过程中切换不同的无线频率并探测可用的无线访问点, 这种请求可能需要数分钟才能完成。 只有超级用户才能启动这种扫描: &prompt.root; ifconfig ath0 up scan SSID BSSID CHAN RATE S:N INT CAPS dlinkap 00:13:46:49:41:76 6 54M 29:0 100 EPS WPA WME freebsdap 00:11:95:c3:0d:ac 1 54M 22:0 100 EPS WPA 在开始扫描之前, 必须将网络接口设为 。 后续的扫描请求就不需要再将网络接口设为 up 了。 扫描会列出所请求到的所有 BSS/IBSS 网络列表。 除了网络的名字 SSID 之外, 我们还会看到 BSSID 即无线访问点的 MAC 地址。 而 CAPS 字段则给出了网络类型及其提供的功能, 其中包括: E Extended Service Set (ESS)。 表示通讯站是 infrastructure 网络 (相对于 IBSS/ad-hoc 网络) 的成员。 I IBSS/ad-hoc 网络。 表示通讯站是 ad-hoc 网络 (相对于 ESS 网络) 的成员。 P 私密。 在 BSS 中交换的全部数据帧均需保证数据保密性。 这表示 BSS 需要通讯站使用加密算法, 例如 WEP、 TKIP 或 AES-CCMP 来加密/解密与其他通讯站交换的数据帧。 S 短前导码 (Short Preamble)。 表示网络采用的是短前导码 (由 802.11b High Rate/DSSS PHY 定义, 短前导码采用 56-位 同步字段, 而不是在长前导码模式中所采用的 128-位 字段)。 s 短碰撞槽时间 (Short slot time)。 表示由于不存在旧式 (802.11b) 通讯站, 802.11g 网络正使用短碰撞槽时间。 要显示目前已知的网络, 可以使用下面的命令: &prompt.root; ifconfig ath0 list scan 这些信息可能会由无线适配器自动更新, 也可使用 手动更新。 快取缓存中的旧数据会自动删除, 因此除非进行更多扫描, 这个列表会逐渐缩小。 基本配置 在这一节中我们将展示一个简单的例子来介绍如何让无线网络适配器在 &os; 中以不加密的方式工作。 在您熟悉了这些概念之后, 我们强烈建议您在实际的使用中采用 WPA 来配置网络。 配置无线网络的过程可分为三个基本步骤: 选择无线访问点、 验证您的通讯站身份, 以及配置 IP 地址。 下面的几节中将分步骤地介绍它们。 选择无线访问点 多数时候让系统以内建的探测方式选择无线访问点就可以了。 这是在您将网络接口置为 up 或在 /etc/rc.conf 中配置 IP 地址时的默认方式, 例如: ifconfig_ath0="DHCP" 如果存在多个无线访问点, 而您希望从中选择具体的一个, 则可以通过指定 SSID 来实现: ifconfig_ath0="ssid your_ssid_here DHCP" 在某些环境中, 多个访问点可能会使用同样的 SSID (通常, 这样做的目的是简化漫游), 这时可能就需要与某个具体的设备关联了。 这种情况下, 您还应指定无线访问点的 BSSID (这时可以不指定 SSID): ifconfig_ath0="ssid your_ssid_here bssid xx:xx:xx:xx:xx:xx DHCP" 除此之外, 还有一些其它的方法能够约束查找无线访问点的范围, 例如限制系统扫描的频段, 等等。 如果您的无线网卡支持多个频段, 这样做可能会非常有用, 因为扫描全部可用频段是一个十分耗时的过程。 要将操作限制在某个具体的频段, 可以使用 参数; 例如: ifconfig_ath0="mode 11g ssid your_ssid_here DHCP" 就会强制卡使用采用 2.4GHz 的 802.11g, 这样在扫描的时候, 就不会考虑那些 5GHz 的频段了。 除此之外, 还可以通过 参数来将操作锁定在特定频率, 以及通过 参数来指定扫描的频段列表。 关于这些参数的进一步信息, 可以在联机手册 &man.ifconfig.8; 中找到。 验证身份 一旦您选定了无线访问点, 您的通讯站就需要完成身份验证, 以便开始发送和接收数据。 身份验证可以通过许多方式进行, 最常用的一种方式称为开放式验证, 它允许任意通讯站加入网络并相互通信。 这种验证方式只应在您第一次配置无线网络进行测试时使用。 其它的验证方式则需要在进行数据通讯之前, 首先进行密钥协商握手; 这些方式要么使用预先分发的密钥或密码, 要么是用更复杂一些的后台服务, 如 RADIUS。 绝大多数用户会使用默认的开放式验证, 而第二多的则是 WPA-PSK, 它也称为个人 WPA, 在 下面 的章节中将进行介绍。 如果您使用 &apple; &airport; Extreme 基站作为无线访问点, 则可能需要同时在两端配置 WEP 共享密钥验证。 这可以通过在 /etc/rc.conf 文件中进行设置, 或使用 &man.wpa.supplicant.8; 程序来手工完成。 如果您只有一个 &airport; 基站, 则可以用类似下面的方法来配置: ifconfig_ath0="authmode shared wepmode on weptxkey 1 wepkey 01234567 DHCP" 一般而言, 应尽量避免使用共享密钥这种验证方法, 因为它以非常受限的方式使用 WEP 密钥, 使得攻击者能够很容易地破解密钥。 如果必须使用 WEP (例如, 为了兼容旧式的设备) 最好使用 WEP 配合 open 验证方式。 关于 WEP 的更多资料请参见 通过 DHCP 获取 IP 地址 在您选定了无线访问点, 并配置了验证参数之后, 还必须获得 IP 地址才能真正开始通讯。 多数时候, 您会通过 DHCP 来获得无线 IP 地址。 要达到这个目的, 只需简单地编辑 /etc/rc.conf 并在配置中加入 DHCP ifconfig_ath0="DHCP" 现在您已经完成了启用无线网络接口的全部准备工作了, 下面的操作将启用它: &prompt.root; /etc/rc.d/netif start 一旦网络接口开始运行, 就可以使用 ifconfig 来查看网络接口 ath0 的状态了: &prompt.root; ifconfig ath0 ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet6 fe80::211:95ff:fed5:4362%ath0 prefixlen 64 scopeid 0x1 inet 192.168.1.100 netmask 0xffffff00 broadcast 192.168.1.255 ether 00:11:95:d5:43:62 media: IEEE 802.11 Wireless Ethernet autoselect (OFDM/54Mbps) status: associated ssid dlinkap channel 6 bssid 00:13:46:49:41:76 authmode OPEN privacy OFF txpowmax 36 protmode CTS bintval 100 这里的 status: associated 表示您已经连接到了无线网络 (在这个例子中, 这个网络的名字是 dlinkap)。 bssid 00:13:46:49:41:76 是指您所用无线访问点的 MAC 地址; authmode 这行指出您所做的通讯将不进行加密 (OPEN)。 静态 IP 地址 如果无法从某个 DHCP 服务器获得 IP 地址, 则可以配置一个静态 IP 地址, 方法是将前面的 DHCP 关键字替换为地址信息。 请务必保持其他用于连接无线访问点的参数: ifconfig_ath0="inet 192.168.1.100 netmask 255.255.255.0 ssid your_ssid_here" WPA WPA (Wi-Fi 保护访问) 是一种与 802.11 网络配合使用的安全协议, 其目的是消除 WEP 中缺少身份验证能力的问题, 以及一些其它的安全弱点。 WPA 采用了 802.1X 认证协议, 并采用从多种与 WEP 不同的加密算法中选择一种来保证数据保密性。 WPA 支持的唯一一种加密算法是 TKIP (临时密钥完整性协议), 这是一种对 WEP 所采用的基本 RC4 加密算法的扩展, 除此之外还提供了对检测到的入侵的响应机制。 TKIP 被设计用来与旧式硬件一同工作, 只需要进行部分软件修改; 它提供了一种改善安全性的折衷方案, 但仍有可能受到攻击。 WPA 也指定了 AES-CCMP 加密作为 TKIP 的替代品, 在可能时倾向于使用这种加密; 表达这一规范的常用术语是 WPA2 (或 RSN)。 WPA 定义了验证和加密协议。 验证通常是使用两种方法之一来完成的: 通过 802.1X 或类似 RADIUS 这样的后端验证服务, 或通过在通讯站和无线访问点之间通过事先分发的密码来进行最小握手。 前一种通常称作企业 WPA, 而后者通常也叫做个人 WPA。 因为多数人不会为无线网络配置 RADIUS 后端服务器, 旖旎 WPA-PSK 是在 WPA 中最为常见的一种。 对无线连接的控制和身份验证工作 (密钥协商或通过服务器验证) 是通过 &man.wpa.supplicant.8; 工具来完成的。 这个程序运行时需要一个配置文件, /etc/wpa_supplicant.conf。 关于这个文件的更多信息, 请参考联机手册 &man.wpa.supplicant.conf.5;。 WPA-PSK WPA-PSK 也称作 个人-WPA, 它基于预先分发的密钥 (PSK), 这个密钥是根据作为无线网络上使用的主密钥的密码生成的。 者表示每个无线用户都会使用同样的密钥。 WPA-PSK 主要用于小型网络, 在这种网络中, 通常不需要或没有办法架设验证服务器。 无论何时, 都应使用足够长, 且包括尽可能多字母和数字的强口令, 以免被猜出和/或攻击。 第一步是修改配置文件 /etc/wpa_supplicant.conf, 并在其中加入在您网络上使用的 SSID 和事先分发的密钥: network={ ssid="freebsdap" psk="freebsdmall" } 接下来, 在 /etc/rc.conf 中, 我们将指定无线设备的配置, 令其采用 WPA, 并通过 DHCP 来获取 IP 地址: ifconfig_ath0="WPA DHCP" 下面, 启用无线网络接口: &prompt.root; /etc/rc.d/netif start Starting wpa_supplicant. DHCPDISCOVER on ath0 to 255.255.255.255 port 67 interval 5 DHCPDISCOVER on ath0 to 255.255.255.255 port 67 interval 6 DHCPOFFER from 192.168.0.1 DHCPREQUEST on ath0 to 255.255.255.255 port 67 DHCPACK from 192.168.0.1 bound to 192.168.0.254 -- renewal in 300 seconds. ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet6 fe80::211:95ff:fed5:4362%ath0 prefixlen 64 scopeid 0x1 inet 192.168.0.254 netmask 0xffffff00 broadcast 192.168.0.255 ether 00:11:95:d5:43:62 media: IEEE 802.11 Wireless Ethernet autoselect (OFDM/36Mbps) status: associated ssid freebsdap channel 1 bssid 00:11:95:c3:0d:ac authmode WPA privacy ON deftxkey UNDEF TKIP 2:128-bit txpowmax 36 protmode CTS roaming MANUAL bintval 100 除此之外, 您也可以手动地使用 above 中那份 /etc/wpa_supplicant.conf 来配置, 方法是执行: &prompt.root; wpa_supplicant -i ath0 -c /etc/wpa_supplicant.conf Trying to associate with 00:11:95:c3:0d:ac (SSID='freebsdap' freq=2412 MHz) Associated with 00:11:95:c3:0d:ac WPA: Key negotiation completed with 00:11:95:c3:0d:ac [PTK=TKIP GTK=TKIP] 接下来的操作, 是运行 dhclient 命令来从 DHCP 服务器获取 IP: &prompt.root; dhclient ath0 DHCPREQUEST on ath0 to 255.255.255.255 port 67 DHCPACK from 192.168.0.1 bound to 192.168.0.254 -- renewal in 300 seconds. &prompt.root; ifconfig ath0 ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet6 fe80::211:95ff:fed5:4362%ath0 prefixlen 64 scopeid 0x1 inet 192.168.0.254 netmask 0xffffff00 broadcast 192.168.0.255 ether 00:11:95:d5:43:62 media: IEEE 802.11 Wireless Ethernet autoselect (OFDM/48Mbps) status: associated ssid freebsdap channel 1 bssid 00:11:95:c3:0d:ac authmode WPA privacy ON deftxkey UNDEF TKIP 2:128-bit txpowmax 36 protmode CTS roaming MANUAL bintval 100 如果 /etc/rc.conf 的配置中, 使用了 ifconfig_ath0="DHCP", 就不需要手工运行 dhclient 命令了, 因为 dhclient 将在 wpa_supplicant 探测到密钥之后执行。 在这个例子中, DHCP 并不可用, 您可以在 wpa_supplicant 为通讯站完成了身份认证之后, 指定静态 IP 地址: &prompt.root; ifconfig ath0 inet 192.168.0.100 netmask 255.255.255.0 &prompt.root; ifconfig ath0 ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet6 fe80::211:95ff:fed5:4362%ath0 prefixlen 64 scopeid 0x1 inet 192.168.0.100 netmask 0xffffff00 broadcast 192.168.0.255 ether 00:11:95:d5:43:62 media: IEEE 802.11 Wireless Ethernet autoselect (OFDM/36Mbps) status: associated ssid freebsdap channel 1 bssid 00:11:95:c3:0d:ac authmode WPA privacy ON deftxkey UNDEF TKIP 2:128-bit txpowmax 36 protmode CTS roaming MANUAL bintval 100 如果没有使用 DHCP, 还需要手工配置默认网关, 以及域名服务器: &prompt.root; route add default your_default_router &prompt.root; echo "nameserver your_DNS_server" >> /etc/resolv.conf 使用 EAP-TLS 的 WPA 使用 WPA 的第二种方式是使用 802.1X 后端验证服务器, 在这个例子中, WPA 也称作 企业-WPA, 以便与安全性较差、 采用事先分发密钥的 个人-WPA 区分开来。 在 企业-WPA 中, 验证操作是采用 EAP 完成的 (可扩展认证协议)。 EAP 并未附带加密方法, 因此设计者决定将 EAP 放在加密信道中进行传送。 为此设计了许多 EAP 验证方法, 最常用的方法是 EAP-TLS、 EAP-TTLS 和 EAP-PEAP。 EAP-TLS (带 传输层安全 的 EAP) 是一种在无线世界中得到了广泛支持的验证协议, 因为它是 Wi-Fi 联盟 核准的第一个 EAP 方法。 EAP-TLS 需要使用三个证书: CA 证书 (在所有计算机上安装)、 用以向您证明服务器身份的服务器证书, 以及每个无线客户端用于证明身份的客户机证书。 在这种 EAP 方式中, 验证服务器和无线客户端均通过自己的证书向对方证明身份, 它们均验证对方的证书是本机构的证书发证机构 (CA) 签发的。 与之前介绍的方法类似, 配置也是通过 /etc/wpa_supplicant.conf 来完成的: network={ ssid="freebsdap" proto=RSN key_mgmt=WPA-EAP eap=TLS identity="loader" ca_cert="/etc/certs/cacert.pem" client_cert="/etc/certs/clientcert.pem" private_key="/etc/certs/clientkey.pem" private_key_passwd="freebsdmallclient" } 这个字段表示网络名 (SSID)。 这里, 我们使用 RSN (IEEE 802.11i) 协议, 也就是 WPA2。 key_mgmt 这行表示所用的密钥管理协议。 在我们的例子中, 它是使用 EAP 验证的 WPA: WPA-EAP 这个字段中, 提到了我们的连接采用 EAP 方式。 identity 字段包含了 EAP 的实体串。 ca_cert 字段给出了 CA 证书文件的路径名。 在验证服务器证书时, 这个文件是必需的。 client_cert 这行给出了客户机证书的路径名。 对每个无线客户端而言, 这个证书都是在全网范围内唯一的。 private_key 字段是客户机证书私钥文件的路径名。 private_key 字段是私钥的口令字。 接着, 把下面的配置加入到 /etc/rc.conf ifconfig_ath0="WPA DHCP" 下一步是使用 rc.d 机制来启用网络接口: &prompt.root; /etc/rc.d/netif start Starting wpa_supplicant. DHCPREQUEST on ath0 to 255.255.255.255 port 67 DHCPREQUEST on ath0 to 255.255.255.255 port 67 DHCPACK from 192.168.0.20 bound to 192.168.0.254 -- renewal in 300 seconds. ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet6 fe80::211:95ff:fed5:4362%ath0 prefixlen 64 scopeid 0x1 inet 192.168.0.254 netmask 0xffffff00 broadcast 192.168.0.255 ether 00:11:95:d5:43:62 media: IEEE 802.11 Wireless Ethernet autoselect (DS/11Mbps) status: associated ssid freebsdap channel 1 bssid 00:11:95:c3:0d:ac authmode WPA2/802.11i privacy ON deftxkey UNDEF TKIP 2:128-bit txpowmax 36 protmode CTS roaming MANUAL bintval 100 如前面提到的那样, 也可以手工通过 wpa_supplicantifconfig 命令达到类似的目的。 使用 EAP-TTLS 的 WPA 在使用 EAP-TLS 时, 参与验证过程的服务器和客户机都需要证书, 而在使用 EAP-TTLS (带传输层安全隧道的 EAP) 时, 客户机证书则是可选的。 这种方式与某些安全 web 站点更为接近, 即使访问者没有客户端证书, 这些 web 服务器也能建立安全的 SSL 隧道。 EAP-TTLS 会使用加密的 TLS 隧道来传送验证信息。 对于它的配置, 同样是通过 /etc/wpa_supplicant.conf 文件来进行的: network={ ssid="freebsdap" proto=RSN key_mgmt=WPA-EAP eap=TTLS identity="test" password="test" ca_cert="/etc/certs/cacert.pem" phase2="auth=MD5" } 这个字段是我们的连接所采用的 EAP 方式。 identity 字段中是在加密 TLS 隧道中用于 EAP 验证的身份串。 password 字段中是用于 EAP 验证的口令字。 ca_cert 字段给出了 CA 证书文件的路径名。 在验证服务器证书时, 这个文件是必需的。 这个字段中给出了加密 TLS 隧道中使用的验证方式。 在这个例子中, 我们使用的是带 MD5-挑战 的 EAP。 inner authentication 通常也叫 phase2 您还必须把下面的配置加入到 /etc/rc.conf ifconfig_ath0="WPA DHCP" 下一步是启用网络接口: &prompt.root; /etc/rc.d/netif start Starting wpa_supplicant. DHCPREQUEST on ath0 to 255.255.255.255 port 67 DHCPREQUEST on ath0 to 255.255.255.255 port 67 DHCPREQUEST on ath0 to 255.255.255.255 port 67 DHCPACK from 192.168.0.20 bound to 192.168.0.254 -- renewal in 300 seconds. ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet6 fe80::211:95ff:fed5:4362%ath0 prefixlen 64 scopeid 0x1 inet 192.168.0.254 netmask 0xffffff00 broadcast 192.168.0.255 ether 00:11:95:d5:43:62 media: IEEE 802.11 Wireless Ethernet autoselect (DS/11Mbps) status: associated ssid freebsdap channel 1 bssid 00:11:95:c3:0d:ac authmode WPA2/802.11i privacy ON deftxkey UNDEF TKIP 2:128-bit txpowmax 36 protmode CTS roaming MANUAL bintval 100 使用 EAP-PEAP 的 WPA PEAP (受保护的 EAP) 被设计用以替代 EAP-TTLS。 有两种类型的 PEAP 方法, 最常用的是 PEAPv0/EAP-MSCHAPv2。 在这篇文档余下的部分中, 术语 PEAP 是指这种 EAP 方法。 PEAP 是在 EAP-TLS 之后最为常用的 EAP 标准, 换言之, 如果您的网络中有多种不同的操作系统, PEAP 将是仅次于 EAP-TLS 的支持最广的标准。 PEAP 与 EAP-TTLS 很像: 它使用服务器端证书, 通过在客户端与验证服务器之间建立加密的 TLS 隧道来向用户验证身份, 这保护了验证信息的交换过程。 在安全方面, EAP-TTLS 与 PEAP 的区别是 PEAP 会以明文广播用户名, 而只有口令是通过加密 TLS 隧道传送的。 而与此相反, EAP-TTLS 传送用户名和口令时, 都使用 TLS 隧道。 我们需要编辑 /etc/wpa_supplicant.conf 文件, 并加入与 EAP-PEAP 有关的配置: network={ ssid="freebsdap" proto=RSN key_mgmt=WPA-EAP eap=PEAP identity="test" password="test" ca_cert="/etc/certs/cacert.pem" phase1="peaplabel=0" phase2="auth=MSCHAPV2" } 这个字段的内容是用于连接的 EAP 方式。 identity 字段中是在加密 TLS 隧道中用于 EAP 验证的身份串。 password 字段中是用于 EAP 验证的口令字。 ca_cert 字段给出了 CA 证书文件的路径名。 在验证服务器证书时, 这个文件是必需的。 这个字段包含了第一阶段验证 (TLS 隧道) 的参数。 随您使用的验证服务器的不同, 您需要指定验证的标签。 多数时候, 标签应该是 客户端 EAP 加密, 这可以通过使用 peaplabel=0 来指定。 更多信息可以在联机手册 &man.wpa.supplicant.conf.5; 中找到。 这个字段的内容是验证协议在加密的 TLS 隧道中使用的信息。 对 PEAP 而言, 这是 auth=MSCHAPV2 您还必须把下面的配置加入到 /etc/rc.conf ifconfig_ath0="WPA DHCP" 下一步是启用网络接口: &prompt.root; /etc/rc.d/netif start Starting wpa_supplicant. DHCPREQUEST on ath0 to 255.255.255.255 port 67 DHCPREQUEST on ath0 to 255.255.255.255 port 67 DHCPREQUEST on ath0 to 255.255.255.255 port 67 DHCPACK from 192.168.0.20 bound to 192.168.0.254 -- renewal in 300 seconds. ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet6 fe80::211:95ff:fed5:4362%ath0 prefixlen 64 scopeid 0x1 inet 192.168.0.254 netmask 0xffffff00 broadcast 192.168.0.255 ether 00:11:95:d5:43:62 media: IEEE 802.11 Wireless Ethernet autoselect (DS/11Mbps) status: associated ssid freebsdap channel 1 bssid 00:11:95:c3:0d:ac authmode WPA2/802.11i privacy ON deftxkey UNDEF TKIP 2:128-bit txpowmax 36 protmode CTS roaming MANUAL bintval 100 WEP WEP (有线等效协议) 是最初 802.11 标准的一部分。 其中没有提供身份验证机制, 只提供了弱访问控制, 而且很容易破解。 WEP 可以通过 ifconfig 配置: &prompt.root; ifconfig ath0 inet 192.168.1.100 netmask 255.255.255.0 ssid my_net \ wepmode on weptxkey 3 wepkey 3:0x3456789012 weptxkey 指明了使用哪个 WEP 密钥来进行数据传输。 这里我们使用第三个密钥。 它必须与无线访问点的配置一致。 wepkey 表示设置所选的 WEP 密钥。 其格式应为 index:key, 如果没有给出 index 值, 则默认为 1。 因此, 如果需要设置的密钥不是第一个, 就必需指定 index 了。 您需要将 0x3456789012 改为在无线接入点上配置的那个。 我们建议您阅读联机手册 &man.ifconfig.8; 来了解进一步的信息。 wpa_supplicant 机制也可以用来配置您的无线网卡使用 WEP。 前面的例子也可以通过在 /etc/wpa_supplicant.conf 中加入下述设置来实现: network={ ssid="my_net" key_mgmt=NONE wep_key3=3456789012 wep_tx_keyidx=3 } 接着: &prompt.root; wpa_supplicant -i ath0 -c /etc/wpa_supplicant.conf Trying to associate with 00:13:46:49:41:76 (SSID='dlinkap' freq=2437 MHz) Associated with 00:13:46:49:41:76 Ad-hoc 模式 IBSS 模式, 也称为 ad-hoc 模式, 是为点对点连接设计的。 例如, 如果希望在计算机 AB 之间建立 ad-hoc 网络, 我们只需选择两个 IP 地址和一个 SSID 就可以了。 在计算机 A 上: &prompt.root; ifconfig ath0 inet 192.168.0.1 netmask 255.255.255.0 ssid freebsdap mediaopt adhoc &prompt.root; ifconfig ath0 ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255 inet6 fe80::211:95ff:fec3:dac%ath0 prefixlen 64 scopeid 0x4 ether 00:11:95:c3:0d:ac media: IEEE 802.11 Wireless Ethernet autoselect <adhoc> (autoselect <adhoc>) status: associated ssid freebsdap channel 2 bssid 02:11:95:c3:0d:ac authmode OPEN privacy OFF txpowmax 36 protmode CTS bintval 100 此处的 adhoc 参数表示无线网络接口应以 IBSS 模式运转。 此时, 在 B 上应该能够检测到 A 的存在了: &prompt.root; ifconfig ath0 up scan SSID BSSID CHAN RATE S:N INT CAPS freebsdap 02:11:95:c3:0d:ac 2 54M 19:0 100 IS 在输出中的 I 再次确认了 A 机是以 ad-hoc 模式运行的。 我们只需给 B 配置一不同的 IP 地址: &prompt.root; ifconfig ath0 inet 192.168.0.2 netmask 255.255.255.0 ssid freebsdap mediaopt adhoc &prompt.root; ifconfig ath0 ath0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet6 fe80::211:95ff:fed5:4362%ath0 prefixlen 64 scopeid 0x1 inet 192.168.0.2 netmask 0xffffff00 broadcast 192.168.0.255 ether 00:11:95:d5:43:62 media: IEEE 802.11 Wireless Ethernet autoselect <adhoc> (autoselect <adhoc>) status: associated ssid freebsdap channel 2 bssid 02:11:95:c3:0d:ac authmode OPEN privacy OFF txpowmax 36 protmode CTS bintval 100 这样, AB 就可以交换信息了。 故障排除 如果您在使用无线网络时遇到了麻烦, 此处提供了一系列用以帮助排除故障的步骤。 如果您在列表中找不到无线访问点, 请确认您没有将无线设备配置为使用有限的一组频段。 如果您无法关联到无线访问点, 请确认您的通讯站配置与无线访问点的配置一致。 这包括认证模式以及安全协议。 尽可能简化您的配置。 如果您正使用类似 WPA 或 WEP 这样的安全协议, 请将无线访问点配置为开放验证和不采用安全措施, 并检查是否数据能够通过。 一旦您能够关联到无线访问点之后, 就可以使用简单的工具如 &man.ping.8; 来诊断安全配置了。 wpa_supplicant 提供了许多调试支持; 尝试手工运行它, 在启动时指定 选项, 并察看输出结果。 除此之外还有许多其它的底层调试工具。 您可以使用 /usr/src/tools/tools/net80211 中的 wlandebug 命令来启用 802.11 协议支持层的调试功能。 例如: &prompt.root; wlandebug -i ath0 +scan+auth+debug+assoc net.wlan.0.debug: 0 => 0xc80000<assoc,auth,scan> 可以用来启用与扫描无线访问点和 802.11 协议在安排通讯时与握手有关的控制台信息。 还有许多有用的统计信息是由 802.11 层维护的; wlanstats 工具可以显示这些信息。 这些统计数据能够指出由 802.11 层识别出来的错误。 请注意某些错误可能是由设备驱动在 802.11 层之下识别出来的, 因此这些错误可能并不显示。 要诊断与设备有关的问题, 您需要参考设备驱动程序的文档。 如果上述信息没能帮助您找到具体的问题所在, 请提交问题报告, 并在其中附上这些工具的输出。 Pav Lucistnik 作者:
pav@FreeBSD.org
雪平 中文翻译:
zxpmyth@yahoo.com.cn
苏义
蓝牙 蓝牙 简介 Bluetooth (蓝牙) 是一项无线技术, 用于建立带宽为 2.4GHZ,波长为 10 米的私有网络。 网络一般是由便携式设备,比加手机 (cellular phone), 掌上电脑 (handhelds) 和膝上电脑 (laptops)) 以 ad-hoc 形式组成。不象其它流行的无线技术——Wi-Fi,Bluetooth 提供了更高级的服务层面,像类 FTP 的文件服务、文件推送 (file pushing)、语音传送、串行线模拟等等。 在 &os; 里,蓝牙栈 (Bluetooth stack) 通过使用 Netgraph 框架 (请看 &man.netgraph.4;) 来的实现。 大量的"Bluetooth USB dongle"由 &man.ng.ubt.4; 驱动程序支持。 基于 Broadcom BCM2033 芯片组的 Bluetooth 设备可以通过 &man.ubtbcmfw.4; 和 &man.ng.ubt.4; 驱动程序支持。 3Com Bluetooth PC 卡 3CRWB60-A 由 &man.ng.bt3c.4; 驱动程序支持。 基于 Serial 和 UART 的蓝牙设备由 &man.sio.4;、&man.ng.h4.4; 和 &man.hcseriald.8;。本节介绍 USB Bluetooth dongle 的使用。 插入设备 默认的 Bluetooth 设备驱动程序已存在于内核模块里。 接入设备前,您需要将驱动程序加载入内核: &prompt.root; kldload ng_ubt 如果系统启动时 Bluetooth 设备已经存在于系统里, 那么从 /boot/loader.conf 里加载这个模块: ng_ubt_load="YES" 插入USB dongle。控制台(console)(或syslog中)会出现类似如下的信息: ubt0: vendor 0x0a12 product 0x0001, rev 1.10/5.25, addr 2 ubt0: Interface 0 endpoints: interrupt=0x81, bulk-in=0x82, bulk-out=0x2 ubt0: Interface 1 (alt.config 5) endpoints: isoc-in=0x83, isoc-out=0x3, wMaxPacketSize=49, nframes=6, buffer size=294 在 &os; 6.0, 以及 &os; 5.X 系列中 5.5 之前的版本上, 蓝牙栈必须手动启动。 在 &os; 5.5、 6.1 以及更新一些的版本上, 这一工作会由 &man.devd.8; 自动完成。 复制 /usr/share/examples/netgraph/bluetooth/rc.bluetooth 到一个合适的地方,如 /etc/rc.bluetooth。 这个脚本用于启动和停止 Bluetooth stack (蓝牙栈)。 最好在拔出设备前停止 stack(stack),当然也不是非做不可。 启动 stack (栈) 时,会得到如下的输出: &prompt.root; /etc/rc.bluetooth start ubt0 BD_ADDR: 00:02:72:00:d4:1a Features: 0xff 0xff 0xf 00 00 00 00 00 <3-Slot> <5-Slot> <Encryption> <Slot offset> <Timing accuracy> <Switch> <Hold mode> <Sniff mode> <Park mode> <RSSI> <Channel quality> <SCO link> <HV2 packets> <HV3 packets> <u-law log> <A-law log> <CVSD> <Paging scheme> <Power control> <Transparent SCO data> Max. ACL packet size: 192 bytes Number of ACL packets: 8 Max. SCO packet size: 64 bytes Number of SCO packets: 8 HCI 主控制器接口 (HCI) 主控制器接口 (HCI) 提供了通向基带控制器和连接管理器的命令接口及访问硬件状态字和控制寄存器的通道。 这个接口提供了访问蓝牙基带 (Bluetooth baseband) 功能的统一方式。 主机上的 HCI 层与蓝牙硬件上的 HCI 固件交换数据和命令。 主控制器的传输层 (如物理总线) 驱动程序提供两个 HCI 层交换信息的能力。 为每个蓝牙 (Bluetooth) 设备创建一个 hci 类型的 Netgraph 结点。 HCI 结点一般连接蓝牙设备的驱动结点 (下行流) 和 L2CAP 结点 (上行流)。 所有的HCI操作必须在 HCI 结点上进行而不是设备驱动结点。HCI 结点的默认名是 devicehci。更多细节请参考 &man.ng.hci.4; 的联机手册。 最常见的任务是发现在 RF proximity 中的蓝牙 (Bluetooth) 设备。这个就叫做 质询(inquiry)。质询及 HCI 相关的操作可以由 &man.hccontrol.8; 工具来完成。 以下的例子展示如何找出范围内的蓝牙设备。 在几秒钟内您应该得到一张设备列表。 注意远程主机只有被置于 discoverable(可发现) 模式才能答应质询。 &prompt.user; hccontrol -n ubt0hci inquiry Inquiry result, num_responses=1 Inquiry result #0 BD_ADDR: 00:80:37:29:19:a4 Page Scan Rep. Mode: 0x1 Page Scan Period Mode: 00 Page Scan Mode: 00 Class: 52:02:04 Clock offset: 0x78ef Inquiry complete. Status: No error [00] BD_ADDR 是蓝牙设备的特定地址, 类似于网卡的 MAC 地址。需要用此地址与某个设备进一步地通信。 可以为 BD_ADDR 分配由人可读的名字 (human readable name)。 文件 /etc/bluetooth/hosts 包含已知蓝牙主机的信息。 下面的例子展示如何获得分配给远程设备的可读名。 &prompt.user; hccontrol -n ubt0hci remote_name_request 00:80:37:29:19:a4 BD_ADDR: 00:80:37:29:19:a4 Name: Pav's T39 如果在远程蓝牙上运行质询,您会发现您的计算机是 your.host.name (ubt0)。 分配给本地设备的名字可随时改变。 蓝牙系统提供点对点连接 (只有两个蓝牙设备参与) 和点对多点连接。在点对多点连接中,连接由多个蓝牙设备共享。 以下的例子展示如何取得本地设备的活动基带 (baseband) 连接列表。 &prompt.user; hccontrol -n ubt0hci read_connection_list Remote BD_ADDR Handle Type Mode Role Encrypt Pending Queue State 00:80:37:29:19:a4 41 ACL 0 MAST NONE 0 0 OPEN connection handle(连接柄) 在需要终止基带连接时有用。注意:一般不需要手动完成。 栈 (stack) 会自动终止不活动的基带连接。 &prompt.root; hccontrol -n ubt0hci disconnect 41 Connection handle: 41 Reason: Connection terminated by local host [0x16] 参考 hccontrol help 获取完整的 HCI 命令列表。大部分 HCI 命令不需要超级用户权限。 L2CAP 逻辑连接控制和适配协议(L2CAP) 逻辑连接控制和适配协议 (L2CAP) 为上层协议提供面向连接和无连接的数据服务, 并提供多协议功能和分割重组操作。L2CAP 充许上层协议和应用软件传输和接收最大长度为 64K 的 L2CAP 数据包。 L2CAP 基于 通道(channel) 的概念。 通道 (Channel) 是位于基带 (baseband) 连接之上的逻辑连接。 每个通道以多对一的方式绑定一个单一协议 (single protocol)。 多个通道可以绑定同一个协议,但一个通道不可以绑定多个协议。 每个在通道里接收到的 L2CAP 数据包被传到相应的上层协议。 多个通道可共享同一个基带连接。 为每个蓝牙 (Bluetooth) 设备创建一个 l2cap 类型的 Netgraph 结点。 L2CAP 结点一般连接 HCI 结点(下行流)和蓝牙设备的驱动结点(上行流)。 L2CAP 结点的默认名是 devicel2cap。 更多细节请参考 &man.ng.l2cap.4; 的联机手册。 一个有用的命令是 &man.l2ping.8;, 它可以用来 ping 其它设备。 一些蓝牙实现可能不会返回所有发送给它们的数据, 所以下例中的 0 bytes 是正常的。 &prompt.root; l2ping -a 00:80:37:29:19:a4 0 bytes from 0:80:37:29:19:a4 seq_no=0 time=48.633 ms result=0 0 bytes from 0:80:37:29:19:a4 seq_no=1 time=37.551 ms result=0 0 bytes from 0:80:37:29:19:a4 seq_no=2 time=28.324 ms result=0 0 bytes from 0:80:37:29:19:a4 seq_no=3 time=46.150 ms result=0 &man.l2control.8; 工具用于在 L2CAP 上进行多种操作。 以下这个例子展示如何取得本地设备的逻辑连接 (通道) 和基带连接的列表: &prompt.user; l2control -a 00:02:72:00:d4:1a read_channel_list L2CAP channels: Remote BD_ADDR SCID/ DCID PSM IMTU/ OMTU State 00:07:e0:00:0b:ca 66/ 64 3 132/ 672 OPEN &prompt.user; l2control -a 00:02:72:00:d4:1a read_connection_list L2CAP connections: Remote BD_ADDR Handle Flags Pending State 00:07:e0:00:0b:ca 41 O 0 OPEN 另一个诊断工具是 &man.btsockstat.1;。 它完成与 &man.netstat.1; 类似的操作, 只是用了蓝牙网络相关的数据结构。 以下这个例子显示与 &man.l2control.8; 相同的逻辑连接。 &prompt.user; btsockstat Active L2CAP sockets PCB Recv-Q Send-Q Local address/PSM Foreign address CID State c2afe900 0 0 00:02:72:00:d4:1a/3 00:07:e0:00:0b:ca 66 OPEN Active RFCOMM sessions L2PCB PCB Flag MTU Out-Q DLCs State c2afe900 c2b53380 1 127 0 Yes OPEN Active RFCOMM sockets PCB Recv-Q Send-Q Local address Foreign address Chan DLCI State c2e8bc80 0 250 00:02:72:00:d4:1a 00:07:e0:00:0b:ca 3 6 OPEN RFCOMM RFCOMM 协议 RFCOMM 协议提供基于 L2CAP 协议的串行端口模拟。 该协议基于 ETSI TS 07.10 标准。RFCOMM 是一个简单的传输协议, 附加了摸拟 9 针 RS-232(EIATIA-232-E) 串行端口的定义。 RFCOMM 协议最多支持 60 个并发连接 (RFCOMM通道)。 为了实现 RFCOMM, 运行于不同设备上的应用程序建立起一条关于它们之间通信段的通信路径。 RFCOMM实际上适用于使用串行端口的应用软件。 通信段是一个设备到另一个设备的蓝牙连接 (直接连接)。 RFCOMM 关心的只是直接连接设备之间的连接, 或在网络里一个设备与 modem 之间的连接。RFCOMM 能支持其它的配置, 比如在一端通过蓝牙无线技术通讯而在另一端使用有线接口。 在&os;,RFCOMM 协议在蓝牙套接字层 (Bluetooth sockets layer) 实现。 结对 设备的结对(Pairing of Devices) 默认情况下,蓝牙通信是不需要验证的, 任何设备可与其它任何设备对话。一个蓝牙设备 (比如手机) 可以选择通过验证以提供某种特殊服务 (比如拨号服务)。 蓝牙验证一般使用 PIN码(PIN codes)。 一个 PIN 码是最长为 16 个字符的 ASCII 字符串。 用户需要在两个设备中输入相同的PIN码。用户输入了 PIN 码后, 两个设备会生成一个 连接密匙(link key)。 接着连接密钥可以存储在设备或存储器中。 连接时两个设备会使用先前生成的连接密钥。 以上介绍的过程被称为 结对(pairing)。 注意如果任何一方丢失了连接密钥,必须重新进行结对。 守护进程 &man.hcsecd.8; 负责处理所有蓝牙验证请求。 默认的配置文件是 /etc/bluetooth/hcsecd.conf。 下面的例子显示一个手机的 PIN 码被预设为1234 device { bdaddr 00:80:37:29:19:a4; name "Pav's T39"; key nokey; pin "1234"; } PIN 码没有限制(除了长度)。有些设备 (例如蓝牙耳机) 会有一个预置的 PIN 码。 开关强制 &man.hcsecd.8; 守护进程处于前台,因此很容易看清发生了什么。 设置远端设备准备接收结对 (pairing),然后启动蓝牙连接到远端设备。 远端设备应该回应接收了结对并请求PIN码。输入与 hcsecd.conf 中一样的 PIN 码。 现在您的个人计算机已经与远程设备结对了。 另外您也可以在远程设备上初始结点。 在 &os; 5.5、 6.1 以及更新版本上, 可以通过在 /etc/rc.conf 文件中增加下面的行, 以便让 hcsecd 在系统启动时自动运行: hcsecd_enable="YES" 以下是简单的 hcsecd 服务输出样本: hcsecd[16484]: Got Link_Key_Request event from 'ubt0hci', remote bdaddr 0:80:37:29:19:a4 hcsecd[16484]: Found matching entry, remote bdaddr 0:80:37:29:19:a4, name 'Pav's T39', link key doesn't exist hcsecd[16484]: Sending Link_Key_Negative_Reply to 'ubt0hci' for remote bdaddr 0:80:37:29:19:a4 hcsecd[16484]: Got PIN_Code_Request event from 'ubt0hci', remote bdaddr 0:80:37:29:19:a4 hcsecd[16484]: Found matching entry, remote bdaddr 0:80:37:29:19:a4, name 'Pav's T39', PIN code exists hcsecd[16484]: Sending PIN_Code_Reply to 'ubt0hci' for remote bdaddr 0:80:37:29:19:a4 SDP 服务发现协议 (SDP) 服务发现协议 (SDP) 提供给客户端软件一种方法, 它能发现由服务器软件提供的服务及属性。 服务的属性包括所提供服务的类型或类别, 使用该服务所需要的机制或协议。 SDP 包括 SDP 服务器和 SDP 客户端之间的通信。 服务器维护一张服务记录列表,它介绍服务器上服务的特性。 每个服务记录包含关于单个服务的信息。通过发出 SDP 请求, 客户端会得到服务记录列表的信息。如果客户端 (或者客户端上的应用软件) 决定使用一个服务,为了使用这个服务它必须与服务提供都建立一个独立的连接。 SDP 提供了发现服务及其属性的机制,但它并不提供使用这些服务的机制。 一般地,SDP客户端按照服务的某种期望特征来搜索服务。 但是,即使没有任何关于由 SDP 服务端提供的服务的预设信息, 有时也能令人满意地发现它的服务记录里所描述的是哪种服务类型。 这种发现所提供服务的过程称为 浏览(browsing) 蓝牙 SDP 服务端 &man.sdpd.8; 和命令行客户端 &man.sdpcontrol.8; 都包括在了标准的 &os; 安装里。 下面的例子展示如何进行 SDP 浏览查询。 &prompt.user; sdpcontrol -a 00:01:03:fc:6e:ec browse Record Handle: 00000000 Service Class ID List: Service Discovery Server (0x1000) Protocol Descriptor List: L2CAP (0x0100) Protocol specific parameter #1: u/int/uuid16 1 Protocol specific parameter #2: u/int/uuid16 1 Record Handle: 0x00000001 Service Class ID List: Browse Group Descriptor (0x1001) Record Handle: 0x00000002 Service Class ID List: LAN Access Using PPP (0x1102) Protocol Descriptor List: L2CAP (0x0100) RFCOMM (0x0003) Protocol specific parameter #1: u/int8/bool 1 Bluetooth Profile Descriptor List: LAN Access Using PPP (0x1102) ver. 1.0 ...等等。注意每个服务有一个属性 (比如 RFCOMM 通道)列表。 根据服务您可能需要为一些属性做个注释。 有些蓝牙实现 (Bluetooth implementation)不支持服务浏览, 可能会返回一个空列表。这种情况,可以搜索指定的服务。 下面的例子展示如何搜索 OBEX Object Push (OPUSH) 服务: &prompt.user; sdpcontrol -a 00:01:03:fc:6e:ec search OPUSH 要在 &os; 里为蓝牙客户端提供服务,可以使用 &man.sdpd.8; 服务。 在 &os; 5.5、 6.1 和更新版本之上, 可以通过在 /etc/rc.conf 中加入下面的行: sdpd_enable="YES" 接下来使用下面的命令来启动 sdpd 服务: &prompt.root; /etc/rc.d/sdpd start 在 &os; 6.0, 以及 5.5 之前的 &os; 5.X 版本上, sdpd 没有集成进系统启动脚本。 它可以用下面的命令来手动启动: &prompt.root; sdpd 需要为远端提供蓝牙服务的本地的服务程序会使用本地 SDP 进程注册服务。像这样的程序就有 &man.rfcomm.pppd.8;。 一旦启动它,就会使用本地 SDP 进程注册蓝牙 LAN 服务。 使用本地 SDP 进程注册的服务列表,可以通过本地控制通道发出 SDP 浏览查询获得: &prompt.root; sdpcontrol -l browse 拨号网络 (DUN) 和使用 PPP(LAN) 层面的网络接入 拨号网络 (DUN) 配置通常与 modem 和手机一起使用。 如下是这一配置所涉及的内容: 计算机使用手机或 modem 作为无线 modem 来连接拨号因特网连入服务器, 或者使用其它的拨号服务; 计算机使用手机或 modem 接收数据请求。 使用 PPP(LAN) 层面的网络接入常使用在如下情形: 单个蓝牙设备的局域网连入; 多个蓝牙设备的局域网接入; PC 到 PC (使用基于串行线模拟的 PPP 网络)。 在 &os; 中,两个层面使用 &man.ppp.8; 和 &man.rfcomm.pppd.8; (一种封装器,可以将 RFCOMM 蓝牙连接转换为 PPP 可操作的东西) 来实现。 在使用任何层面之前,一个新的 PPP 标识必须在 /etc/ppp/ppp.conf 中建立。 想要实例请参考 &man.rfcomm.pppd.8;。 在下面的例子中,&man.rfcomm.pppd.8; 用来在 NUN RFCOMM 通道上打开一个到 BD_ADDR 为 00:80:37:29:19:a4 的设备的 RFCOMM 连接。具体的 RFCOMM 通道号要通过 SDP 从远端设备获得。也可以手动指定通 RFCOMM,这种情况下 &man.rfcomm.pppd.8; 将不能执行 SDP 查询。使用 &man.sdpcontrol.8; 来查找远端设备上的 RFCOMM 通道。 &prompt.root; rfcomm_pppd -a 00:80:37:29:19:a4 -c -C dun -l rfcomm-dialup 为了提供 PPP(LAN) 网络接入服务,必须运行 &man.sdpd.8; 服务。一个新的 LAN 客户端条目必须在 /etc/ppp/ppp.conf 文件中建立。 想要实例请参考 &man.rfcomm.pppd.8;。 最后,在有效地通道号上开始 RFCOMM PPP 服务。 RFCOMM PPP 服务会使用本地 SDP 进程自动注册蓝牙 LAN 服务。下面的例子展示如何启动 RFCOMM PPP 服务。 &prompt.root; rfcomm_pppd -s -C 7 -l rfcomm-server OBEX OBEX 对象推送 (OBEX Object Push - OPUSH) 层面 OBEX协议被广泛地用于移动设备之间简单的文件传输。 它的主要用处是在红外线通信领域, 被用于笔记本或手持设备之间的一般文件传输。 OBEX 服务器和客户端由第三方软件包 obexapp实现,它可以从 comms/obexapp port 安装。 OBEX 客户端用于向 OBEX 服务器推入或接出对象。 一个对像可以是(举个例子)商业卡片或约会。 OBEX 客户能通过 SDP 从远程设备取得 RFCOMM 通道号。这可以通过指定服务名代替 RFCOMM 通道号来完成。支持的服务名是有:IrMC、FTRN 和 OPUSH。 也可以用数字来指定 RFCOMM 通道号。下面是一个 OBEX 会话的例子,一个设备信息对像从手机中被拉出, 一个新的对像被推入手机的目录。 &prompt.user; obexapp -a 00:80:37:29:19:a4 -C IrMC obex> get telecom/devinfo.txt devinfo-t39.txt Success, response: OK, Success (0x20) obex> put new.vcf Success, response: OK, Success (0x20) obex> di Success, response: OK, Success (0x20) 为了提供 OBEX 推入服务,&man.sdpd.8; 必须处于运行状态。必须创建一个根目录用于存放所有进入的对象。 根文件夹的默认路径是 /var/spool/obex。 最后,在有效的 RFCOMM 通道号上开始 OBEX 服务。OBEX 服务会使用 SDP 进程自动注册 OBEX 对象推送 (OBEX Object Push) 服务。 下面的例子展示如何启动 OBEX 服务。 &prompt.root; obexapp -s -C 10 串口(SP)层面 串口(SP)层面允许蓝牙设备完成 RS232 (或类似) 串口线的仿真。 这个层面所涉及到情形是, 通过虚拟串口使用蓝牙代替线缆来处理以前的程序。 工具 &man.rfcomm.sppd.1; 来实现串口层。 Pseudo tty 用来作为虚拟的串口。 下面的例子展示如何连接远程设备的串口服务。 注意您不必指定 RFCOMM 通道——&man.rfcomm.sppd.1; 能够通过 SDP 从远端设备那里获得。 如果您想代替它的话,可以在命令行里指定 RFCOMM 通道来实现: &prompt.root; rfcomm_sppd -a 00:07:E0:00:0B:CA -t /dev/ttyp6 rfcomm_sppd[94692]: Starting on /dev/ttyp6... 一旦连接上,pseudo tty就可以充当串口了: &prompt.root; cu -l ttyp6 问题解答 不能连接远端设备 一些较老的蓝牙设备并不支持角色转换 (role switching)。默认情况下,&os; 接受一个新的连接时, 它会尝试进行角色转换并成为主控端 (master)。 不支持角色转换的设备将无法连接。 注意角色转换是在新连接建立时运行的, 因此如果远程设备不支持角色转换,就不可能向它发出请求。 一个 HCI 选项用来在本地端禁用角色转换。 &prompt.root; hccontrol -n ubt0hci write_node_role_switch 0 如果有错, 能否知道到底正在发生什么? 可以。 需要借助第三方软件包 hcidump, 它可以通过 comms/hcidump port 来安装。 hcidump 工具和 &man.tcpdump.1; 非常相像。 它可以用来显示蓝牙数据包的内容, 并将其记录到文件中。
Steve Peterson 作者: 雪平 中文翻译:
zxpmyth@yahoo.com.cn
苏义
桥接 简介 IP 子网 桥接 有时候需要将一个物理网络分成两个独立的网段, 而无需创建新的 IP 子网和连接两个网段的路由器。 以这种方式连接两个网络的设备称为网桥 (bridge)。 有两个网络接口的 FreeBSD 系统可以作为网桥。 网桥通过学习每个网络接口上的 MAC 层地址 (以太网地址) 工作。 只当数据包的源地址和目标地址处于不同网络时网桥才进行转发。 在很多方面,网桥就像一个带有很少端口的以太网交换机。 适合桥接的情况 目前,有两种常见的情况下使用网桥。 网段上存在高流量 一种情况是您的物理网段流量过载, 但是您不希望划分子网以路由器连接两个子网。 让我们考虑一个关于报社的例子, 它的编辑部和产品部处于同一子网中。 所有的编辑用户都使用服务器 A 的文件服务,而产品部使用服务器 B。 一个以太网将所有的用户连接在一起, 高的流量负载使得网络速度变慢。 如果编辑部的用户能被分隔到一个网段中, 产品部用户被分隔到另一个网段中那么这两个网段可以通过网桥连接起来。 只当数据包目标为网桥其它端接口时, 它才会被传到其它的网络上——这样就减少了各个网络的拥塞。 过滤/数据整形防火墙 防火墙 NAT 第二种常见的情况是需要防火墙的地方没有进行网络地址转换(NAT)。 一个例子是一个小公司,它通过 DSL 或 ISDN 连接到 ISP。 它拥有 13 个 ISP 分配的全局 IP 地址和 10 台 PC。 在这种情况下,由于划分子网的问题, 使用基于路由的防火墙存在一定难度。 路由器 DSL ISDN 一个基于网桥的防火墙可以成接在 DSL/ISDN 路由器的后面而免去了所有的 IP 号问题。 配置网桥 选择网络接口卡 一个网桥至少需要两块网卡才能运行。 不幸的是,并不是所有的网卡都能被用于桥接。阅读 &man.bridge.4; 了解所支持网卡的细节。 在继续之前要先安装并测试这两块网卡。 改变内核配置 内核选项 BRIDGE 为了激活内核对桥接的支持,增加以下语句: options BRIDGE 到您的内核配置文件里,然后重建内核。 防火墙支持 防火墙 如果您打算把网桥作为防火墙来使用, 则还需要加入 IPFIREWALL 的设置。 请参考 以了解关于将网桥配置为防火墙的其它信息。 - 如果允许非IP(non-IP)数据包 (比如 ARP) 穿过网桥, - 必须设置一个防火墙 (firewall) 选项。这个选项是 - IPFIREWALL_DEFAULT_TO_ACCEPT。 - 注意:这个选项改变了默认的规则使得防火墙接受任何的数据包。 - 在您设置这些规则前,请确认这些规则可能会产生什么后果。 + 如果需要允许非 IP 数据包 (例如 ARP) 穿过网桥, + 有三种方法可供选择。 第一种是在内核配置中加入下列选项, + 并重新联编: + + option IPFIREWALL_DEFAULT_TO_ACCEPT + + 第二种方法, 是在 + rc.conf 文件中将防火墙类型设置为 open + + firewall_type="open" + + 注意, 这些选项会让防火墙看起来像透明的一样; + 默认情况下, 所有包或连接都会被允许。 + 如果选择这样做的话, 可能会需要对防火墙规则进行大幅调整。 + + 第三种方法是应用下述 &man.ipfw.8; + 规则: + + &prompt.root; ipfw add allow mac-type arp layer2 + + 或将其加入在用的防火墙规则集。 这个规则实际上是允许 &man.arp.8; 包通过, + 因此最好把它放在规则集前面, 以便能够尽早地应用此规则, 而避免由此带来的性能影响。 数据传输支持 如果您希望将网桥作为一个数据传输器, 您需要向内核文件中加入 DUMMYNET 选项。阅读 &man.dummynet.4; 以做进一步了解。 激活网桥 增加下行: net.link.ether.bridge.enable=1 /etc/sysctl.conf 里, 以便在运行时激活网桥,然后加下行: net.link.ether.bridge.config=if1,if2 以便在指定的接口上激活网桥 (使用您的两个网络接口的名字替换 if1if2 )。如果您希望用 &man.ipfw.8; 来过滤桥接的数据包,您还应该加入: net.link.ether.bridge.ipfw=1 这样一行。 对于 &os; 5.2-RELEASE 和更早的版本, 则应使用下面的配置: net.link.ether.bridge=1 net.link.ether.bridge_cfg=if1,if2 net.link.ether.bridge_ipfw=1 其它信息 如果您希望可以从网络上 &man.ssh.1; 进入网桥, 给一个网卡分配 IP 地址就可以了。 原则上给两张卡分配一个地址是很不好的。 如果网络中有多个网桥, 任何两个工作站之间的路径不能多于一条。 技术上说,它的意思是不支持生成连接树管理。 网桥会增加 &man.ping.8; 的延迟时间, 尤其是不同网段之间的传输。
Jean-François Dockès 更新: Alex Dupre 重新组织及增强: 雪平 中文翻译:
zxpmyth@yahoo.com.cn
苏义
无盘操作 无盘工作站 无盘操作 FreeBSD 主机可以从网络启动而无需本地磁盘就可操作, 使用的是从 NFS 服务器装载的文件系统。 除了标准的配置文件,无需任何的系统修改。 很容易设置这样的系统因为所有必要的元素都很容易得到: 至少有两种可能的方法从网络加载内核: PXE:&intel; 的先启动执行环境 (Preboot Xecution Environment) 系统是一种灵活的引导 ROM 模式,这个 ROM 内建在一些网卡或主板的中。查看 &man.pxeboot.8; 以获取更多细节。 Etherboot port (net/etherboot) 产生通过网络加载内核的可 ROM 代码。这些代码可以烧入网卡上的 PROM 上,或从本地软盘 (或硬盘) 驱动器加载,或从运行着的 &ms-dos; 系统加载。它支持多种网卡。 一个样板脚本 (/usr/share/examples/diskless/clone_root) 简化了对服务器上的工作站根文件系统的创建和维护。 这个脚本需要少量的自定义,但您能很快的熟悉它。 /etc 存在标准的系统启动文件用于侦测和支持无盘的系统启动。 可以向 NFS 文件或本地磁盘进行交换(如果需要的话)。 设置无盘工作站有许多方法。 有很多相关的元素大部分可以自定义以适合本地情况。 以下将介绍一个完整系统的安装,强调的是简单性和与标准 FreeBSD 启动脚本的兼容。介绍的系统有以下特性: 无盘工作站使用一个共享的只读 / 文件系统和一个共享的只读/usr root 文件系统是一份标准的 FreeBSD 根文件系统 (一般是服务器的),只是一些配置文件被特定于无盘操作的配置文件覆盖。 root 文件系统必须可写的部分被 &man.md.4; 文件系统覆盖。 任何的改写在重启后都会丢失。 内核由 etherbootPXE 传送和加载, 有些情况可能会指定使用其中之一。 如上所述,这个系统是不安全的。 它应该处于网络的受保护区域并不被其它主机信任。 这部分所有的信息均在 5.2.1-RELEASE 上测试过。 背景信息 设置无盘工作站相对要简单而又易出错。 有时分析一些原因是很难的。例如: 编译时选项在运行时可能产生不同的行为。 出错信息经常是加密了的或根本就没有。 在这里, 涉及到的一些背景知识对于可能出现的问题的解决是很有帮助的。 要成功地引导系统还有些操作需要做。 机子需要获取初始的参数,如它的 IP 地址、执行文件、服务器名、根路径。这个可以使用 或 BOOTP 协议来完成。 DHCP 是 BOOTP 的兼容扩展, 并使用相同的端口和基本包格式。 只使用 BOOTP 来配置系统也是可行的。 &man.bootpd.8; 服务程序被包含在基本的 &os; 系统里。 不过,DHCP 相比 BOOTP 有几个好处 (更好的配置文件,使用 PXE 的可能性,以及许多其它并不直接相关的无盘操作), 接着我们会要描述一个 DHCP 配置, 可能的话会利用与使用 &man.bootpd.8; 相同的例子。这个样板配置会使用ISC DHCP 软件包 (3.0.1.r12 发行版安装在测试服务器上)。 机子需要传送一个或多个程序到本地内存。 TFTPNFS 会被使用。选择TFTP 还是 NFS 需要在几个地方的编译时间选项里设置。 通常的错误源是为文件名指定了错误的协议:TFTP 通常从服务器里的一个单一目录传送所有文件,并需要相对这个目录的文件名。 NFS 需要的是绝对文件路径。 介于启动程序和内核之间的可能的部分需要被初始化并执行。 在这部分有几个重要的变量: PXE 会装入 &man.pxeboot.8;——它是 &os; 第三阶段装载器的修改版。 &man.loader.8; 会获得许多参数用于系统启动, 并在传送控制之前把它们留在内核环境里。 在这种情况下,使用 GENERIC 内核就可能了。 Etherboot 会做很少的准备直接装载内核。 您要使用指定的选项建立 (build) 内核。 PXEEtherboot 工作得一样的好。 不过, 因为一般情况下内核希望 &man.loader.8; 做了更多的事情, PXE 是推荐的方法。 如果您的 BIOS 和网卡都支持 PXE, 就应该使用它。 最后,机子需要访问它的文件系统。 NFS 使用在所有的情况下。 查看 &man.diskless.8; 手册页。 安装说明 配置使用<application>ISC DHCP</application> DHCP 无盘操作 ISC DHCP 服务器可以回应 BOOTP 和 DHCP 的请求。 ISC DHCP 3.0 并不属于基本系统。首先您需要安装 net/isc-dhcp3-server port 或相应的 一旦安装了 ISC DHCP, 还需要一个配置文件才能运行 (通常名叫 /usr/local/etc/dhcpd.conf)。 这里有个注释过的例子,里边主机 margaux 使用 Etherboot, 而主机corbieres 使用 PXE default-lease-time 600; max-lease-time 7200; authoritative; option domain-name "example.com"; option domain-name-servers 192.168.4.1; option routers 192.168.4.1; subnet 192.168.4.0 netmask 255.255.255.0 { use-host-decl-names on; option subnet-mask 255.255.255.0; option broadcast-address 192.168.4.255; host margaux { hardware ethernet 01:23:45:67:89:ab; fixed-address margaux.example.com; next-server 192.168.4.4; filename "/data/misc/kernel.diskless"; option root-path "192.168.4.4:/data/misc/diskless"; } host corbieres { hardware ethernet 00:02:b3:27:62:df; fixed-address corbieres.example.com; next-server 192.168.4.4; filename "pxeboot"; option root-path "192.168.4.4:/data/misc/diskless"; } } 这个选项告诉 dhcpd 发送host 里声明的用于无盘主机的主机名的值。 另外可能会增加一个 option host-name margauxhost 声明里。 next-server 正式指定 TFTPNFS 服务用于载入装载器或内核文件 (默认使用的是相同的主机作为DHCP 服务器)。 filename 正式定义这样的文件——etherbootPXE 为执行下一步将装载它。 根据使用的传输方式,它必须要指定。 Etherboot 可以被编译来使用 NFSTFTP。 &os; port 默认配置了NFSPXE 使用 TFTP, 这就是为什么在这里使用相对文件名 (这可能依赖于 TFTP 服务器配置,不过会相当典型)。 同样,PXE 会装载 pxeboot, 而不是内核。另外有几个很有意思的可能,如从 &os; CD-ROM 的 /boot 目录装载 pxeboot (因为 &man.pxeboot.8; 能够装载 GENERIC 内核,这就使得可以使用 PXE 从远程的 CD-ROM 里启动)。 root-path 选项定义到根 (root) 文件系统的路径,通常是 NFS 符号。当使用 PXE 时,只要您不启用内核里的 BOOTP 选项,可以不管主机的IP。NFS 服务器然后就如同 TFTP 一样。 配置使用BOOTP BOOTP 无盘操作 这里紧跟的是一个等效的 bootpd 配置 (减少到一个客户端)。这个可以在 /etc/bootptab 里找到。 请注意:为了使用BOOTP,etherboot 必须使用非默认选项 NO_DHCP_SUPPORT 来进行编译,而且 PXE 需要 DHCPbootpd 的唯一可见的好处是它存在于基本系统中。 .def100:\ :hn:ht=1:sa=192.168.4.4:vm=rfc1048:\ :sm=255.255.255.0:\ :ds=192.168.4.1:\ :gw=192.168.4.1:\ :hd="/tftpboot":\ :bf="/kernel.diskless":\ :rp="192.168.4.4:/data/misc/diskless": margaux:ha=0123456789ab:tc=.def100 使用<application>Etherboot</application>准备启动程序 Etherboot Etherboot 的网站 包含有更多的文档 ——主要瞄准的是 Linux 系统,但无疑包含有有用的信息。 如下列出的是关于在 FreeBSD 系统里使用 Etherboot 首先您必须安装net/etherboot 包或 port。 您可以改变 Etherboot 的配置 (如使用 TFTP 来代替 NFS), 方法是修改 Config 文件——在 Etherboot 源目录里。 对于我们的设置,我们要使用一张启动软盘。 对于其它的方法(PROM,或 &ms-dos;程序), 请参考 Etherboot 文档。 想要使用启动软盘,先插入一张软盘到安装有 Etherboot 的机器的驱动器里, 然后把当前路径改到 src 目录——在 Etherboot 树下, 接着输入: &prompt.root; gmake bin32/devicetype.fd0 devicetype 依赖于无盘工作站上的以太网卡的类型。 参考在同一个目录下的 NIC 文件确认正确的 devicetype 使用<acronym>PXE</acronym>启动 默认地,&man.pxeboot.8; 装载器通过 NFS 装载内核。它可以编译来使用 TFTP——通过在文件 /etc/make.conf 里指定 LOADER_TFTP_SUPPORT 选项来代替。 请参见 /usr/share/examples/etc/make.conf 里的注释 了解如何配置。 除此之外还有两个未说明的 make.conf 选项——它可能对于设置一系列控制台无盘机器会有用: BOOT_PXELDR_PROBE_KEYBOARDBOOT_PXELDR_ALWAYS_SERIAL 当机器启动里,要使用 PXE, 通常需要选择 Boot from network 选项——在 BIOS 设置里, 或者在 PC 初始化的时候输入一个功能键 (function key)。 配置 <acronym>TFTP</acronym> 和 <acronym>NFS</acronym> 服务器 TFTP 无盘操作 NFS 无盘操作 如果您正在使用 PXEEtherboot——配置使用了 TFTP,那么您需要在文件服务器上启用 tftpd 建立一个目录——从那里 tftpd 可以提供文件服务,如 /tftpboot 把这一行加入到 /etc/inetd.conf里: tftp dgram udp wait root /usr/libexec/tftpd tftpd -l -s /tftpboot 好像有一些版本的 PXE 需要 TCP 版本的 TFTP。 在这种情况下,加入第二行,使用 stream tcp 来代替 dgram udp inetd 重读其配置文件。 要正确执行这个命令, 在 /etc/rc.conf 文件中必须加入 &prompt.root; /etc/rc.d/inetd restart 您可把 tftpboot 目录放到服务器上的什何地方。 确定这个位置设置在 inetd.confdhcpd.conf 里。 在所有的情况下,您都需要启用 NFS, 并且 NFS 服务器上导出相应的文件系统。 把这一行加入到/etc/rc.conf里: nfs_server_enable="YES" 通过往 /etc/exports 里加入下面几行(调整载入点列, 并且使用无盘工作站的名字替换 margaux corbieres), 导出文件系统——无盘根目录存在于此: /data/misc -alldirs -ro margaux corbieres mountd 重读它的配置文件。如果您真的需要启用第一步的 /etc/rc.confNFS, 您可能就要重启系统了。 &prompt.root; /etc/rc.d/mountd restart 建立无盘内核 无盘操作 内核配置 如果您在使用 Etherboot, 您需要为无盘客户端建立内核配置文件, 使用如下选项(除了常使用的外): options BOOTP # Use BOOTP to obtain IP address/hostname options BOOTP_NFSROOT # NFS mount root filesystem using BOOTP info 您可能也想使用 BOOTP_NFSV3BOOT_COMPATBOOTP_WIRED_TO (参考 NOTES 文件)。 这些名字具有历史性,并且有些有些误导, 因为它们实际上启用了内核里 (它可能强制限制 BOOTP 或 DHCP 的使用),与 DHCP 和 BOOTP 的无关的应用。 编译内核(参考), 然后将它复制到 dhcpd.conf 里指定的地方。 当使用 PXE 里, 使用以上选项建立内核并不做严格要求(尽管建议这样做)。 启用它们会在内核启动时引起更多的 DHCP 提及过的请求,带来的小小的风险是在有些特殊情况下新值和由 &man.pxeboot.8; 取回的值之间的不一致性。 使用它们的好处是主机名会被附带设置。否则, 您就需要使用其它的方法来设置主机名,如在客户端指定的 rc.conf 文件里。 为了使带有 Etherboot 的内核可引导,就需要把设备提示 (device hint) 编译进去。通常要在配置文件(查看 NOTES 配置注释文件) 里设置下列选项: hints "GENERIC.hints" 准备根(root)文件系统 根文件系统 无盘操作 您需要为无盘工作站建立根文件系统, 它就是 dhcpd.conf 里的 root-path 所指定的目录。 使用 <command>make world</command> 来复制根文件系统 这种方法可以迅速安装一个彻底干净的系统 (不仅仅是根文件系统) 到 DESTDIR。 您要做的就是简单地执行下面的脚本: #!/bin/sh export DESTDIR=/data/misc/diskless mkdir -p ${DESTDIR} cd /usr/src; make buildworld && make buildkernel cd /usr/src/etc; make distribution 一旦完成,您可能需要定制 /etc/rc.conf/etc/fstab——根据您的需要放到 DESTDIR里。 配置 swap(交换) 如果需要,位于服务器上的交换文件可以通过 NFS 来访问。 <acronym>NFS</acronym> 交换区 内核并不支持在引导时启用 NFS 交换区。 交换区必须通过启动脚本启用, 其过程是挂接一个可写的文件系统, 并在其上创建并启用交换文件。 要建立尺寸合适的交换文件, 可以这样做: &prompt.root; dd if=/dev/zero of=/path/to/swapfile bs=1k count=1 oseek=100000 要启用它,您须要把下面几行加到 rc.conf里: swapfile=/path/to/swapfile 杂项问题 运行时 <filename>/usr</filename> 是只读在 无盘操作 只读的 /usr 如果无盘工作站是配置来支持 X, 那么您就必须调整 XDM 配置文件,因为它默认把错误信息写到 /usr 使用非 FreeBSD 服务器 当用作根文件系统的服务器运行的是不 FreeBSD,您须要在 FreeBSD 机器上建立根文件系统, 然后把它复制到它的目的地,使用的命令可以是 tarcpio 在这种情况下,有时对于 /dev 里的一些特殊的文件会有问题,原因就是不同的 最大/最小整数大小。 一种解决的方法就是从非 FreeBSD 服务里导出一个目录, 并把它载入 FreeBSD 到机子上, 并使用 &man.devfs.5; 来为用户透明地分派设备节点。
ISDN ISDN 关于 ISDN 技术和硬件的一个好的资源是Dan Kegel 的 ISDN 主页 一个快速简单的到 ISDN 的路线图如下: 如果您住在欧洲,您可能要查看一下 ISDN 卡部分。 如果您正计划首要地使用 ISDN 基于拨号非专用线路连接到带有提供商的互联网, 您可能要了解一下终端适配器。如果您更改提供商的话, 这会给您带来最大的灵活性、最小的麻烦。 如果您连接了两个局域网 (LAN),或使用了专用的 ISDN 连线连接到互联网,您可能要考虑选择单独的路由器/网桥。 在决定选择哪一种方案的时候,价格是个很关键的因素。 下面列有从不算贵到最贵的选择: Hellmuth Michaelis 贡献者: 雪平 中文翻译:
zxpmyth@yahoo.com.cn
ISDN 卡 ISDN FreeBSD 的 ISDN 工具通过被动卡 (passive card) 仅支持 DSS1/Q.931(或 Euro-ISDN) 标准。 此外也支持一些 active card, 它们的固件也支持其它信号协议, 这其中包括最先得到支持的 Primary Rate (PRI) ISDN卡。 isdn4bsd 软件允许连接到其它 ISDN 路由器,使用的是原始的 HDLC 上的 IP 或利用同步 PPP:使用带有 isppp (一个修改过的 &man.sppp.4; 驱动程序)的 PPP 内核,或使用用户区 (userland) &man.ppp.8;。通过使用 userland &man.ppp.8;,两个或更多 ISDN 的 B 通道联结变得可能。 除了许多如 300 波特 (Baud) 的软 modem 一样的工具外, 还可以实现电话应答机应用。 在 FreeBSD 里,正有更多的 PC ISDN 卡被支持; 报告显示在整个欧洲及世界的其它许多地区可以成功使用。 被支持的主动型 ISDN 卡主要是带有 Infineon (以前的 Siemens) ISAC/HSCX/IPAC ISDN 芯片组,另外还有带有 Cologne (只有 ISA 总线) 芯片的 ISDN 卡、带有 Winbond W6692 芯片的 PCI 卡、一部分带有 Tiger300/320/ISAC 芯片组的卡以及带有一些商家专有的芯片组的卡 (如 AVM Fritz!Card PCI V.1.0 和 the AVM Fritz!Card PnP)。 当前积极的支持的 ISDN 卡有 AVM B1 (ISA 和 PCI) BRI 卡和 AVM T1 PCI PRI 卡。 关于 isdn4bsd 的文档,请查看 FreeBSD 系统里的 /usr/share/examples/isdn/ 目录或查看 isdn4bsd的主页, 那里也有提示、勘误表以及更多的文档 (如 isdn4bsd手册)。 要是您有兴趣增加对不同 ISDN 协议的支持,对当前还不支持的 ISDN PC 卡的支持或想增强 isdn4bsd 的性能,请联系 &a.hm;。 对于安装、配置以及 isdn4bsd 故障排除的问题,可以利用 &a.isdn.name; 邮件列表。
ISDN 终端适配器 终端适配器 (TA) 对于 ISDN 就好比 modem 对于常规电话线。 modem 许多 TA 使用标准的 Hayes modem AT 命令集,并且可以降级来代替 modem。 TA 基本的运作同 modem 一样,不同之处是连接和整个速度更比老 modem 更快。同 modem 的安装一样,您也需要配置 PPP。确认您的串口速度已足够高。 PPP 使用 TA 连接互联网提供商的主要好处是您可以做动态的 PPP。 由于 IP 地址空间变得越来越紧张,许多提供商都不愿再提供静态 IP。许多的独立的路由器是不支持动态 IP 分配的。 TA 完全依赖于您在运行的 PPP 进程, 以完成它们的功能和稳定的连接。这可以让您在 FreeBSD 机子里轻易地从使用 modem 升级到 ISDN,要是您已经安装了 PPP 的话。只是,在您使用 PPP 程序时所体验到任何问题同时也存在。 如果您想要最大的稳定性,请使用 PPP 内核选项,而不要使用 userland PPP。 下面的 TA 就可以同 FreeBSD 一起工作: Motorola BitSurfer 和 Bitsurfer Pro Adtran 大部分其它的 TA 也可能工作,TA 提供商试图让他们的产品可以接受大部分的标准 modem AT 命令集。 对于外置 TA 的实际问题是:象 modem 要一样,您机子需要有一个好的串行卡。 想要更深入地理解串行设备以及异步和同步串口这间的不同点, 您就要读读 FreeBSD 串行硬件教程了。 TA 将标准的 PC 串口 (同步的) 限制到了 115.2 Kbs,即使您有 128 Kbs 的连接。 想要完全利用 ISDN 有能力达到的 128 Kbs,您就需要把 TA 移到同步串行卡上。 当心被骗去买一个内置的 TA 以及自认为可以避免同步/异步问题。内置的 TA 只是简单地将一张标准 PC 串口芯片内建在里边。 所做的这些只是让您省去买另一根串行线以及省去寻找另一个空的插孔。 带有 TA 的同步卡至少和一个独立的路由器同一样快地, 而且仅使用一个简单的 386 FreeBSD 盒驱动它。 选择同步卡/TA 还是独立的路由器,是个要高度谨慎的问题。 在邮件列表里有些相关的讨论。我们建议您去搜索一下关于完整讨论的记录 单独的 ISDN 桥/路由器 ISDN 单独的 桥/路由器 ISDN 桥或路由器根本就没有指定要 FreeBSD 或其它任何的操作系统。更多完整的关于路由和桥接技术的描述, 请参考网络指南的书籍。 这部分的内容里,路由器和桥接这两个词汇将会交替地使用。 随着 ISDN 路由器/桥的价格下滑,对它们的选择也会变得越来越流行。 ISDN 路由器是一个小盒子,可以直接地接入您的本地以太网, 并且自我管理到其它桥/路由器的连接。它有个内建的软件用于与通信——通过 PPP 和其它流行的协议。 路由器有比标准 TA 更快的吞吐量,因为它会使用完全同步的 ISDN 连接。 使用 ISDN 路由器和桥的主要问题是两个生产商之间的协同性仍存在问题。 如果您计划连接到互联网提供商,您应该跟他们进行交涉。 如果您计划连接两个局域网网段,如您的家庭网和办公网, 这将是最简单最低维护的解决方案。因为您买的设备是用于连接两边的, 可以保证这种连接一定会成功。 例如连接到家里的计算机,或者是办公网里的一个分支连接到办公主网, 那么下面的设置就可能用到: 办公室局部或家庭网 10 base 2 网络使用基于总线拓扑的 10 base 2 以太网 (瘦网(thinnet))。如果有必要,用网线连接路由器和 AUI/10BT 收发器。 ---Sun workstation | ---FreeBSD box | ---Windows 95 | Stand-alone router | ISDN BRI line 10 Base 2 Ethernet 如果您的家里或办公室支部里只有一台计算机, 您可以使用一根交叉的双绞线直接连接那台独立路由器。 主办公室或其它网络 10 base T 网络使用的是星形拓扑的 10 base T 以太网(双绞线)。 -------Novell Server | H | | ---Sun | | | U ---FreeBSD | | | ---Windows 95 | B | |___---Stand-alone router | ISDN BRI line ISDN Network Diagram 大部分路由器/网桥有一大好处就是,它们允许您在 同一 时间,有两个 分开独立的 PPP 连接到两个分开的点上。这点在许多的 TA 上是不支持的, 除非带有两个串口的特定模式(通常都很贵)。请不要把它与通道连接、MPP 等相混淆。 这是个非常有用的功能,例如,如果在您的办公室里您有个专有的 ISDN 连接,而且您想接入到里边,但休想让另一根 ISDN 线也能工作。 办公室里的路由器能够管理专有的B通道连接到互联网 (64 Kbps) 以及使用另一个通道 B 来完成单独的数据连接。 第二个 B 通道可以用于拨进、拨出或动态与第一个B通道进行连接 (MPP等),以获取更大宽带。 IPX/SPX 以太网桥也允许您传输的不仅仅是 IP 通信。您也可以发送 IPX/SPX 或其它任何您所使用的协议。
Chern Lee 作者: 译者:
delphij@FreeBSD.org.cn
网络地址转换 概要 natd FreeBSD 的网络地址转换服务, 通常也被叫做 &man.natd.8;, 是一个能够接收连入的未处理 IP 包, 将源地址修改为本级地址然后重新将这些包注入到发出 IP 包流中。 &man.natd.8; 同时修改源地址和端口, 当接收到响应数据时,它作逆向转换以便把数据发回原先的请求者。 Internet 连接共享 NAT NAT 最常见的用途是为人们所熟知的 Internet 连接共享。 安装 随着 IPv4 的 IP 地址空间的日益枯竭, 以及使用如 DSL 和电缆等高速连接的用户的逐渐增多, 越来越多的人开始需要 Internet 连接共享这样的解决方案。 由于能够将许多计算机通过一个对外的 IP 地址进行接入, &man.natd.8; 成为了一个理想的选择。 更为常见的情况, 一个用户通过电缆或者 DSL 线路 接入,并拥有一个 IP 地址,同时,希望通过这台接入 Internet 的计算机来为 LAN 上更多的计算机提供接入服务。 为了完成这一任务, 接入 Internet 的 FreeBSD 机器必须扮演网关的角色。 这台网关必须有两块网卡 — 一块用于连接 Internet 路由器, 另一块用来连接 LAN。 所有 LAN 上的机器通过 Hub 或交换机进行连接。 有多种方法能够通过 &os; 网关将 LAN 接入 Internet。 这个例子只介绍了有至少两块网卡的网关。 _______ __________ ________ | | | | | | | Hub |-----| Client B |-----| Router |----- Internet |_______| |__________| |________| | ____|_____ | | | Client A | |__________| Network Layout 上述配置被广泛地用于共享 Internet 连接。 LAN 中的一台机器连接到 Internet 中。 其余的计算机则通过那台 网关 机来连接 Internet。 内核 配置 配置 下面这些选项必须放到内核配置文件中: options IPFIREWALL options IPDIVERT 此外,下列是一些可选的选项: options IPFIREWALL_DEFAULT_TO_ACCEPT options IPFIREWALL_VERBOSE 这些配置必须放到 /etc/rc.conf 中: gateway_enable="YES" firewall_enable="YES" firewall_type="OPEN" natd_enable="YES" natd_interface="fxp0" natd_flags="" 将机器配置为网关。 执行 sysctl net.inet.ip.forwarding=1 效果相同。 在启动时启用 /etc/rc.firewall 中的防火墙规则。 指定一个预定义的允许所有包进入的防火墙规则集。 参见 /etc/rc.firewall 以了解其他类型的规则集。 指定通过哪个网络接口转发包 (接入 Internet 的那一个)。 其他希望在启动时传递给 &man.natd.8; 的参数。 /etc/rc.conf 中加入上述选项将在系统启动时运行 natd -interface fxp0。 这一工作也可以手工完成。 当有太多选项要传递时,也可以使用一个 &man.natd.8; 的配置文件来完成。这种情况下,这个配置文件必须通过在 /etc/rc.conf 里增加下面内容来定义: natd_flags="-f /etc/natd.conf" /etc/natd.conf 文件会包含一个配置选项列表, 每行一个。在紧跟部分的例子里将使用下面的文件: redirect_port tcp 192.168.0.2:6667 6667 redirect_port tcp 192.168.0.3:80 80 关于配置文件的更多信息,参考 &man.natd.8; 手册页中关于 选项那一部分。 在LAN后面的每一台机子和接口应该被分配私有地址空间(由RFC 1918定义) 里的 IP 地址,并且默认网关设成 natd 机子的内连 IP 地址。 例如:客户端 AB 在 LAN 后面,IP 地址是 192.168.0.2192.168.0.3,同时 natd 机子的 LAN 接口上的 IP 地址是 192.168.0.1。客户端 AB 的默认网关必须要设成 natd 机子的 IP——192.168.0.1natd 机子外连,或互联网接口不需要为了 &man.natd.8; 而做任何特别的修改就可工作。 端口重定向 使用 &man.natd.8; 的缺点就是 LAN 客户不能从互联网访问。LAN 上的客户可以进行到外面的连接,而不能接收进来的连接。如果想在 LAN 的客户端机子上运行互联网服务,这就会有问题。 对此的一种简单方法是在 natd 机子上重定向选定的互联网端口到 LAN 客户端。 例如:在客户端 A 上运行 IRC 服务,而在客户端 B 上运行 web 服务。 想要正确的工作,在端口 6667 (IRC) 和 80 (web) 上接收到的连接就必须重定向到相应的机子上。 需要使用适当的选项传送给 &man.natd.8;。语法如下: -redirect_port proto targetIP:targetPORT[-targetPORT] [aliasIP:]aliasPORT[-aliasPORT] [remoteIP[:remotePORT[-remotePORT]]] 在上面的例子中,参数应该是: -redirect_port tcp 192.168.0.2:6667 6667 -redirect_port tcp 192.168.0.3:80 80 这就会重定向适当的 tcp 端口到 LAN 上的客户端机子。 参数可以用来指出端口范围来代替单个端口。例如, tcp 192.168.0.2:2000-3000 2000-3000 就会把所有在端口 2000 到 3000 上接收到的连接重定向到主机 A 上的端口 2000 到 3000。 当直接运行 &man.natd.8; 时,就可以使用这些选项, 把它们放到 /etc/rc.conf 里的 natd_flags="" 选项上, 或通过一个配置文件进行传送。 想要更多配置选项,请参考 &man.natd.8;。 地址重定向 地址重定向 如果有几个 IP 地址提供,那么地址重定向就会很有用, 然而他们必须在一个机子上。使用它,&man.natd.8; 就可以分配给每一个 LAN 客户端它们自己的外部 IP 地址。&man.natd.8; 然后会使用适当的处部 IP 地址重写从 LAN 客户端外出的数据包, 以及重定向所有进来的数据包——一定的 IP 地址回到特定的 LAN 客户端。这也叫做静态 NAT。例如,IP 地址 128.1.1.1128.1.1.2128.1.1.3 属于 natd 网关机子。 128.1.1.1 可以用来作 natd 网关机子的外连 IP 地址,而 128.1.1.2128.1.1.3 用来转发回 LAN 客户端 AB 语法如下: -redirect_address localIP publicIP localIP LAN 客户端的内部 IP 地址。 publicIP 相应 LAN 客户端的外部 IP 地址。 在这个例子里,参数是: -redirect_address 192.168.0.2 128.1.1.2 -redirect_address 192.168.0.3 128.1.1.3 一样,这些参数也是放在 /etc/rc.conf 里的 natd_flags="" 选项上, 或通过一个配置文件传送给它。使用地址重定向, 就没有必要用端口重定向了,因为所有在某个 IP 地址上收到的数据都被重定向了。 natd 机子上的外部 IP 地址必须激活并且别名到 (aliased) 外连接口。要这做就看看 &man.rc.conf.5;。
并口电缆 IP (PLIP) PLIP 并口电缆 IP PLIP PLIP 允许我们在两个并口间运行 TCP/IP。 在使用笔记本电脑, 或没有网卡的计算机时, 这会非常有用。 这一节中, 我们将讨论: 制作用于并口的 (laplink) 线缆。 使用 PLIP 连接两台计算机。 制作并口电缆。 您可以在许多计算机供应店里买到并口电缆。 如果买不到, 或者希望自行制作, 则可以参阅下面的表格, 它介绍了如何利用普通的打印机并口电缆来改制: 用于网络连接的并口电缆接线方式A-name A 端 B 端 描述 Post/BitDATA0 -ERROR 2 15 15 2 数据 0/0x01 1/0x08DATA1 +SLCT 3 13 13 3 数据 0/0x02 1/0x10DATA2 +PE 4 12 12 4 数据 0/0x04 1/0x20DATA3 -ACK 5 10 10 5 脉冲 (Strobe) 0/0x08 1/0x40DATA4 BUSY 6 11 11 6 数据 0/0x10 1/0x80GND 18-25 18-25 GND -
设置 PLIP 首先,您需要一根 laplink 线。然后, 确认两台计算机的内核都有对 &man.lpt.4; 驱动程序的支持: &prompt.root; grep lp /var/run/dmesg.boot lpt0: <Printer> on ppbus0 lpt0: Interrupt-driven port 并口必须是一个中断驱动的端口, 您应在 /boot/device.hints 文件中配置: hint.ppc.0.at="isa" hint.ppc.0.irq="7" 然后检查内核配置文件中是否有一行 device plip 或加载了 plip.ko 内核模块。 这两种情况下, 在使用 &man.ifconfig.8; 命令时都会显示并口对应的网络接口, 类似这样: &prompt.root; ifconfig plip0 plip0: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> mtu 1500 用 laplink 线接通两台计算机的并口。 在两边以 root 身份配置通讯参数。 例如, 如果你希望将 host1 通过另一台机器 host2 连接: host1 <-----> host2 IP Address 10.0.0.1 10.0.0.2 配置 host1 上的网络接口,照此做: &prompt.root; ifconfig plip0 10.0.0.1 10.0.0.2 配置 host2 上的网络接口,照此做: &prompt.root; ifconfig plip0 10.0.0.2 10.0.0.1 您现在应该有个工作的连接了。想要更详细的信息, 请阅读 &man.lp.4; 和 &man.lpt.4; 手册页。 您还应该增加两个主机到 /etc/hosts 127.0.0.1 localhost.my.domain localhost 10.0.0.1 host1.my.domain host1 10.0.0.2 host2.my.domain 要确认连接是否工作,可以到每一台机子上,然后 ping 另外一台。例如,在 host1 上: &prompt.root; ifconfig plip0 plip0: flags=8851<UP,POINTOPOINT,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet 10.0.0.1 --> 10.0.0.2 netmask 0xff000000 &prompt.root; netstat -r Routing tables Internet: Destination Gateway Flags Refs Use Netif Expire host2 host1 UH 0 0 plip0 &prompt.root; ping -c 4 host2 PING host2 (10.0.0.2): 56 data bytes 64 bytes from 10.0.0.2: icmp_seq=0 ttl=255 time=2.774 ms 64 bytes from 10.0.0.2: icmp_seq=1 ttl=255 time=2.530 ms 64 bytes from 10.0.0.2: icmp_seq=2 ttl=255 time=2.556 ms 64 bytes from 10.0.0.2: icmp_seq=3 ttl=255 time=2.714 ms --- host2 ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max/stddev = 2.530/2.643/2.774/0.103 ms
Aaron Kaplan 原始作者: Tom Rhodes 重新组织和增加: 雪平 中文翻译:
zxpmyth@yahoo.com.cn
Brad Davis Extended by
IPv6 IPv6 (也被称作 IPng 下一代 IP) 是众所周知的 IP 协议 (也叫 IPv4) 的新版本。 和其他现代的 *BSD 系统一样, FreeBSD 包含了 KAME 的 IPv6 参考实现。 因此, 您的 FreeBSD 系统包含了尝试 IPv6 所需要的所有工具。 这一节主要集中讨论如何配置和使用 IPv6。 在 1990 年代早期, 人们开始担心可用的 IPv4 地址空间在不断地缩小。 随着 Internet 的爆炸式发展, 主要的两个担心是: 用尽所有的地址。 当然现在这个问题已经不再那样尖锐, 因为 RFC1918 私有地址空间 (10.0.0.0/8172.16.0.0/12, 以及 192.168.0.0/16) 和网络地址转换 (NAT) 技术已经被广泛采用。 路由表条目变得太大。这点今天仍然是焦点。 IPv6 解决这些和其它许多的问题: 128 位地址空间。换句话,理论上有 340,282,366,920,938,463,463,374,607,431,768,211,456 个地址可以使用。这意味着在我们的星球上每平方米大约有 6.67 * 10^27 个 IPv6 地址。 路由器仅在它们的路由表里存放网络地址集, 这就减少路由表的平均空间到 8192 个条目。 IPv6 还有其它许多有用的功能,如: 地址自动配置 (RFC2462) Anycast (任意播) 地址(一对多) 强制的多播地址 IPsec (IP 安全) 简单的头结构 移动的 (Mobile) IP IPv6 到 IPv4 的转换机制 要更多信息,请查看: IPv6 概观,在 playground.sun.com KAME.net 6bone.net 关于 IPv6 地址的背景知识 有几种不同类型的 IPv6 地址:Unicast,Anycast 和 Multicast。 Unicast 地址是为人们所熟知的地址。一个被发送到 unicast 地址的包实际上会到达属于这个地址的接口。 Anycast 地址语义上与 unicast 地址没有差别, 只是它们强调一组接口。指定为 anycast 地址的包会到达最近的 (以路由为单位) 接口。Anycast 地址可能只被路由器使用。 Multicast 地址标识一组接口。指定为 multicast 地址的包会到达属于 multicast 组的所有的接口。 IPv4 广播地址 (通常为 xxx.xxx.xxx.255) 由 IPv6 的 multicast 地址来表示。 保留的 IPv6 地址 IPv6 地址 预定长度 (bits) 描述 备注 :: 128 bits 未指定 类似 IPv4 中的 0.0.0.0 ::1 128 bits 环回地址 类似 IPv4 中的 127.0.0.1 ::00:xx:xx:xx:xx 96 bits 嵌入的 IPv4 低 32 bits 是 IPv4 地址。这也称作 IPv4 兼容 IPv6 地址 ::ff:xx:xx:xx:xx 96 bits IPv4 影射的 IPv6 地址 低的 32 bits 是 IPv4 地址。 用于那些不支持 IPv6 的主机。 fe80:: - feb:: 10 bits 链路环回 类似 IPv4 的环回地址。 fec0:: - fef:: 10 bits 站点环回   ff:: 8 bits 多播   001 (base 2) 3 bits 全球多播 所有的全球多播地址都指定到这个地址池中。前三个二进制位是 001
IPv6 地址的读法 规范形式被描述为:x:x:x:x:x:x:x:x, 每一个x就是一个 16 位的 16 进制值。当然, 每个十六进制块以三个0开始头的也可以省略。如 FEBC:A574:382B:23C1:AA49:4592:4EFE:9982 通常一个地址会有很长的子串全部为零, 因此每个地址的这种子串常被简写为::。 例如:fe80::1 对应的规范形式是 fe80:0000:0000:0000:0000:0000:0000:0001 第三种形式是以众所周知的用点.作为分隔符的十进制 IPv4 形式,写出最后 32 Bit 的部分。例如 2002::10.0.0.1 对应的十进制正规表达方式是 2002:0000:0000:0000:0000:0000:0a00:0001 它也相当于写成 2002::a00:1. 到现在,读者应该能理解下面的内容了: &prompt.root; ifconfig rl0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500 inet 10.0.0.10 netmask 0xffffff00 broadcast 10.0.0.255 inet6 fe80::200:21ff:fe03:8e1%rl0 prefixlen 64 scopeid 0x1 ether 00:00:21:03:08:e1 media: Ethernet autoselect (100baseTX ) status: active fe80::200:21ff:fe03:8e1%rl0 是一个自动配置的链路环回地址。它作为自动配置的一部分由 MAC 生成。 关于 IPv6 地址的结构的更多信息,请参看 RFC3513 进行连接 目前,有四种方式可以连接到其它 IPv6 主机和网络: 加入试验性的 6bone(骨干) 从您的上一级提供商那里获得 IPv6 网络。与您的互联网提供商讨论以求指导。 使用 6-to-4 通道 (RFC3068) 如果您是括号连接 (dial-up connection),请使用 net/freenet6 port。 这里我们就讨论如何连接到 6bone,因为它目前看来是最流行的一种方式。 首先看一下 6bone 网站,并找出离您最近的 6bone 连接。给某位值得信赖的人写信过去, 如果运气好,您就会得到关于如何设置您的连接的指导。通常这包括了设置 GRE (gif) 通道。 这里有一个典型的关于设置 &man.gif.4; 通道的例子。 &prompt.root; ifconfig gif0 create &prompt.root; ifconfig gif0 gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280 &prompt.root; ifconfig gif0 tunnel MY_IPv4_ADDR MY_IPv4_REMOTE_TUNNEL_ENDPOINT_ADDR &prompt.root; ifconfig gif0 inet6 alias MY_ASSIGNED_IPv6_TUNNEL_ENDPOINT_ADDR MY_IPv6_REMOTE_TUNNEL_ENDPOINT_ADDR 把大写字母换成您从上一级 6bone 节点收到的信息。 这样就建立了通道。通过 &man.ping6.8; ff02::1%gif0, 检查通道是否工作。您应该会收到两个 ping 回应。 或许您会对地址 ff02:1%gif0 感兴趣,它是一个 multicast 地址。%gif0 表明在网络接口 gif0 上的 multicast 地址已经用上了。因为我们 ping 一个 multicast 地址的时候, 通道的另一端也应该会回应。 到现在,设置一个到 6bone 上级连接的路由应该是相当简单了。 &prompt.root; route add -inet6 default -interface gif0 &prompt.root; ping6 -n MY_UPLINK &prompt.root; traceroute6 www.jp.FreeBSD.org (3ffe:505:2008:1:2a0:24ff:fe57:e561) from 3ffe:8060:100::40:2, 30 hops max, 12 byte packets 1 atnet-meta6 14.147 ms 15.499 ms 24.319 ms 2 6bone-gw2-ATNET-NT.ipv6.tilab.com 103.408 ms 95.072 ms * 3 3ffe:1831:0:ffff::4 138.645 ms 134.437 ms 144.257 ms 4 3ffe:1810:0:6:290:27ff:fe79:7677 282.975 ms 278.666 ms 292.811 ms 5 3ffe:1800:0:ff00::4 400.131 ms 396.324 ms 394.769 ms 6 3ffe:1800:0:3:290:27ff:fe14:cdee 394.712 ms 397.19 ms 394.102 ms 这个输出可能随机器而不同。到现在,您应该可以到达 IPv6 站点www.kame.net, 并看到那只正跳舞的乌龟 — 如果您有一个支持 IPv6 的浏览器,如 www/mozillaKonqueror (x11/kdebase3的一部分) 或 www/epiphany IPv6 世界里的 DNS 对于 IPv6 有两种类型的 DNS 记录:IETF 已经宣布 A6 是过时标准;现行的标准是 AAAA 记录。 使用AAAA记录是很简单的。通过增加下面内容, 给您的主机分配置您刚才接收到的新的 IPv6 地址: MYHOSTNAME AAAA MYIPv6ADDR 到您的主域 DNS 文件里,就可以完成。要是您自已没有 DNS 域服务,您可以询问您的 DNS 提供商。目前的 bind 版本 (version 8.3 与 9) 和 dns/djbdns(含IPv6补丁) 支持 AAAA 记录。 在 <filename>/etc/rc.conf</filename> 中进行所需的修改 IPv6 客户机设置 这些设置将帮助您把一台您 LAN 上的机器配置为一台客户机, 而不是路由器。 要让 &man.rtsol.8; 在启动时自动配置您的网卡, 只需添加: ipv6_enable="YES" 要自动地静态指定 IP 地址, 例如 2001:471:1f11:251:290:27ff:fee0:2093, 到 fxp0 上, 则写上: ipv6_ifconfig_fxp0="2001:471:1f11:251:290:27ff:fee0:2093" 要指定 2001:471:1f11:251::1 作为默认路由, 需要在 /etc/rc.conf 中加入: ipv6_defaultrouter="2001:471:1f11:251::1" IPv6 路由器/网关配置 这将帮助您从隧道提供商, 例如 6bone 那里取得必要的资料, 并将这些资料转化为在重启时能够保持住的设置。 要在启动时恢复您的隧道, 需要在 /etc/rc.conf 中增加: 列出要配置的通用隧道接口, 例如 gif0 gif_interfaces="gif0" 配置该接口使用本地端地址 MY_IPv4_ADDR 和远程端地址 REMOTE_IPv4_ADDR gifconfig_gif0="MY_IPv4_ADDR REMOTE_IPv4_ADDR" 应用分配给您用于 IPv6 隧道远端的 IPv6 地址, 需要增加: ipv6_ifconfig_gif0="MY_ASSIGNED_IPv6_TUNNEL_ENDPOINT_ADDR" 此后十设置 IPv6 的默认路由。 这是 IPv6 隧道的另一端: ipv6_defaultrouter="MY_IPv6_REMOTE_TUNNEL_ENDPOINT_ADDR" IPv6 隧道配置 如果服务器将您的网络通过 IPv6 路由到世界的其他角落, 您需要在 /etc/rc.conf 中添加下面的配置: ipv6_gateway_enable="YES" 路由宣告和主机自动配置 这节将帮助您配置 &man.rtadvd.8; 来宣示默认的 IPv6 路由。 要启用 &man.rtadvd.8; 您需要在 /etc/rc.conf 中添加: rtadvd_enable="YES" 指定由哪个网络接口来完成 IPv6 路由请求非常重要。 举例来说, 让 &man.rtadvd.8; 使用 fxp0 rtadvd_interfaces="fxp0" 接下来我们需要创建配置文件, /etc/rtadvd.conf。 示例如下: fxp0:\ :addrs#1:addr="2001:471:1f11:246::":prefixlen#64:tc=ether: fxp0 改为您打算使用的接口名。 接下来, 将 2001:471:1f11:246:: 改为分配给您的地址前缀。 如果您拥有专用的 /64 子网, 则不需要修改其他设置。 反之, 您需要把 prefixlen# 改为正确的值。
Harti Brandt 贡献者: 雪平 中文翻译:
zxpmyth@yahoo.com.cn
异步传输模式 (ATM) 配置 classical IP over ATM (PVCs) Classical IP over ATM (CLIP) 是一种最简单的使用带 IP 的 ATM 的方法。 这种方法可以用在交换式连接 (SVC) 和永久连接 (PVC) 上。这部分描述的就是配置基于 PVC 的网络。 完全互连的配置 第一种使用PVC来设置 CLIP 的方式就是通过专用的 PVC 让网络里的每一台机子都互连在一起。 尽管这样配置起来很简单,但对于数量更多一点的机子来说就有些不切实际了。 例如我们有四台机子在网络里,每一台都使用一张 ATM 适配器卡连接到 ATM 网络。第一步就是规划 IP 地址和机子间的 ATM 连接。我们使用下面的: 主机 IP 地址 hostA 192.168.173.1 hostB 192.168.173.2 hostC 192.168.173.3 hostD 192.168.173.4 为了建造完全交错的网络,我们需要在第一对机子间有一个 ATM 连接: 机器 VPI.VCI 对 hostA - hostB 0.100 hostA - hostC 0.101 hostA - hostD 0.102 hostB - hostC 0.103 hostB - hostD 0.104 hostC - hostD 0.105 在每一个连接端 VPI 和 VCI 的值都可能会不同, 只是为了简单起见,我们假定它们是一样的。 下一步我们需要配置每一个主机上的 ATM 接口: hostA&prompt.root; ifconfig hatm0 192.168.173.1 up hostB&prompt.root; ifconfig hatm0 192.168.173.2 up hostC&prompt.root; ifconfig hatm0 192.168.173.3 up hostD&prompt.root; ifconfig hatm0 192.168.173.4 up 假定所有主机上的 ATM 接口都是 hatm0。 现在 PVC 需要配置到 hostA 上 (我们假定它们都已经配置在了 ATM 交换机上,至于怎么做的, 您就需要参考一下该交换机的手册了)。 hostA&prompt.root; atmconfig natm add 192.168.173.2 hatm0 0 100 llc/snap ubr hostA&prompt.root; atmconfig natm add 192.168.173.3 hatm0 0 101 llc/snap ubr hostA&prompt.root; atmconfig natm add 192.168.173.4 hatm0 0 102 llc/snap ubr hostB&prompt.root; atmconfig natm add 192.168.173.1 hatm0 0 100 llc/snap ubr hostB&prompt.root; atmconfig natm add 192.168.173.3 hatm0 0 103 llc/snap ubr hostB&prompt.root; atmconfig natm add 192.168.173.4 hatm0 0 104 llc/snap ubr hostC&prompt.root; atmconfig natm add 192.168.173.1 hatm0 0 101 llc/snap ubr hostC&prompt.root; atmconfig natm add 192.168.173.2 hatm0 0 103 llc/snap ubr hostC&prompt.root; atmconfig natm add 192.168.173.4 hatm0 0 105 llc/snap ubr hostD&prompt.root; atmconfig natm add 192.168.173.1 hatm0 0 102 llc/snap ubr hostD&prompt.root; atmconfig natm add 192.168.173.2 hatm0 0 104 llc/snap ubr hostD&prompt.root; atmconfig natm add 192.168.173.3 hatm0 0 105 llc/snap ubr 当然,除 UBR 外其它的通信协定也可让 ATM 适配器支持这些。 此种情况下,通信协定的名字要跟人通信参数后边。工具 &man.atmconfig.8; 的帮助可以这样得到: &prompt.root; atmconfig help natm add 或者在 &man.atmconfig.8; 手册页里得到。 相同的配置也可以通过 /etc/rc.conf 来完成。对于 hostA,看起来就象这样: network_interfaces="lo0 hatm0" ifconfig_hatm0="inet 192.168.173.1 up" natm_static_routes="hostB hostC hostD" route_hostB="192.168.173.2 hatm0 0 100 llc/snap ubr" route_hostC="192.168.173.3 hatm0 0 101 llc/snap ubr" route_hostD="192.168.173.4 hatm0 0 102 llc/snap ubr" 所有 CLIP 路由的当前状态可以使用如下命令获得: hostA&prompt.root; atmconfig natm show
diff --git a/zh_CN.GB2312/books/handbook/book.sgml b/zh_CN.GB2312/books/handbook/book.sgml index 4ad4f3c127..80c58ee516 100644 --- a/zh_CN.GB2312/books/handbook/book.sgml +++ b/zh_CN.GB2312/books/handbook/book.sgml @@ -1,326 +1,326 @@ %books.ent; %chapters; %txtfiles; %pgpkeys; ]> FreeBSD 使用手册 The FreeBSD Documentation Project 1999 年 2 月 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 The FreeBSD Documentation Project &cnproj.freebsd.org; 2005 年 12 月 2003 2004 2005 2006 &cnproj.freebsd.org; &bookinfo.legalnotice; &tm-attrib.freebsd; &tm-attrib.3com; &tm-attrib.3ware; &tm-attrib.arm; &tm-attrib.adaptec; &tm-attrib.adobe; &tm-attrib.apple; &tm-attrib.corel; &tm-attrib.creative; &tm-attrib.cvsup; &tm-attrib.heidelberger; &tm-attrib.ibm; &tm-attrib.ieee; &tm-attrib.intel; &tm-attrib.intuit; &tm-attrib.linux; &tm-attrib.lsilogic; &tm-attrib.m-systems; &tm-attrib.macromedia; &tm-attrib.microsoft; &tm-attrib.netscape; &tm-attrib.nexthop; &tm-attrib.opengroup; &tm-attrib.oracle; &tm-attrib.powerquest; &tm-attrib.realnetworks; &tm-attrib.redhat; &tm-attrib.sap; &tm-attrib.sun; &tm-attrib.symantec; &tm-attrib.themathworks; &tm-attrib.thomson; &tm-attrib.usrobotics; &tm-attrib.vmware; &tm-attrib.waterloomaple; &tm-attrib.wolframresearch; &tm-attrib.xfree86; &tm-attrib.xiph; &tm-attrib.general; 欢迎使用 FreeBSD! 本手册适用于安装 FreeBSD &rel2.current;-RELEASEFreeBSD &rel.current;-RELEASE 以及它们的日常使用。 - 这个手册目前由很多人 持续地 维护。其中的内容需要不断的添加和更新。 + 这个手册目前由很多人 持续地 维护。 其中的内容需要不断地更新。 如果您有兴趣参加这个项目,请发邮件到 &a.doc;。此文档最新的英文原始版本可以从 FreeBSD Web站点 上获得 (这本手册的较早期版本可以在 找到), 由 &cnproj.freebsd.org; 维护的最新译本可以在 &cnproj.freebsd.org; 快照 Web 站点&cnproj.freebsd.org; 文档快照 处获得, 这一译本会不断向主站同步。 此外, 您也可以从 FreeBSD 的 FTP 服务器 或众多的 镜像站点 得到这份文档的各种其他格式以及压缩形式的版本。 如果您更希望得到一份印刷版本的手册, 可以从 FreeBSD Mall 购买。 您还可以 搜索手册 &chap.preface; 起步 手册的以下章节主要是针对刚开始使用 FreeBSD 的用户及管理员: FreeBSD 入门。 安装过程向导。 教您 &unix; 基本知识和基本原理。 展示如何在 FreeBSD 上安装大量的第三方应用。 介绍使用 X,&unix; 窗口系统,以及为一些生产环境配置桌面环境的细节。 我们尝试用最少的页数来保持前言的索引,以至于可以用最少翻页次数将该手册从头至尾读过。 常见的任务 前面已经介绍了必要的基础知识, 手册的这一部分将讨论 FreeBSD 的一些最常用的功能。 这些章节包括: 向您介绍流行和实用的桌面应用程序: 浏览器、产品工具、文档察看程序,等等。 向您介绍一系列可以在 FreeBSD 上使用的多媒体工具。 介绍构建定制的 FreeBSD 内核以启用附加功能的方法。 详细介绍包括桌面和网络打印机在内的打印系统设置。 向您展示如何在 FreeBSD 上运行 Linux 应用程序。 某些章节希望您首先阅读过其他部分,在这些章的开头部分也会给出类似的提示。 系统管理 FreeBSD 手册中其余章节的内容都是关于系统管理。每一章节都从描述开始,由浅入深。 这些章节被设计成很多相对完整的部分,如果您需要了解某部分内容,直接阅读这部分内容即可,无需按照顺序,也不用在您使用 FreeBSD 的时候需要先读一遍。 网络通讯 FreeBSD 是目前以高性能网络服务为目的而部署范围最广的操作系统之一。 讨论这些话题的章节包括: 串口通讯 PPP 和以太网上的 PPP 电子邮件 运行网络服务 防火墙 其他高级网络话题 这些章节主要供您在需要时参考。 不需要以特定的顺序来阅读它们, 此外, 您开始在网络中使用 FreeBSD 之前也不必把它们都读完。 附录 &chap.colophon; diff --git a/zh_CN.GB2312/books/handbook/config/chapter.sgml b/zh_CN.GB2312/books/handbook/config/chapter.sgml index ae23b103d3..b5c497dae0 100644 --- a/zh_CN.GB2312/books/handbook/config/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/config/chapter.sgml @@ -1,2865 +1,2867 @@ Chern Lee 原作: Mike Smith 这份文档基于一份教程, 其作者是 Matt Dillon 此外, 也参考了 tuning(7), 其作者是 设置和调整 概述 系统配置 系统优化 使用 &os; 的一个重要问题是系统配置。 正确地配置系统能充分地减少以后维护和升级系统所需的工作量。 这章将解释一些 &os; 的配置过程,包括一些可以调整的 &os; 系统的一些参数。 读完本章, 您将了解: 如何有效地利用文件系统和交换分区。 rc.conf 的基本设置以及 /usr/local/etc/rc.d 启动体系。 如何设置和测试网卡。 如何在您的网络设备上配置虚拟主机。 如何使用 /etc 下的各配置文件。 如何通过 sysctl 变量来对 &os; 系统进行调优。 怎样调整磁盘性能和修改内核限制。 在阅读本章之前,您应该了解: 了解 &unix; 和 &os; 的基础知识 ()。 熟悉内核配置编译的基础知识 ()。 初步配置 分区规划 分区规划 /etc /var /usr 基本分区 当使用 &man.bsdlabel.8; 或者 &man.sysinstall.8; 来分割您的文件系统的时候, 要记住硬盘驱动器外磁道传输数据要比从内磁道传输数据快。 因此应该将小的和经常访问的文件系统放在驱动器靠外的位置, 一些大的分区比如 /usr 应该放在比较靠里的位置。 以类似这样的顺序建立分区是一个不错的主意:root,swap, /var/usr /var 的大小能反映您的机器使用情况。 它用来存储邮件,日志文件和打印队列缓存, 特别是邮箱和日志文件可能会达到无法预料的大小, 这主要取决于在您的系统上有多少用户和您的日志文件可以保存多长时间。 一般大多数用户不需要一个 G 以上的空间,但要记住 /var/tmp 应该足够大来以便存储一些 packages。 /usr 分区存储很多用来系统运行所需要的文件例如 &man.ports.7; (建议这样做) 和源代码 (可选的)。安装的时候这两项都是可选的。 这个分区至少要保留两个 G 的可用空间。 当选择分区大小的时候,记住保留一些空间。 用完了一个分区的空间而在另一个分区上还有很多, 可能会导致出现一些错误。 一些用户会发现 &man.sysinstall.8; 的 Auto-defaults 自动分区有时会分配给 /var/ 较小的分区空间。 分区应该精确一些并且大一些。 交换分区 交换分区分配 交换分区 一般来讲,交换分区应该大约是系统内存 (RAM) 的两倍。 例如,如果机器有 128M 内存,交换文件应该是 256M。 较小内存的系统可以通过多一点地交换分区来提升性能。 不建议小于 256 兆的交换分区,并且扩充您的内存应该被考虑一下。 当交换分区最少是主内存的两倍的时候,内核的 VM (虚拟内存) 页面调度算法可以将性能调整到最好。如果您给机器添加更多内存, 配置太小的交换分区会导致 VM 页面扫描的代码效率低下。 在使用多块SCSI磁盘(或者不同控制器上的IDE磁盘)的大系统上, 建议在每个驱动器上建立交换分区(直到四个驱动器)。 交换分区应该大约一样大小。内核可以使用任意大小, 但内部数据结构则是最大交换分区的 4 倍。保持交换分区同样的大小, 可以允许内核最佳地调度交换空间来访问磁盘。 即使不太使用,分配大的交换分区也是好的, 在被迫重启之前它可以让您更容易的从一个失败的程序中恢复过来。 为什么要分区? 一些用户认为一个单独的大分区将会很好, 但是有很多原因会证明为什么这是个坏主意。首先, 每个分区有不同的分区特性,因此分开可以让文件系统调整它们。 例如,根系统和 /usr 一般只是读取,写入很少。 很多读写频繁的被放在 /var/var/tmp中。 适当的划分一个系统, 在其中使用较小的分区, 这样, 那些以写为主的分区将不会比以读为主的分区付出更高的代价。 将以写为主的分区放在靠近磁盘的边缘, 例如放在实际的大硬盘的前面代替放在分区表的后面,将会提高您需要的分区的 I/O 性能。现在可能也需要在比较大的分区上有很好的 I/O 性能, 把他们移动到磁盘外围不会带来多大的性能提升,反而把 /var 移到外面会有很好的效果。最后涉及到安全问题。 一个主要是只读的小的、整洁的根分区可以提高从一个严重的系统崩溃中恢复过来的机会。 核心配置 rc 文件 rc.conf 系统的配置信息主要位于 /etc/rc.conf。 这个文件包含了配置信息很大的一部分,主要在系统启动的时候来配置系统, 这个名字直接说明了这点;它也是 rc* 文件的配置信息。 系统管理员应该在 rc.conf 文件中建立记录来覆盖 /etc/defaults/rc.conf 中的默认设置。 这个默认文件不应该被逐字的复制到 /etc —— 它包含的是默认值而不是一个例子。 所有特定的改变应该在 rc.conf 中。 为了降低管理成本,有很多策略可以应用在成群的应用程序中来从系统指定的配置中分离 site-wide 配置。建议的方法是将 site-wide 配置放在另一个文件中,例如 /etc/rc.conf.site, 并且把它包含进然后把这个文件包括进只包含系统指定信息的 /etc/rc.conf 由于 rc.conf 可以被 &man.sh.1; 阅读,所以达到这个目的很简单,例如: rc.conf: . /etc/rc.conf.site hostname="node15.example.com" network_interfaces="fxp0 lo0" ifconfig_fxp0="inet 10.1.1.1" rc.conf.site: defaultrouter="10.1.1.254" saver="daemon" blanktime="100" rc.conf.site 文件会被分发给每一个使用 rsync 或相似程序的系统,同时 rc.conf 文件仍然保持独立。 使用 &man.sysinstall.8; 或者 make world 来升级系统不会覆盖 rc.conf 文件, 所以系统配置信息不会丢失。 应用程序配置 典型的,被安装的应用程序有他自己的配置文件、语法等等。 从基本系统中分开他们是很重要的以至于他们可以容易的被 package 管理工具定位和管理 /usr/local/etc 一般来说,这些文件被安装在 /usr/local/etc。这个例子中, 一个应用程序有很多配置文件并且创建了一个子目录来存放他们。 通常,当一个 port 或者 package 被安装的时候, 配置文件示例也同样被安装了。它们通常用 .default 的后缀来标识。如果不存在这个应用程序的配置文件, 它们会通过复制 .default 文件来创建。 例如,看一下这个目下的内容 /usr/local/etc/apache -rw-r--r-- 1 root wheel 2184 May 20 1998 access.conf -rw-r--r-- 1 root wheel 2184 May 20 1998 access.conf.default -rw-r--r-- 1 root wheel 9555 May 20 1998 httpd.conf -rw-r--r-- 1 root wheel 9555 May 20 1998 httpd.conf.default -rw-r--r-- 1 root wheel 12205 May 20 1998 magic -rw-r--r-- 1 root wheel 12205 May 20 1998 magic.default -rw-r--r-- 1 root wheel 2700 May 20 1998 mime.types -rw-r--r-- 1 root wheel 2700 May 20 1998 mime.types.default -rw-r--r-- 1 root wheel 7980 May 20 1998 srm.conf -rw-r--r-- 1 root wheel 7933 May 20 1998 srm.conf.default 文件大小显示了只有 srm.conf 改变了。以后 Apache 的升级就不会改变这个文件。 Tom Rhodes Contributed by 启动服务 服务 许多用户会选择使用 Ports Collection 来在 &os; 上安装第三方软件。 很多情况下这可能需要进行一些配置以便让这些软件能够在系统初始化的过程中启动。 服务, 例如 mail/postfixwww/apache13 就是这些需要在系统初始化时启动的软件包中的两个典型代表。 这一节解释了启动第三方软件所需要的步骤。 &os; 包含的大多数服务,例如 &man.cron.8;, 就是通过系统启动脚本启动的。 这些脚本也许会有些不同, 这取决于 &os; 版本。 但是不管怎样, 需要考虑的一个重要方面是他们的启动配置文件要能被基本启动脚本识别捕获。 rc.d 出现之前, 应用程序会把一个简单的启动脚本放到 /usr/local/etc/rc.d 目录中, 这个目录中的脚本会被系统初始化脚本读取。 尽管很多人已经花费了相当多的时间来把旧的配置方式融入到新系统中, 仍然有许多第三方软件需要把脚本放到上面提到的目录中。 是否使用 rc.d 会对这些脚本的执行带来一些变化。 在 &os; 5.1 之前采用的是旧式的配置, 当然, 绝大多数情况下, 新式的脚本也会工作的很好。 每个脚本都应该遵守 &os; 版本所需求的一些规定: 每个脚本必须在文件名最后添加一个 .sh 的扩展名,并且这个脚本能被系统执行。 后者可以通过 chmod 命令把权限设置为 755来实现。 它还应该能接受 start 选项来启动程序并且接受 stop 选项来结束程序。 一个简单的脚本看起来可能会像这样: #!/bin/sh echo -n ' utility' case "$1" in start) /usr/local/bin/utility ;; stop) kill -9 `cat /var/run/utility.pid` ;; *) echo "Usage: `basename $0` {start|stop}" >&2 exit 64 ;; esac exit 0 这个脚本提供了 stopstart 两个选项, 用以操作 utility 可以用如下方法来启动: &prompt.root; /usr/local/etc/rc.d/utility.sh start 现在不是所有第三方软件都需要在 rc.conf 中进行如此的配置, 不过几乎每天都有新的 port 被修改来采用这种配置方法。 您应在安装的最后阶段查看所显示的信息, 以了解某个具体的应用是否需要这样的配置。 某些第三方软件会提供启动脚本, 以便与 rc.d 配合使用; 这些内容将在下一节介绍。 扩展应用程序配置 现在 &os; 提供了 rc.d, 这使得对应用软件的启动进行配置变得更加方便, 并提供了更多的其他功能。 例如, 使用在 rc.d 一节中所介绍的关键字, 应用程序就可以设置在某些其他服务, 例如 DNS 之后启动; 除此之外, 还可以通过 rc.conf 来指定一些额外的启动参数, 而不再需要将它们硬编码到启动脚本中。 基本的启动脚本如下所示: #!/bin/sh # # PROVIDE: utility # REQUIRE: DAEMON # KEYWORD: shutdown # # DO NOT CHANGE THESE DEFAULT VALUES HERE # SET THEM IN THE /etc/rc.conf FILE # utility_enable=${utility_enable-"NO"} utility_flags=${utility_flags-""} utility_pidfile=${utility_pidfile-"/var/run/utility.pid"} . /etc/rc.subr name="utility" rcvar=`set_rcvar` command="/usr/local/sbin/utility" load_rc_config $name pidfile="${utility_pidfile}" start_cmd="echo \"Starting ${name}.\"; /usr/bin/nice -5 ${command} ${utility_flags} ${command_args}" run_rc_command "$1" 这个脚本将保证 utility 能够在 daemon 服务之后启动。 它同时也提供了设置和跟踪 PID, 也就是进程 ID 文件的方法。 可以在 /etc/rc.conf 中加入: utility_enable="YES" 这个新方法也使得命令行参数、包含 /etc/rc.subr 中所提供的功能, 兼容 &man.rcorder.8; 工具并提供更简单的通过 rc.conf 文件来配置的方法。 用服务来启动服务 其他服务, 例如 POP3 服务器, IMAP, 等等, 也可以通过 &man.inetd.8; 来启动。 这一过程包括从 Ports Collection 安装相应的应用程序, 并把配置加入到 /etc/inetd.conf 文件, 或去掉当前配置中的某些注释。 如何使用和配置 inetdinetd 一节中进行了更为深入的阐述。 一些情况下, 通过 &man.cron.8; 来启动系统服务也是一种可行的选择。 这种方法有很多好处, 因为 cron 会以 crontab 的文件属主身份执行那些进程。 这使得普通用户也能够执行他们的应用。 cron 工具提供了一个独有的功能, 以 @reboot 来指定时间。 这样的设置将在 &man.cron.8; 启动时运行, 通常这也是系统初始化的时候。 Tom Rhodes Contributed by 配置 <command>cron</command> cron 配置 &os; 最有用的软件包(utilities)中的一个是 &man.cron.8;。 cron 软件在后台运行并且经常检查 /etc/crontab 文件。cron 软件也检查 /var/cron/tabs 目录,搜索新的 crontab 文件。这些 crontab 文件存储一些 cron 在特定时间执行任务的信息。 cron 程序使用两种不同类型的配置文件, 即系统 crontab 和用户 crontabs。 两种格式的唯一区别是第六个字段。 在系统 crontab 中,第六个字段是用于执行命令的用户名。 这给予了系统 crontab 以任意用户身份执行命令的能力。 在用户 crontab 中, 第六个字段是要执行的命令, 所有的命令都会以这个用户自己的身份执行; 这是一项重要的安全功能。 同其他用户一样, root 用户也可以有自己的 crontab。 它不同于 /etc/crontab (也就是系统 crontab)。 由于有系统 crontab 的存在, 通常并不需要给 root 建立单独的用户 crontab。 让我们来看一下 /etc/crontab 文件: # /etc/crontab - root's crontab for &os; # # $&os;: src/etc/crontab,v 1.32 2002/11/22 16:13:39 tom Exp $ # # SHELL=/bin/sh PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin HOME=/var/log # # #minute hour mday month wday who command # # */5 * * * * root /usr/libexec/atrun 像大多数 &os; 配置文件一样,# 字符是注释。 这样, 就可以编写注释来说明要执行什么操作, 以及这样做的原因。 需要注意的是, 注释应该另起一行, 而不能跟命令放在同一行上, 否则它们会被看成命令的一部分。 这个文件中的空行会被忽略。 首先应该定义环境变量。等号 (=) 字符用来定义任何环境变量,像这个例子用到了 SHELLPATHHOME 变量。如果 shell 行被忽略掉,cron 将会用默认值 sh。如果 变量被忽略, 那么就没有默认值并且需要指定文件绝对位置。如果 被忽略,cron 将用用执行者的 home 目录。 这一行定义了七个字段。它们是 minutehourmdaymonthwdaywhocommand。 它们差不多已经说明了各自的用处。Minute 是命令要运行时的分钟,Hour 跟 minute 差不多,只是用小时来表示。Mday 是每个月的天。Month 跟 hour 还有 minute 都差不多,用月份来表示。wday 字段表示星期几。 所有这些字段的值必须是数字并且用24小时制来表示。who 字段是特别的,并且只在 /etc/crontab 文件中存在。 这个字段指定了命令应该以哪个用户的身份来运行。当一个用户添加了他(她)的 crontab 文件的时候,他们就会没有这个字段选项。最后,是 command 字段。这是最后的一个字段, 所以自然就是它指定要运行的程序。 最后一行定义了上面所说的值。注意这里我们有一个 */5 列表,紧跟着是一些 * 字符。* 字符代表开始到最后, 也可以被解释成 每次。所以,根据这行, 显然表明了无论在何时每隔 5 分钟以 root 身份来运行 atrun 命令。查看 &man.atrun.8; 手册页以获得 atrun 的更多信息。 命令可以有任意多个传递给它们的标志。无论怎样, 扩展到多行的命令应该用反斜线(\)来续行。 这是每个 crontab 文件的基本设置, 虽然它们有一个不同。第六行我们指定的用户名只存在于系统 /etc/crontab 文件。这个字段在普通用户的 crontab 文件中应该被忽略。 安装 Crontab 绝对不要用这种方法来编辑/安装系统 crontab。 您需要做的只是使用自己喜欢的编辑器: cron 程序会注意到文件发生了变化, 并立即开始使用新的版本。参见 这个 FAQ 项目 以了解进一步的情况。 要安装刚写好的用户 crontab, 首先使用最习惯的编辑器来创建一个符合要求格式的文件,然后用 crontab 程序来完成。最常见的用法是: &prompt.user; crontab crontab-file 在前面的例子中, crontab-file 是一个事先写好的 crontab 还有一个选项用来列出安装的 crontab 文件: 只要传递 选项给 crontab 然后看一下输出。 用户想不用模板(已经存在的文件)而直接安装他的 crontab 文件,用 crontab -e 选项也是可以的。 它将会启动一个编辑器并且创建一个新文件,当这个文件被保存的时候, 它会自动的用 crontab 来安装这个文件。 如果您稍后想要彻底删除自己的用户 crontab 可以使用 crontab 选项。 Tom Rhodes Contributed by 在 &os; 中使用 rc 在 2002 年, &os; 整合了来自 NetBSD 的 rc.d 系统, 并通过它来完成系统的初始化工作。 用户要注意在 /etc/rc.d 目录下的文件。 这里面的许多文件是用来管理基础服务的, 它们可以通过 , 以及 选项来控制。 举例来说, &man.sshd.8; 可以通过下面的命令来重启: &prompt.root; /etc/rc.d/sshd restart 对其它服务的操作与此类似。 当然, 这些服务通常是在启动时根据 &man.rc.conf.5; 自动启动的。 例如, 要配置使系统启动时启动网络地址转换服务, 可以简单地通过在 /etc/rc.conf 中加入如下设置来完成: natd_enable="YES" 如果 行已经存在, 只要简单的把 改成 即可。 rc 脚本在下次重新启动的时候会自动的装载所需要的服务, 像下面所描述的那样。 由于 rc.d 系统在系统启动/关闭时首先启动/停止服务,如果设置了适当的 /etc/rc.conf 变量,标准的 选项将会执行他们的动作。例如 sshd restart 命令只在 /etc/rc.conf 中的 sshd_enable 设置成 的时候工作。不管是否在 /etc/rc.conf 中设置了,要 或者 - 一个服务,命令前可以加上一个force前缀。例如要不顾当前 + 一个服务,命令前可以加上一个one前缀。例如要不顾当前 /etc/rc.conf 的设置重新启动 - sshd,执行下面的命令: - + sshd,执行下面的命令: - &prompt.root; /etc/rc.d/sshd forcerestart + &prompt.root; /etc/rc.d/sshd onerestart 用选项 可以简单来的检查 /etc/rc.conf 中用适当的 rc.d 脚本启动的服务是否被启用。从而管理员可以运行这样的程序来检查 sshd 是否真的在 /etc/rc.conf 中被启动了: &prompt.root; /etc/rc.d/sshd rcvar # sshd $sshd_enable=YES 第二行 (# sshd) 是从 sshd 命令中输出的,而不是 root 控制台。 为了确定一个服务是否真的在运行,可以用 选项。例如验证 sshd 是否真的启动了: &prompt.root; /etc/rc.d/sshd status sshd is running as pid 433. 有些时候也可以 服务。 这一操作实际上是向服务发送一个信号, 来强制其重新加载配置。 多数情况下, 发给服务的会是 SIGHUP 信号。 并非所有服务都支持这一功能。 rc.d 系统不仅用于网络服务, 它也为系统初始化中的多数过程提供支持。 比如 bgfsck 文件, 当它被执行时, 将会给出下述信息: Starting background file system checks in 60 seconds. 这个文件用做后台文件系统检查,系统初始化的时候完成。 很多系统服务依赖其他服务提供的相应功能。例如,NIS 和其他基于 RPC 的服务启动可能在 rpcbind 服务启动之前失败。 要解决这个问题,依赖关系信息和其他头信息当作注释被包含在每个启动脚本文件的前面。 程序在系统初始化时分析这些注释以决定调用其他系统服务来满足依赖关系。 下面的字句可能会包含在每个启动脚本文件的前面: PROVIDE: 指定此文件所提供的服务的名字。 REQUIRE: 列出此服务启动之前所需要的其他服务。 此脚本提供的服务会在指定的那些服务 之后 启动。 BEFORE: 列出依赖此服务的其他服务。 此脚本提供的服务将在指定的那些服务 之前 启动。 通过这种方法,系统管理员可以容易的控制系统而不用像其他一些 &unix; 操作系统一样要用 runlevels 来控制。 更多关于 rc.d 系统的信息, 可以在 - &man.rc.8; 和 &man.rc.subr.8; 联机手册中找到。 + &man.rc.8; 和 &man.rc.subr.8; 联机手册中找到。 + 如果您有意撰写自己的 rc.d 脚本, + 或对现有的脚本进行一些改进, 也可以参考 + 这篇文章 Marc Fonvieille Contributed by 设置网卡 网卡 配置 现在我们不可想象一台计算机没有网络连接的情况。 添加和配置一块网卡是任何 &os; 系统管理员的一项基本任务。 查找正确的驱动程序 网卡 驱动程序 在开始之前,您应该知道您的网卡类型,它用的芯片和它是 PCI 还是 ISA 网卡。&os; 支持很多种 PCI 和 ISA 网卡。 可以查看您的版本硬件兼容性列表以确定您的网卡被支持。 确认系统能够支持您的网卡之后, 您还需要为它选择合适的驱动程序。 /usr/src/sys/conf/NOTES/usr/src/sys/arch/conf/NOTES 将为您提供所支持的一些网卡和芯片组的信息。 如果您怀疑驱动程序是否使所要找的那一个, 请参考驱动程序的联机手册。 联机手册将提供关于所支持的硬件更详细的信息, 甚至还包括可能发生的问题。 如果您的网卡很常见的话, 大多数时候您不需要为驱动浪费精力。 常用的网卡在 GENERIC 内核中已经支持了, 所以您的网卡在启动时就会显示出来,像是: dc0: <82c169 PNIC 10/100BaseTX> port 0xa000-0xa0ff mem 0xd3800000-0xd38 000ff irq 15 at device 11.0 on pci0 dc0: Ethernet address: 00:a0:cc:da:da:da miibus0: <MII bus> on dc0 ukphy0: <Generic IEEE 802.3u media interface> on miibus0 ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto dc1: <82c169 PNIC 10/100BaseTX> port 0x9800-0x98ff mem 0xd3000000-0xd30 000ff irq 11 at device 12.0 on pci0 dc1: Ethernet address: 00:a0:cc:da:da:db miibus1: <MII bus> on dc1 ukphy1: <Generic IEEE 802.3u media interface> on miibus1 ukphy1: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto 在这个例子中,我们看到有两块使用 &man.dc.4; 驱动的网卡在系统中。 如果您的网卡没有出现在 GENERIC 中, 则需要手工加载合适的驱动程序。 要完成这项工作可以使用下面两种方法之一: 最简单的办法是用 &man.kldload.8; 加载网卡对应的内核模块。 除此之外, 通过在 /boot/loader.conf 文件中加入适当的设置, 也可以让系统在引导时自动加载这些模块。 不过, 并不是所有的网卡都能够通过这种方法提供支持; ISA 网卡是比较典型的例子。 另外, 您也可以将网卡的支持静态联编进内核。 察看 /usr/src/sys/conf/NOTES/usr/src/sys/arch/conf/NOTES 以及驱动程序的联机手册以了解需要在您的内核配置文件中加一些什么。 要了解关于重新编译内核的进一步细节, 请参见 。 如果您的卡在引导时可以被内核 (GENERIC) 识别, 您应该不需要编译新的内核。 使用 &windows; NDIS 驱动程序 NDIS NDISulator &windows; 驱动程序 Microsoft Windows Microsoft Windows device drivers (设备驱动) KLD (kernel loadable object) 不幸的是, 许多厂商由于认为驱动程序会涉及许多敏感的商业机密, 至今仍不愿意将把驱动程序作为开放源代码形式发布列入他们的时间表。 因此, &os; 和其他操作系统的开发者就只剩下了两种选择: 要么经历长时间的痛苦过程来对驱动进行逆向工程, 要么使用现存的为 µsoft.windows; 平台提供的预编译版本的驱动程序。 包括参与 &os; 开发的绝大多数开发人员, 都选择了后一种方法。 得益于 Bill Paul (wpaul) 的工作, 从 &os; 5.3-RELEASE 开始, 已经可以 直接地 支持 网络驱动接口标准 (NDIS, Network Driver Interface Specification) 了。 &os; NDISulator (也被称为 Project Evil) 可以支持二进制形式的 &windows; 驱动程序, 并让它相信正在运行的是 &windows;。 由于 &man.ndis.4; 驱动使用的是用于 &windows; 的二进制形式的驱动, 因此它只能在 &i386; 和 amd64 系统上使用。 &man.ndis.4; 驱动在设计时主要提供了 PCI、 CardBus 和 PCMCIA 设备的支持, 而 USB 设备目前则没有提供支持。 要使用 NDISulator, 您需要三件东西: 内核的源代码 二进制形式的 &windowsxp; 驱动程序 (扩展名为 .SYS) &windowsxp; 驱动程序配置文件 (扩展名为 .INF) 您需要找到用于您的卡的这些文件。 一般而言, 这些文件可以在随卡附送的 CD 或制造商的网站上找到。 在下面的例子中, 我们用 W32DRIVER.SYSW32DRIVER.INF 来表示这些文件。 不能在 &os;/amd64 上使用 &windows;/i386 驱动程序。 必须使用 &windows;/amd64 驱动才能在其上正常工作。 接下来的步骤是将二进制形式的驱动程序组装成内核模块。 要完成这一任务, 需要以 root 用户的身份执行 &man.ndisgen.8;: &prompt.root; ndisgen /path/to/W32DRIVER.INF /path/to/W32DRIVER.SYS &man.ndisgen.8; 是一个交互式的程序, 它会提示您输入所需的一些其他的额外信息; 这些工作完成之后, 它会在当前目录生成一个内核模块文件, 这个文件可以通过下述命令来加载: &prompt.root; kldload ./W32DRIVER.ko 除了刚刚生成的内核模块之外, 还必须加载 ndis.koif_ndis.ko 这两个内核模块, 在您加载需要 &man.ndis.4; 的模块时, 通常系统会自动完成这一操作。 如果希望手工加载它们, 则可以使用下列命令: &prompt.root; kldload ndis &prompt.root; kldload if_ndis 第一个命令会加载 NDIS 袖珍端口驱动封装模块, 而第二条命令则加载实际的网络接口。 现在请查看 &man.dmesg.8; 来了解是否发生了错误。 如果一切正常, 您会看到类似下面的输出: ndis0: <Wireless-G PCI Adapter> mem 0xf4100000-0xf4101fff irq 3 at device 8.0 on pci1 ndis0: NDIS API version: 5.0 ndis0: Ethernet address: 0a:b1:2c:d3:4e:f5 ndis0: 11b rates: 1Mbps 2Mbps 5.5Mbps 11Mbps ndis0: 11g rates: 6Mbps 9Mbps 12Mbps 18Mbps 36Mbps 48Mbps 54Mbps 这之后, 就可以像使用其它网络接口 (例如 dc0) 一样来使用 ndis0 设备了。 与任何其它模块一样, 您也可以配置系统, 令其在启动时自动加载 NDIS 模块。 首先, 将生成的模块 W32DRIVER.ko 复制到 /boot/modules 目录中。 接下来, 在 /boot/loader.conf 中加入: W32DRIVER_load="YES" 配置网卡 网卡 配置 现在正确的网卡驱动程序已经装载,那么就应该配置它了。 跟其他配置一样,网卡可以在安装时用 sysinstall 来配置。 要显示您系统上的网络接口的配置,输入下列命令: &prompt.user; ifconfig dc0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet 192.168.1.3 netmask 0xffffff00 broadcast 192.168.1.255 ether 00:a0:cc:da:da:da media: Ethernet autoselect (100baseTX <full-duplex>) status: active dc1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet 10.0.0.1 netmask 0xffffff00 broadcast 10.0.0.255 ether 00:a0:cc:da:da:db media: Ethernet 10baseT/UTP status: no carrier lp0: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> mtu 1500 lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384 inet 127.0.0.1 netmask 0xff000000 tun0: flags=8010<POINTOPOINT,MULTICAST> mtu 1500 老版本的 &os; 可能需要在 &man.ifconfig.8; 后面接 选项,需要了解更多的 &man.ifconfig.8; 语法请查阅使用手册。注意所有关于 IPv6 (inet6 等等) 的记录在这个例子里都被忽略了。 在这个例子中,显示出了下列设备: dc0: 第一个以太网接口 dc1: 第二个以太网接口 lp0: 并行端口网络接口 lo0: 回环设备 tun0: ppp使用的隧道设备 &os; 使用内核引导时检测到的网卡驱动顺序来命名网卡。例如 sis2 是系统中使用 &man.sis.4; 驱动的第三块网卡。 在这个例子中,dc0 设备启用了。主要表现在: UP 表示这块网卡已经配置完成准备工作。 这块网卡有一个 Internet (inet) 地址 (这个例子中是 192.168.1.3)。 它有一个有效的子网掩码 (netmask0xffffff00 等同于 255.255.255.0)。 它有一个有效的广播地址 (这个例子中是 192.168.1.255)。 网卡的 MAC (ether) 地址是 00:a0:cc:da:da:da 物理传输媒介模式处于自动选择状态 (media: Ethernet autoselect (100baseTX <full-duplex>))。我们看到 dc1 被配置成运行在 10baseT/UTP 模式下。 要了解驱动媒介类型的更多信息, 请查阅它们的使用手册。 连接状态 (status)是 active,也就是说连接信号被检测到了。对于 dc1,我们看到 status: no carrier。 这通常是网线没有插好。 如果 &man.ifconfig.8; 的输出显示了类似于: dc0: flags=8843<BROADCAST,SIMPLEX,MULTICAST> mtu 1500 ether 00:a0:cc:da:da:da 的信息,那么就是还没有配置网卡。 要配置网卡,您需要 root 权限。 网卡配置可以通过使用 &man.ifconfig.8; 命令行方式来完成, 但是这样每次启动都要做一遍。放置网卡配置信息的文件是 /etc/rc.conf 用您自己喜欢的编辑器打开 /etc/rc.conf。 并且您需要为每一块系统中存在的网卡添加一行, 在我们的例子中,添加如下几行: ifconfig_dc0="inet 192.168.1.3 netmask 255.255.255.0" ifconfig_dc1="inet 10.0.0.1 netmask 255.255.255.0 media 10baseT/UTP" 用自己正确的设备名和地址来替换例子中的 dc0dc1 等内容。您应该应该查阅网卡驱动和 &man.ifconfig.8; 的手册页来了解各选项,也要查看一下 &man.rc.conf.5; 帮助页来了解 /etc/rc.conf 的语法。 如果在安装的时候配置了网络,关于网卡的一些行可能已经存在了。 所以在添加新行前仔细检查一下 /etc/rc.conf 您也可能需要编辑 /etc/hosts 来添加局域网中不同的机器名称和 IP 地址,如果它们不存在,查看 &man.hosts.5; 帮助和 /usr/share/examples/etc/hosts 以获得更多信息。 测试和调试 /etc/rc.conf 做了必要的修改之后应该重启系统以应用对接口的修改, 并且确认系统重启后没有任何配置错误。 系统重启后就应该测试网络接口了。 测试以太网卡 网卡 测试 为了确认网卡被正确的配置了,在这里我们要做两件事情。首先, ping 自己的网络接口,接着 ping 局域网内的其他机器。 首先测试本地接口: &prompt.user; ping -c5 192.168.1.3 PING 192.168.1.3 (192.168.1.3): 56 data bytes 64 bytes from 192.168.1.3: icmp_seq=0 ttl=64 time=0.082 ms 64 bytes from 192.168.1.3: icmp_seq=1 ttl=64 time=0.074 ms 64 bytes from 192.168.1.3: icmp_seq=2 ttl=64 time=0.076 ms 64 bytes from 192.168.1.3: icmp_seq=3 ttl=64 time=0.108 ms 64 bytes from 192.168.1.3: icmp_seq=4 ttl=64 time=0.076 ms --- 192.168.1.3 ping statistics --- 5 packets transmitted, 5 packets received, 0% packet loss round-trip min/avg/max/stddev = 0.074/0.083/0.108/0.013 ms 现在我们应该 ping 局域网内的其他机器: &prompt.user; ping -c5 192.168.1.2 PING 192.168.1.2 (192.168.1.2): 56 data bytes 64 bytes from 192.168.1.2: icmp_seq=0 ttl=64 time=0.726 ms 64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.766 ms 64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.700 ms 64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=0.747 ms 64 bytes from 192.168.1.2: icmp_seq=4 ttl=64 time=0.704 ms --- 192.168.1.2 ping statistics --- 5 packets transmitted, 5 packets received, 0% packet loss round-trip min/avg/max/stddev = 0.700/0.729/0.766/0.025 ms 您如果您设置了 /etc/hosts 文件,也可以用机器名来替换 192.168.1.2 调试 网卡 故障排除 调试硬件和软件配置一直是一件头痛的事情, 从最简单的开始可以减轻一些痛苦。 例如网线是否插好了?是否配置好了网络服务?防火墙配置正确吗? 是否使用了被 &os; 支持的网卡? 在发送错误报告之前您应该查看一下硬件说明, 升级 &os; 到最新的 STABLE 版本, 看一下邮件列表或者在 Internet 上搜索一下。 如果网卡工作了, 但性能低下,应该好好阅读一下 &man.tuning.7; 联机手册。 您也可以检查一下网络配置, 不正确的设置会导致慢速的网络连接。 一些用户可能会在一些网卡上经历一到两次 device timeouts, 这通常是正常现象。 如果经常这样甚至引起麻烦, 则应确定一下它跟其他设备没有冲突。 仔细检查网线连接, 或者换一块网卡。 有时用户会看到少量 watchdog timeout 错误。 这种情况要做的第一件事就是检查线缆连接。 一些网卡需要支持总线控制的 PCI 插槽。 在一些老的主板上,只有一个 PCI 插槽支持 (一般是 slot 0)。 检查网卡和主板说明书来确定是不是这个问题。 No route to host 通常发生在如果系统不能发送一个路由到目的主机的包的时候。 这在没有指定默认路由或者网线没有插上时会发生。 检查 netstat -rn 的输出并确认有一个有效的路由能到达相应的主机。 如果没有,请查阅 ping: sendto: Permission denied 错误信息经常由防火墙的配置错误引起。 如果 ipfw 在内核中启用了但是没有定义规则, 那么默认的规则就是拒绝所有通讯,甚至 ping 请求! 查阅 以了解更多信息。 有时网卡性能低下或者低于平均水平, 这种情况最好把传输媒介模式从 autoselect 改变为正确的传输介质模式。 这通常对大多数硬件有用, 但可能不会解决所有人的问题。 接着,检查所有网络设置,并且阅读 &man.tuning.7; 手册页。 虚拟主机 虚拟主机 IP 别名 &os; 的一个很普通的用途是虚拟主机站点, 一个服务器虚拟成很多服务器一样提供网络服务。 这通过在一个接口上绑定多个网络地址来实现。 一个特定的网络接口有一个真实的地址, 也可能有一些别名地址。这些别名通常用 /etc/rc.conf 中的记录来添加。 一个 fxp0 的别名记录类似于: ifconfig_fxp0_alias0="inet xxx.xxx.xxx.xxx netmask xxx.xxx.xxx.xxx" 记住别名记录必须从 alias0 开始并且按顺序递增(例如 _alias1_alias2)。 配置程序将会停止在第一个缺少的数字的地方。 计算别名的子网掩码是很重要的,幸运的是它很简单。 对于一个接口来说,必须有一个描述子网掩码的地址。 任何在这个网段下的地址必须有一个全是 1 的子网掩码(通常表示为 255.255.255.2550xffffffff 举例来说, 假设使用 fxp0 连接到两个网络, 分别是 10.1.1.0, 其子网掩码为 255.255.255.0, 以及 202.0.75.16, 其子网掩码为 255.255.255.240。 我们希望从 10.1.1.110.1.1.5 以及从 202.0.75.17202.0.75.20 的地址能够互相访问。 如前所述, 只有两个网段中的第一个地址 (本例中, 10.0.1.1202.0.75.17) 应使用真实的子网掩码; 其余的 (10.1.1.210.1.1.5 以及 202.0.75.18202.0.75.20) 则必须配置为使用 255.255.255.255 作为子网掩码。 下面是根据上述描述所进行的 /etc/rc.conf 配置: ifconfig_fxp0="inet 10.1.1.1 netmask 255.255.255.0" ifconfig_fxp0_alias0="inet 10.1.1.2 netmask 255.255.255.255" ifconfig_fxp0_alias1="inet 10.1.1.3 netmask 255.255.255.255" ifconfig_fxp0_alias2="inet 10.1.1.4 netmask 255.255.255.255" ifconfig_fxp0_alias3="inet 10.1.1.5 netmask 255.255.255.255" ifconfig_fxp0_alias4="inet 202.0.75.17 netmask 255.255.255.240" ifconfig_fxp0_alias5="inet 202.0.75.18 netmask 255.255.255.255" ifconfig_fxp0_alias6="inet 202.0.75.19 netmask 255.255.255.255" ifconfig_fxp0_alias7="inet 202.0.75.20 netmask 255.255.255.255" 配置文件 <filename>/etc</filename> 布局 在配置信息中有很多的目录,这些包括: /etc 一般的系统配置信息。这儿的数据是与特定系统相关的。 /etc/defaults 系统配置文件的默认版本。 /etc/mail 额外的 &man.sendmail.8; 配置信息,其他 MTA 配置文件。 /etc/ppp 用于用户级和内核级 ppp 程序的配置。 /etc/namedb &man.named.8; 数据的默认位置。通常 named.conf 和区域文件存放在这里。 /usr/local/etc 被安装的应用程序配置文件。可以参考每个应用程序的子目录。 /usr/local/etc/rc.d 被安装程序的 启动/停止 脚本。 /var/db 特定系统自动产生的数据库文件,像 package 数据库,位置数据库等等。 主机名 主机名 DNS <filename>/etc/resolv.conf</filename> resolv.conf /etc/resolv.conf 指示了 &os; 如何访问域名系统(DNS)。 resolv.conf 中最常见的记录是: nameserver 按顺序要查询的名字服务器的 IP 地址,最多三个。 search 搜索机器名的列表。这通常由本地机器名的域决定。 domain 本地域名。 一个典型的 resolv.conf 文件: search example.com nameserver 147.11.1.11 nameserver 147.11.100.30 只能使用一个 searchdomain 选项。 如果您在使用 DHCP,&man.dhclient.8; 经常使用从 DHCP 服务器接受来的信息重写 resolv.conf <filename>/etc/hosts</filename> 主机 /etc/hosts 是 Internet 早期使用的一个简单文本数据库。 它结合 DNS 和 NIS 提供名字到 IP 地址的映射。 通过局域网连接的机器可以用这个简单的命名方案来替代设置一个 &man.named.8; 服务器。另外,/etc/hosts 也可以提供一个 Internet 名称的本地纪录以减轻需要从外部查询带来的负担。 # $&os;$ # # Host Database # This file should contain the addresses and aliases # for local hosts that share this file. # In the presence of the domain name service or NIS, this file may # not be consulted at all; see /etc/nsswitch.conf for the resolution order. # # ::1 localhost localhost.my.domain myname.my.domain 127.0.0.1 localhost localhost.my.domain myname.my.domain # # Imaginary network. #10.0.0.2 myname.my.domain myname #10.0.0.3 myfriend.my.domain myfriend # # According to RFC 1918, you can use the following IP networks for # private nets which will never be connected to the Internet: # # 10.0.0.0 - 10.255.255.255 # 172.16.0.0 - 172.31.255.255 # 192.168.0.0 - 192.168.255.255 # # In case you want to be able to connect to the Internet, you need # real official assigned numbers. PLEASE PLEASE PLEASE do not try # to invent your own network numbers but instead get one from your # network provider (if any) or from the Internet Registry (ftp to # rs.internic.net, directory `/templates'). # /etc/hosts 用简单的格式: [Internet address] [official hostname] [alias1] [alias2] ... 例如: 10.0.0.1 myRealHostname.example.com myRealHostname foobar1 foobar2 参考 &man.hosts.5; 以获得更多信息。 日志文件配置 日志文件 <filename>syslog.conf</filename> syslog.conf syslog.conf 是 &man.syslogd.8; 程序的配置文件。 它指出了的 syslog 哪种信息类型被存储在特定的日志文件中。 # $&os;$ # # Spaces ARE valid field separators in this file. However, # other *nix-like systems still insist on using tabs as field # separators. If you are sharing this file between systems, you # may want to use only tabs as field separators here. # Consult the syslog.conf(5) manual page. *.err;kern.debug;auth.notice;mail.crit /dev/console *.notice;kern.debug;lpr.info;mail.crit;news.err /var/log/messages security.* /var/log/security mail.info /var/log/maillog lpr.info /var/log/lpd-errs cron.* /var/log/cron *.err root *.notice;news.err root *.alert root *.emerg * # uncomment this to log all writes to /dev/console to /var/log/console.log #console.info /var/log/console.log # uncomment this to enable logging of all log messages to /var/log/all.log #*.* /var/log/all.log # uncomment this to enable logging to a remote log host named loghost #*.* @loghost # uncomment these if you're running inn # news.crit /var/log/news/news.crit # news.err /var/log/news/news.err # news.notice /var/log/news/news.notice !startslip *.* /var/log/slip.log !ppp *.* /var/log/ppp.log 参考 &man.syslog.conf.5; 手册页以获得更多信息 <filename>newsyslog.conf</filename> newsyslog.conf newsyslog.conf 是一个通常用 &man.cron.8; 计划运行的 &man.newsyslog.8; 程序的配置文件。 &man.newsyslog.8; 指出了什么时候日志文件需要打包或者重新整理。 比如 logfile 被移动到 logfile.0logfile.0 被移动到 logfile.1 等等。另外,日志文件可以用 &man.gzip.1; 来压缩,它们是这样的命名格式: logfile.0.gzlogfile.1.gz 等等。 newsyslog.conf 指出了哪个日志文件要被管理,要保留多少和它们什么时候被创建。 日志文件可以在它们达到一定大小或者在特定的日期被重新整理。 # configuration file for newsyslog # $&os;$ # # filename [owner:group] mode count size when [ZB] [/pid_file] [sig_num] /var/log/cron 600 3 100 * Z /var/log/amd.log 644 7 100 * Z /var/log/kerberos.log 644 7 100 * Z /var/log/lpd-errs 644 7 100 * Z /var/log/maillog 644 7 * @T00 Z /var/log/sendmail.st 644 10 * 168 B /var/log/messages 644 5 100 * Z /var/log/all.log 600 7 * @T00 Z /var/log/slip.log 600 3 100 * Z /var/log/ppp.log 600 3 100 * Z /var/log/security 600 10 100 * Z /var/log/wtmp 644 3 * @01T05 B /var/log/daily.log 640 7 * @T00 Z /var/log/weekly.log 640 5 1 $W6D0 Z /var/log/monthly.log 640 12 * $M1D0 Z /var/log/console.log 640 5 100 * Z 参考 &man.newsyslog.8; 手册页以获得更多信息。 <filename>sysctl.conf</filename> sysctl.conf sysctl sysctl.conf 看起来很像 rc.conf。它用 variable=value 的形式来设定值。指定的值在系统进入多用户模式之后被设定。 并不是所有的变量都可以在这个模式下设定。 一个简单的例子举明了在 sysctl.conf 中关闭了重要的退出信号的日志并且让 Linux 程序知道他们其实运行在 &os; 下面: kern.logsigexit=0 # Do not log fatal signal exits (e.g. sig 11) compat.linux.osname=&os; compat.linux.osrelease=4.3-STABLE 用 sysctl 进行调整 sysctl 调整 以 sysctl &man.sysctl.8; 是一个允许您改变正在运行中的 &os; 系统的接口。它包含一些 TCP/IP 堆栈和虚拟内存系统的高级选项, 这可以让有经验的管理员提高引人注目的系统性能。用 &man.sysctl.8; 可以读取设置超过五百个系统变量。 基于这点,&man.sysctl.8; 提供两个功能:读取和修改系统设置。 查看所有可读变量: &prompt.user; sysctl -a 读一个指定的变量,例如 kern.maxproc &prompt.user; sysctl kern.maxproc kern.maxproc: 1044 要设置一个指定的变量,直接用 variable=value 这样的语法: &prompt.root; sysctl kern.maxfiles=5000 kern.maxfiles: 2088 -> 5000 sysctl 变量的设置通常是字符串、数字或者布尔型。 (布尔型用 1 来表示'yes',用 0 来表示'no')。 如果你想在每次机器启动时自动设置某些变量, 可将它们加入到文件 /etc/sysctl.conf 之中。更多信息,请参阅手册页 &man.sysctl.conf.5; 及 Tom Rhodes Contributed by 只读的 &man.sysctl.8; 有时可能会需要修改某些只读的 &man.sysctl.8; 的值。 尽管有时不得不这样做, 但只有通过(重新)启动才能达到这样的目的。 例如一些膝上型电脑的 &man.cardbus.4; 设备不会探测内存范围,并且产生看似于这样的错误: cbb0: Could not map register memory device_probe_and_attach: cbb0 attach returned 12 像上面的错误通常需要修改一些只读的 &man.sysctl.8; 默认设置。要实现这点,用户可以在本地的 /boot/loader.conf.local 里面放一个 &man.sysctl.8; OIDs。那些设置定位在 /boot/defaults/loader.conf 文件中。 修复上面的问题用户需要在刚才所说的文件中设置 。现在 &man.cardbus.4; 就会正常的工作了。 调整磁盘 Sysctl 变量 <varname>vfs.vmiodirenable</varname> vfs.vmiodirenable vfs.vmiodirenable sysctl 变量可以设置成0(关)或者1(开);默认是1。 这个变量控制目录是否被系统缓存。大多数目录是小的, 在系统中只使用单个片断(典型的是1K)并且在缓存中使用的更小 (典型的是512字节)。当这个变量设置为关闭 (0) 时, 缓存器仅仅缓存固定数量的目录,即使您有很大的内存。 而将其开启 (设置为1) 时, 则允许缓存器用 VM 页面缓存来缓存这些目录,让所有可用内存来缓存目录。 不利的是最小的用来缓存目录的核心内存是大于 512 字节的物理页面大小(通常是 4k)。 我们建议如果您在运行任何操作大量文件的程序时保持这个选项打开的默认值。 这些服务包括 web 缓存,大容量邮件系统和新闻系统。 尽管可能会浪费一些内存,但打开这个选项通常不会降低性能。 但还是应该检验一下。 <varname>vfs.write_behind</varname> vfs.write_behind vfs.write_behind sysctl 变量默认是 1 (打开)。 它告诉文件系统簇被收集满的时候把内容写进介质, 典型的是在写入大的连续的文件时。 主要的想法是, 如果可能对 I/O 性能会产生负面影响时, 应尽量避免让缓冲缓存被未同步缓冲区充满。 然而它可能降低处理速度并且在某些情况下您可能想要关闭它。 <varname>vfs.hirunningspace</varname> vfs.hirunningspace vfs.hirunningspace sysctl 变量决定了在任何给定情况下, 有多少写 I/O 被排进队列以给系统的磁盘控制器。 默认值一般是足够的,但是对有很多磁盘的机器来说您可能需要把它设置成 4M 或 5M。注意这个设置成很高的值(超过缓存器的写极限)会导致坏的性能。 不要盲目的把它设置太高!高的数值会导致同时发生的读操作的迟延。 sysctl 中还有许多与 buffer cache 和 VM页面 cache 有关的值, 一般不推荐修改它们。 虚拟内存系统已经能够很好地进行自动调整了。 <varname>vm.swap_idle_enabled</varname> vm.swap_idle_enabled vm.swap_idle_enabled sysctl 变量在有很多用户进入、离开系统和有很多空闲进程的大的多用户系统中很有用。 这些系统注重在空闲的内存中间产生连续压力的处理。通过 vm.swap_idle_threshold1vm.swap_idle_threshold2 打开这个特性并且调整交换滞后 (在空闲时)允许您降低内存页中空闲进程的优先权,从而比正常的出页 (pageout)算法更快。这给出页守护进程带来了帮助。 除非您需要否则不要把这个选项打开,因为您所权衡的是更快地进入内存, 因而它会吃掉更多的交换和磁盘带宽。在小的系统上它会有决定性的效果, 但是在大的系统上它已经做了合适的页面调度这个选项允许 VM 系统容易的让全部的进程进出内存。 <varname>hw.ata.wc</varname> hw.ata.wc &os; 4.3 中默认将 IDE 的写缓存关掉了。 这会降低到 IDE 磁盘用于写入操作的带宽, 但我们认为这有助于避免硬盘厂商所引入的, 可能引致严重的数据不一致问题。 这类问题实际上是由于 IDE 硬盘就写操作完成这件事的不诚实导致的。 当启用了 IDE 写入缓存时, IDE 硬盘驱动器不但不会按顺序将数据写到盘上, 而且当磁盘承受重载时, 它甚至会自作主张地对推迟某些块的实际写操作。 这样一来, 在系统发生崩溃或掉电时, 就会导致严重的文件系统损坏。 基于这些考虑, 我们将 &os; 的默认配置改成了更为安全的禁用 IDE 写入缓存。 然而不幸的是, 这样做导致了性能的大幅降低, 因此在后来的发行版中这个配置又改为默认启用了。 您可以通过观察 hw.ata.wc sysctl 变量, 来确认您的系统中所采用的默认值。 如果 IDE 写缓存被禁用, 您可以通过将内核变量设置为 1 来启用它。 这一操作必须在启动时通过 boot loader 来完成。 在内核启动之后尝试这么做是没有任何作用的。 要了解更多的信息,请查阅 &man.ata.4;。 <literal>SCSI_DELAY</literal> (<varname>kern.cam.scsi_delay</varname>) kern.cam.scsi_delay kernel options SCSI_DELAY SCSI_DELAY 内核配置会缩短系统启动时间。 默认值在系统启动过程中有 15 秒的迟延时间, 这是一个足够多且可靠的值。把它减少到 5 通常也能工作(特别是现代的驱动器)。新一些的 &os; (5.0 或更高版本) 应该用启动时刻可调整 kern.cam.scsi_delay。 这个可调整的和内核配置选项接受的值是 毫秒 不是 Soft Updates Soft Updates tunefs &man.tunefs.8; 程序能够用来很好的调整文件系统。 这个程序有很多不同的选项,但是现在只介绍 Soft Updates 的打开和关闭,这样做: &prompt.root; tunefs -n enable /filesystem &prompt.root; tunefs -n disable /filesystem 在文件系统被挂载之后不能用 &man.tunefs.8; 来修改。打开 Soft Updates 的最佳时机是在单用户模式下任何分区被被挂载前。 Soft Updates 极大地改善了元数据修改的性能, 主要是文件创建和删除,通过内存缓存。我们建议您在所有的文件系统上使用 Soft Updates。应该知道 Soft Updates 的两点:首先, Soft Updates 保证了崩溃后的文件系统完整性,但是很可能有几秒钟 (甚至一分钟!) 之前的数据没有写到物理磁盘。如果您的系统崩溃了您可能会丢失很多工作。 第二,SoftUpdates 推迟文件系统块的释放时间。如果在文件系统 (例如根文件系统)快满了的情况下对系统进行大规模的升级比如 make installworld, 可能会引起磁盘空间不足从而造成升级失败。 Soft Updates 的详细资料 Soft Updates 详细资料 有两种传统的方法来把文件系统的元数据 (meta-data) 写入磁盘。 (Meta-data更新是更新类似 inodes 或者目录这些没有内容的数据) 从前,默认方法是同步更新这些元数据(meta-data)。 如果一个目录改变了,系统在真正写到磁盘之前一直等待。 文件数据缓存(文件内容)在这之后以非同步形式写入。 这么做有利的一点是操作安全。如果更新时发生错误,元数据(meta-data) 一直处于完整状态。文件要不就被完整的创建要不根本就不创建。 如果崩溃时找不到文件的数据块,&man.fsck.8; 可以找到并且依靠把文件大小设置为 0 来修复文件系统。 另外,这么做既清楚又简单。缺点是元数据(meta-data)更新很慢。例如 rm -r 命令,依次触及目录下的所有文件, 但是每个目录的改变(删除一个文件)都要同步写入磁盘。 这包含它自己更新目录,inode 表和可能对文件分散的块的更新。 同样问题出现大的文件操作上(比如 tar -x)。 第二种方法是非同步元数据更新。这是 Linux/ext2fs 和 *BSD ufs 的 mount -o async 默认的方法。所有元数据更新也是通过缓存。 也就是它们会混合在文件内容数据更新中。 这个方法的优点是不需要等待每个元数据更新都写到磁盘上, 所以所有引起元数据更新大的操作比同步方式更快。同样, 这个方法也是清楚且简单的,所以代码中的漏洞风险很小。 缺点是不能保证文件系统的状态一致性。如果更新大量元数据时失败 (例如掉电或者按了重启按钮),文件系统会处在不可预知的状态。 系统再启动时没有机会检查文件系统的状态;inode 表更新的时候可能文件的数据块已经写入磁盘了但是相关联的目录没有,却不能用 fsck 命令来清理(因为磁盘上没有所需要的信息)。 如果文件系统修复后损坏了,唯一的选择是使用 &man.newfs.8; 并且从备份中恢复它。 这个问题通常的解决办法是使用 dirty region logging 或者 journaling 尽管它不是一贯的被使用并且有时候应用到其他的事务纪录中更好。 这种方法元数据更新依然同步写入,但是只写到磁盘的一个小区域。 过后他们将会被移动到正确的位置。因为纪录区很小, 磁盘上接近的区域磁头不需要移动很长的距离,所以这些比写同步快一些。 另外这个方法的复杂性有限,所以出现错误的机会也很少。缺点是元数据要写两次 (一次写到纪录区域,一次写到正确的区域)。正常情况下, 悲观的性能可能会发生。从另一方面来讲, 崩溃的时候所有未发生的元数据操作可以很快的在系统启动之后从记录中恢复过来。 Kirk McKusick,伯克利 FFS 的开发者,用 Soft Updates 解决了这个问题:元数据更新保存在内存中并且按照排列的顺序写入到磁盘 (有序的元数据更新)。这样的结果是,在繁重的元数据操作中, 如果先前的更新还在内存中没有别写进磁盘,后来的更新就会捕捉到。 所以所有的目录操作在写进磁盘的时候首先在内存中执行 (数据块按照它们的位置来排列,所以它们不会在元数据前被写入)。 如果系统崩溃了这将导致一个固定的 日志回朔: 所有不知如何写入磁盘的操作都像没有发生过一样。文件系统的一致性保持在 30 到 60 秒之前。它保证了所有正在使用的资源被标记例如块和 inodes。崩溃之后, 唯一的资源分配错误是一个实际是空闲的资源的资源被标记为使用。 &man.fsck.8; 可以认出这种情况并且释放不再使用的资源。它对于忽略崩溃后用 mount -f 强制挂上的文件系统的错误状态是安全的。 为了释放可能没有使用的资源,&man.fsck.8; 需要在过后的时间运行。一个主意是用 后台 fsck:系统启动的时候只有一个文件系统的 快照 被记录下来。fsck 可以在过后运行。所有文件系统可以在有错误的时候被挂接, 所以系统可以在多用户模式下启动。接着,后台 fsck 可以在所有文件系统需要的时候启动来释放可能没有使用的资源。 (尽管这样,不用 Soft Updates 的文件系统依然需要通常的 fsck。) 它的优点是元数据操作几乎跟非同步一样快 (也就是比需要两次元数据写操作的 logging 更快)。缺点是代码的复杂性(意味着对于丢失用户敏感数据有更多的风险) 和高的内存使用量。另外它有些特点需要知道。崩溃之后, 文件系统状态会落后一些。同步的方法用 fsck 后在一些地方可能产生一些零字节的文件, 这些文件在用 Soft Updates 文件系统之后不会存在, 因为元数据和文件内容根本没有写进磁盘(可能发生在运行 rm 之后)。这可能在文件系统上安装大量数据时候引发问题, 没有足够的剩余空间来两次存储所有文件。 调整内核限制 调整 内核限制 文件/进程限制 <varname>kern.maxfiles</varname> kern.maxfiles kern.maxfiles 可以根据系统的需要适当增减。 这个变量用于指定在系统中允许的文件描述符的最大数量。 当文件描述符表满的时候, file: table is full 会在系统消息缓冲区中反复出现, 您可以使用 dmesg 命令来观察这一现象。 每个打开的文件、 套接字和管道, 都会占用一个文件描述符。 在大型生产服务器上, 可能会轻易地用掉数千个文件描述符, 具体用量取决于服务的类型和并行启动的服务数量。 在早期版本的 &os; 中, kern.maxfile 的默认值, 是根据您内核配置文件中的 选项计算的。 kern.maxfiles 这个数值, 会与 成比例增减。 当编译定制的内核时, 按照您系统的用途来修改这个值是个好主意。 这个数字同时还决定内核的许多预设的限制值。 有时, 尽管并不会真的有 256 个用户同时连接一台生产服务器, 但对于高负载的 web 服务器而言, 却可能需要与之类似的资源。 从 FreeBSD 4.5 开始, kern.maxusers 会在系统启动时, 根据可用内存的尺寸进行计算, 在内核开始运行之后, 可以通过只读的 kern.maxusers sysctl 变量值来进行观察。 有些情况下, 可能会希望使用更大或更小一些的 kern.maxusers, 它可以以加载器变量的形式进行配置; 类似 64、 128 和 256 这样的值都并不罕见。 我们不推荐使用超过 256 的值, 除非您需要巨量的文件描述符; 根据 kern.maxusers 推算默认值的那些变量, 一般都可以在引导甚至运行时通过 /boot/loader.conf (请参见 &man.loader.conf.5; 联机手册或 /boot/defaults/loader.conf 文件来获得相关的指导) 或这篇文档的其余部分所介绍的方式来调整。 而在 FreeBSD 4.4 值钱的版本, 则只能通过内核的 &man.config.8; 选项 来加以调整。 在较早的版本中, 如果您明确地将 maxusers 设置为 0, 则系统会自动地根据硬件配置来确定这个值。 自动调整算法会将 maxusers 设置为与主存的数量一样, 或者取其下限 32 或上限 384。 。 在 &os; 5.X 和更高版本中, maxusers 如果不指定的话, 就会取默认值 0。 如果希望自行管理 maxusers, 则应配置一个不低于 4 的值, 特别是使用 X Window System 或编译软件的时候。 这样做的原因是, maxusers 所决定的一个最为重要的表的尺寸会影响最大进程数, 这个数值将是 20 + 16 * maxusers。 因此如果将 maxusers 设置为 1, 您就只能同时运行 36 个进程, 这还包括了 18 个左右的系统引导时启动的进程, 以及 15 个左右的, 在您启动 X Window System 时所引发的进程。 即使是简单的任务, 如阅读联机手册, 也需要启动多至九个的进程, 用以过滤、 解压缩, 并显示它。 将 maxusers 设为 64 将允许您同时执行最多 1044 个进程, 这几乎足以满足任何需要了。 不过, 如果您看在启动其它程序, 或运行用以支持大量用户的服务 (例如 ftp.FreeBSD.org) 时, 看到令人担忧的 proc table full 错误, 就应该提高这一数值, 并重新联编内核。 maxusers不能 限制实际能够登录到您系统上来的用户的数量。 它的主要作用是根据您可能支持的用户数量来为一系列系统数据表设置合理的尺寸, 以便提供支持他们所需运行的进程资源。 而 能够 限制并发远程以及 X 终端窗口数量的变量则是 pseudo-device pty 16。 对于 &os; 5.X, 您不再需要为这一数字而担心, 因为 &man.pty.4; 驱动已经是 自动复制的 了; 您只需在配置文件中指定 device pty 即可。 <varname>kern.ipc.somaxconn</varname> kern.ipc.somaxconn kern.ipc.somaxconn sysctl 变量 限制了接收新 TCP 连接侦听队列的大小。对于一个经常处理新连接的高负载 web服务环境来说,默认的 128 太小了。 大多数环境这个值建议增加到 1024 或者更多。 服务进程会自己限制侦听队列的大小(例如 &man.sendmail.8; 或者 Apache), 常常在它们的配置文件中有设置队列大小的选项。 大的侦听队列对防止拒绝服务 DoS 攻击也会有所帮助。 网络限制 NMBCLUSTERS 内核配置选项指出了系统可用的网络Mbuf的数量。 一个高流量的服务器使用一个小数目的网络缓存会影响 &os; 的性能。 每个 cluster 可能需要2K内存,所以一个1024的值需要在内核中给网络缓存保留2M内存。 可以用简单的方法计算出来需要多少网络缓存。 如果您有一个同时发生1000个以上连接的web服务器, 并且每个连接用掉16K接收和发送缓存, 就需要大概32M网络缓存来确保web服务器的工作。 一个好的简单计算方法是乘以2,所以2x32Mb/2Kb=64MB/2kb=32768。 我们建议在有大量内存的机器上把这个值设置在4096到32768之间。 没有必要把它设置成任意太高的值,它会在启动时引起崩溃。 &man.netstat.1; 的 选项可以用来观察网络cluster使用情况。 kern.ipc.nmbclusters 可以用来在启动时刻调节这个。 仅仅在旧版本的 &os; 需要使用 NMBCLUSTERS &man.config.8; 选项。 经常使用 &man.sendfile.2; 系统调用的繁忙的服务器, 有必要通过 NSFBUFS 内核选项或者在 /boot/loader.conf (查看 &man.loader.8; 以获得更多细节) 中设置它的值来调节 &man.sendfile.2; 缓存数量。 这个参数需要调节的普通原因是在进程中看到 sfbufa 状态。sysctl kern.ipc.nsfbufs 变量在内核配置变量中是只读的。 这个参数是由 kern.maxusers 决定的,然而它可能有必有因此而调整。 即使一个套接字被标记成非阻塞,在这个非阻塞的套接字上呼叫 &man.sendfile.2; 可能导致 &man.sendfile.2; 呼叫阻塞直到有足够的 struct sf_buf 可用。 <varname>net.inet.ip.portrange.*</varname> net.inet.ip.portrange.* net.inet.ip.portrange.* sysctl 变量自动的控制绑定在 TCP 和 UDP 套接字上的端口范围。 这里有三个范围:一个低端范围,一个默认范围和一个高端范围。 大多数网络程序分别使用由 net.inet.ip.portrange.firstnet.inet.ip.portrange.last 控制的从 1024 到 5000 的默认范围。端口范围用作对外连接,并且某些情况可能用完系统的端口, 这经常发生在运行一个高负荷 web 代理服务器的时候。 这个端口范围不是用来限制主要的例如 web 服务器进入连接或者有固定端口例如邮件传递对外连接的。 有时您可能用完了端口,那就建议适当的增加 net.inet.ip.portrange.last1000020000 或者 30000 可能是适当的值。 更改端口范围的时候也要考虑到防火墙。 一些防火墙会阻止端口的大部分范围 (通常是低范围的端口)并且用高端口进行对外连接(—)。 基于这个问题建议不要把 net.inet.ip.portrange.first 设的太小。 TCP 带宽迟延(Bandwidth Delay Product) 限制 TCP 带宽延迟积 net.inet.tcp.inflight.enable 限制 TCP 带宽延迟积和 NetBSD 的 TCP/Vegas 类似。 它可以通过将 sysctl 变量 net.inet.tcp.inflight.enable 设置成 1 来启用。 系统将尝试计算每一个连接的带宽延迟积, 并将排队的数据量限制在恰好能保持最优吞吐量的水平上。 这一特性在您的服务器同时向使用普通调制解调器, 千兆以太网, 乃至更高速度的光与网络连接 (或其他带宽延迟积很大的连接) 的时候尤为重要, 特别是当您同时使用滑动窗缩放, 或使用了大的发送窗口的时候。 如果启用了这个选项, 您还应该把 net.inet.tcp.inflight.debug 设置为 0 (禁用调试), 对于生产环境而言, 将 net.inet.tcp.inflight.min 设置成至少 6144 会很有好处。 然而, 需要注意的是, 这个值设置过大事实上相当于禁用了连接带宽延迟积限制功能。 这个限制特性减少了在路由和交换包队列的堵塞数据数量, 也减少了在本地主机接口队列阻塞的数据的数量。在少数的等候队列中、 交互式连接,尤其是通过慢速的调制解调器,也能用低的 往返时间操作。但是,注意这只影响到数据发送 (上载/服务端)。对数据接收(下载)没有效果。 调整 net.inet.tcp.inflight.stab 推荐的。 这个参数的默认值是 20, 表示把 2 个最大包加入到带宽延迟积窗口的计算中。 额外的窗口似的算法更为稳定, 并改善对于多变网络环境的相应能力, 但也会导致慢速连接下的 ping 时间增长 (尽管还是会比没有使用 inflight 算法低许多)。 对于这些情形, 您可能会希望把这个参数减少到 15, 10, 或 5; 并可能因此而不得不减少 net.inet.tcp.inflight.min (比如说, 3500) 来得到希望的效果。 减少这些参数的值, 只应作为最后不得已时的手段来使用。 虚拟内存 <varname>kern.maxvnodes</varname> vnode 是对文件或目录的一种内部表达。 因此, 增加可以被操作系统利用的 vnode 数量将降低磁盘的 I/O。 一般而言, 这是由操作系统自行完成的, 也不需要加以修改。 但在某些时候磁盘 I/O 会成为瓶颈, 而系统的 vnode 不足, 则这一配置应被增加。 此时需要考虑是非活跃和空闲内存的数量。 要查看当前在用的 vnode 数量: &prompt.root; sysctl vfs.numvnodes vfs.numvnodes: 91349 要查看最大可用的 vnode 数量: &prompt.root; sysctl kern.maxvnodes kern.maxvnodes: 100000 如果当前的 vnode 用量接近最大值, 则将 kern.maxvnodes 值增大 1,000 可能是个好主意。 您应继续查看 vfs.numvnodes 的数值, 如果它再次攀升到接近最大值的程度, 仍需继续提高 kern.maxvnodes。 在 &man.top.1; 中显示的内存用量应有显著变化, 更多内存会处于活跃 (active) 状态。 添加交换空间 不管您计划得如何好,有时候系统并不像您所期待的那样运行。 如果您发现需要更多的交换空间,添加它很简单。 有三种方法增加交换空间:添加一块新的硬盘驱动器、通过 NFS 使用交换空间和在一个现有的分区上创建一个交换文件。 要了解关于如何加密交换区, 相关配置, 以及为什么要这样做, 请参阅手册的 在新的硬盘驱动器上使用交换空间 这是添加交换空间最好的方法, 当然为了达到这个目的需要添加一块硬盘。 毕竟您总是可以使用另一块磁盘。如果能这么做, 重新阅读一下手册中关于交换空间的 来了解如何最优地安排交换空间。 通过 NFS 交换 除非没有可以用作交换空间的本地硬盘时, 否则不推荐您使用 NFS 来作为交换空间使用。 NFS 交换会受到可用网络带宽限制并且增加 NFS 服务器的负担。 交换文件 您可以创建一个指定大小的文件用来当作交换文件。 在我们的例子中我们将会使用叫做 /usr/swap0 的 64MB 大小的文件。当然您也可以使用任何您所希望的名字。 在 &os; 中创建交换文件 确认您的内核配置包含虚拟磁盘(Memory disk)驱动 (&man.md.4;)。它在 GENERIC 内核中是默认的。 device md # Memory "disks" 创建一个交换文件(/usr/swap0): &prompt.root; dd if=/dev/zero of=/usr/swap0 bs=1024k count=64 赋予它(/usr/swap0)一个适当的权限: &prompt.root; chmod 0600 /usr/swap0 /etc/rc.conf 中启用交换文件: swapfile="/usr/swap0" # Set to name of swapfile if aux swapfile desired. 通过重新启动机器或下面的命令使交换文件立刻生效: &prompt.root; mdconfig -a -t vnode -f /usr/swap0 -u 0 && swapon /dev/md0 Hiten Pandya Written by Tom Rhodes 电源和资源管理 以有效的方式利用硬件资源是非常重要的。在提出 ACPI 之前,管理电源使用和系统散热对操作系统是很困难的。硬件被嵌入的 BIOS 接口管理,例如可插拔 BIOS (PNPBIOS)或者高级电源管理(APM) 等等。电源和资源管理是现代操作系统的关键组成部分。 例如您可能当系统温度过高的时候让您的操作系统能监视到 (并且可能提醒您)。 在 &os; 使用手册的这一章节,我们将提供 ACPI 全面的信息。 参考资料会在末尾给出。 什么是 ACPI? ACPI APM 高级配置和电源接口 (ACPI) 是一个业界标准的硬件资源和电源管理接口 (因此而得名) 。它是 操作系统控制的配置和电源管理(Operating System-directed configuration and Power Management),也就是说, 它给操作系统(OS)提供了更多的控制和弹性。 在引入 ACPI 之前, 现代操作系统使得目前即插即用接口的局限性更加 凸现 出来。 ACPIAPM(高级电源管理) 的直接继承者。 高级电源管理 (APM) 的缺点 高级电源管理 (APM) 是一种基于系统目前的活动控制其电源使用的机制。 APM BIOS 由 (系统的) 制造商提供, 并且是硬件平台专属的。 在 OS 中的 APM 驱动作为中介来访问 APM 软件接口, 从而实现对电源使用的管理。 APM 有四个主要的问题。 首先, 电源管理是通过 (制造商专属的) BIOS 实现的, 而 OS 则完全不了解其细节。 例如, 用户在 APM BIOS 中设置了硬盘驱动器的空闲等待数值, 当超过这一空闲时间的限制时, 它 (BIOS) 将会减慢硬盘驱动器的速度, 而不会征求 OS 的同意。 第二, APM 逻辑是嵌入 BIOS 的, 因此它是在 OS 的控制之外运转的。 这意味着用户只能通过通过刷新他们 ROM 中的 APM BIOS 才能够解决某些问题; 而这是一个很危险的操作, 因为它可能使系统进入一个无法恢复的状态。 第三, APM 是一种制造商专属的技术, 也就是说有很多第三方的 (重复的工作) 以及 bugs, 如果在一个制造商的 BIOS 中有, 也未必会在其他的产品中解决。 最后但绝不是最小的问题, APM BIOS 没有为实现复杂的电源策略提供足够的余地, 也无法实现能够非常适合具体机器的策略。 即插即用 BIOS (PNPBIOS) 在很多时候都是不可靠的。 PNPBIOS 是 16-位 的技术, 因此 OS 不得不使用 16-位 模拟才能够与 PNPBIOS 的方法 接口 &os; APM 驱动在 &man.apm.4; 手册页中有描述。 配置 <acronym>ACPI</acronym> acpi.ko 驱动默认的在启动时通过 &man.loader.8; 被加载并且 不应该 被编译进内核。原因是这个模块跟系统很容易的工作在一起,比方说不用为了 acpi.ko 而重新编译内核。 这对更简单的测试来说很有利。另一个原因是系统启动后再启动 ACPI 不是很有用,并且在一些情况下会失败。 拿不准的话只要全部禁止 ACPI 即可。 这个驱动不应该而且不能被卸载,因为系统通过它跟各种各样的硬件打交道。 ACPI 可以通过 &man.acpiconf.8; 来禁止。实际上通过 ACPI 的交互可以通过 &man.acpiconf.8; 来完成。 简单的说,如果任何关于 ACPI 的信息在 &man.dmesg.8; 的输出中,那么它很可能已经运行了。 ACPIAPM 不能共存并且应该份开始用。后来装载的如果注意到另一个在运行将会终止执行。 最简单的表现形式是,ACPI 可以通过 &man.acpiconf.8; 的 标志和一个 1-5 的选项来使系统进入休眠状态。 5 选项将会像下面动作一样让系统软关机: &prompt.root; halt -p 其他选项也是可行的。查看 &man.acpiconf.8; 手册页以获得更多信息。 Nate Lawson 撰写人: Peter Schultz 协力: Tom Rhodes 使用和调试 &os; <acronym>ACPI</acronym> ACPI problems ACPI 是一种全新的发现设备、 管理电源使用、 以及提供过去由 BIOS 管理的访问不同硬件的标准化方法。 让 ACPI 在各种系统上都能正确使用的工作一直在进行, 但许多主板的 ACPI 机器语言 (AML) 字节代码中的 bug, &os; 的内核中子系统设计的不完善, 以及 &intel; ACPI-CA 解释器中的 bug 仍然不时会出现。 这份文档期望能够帮助您协助 &os; ACPI 的维护人员来找到您所观察到的问题的根源, 并通过调试找到其解决方法。 感谢您阅读这份文档, 我们也希望能够解决您的系统上的问题。 提交调试信息 在提交问题之前, 请确认您已经在运行最新的 BIOS 版本, 此外, 也包括嵌入式控制器的固件版本。 如果您希望提交一个问题, 请确保将下述信息发到 freebsd-acpi@FreeBSD.org: 问题行为的描述, 包括系统类型、型号,以及任何触发问题的相关信息。 另外, 请注意尽可能准确地描述这一问题是否对您是陌生的。 boot -v 之后得到的 &man.dmesg.8; 输出, 以及任何在重现 bug 时出现的错误信息。 在禁用了 ACPI 之后的 boot -v 的 &man.dmesg.8; 输出, 如果您发现禁用 ACPI 能够帮助消除问题。 来自 sysctl hw.acpi的输出。 这也是找到您的系统所提供的功能的一种好办法。 能够得到您的 ACPI Source Language (ASL) 的 URL不要ASL 直接发到邮件列表中, 因为它们可能非常大。 为了得到 ASL 您可以运行这个命令: &prompt.root; acpidump -t -d > name-system.asl (把 name 改为您的登录名, 并把 system 改为您的硬件制造商及其型号。 例如: njl-FooCo6000.asl) 许多开发者也会订阅 &a.current; 但还是请发到 &a.acpi.name; 这样它会被更多人看到。 请耐心等待, 因为我们都有全职的其他工作。 如果您的 bug 不是显而易见的, 我们可能会要求您通过 &man.send-pr.1; 来提交一个 PR。 在输入 PR 时,请将同样的信息包含进去。 这将帮助我们来追踪和解决问题。 不要在给 &a.acpi.name; 写信之前发送 PR 因为我们把它当作已知文体的备忘录而不是报告机制。 您的问题很可能已经被其他人报告过了。 背景 ACPI ACPI 存在于采用 ia32 (x86)、 ia64 (安腾)、 以及 amd64 (AMD) 架构的所有现代计算机上。 完整的标准具有大量的各式功能, 包括 CPU 性能管理、 电源控制、 温度监控、 电池系统、 嵌入式控制器以及总线枚举。 绝大多数系统实现比完整标准的功能要少一些。 例如, 桌面系统通常只实现总线枚举部分, 而笔记本则通常支持降温和电源管理功能。 笔记本通常还提供休眠和唤醒支持, 并提供与此适应的复杂功能。 符合 ACPI 的系统中有许多组件。 BIOS 和芯片组制造商提供一些固定的表 (例如, FADT) 在存储器中, 以提供类似 APIC 映射 (用于 SMP)、 配置寄存器、 以及简单的配置值等等。 另外, 一个字节代码 (bytecode) 表 (系统区别描述表 DSDT) 则提供了通过树状命名空间来指定设备及其功能的方法。 ACPI 驱动必须要处理固定表, 实现字节码解释器, 并修改驱动程序和内核, 以接受来自 ACPI 子系统的信息。 对于 &os;, &intel; 提供了一个解释器 (ACPI-CA), 它在 Linux 和 NetBSD 也可以使用。 ACPI-CA 源代码可以在 src/sys/contrib/dev/acpica 找到。 用于在 &os; 中允许 ACPI-CA 正确运转的代码则在 src/sys/dev/acpica/Osd。 最后, 用于实现 ACPI 设备的驱动可以在 src/sys/dev/acpica 找到。 常见问题 ACPI problems 要让 ACPI 正常工作, 它的每一部分都必须工作正常。 下面是一些常见的问题, 按照出新的频繁程度排序, 并给出了一些绕过或修正它们的方法。 鼠标问题 某些时候, 唤醒操作会导致鼠标不再正常工作。 已知的绕过这一问题的方法, 是在 /boot/loader.conf 文件中添加 hint.psm.0.flags="0x3000" 设置。 如果这样做不能解决问题, 请考虑按前面介绍的方法提交问题报告。 休眠/唤醒 ACPI 提供了三种休眠到 RAM (STR) 的状态, S1-S3, 以及一个休眠到磁盘的状态 (STD), 称作 S4S5软关机 同时也是系统接好电源但没有开机时的正常状态。 S4 实际上可以用两种不同的方法来实现。 S4BIOS 是一种由 BIOS 辅助的挂起到磁盘方法, 而 S4OS 则是完全由操作系统实现的。 可以使用 sysctl hw.acpi 来查看与休眠有关的项目。 这里是我的 Thinkpad 上得到的结果。 hw.acpi.supported_sleep_state: S3 S4 S5 hw.acpi.s4bios: 0 这表示我可以使用 acpiconf -s 来测试 S3S4OS, 以及 S5。 如果 是一 (1), 则可以使用 S4BIOS 来代替 S4 OS 当测试休眠/唤醒时, 从 S1 开始, 如果它被支持的话。 这个状态是最可能正常工作的状态, 因为它不需要太多的驱动支持。 没有人实现 S2 但如果您有它的支持, 则应该和 S1 类似。 下一件值得尝试的是 S3。 这是最深的 STR 状态, 并需要一系列驱动的支持才能够正常地重新初始化您的硬件。 如果您在唤醒系统时遇到问题, 请不要吝惜发邮件给 &a.acpi.name; 邮件列表, 尽管不要指望问题一定会很快解决, 因为有许多驱动程序/硬件需要进行更多的测试和改进。 为了帮助隔离问题, 请在内核中删去尽可能多的驱动。 如果这样做能够解决问题, 请尝试逐个加载驱动直到问题再次出现。 通常预编译的驱动程序如 nvidia.ko、 X11 显示驱动, 以及 USB 的问题最多, 而以太网卡的驱动则通常工作的很好。 如果您能够通过加载和卸载驱动使系统正常工作, 您可以通过将适当的命令放到 /etc/rc.suspend/etc/rc.resume 来将这个过程自动化。 在这两个文件中有一个注释掉的卸载和加载驱动程序的例子供您参考。 另外您还可以将 设置为零 (0), 如果您的显示在唤醒之后显得很混乱。 此外您还可以尝试更长或更短的 值看看是否有所助益。 另一件值得一试的事情是使用一个比较新的包含 ACPI 支持的 Linux 发行版来试试看他们的 休眠/唤醒 功能是否在同样的硬件上能够正常工作。 如果在 Linux 下正常, 则很可能是 &os; 驱动程序的问题, 而隔离问题并找到存在问题的驱动有助于解决它。 需要注意的是 ACPI 的维护人员通常并不维护其他驱动 (例如 声音、 ATA, 等等) 因此如果最终发现是驱动的问题最好还是发到 &a.current.name; 邮件列表并发给驱动程序的维护者。 如果您喜欢冒险, 则可以加一些 &man.printf.3; 到有问题的驱动中, 以找到它的恢复功能发生问题的位置。 最后, 试试看禁用 ACPI 并代之以启用 APM。 如果 休眠/唤醒 能够在 APM 下正常工作, 使用 APM 可能会更好, 特别是对于较老的硬件 (2000年以前)。 硬件制造商需要一些时间来让老硬件的 ACPI 工作正常, 而 ACPI 的问题十之八九是 BIOS 中的毛病引发的。 系统停止响应 (暂时或永久性地) 中断风暴 绝大多数系统停止响应是由于未能及时响应中断或发生了中断风暴导致的。 芯片组有很多问题最终会溯源到 BIOS 如何在引导系统之前配置中断, APIC (MADT) 表的正确性, 以及 系统控制中断 (SCI) 如何路由。 通过察看 vmstat -i 的输出中包括 acpi0 的那一行可以区分中断风暴和未能及时响应中断。 如果每秒计数器增长的速度多于一两个, 则您是遇到了中断风暴。 如果系统停止了响应, 您可以尝试停止内核并进入 DDB (在控制台上按 CTRL ALTESC) 并输入 show interrupts APIC 禁用 处理中断问题的救命稻草是尝试禁用 APIC 支持, 这是通过在 loader.conf 中加入 hint.apic.0.disabled="1" 完成的。 崩溃 崩溃对于 ACPI 是比较罕见的情况, 如果发现, 我们将会非常重视并很快修复它。 您要做的第一件事是设法隔离出能够重现崩溃 (如果可能的话) 的操作并获取一份调用堆栈。 请启用 并设置串行控制台 (参见 ) 或配置一个 &man.dump.8; 分区。 您将在 DDB 中通过 得到调用堆栈。 如果您只能用手抄的方法记录它, 一定要记下头五 (5) 行和最后五 (5) 行。 然后, 尝试通过在启动时禁用 ACPI 来隔离故障。 如果这样做能够正常工作, 请通过设置 的那组数值来隔离具体是哪个 ACPI 子系统的问题。 请参见 &man.acpi.4; 联机手册中给出的那些例子。 系统在休眠或关机之后又启动了 首先请尝试在 &man.loader.conf.5; 中设置 0。 这将让 ACPI 不再在关机过程中禁用一些事件。 基于同样的原因, 一些系统需要把这个值设置为 1 (这是默认值)。 这通常能够修复在休眠或关机时立即再次启动的问题。 其他问题 如果您有 ACPI 的其他问题 (同 docking station 协同工作、 无法检测设备, 等等), 请把描述发给邮件列表; 不过, 这些问题也有可能和 ACPI 中尚未完成的部分有关, 它们可能需要时间才能被实现。 请给点耐心, 并准备测试我们可能会发给您的补丁。 <acronym>ASL</acronym>、<command>acpidump</command>, 以及 <acronym>IASL</acronym> ACPI ASL 最常见的问题是 BIOS 制造商提供的不正确 (甚至完全错误的!) 字节代码。 这通常会以类似下面这样的内核消息显示在控制台上: ACPI-1287: *** Error: Method execution failed [\\_SB_.PCI0.LPC0.FIGD._STA] \\ (Node 0xc3f6d160), AE_NOT_FOUND 许多时候, 您可以通过将 BIOS 升级到最新版本来解决此类问题。 绝大多数控制台消息是无害的, 但如果您有其他问题例如电池工作不正常, 则从 AML 开始查找问题将是一条捷径。 字节代码, 或常说的 AML, 是从一种叫做 ASL 的语言写成的源代码进行编译得到的结果。 AML 一般存放在 DSDT 表中。 要得到您系统的 ASL, 需要使用 &man.acpidump.8;。 需要同时指定 (显示固定标的内容) 和 (将 AML 反编译成 ASL) 两个选项。 请参见 如何提交调试信息 一节了解如何使用它。 最方便的初步检查是尝试重新编译 ASL 来看看是否有错误。 通常可以忽略这一过程中产生的警告, 但错误一般就都是 bug, 它们通常就是导致 ACPI 无法正常工作的原因。 要重新编译您的 ASL, 可以使用下面的命令: &prompt.root; iasl your.asl 修复 <acronym>ASL</acronym> ACPI ASL 我们的长期目标是让每一个人都能够在不需要任何用户干预的情况下使用 ACPI。 然而, 目前我们仍然在开发绕过 BIOS 制造商常见错误的方法。 µsoft; 解释器 (acpi.sysacpiec.sys) 并不会严格地检查是否遵守了标准, 因此许多只在 &windows; 中测试 ACPIBIOS 制造商很可能永远不会修正他们的 ASL。 我们希望不断地找出并用文档说明 µsoft; 的解释器到底允许那些不标准的行为, 并在 &os; 进行对应的修改使它能够正常工作而不需要用户修正 ASL。 作为一项临时缓解问题的方法, 并帮助我们确认其行为, 您可以手工修正 ASL。 如果这样能够解决问题, 请把新旧 ASL 的 &man.diff.1; 发给我们, 这样我们就有可能绕过 ACPI-CA 中的错误行为, 从而不再需要您来手工修正。 ACPI error messages 下面是一些常见的错误信息, 它们的原因, 以及如何修正。 _OS dependencies (_OS 依赖) 某些 AML 假定世界是由不同版本的 &windows; 组成的。 您可以让 &os; 声称自己是任意 OS 来看一看是否能够修正问题。 比较简单的办法是设置 ="Windows 2001" 到 /boot/loader.conf 中, 或使用您在 ASL 中找到的其他字符串。 Missing Return statements (缺少返回语句) 一些方法可能没按照标准要求的那样显式地返回值。 尽管 ACPI-CA 无法处理它, 但 &os; 提供了一个绕过它并允许其暗含地返回值的方法。 您也可以增加一个显式的 Return 语句, 如果您知道那里需要返回一个值的话。 要强制 iasl 编译 ASL, 需要使用 标志。 替换默认的 <acronym>AML</acronym> 在定制 your.asl 之后, 您可以通过下面的命令编译它: &prompt.root; iasl your.asl 可以使用 标志来强制创建 AML, 即使在编译过程中发生了错误。 请注意某些错误 (例如, 缺少 Return 语句) 会自动被解释器忽略掉。 DSDT.amliasl 命令的默认输出文件名。 可以加载它来取代您 BIOS 中存在问题的副本 (它仍然存在于闪存中), 其方法是按下面的说明编辑 /boot/loader.conf acpi_dsdt_load="YES" acpi_dsdt_name="/boot/DSDT.aml" 一定要把您的 DSDT.aml 复制到 /boot 目录中。 从 <acronym>ACPI</acronym> 中获取调试输出信息 ACPI 问题 ACPI 调试 ACPI 驱动程序提供了非常灵活的调试机制。 这允许您指定一组子系统, 以及所需要的详细信息。 需要调试的子系统可以按 layers(层) 来指定, 并分为 ACPI-CA 组件 (ACPI_ALL_COMPONENTS) 和 ACPI 硬件支持 (ACPI_ALL_DRIVERS)。 调试输出的详细程度可以通过 level(详细度) 来指定, 其范围是 ACPI_LV_ERROR (只报告错误) 到 ACPI_LV_VERBOSE (显示所有)。 level 是一个位掩码因此可以一次设置多个选项, 中间用空格分开。 实际使用中您应该考虑使用串行控制台来记录输出, 如果它太长以至于冲掉了控制台消息缓冲的话。 不同的层和输出详细度的完整列表可以在 &man.acpi.4; 联机手册中找到。 调试输出默认并不开启。 要起用它, 您需要在内核设置中添加 options ACPI_DEBUG, 如果您的内核中编入了 ACPI 的话。 您还可以在 /etc/make.conf 中加入 ACPI_DEBUG=1 来在全局起用它。 如果它只是模块, 您可以用下面的方法来重新编译 acpi.ko &prompt.root; cd /sys/modules/acpi/acpi && make clean && make ACPI_DEBUG=1 安装 acpi.ko/boot/kernel and add your 并把所需的详细度和层在 loader.conf 中指定。 这个例子将启用所有 ACPI-CA 组件以及所有 ACPI 硬件驱动 (CPULID, 等等) 的消息。 只输出错误信息, 也就是最低的详细度。 debug.acpi.layer="ACPI_ALL_COMPONENTS ACPI_ALL_DRIVERS" debug.acpi.level="ACPI_LV_ERROR" 如果您需要的信息是由某个特定的事件触发的 (比如说, 休眠之后的唤醒), 您可以不修改 loader.conf 而转而使用 sysctl 来在启动和为那个事件准备系统之后再指定层和详细度。 这些 sysctl 的名字和 loader.conf 中的一致。 参考文献 关于 ACPI 的更多信息可以从下面这些地方找到: The &a.acpi; ACPI 邮件列表存档 旧的 ACPI 邮件列表存档 The ACPI 2.0 标准 &os; 手册页: &man.acpi.4;, &man.acpi.thermal.4;, &man.acpidump.8;, &man.iasl.8;, &man.acpidb.8; DSDT 调试资源. (使用 Compaq 作为例子但通常情况下都很有用。) diff --git a/zh_CN.GB2312/books/handbook/eresources/chapter.sgml b/zh_CN.GB2312/books/handbook/eresources/chapter.sgml index 0e0ca70573..4cf31fb3f0 100644 --- a/zh_CN.GB2312/books/handbook/eresources/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/eresources/chapter.sgml @@ -1,1576 +1,1599 @@ Internet上的资源 发展迅猛的FreeBSD使得现有的印刷、平面媒体跟不上它的发展进度! 而电子版的也许是最好的,通常是唯一一个可以跟上最新发展方向的。FreeBSD来自于志愿者的成果, 用户社区通常也扮演着是“技术支持部门”的角色。通过电子邮件和USENET新闻组可以很快的找到他们。 以下列出了尽量多的联系FreeBSD用户社区的方式。如果您发现有其他的资源没有被包括在这儿, 请告诉&a.doc;,以便将它们加入到这里。 邮件列表 虽然大部分的FreeBSD开发人员都会阅读USENET, 如果您只将问题发表在 comp.unix.bsd.freebsd.* 其中之一的讨论组上, 我们也不能保证我们永远可以及时了解您的问题。如果您将问题发到适当的邮件列表上, 您不但可以同时让FreeBSD研发人员和其他的读者看到, 通常也可以得到一个较好的(至少会比较快)的回应。 本文的最后给出了各个不同的邮件列表的使用规则。 在订阅其中任何一个列表之前,请先阅读使用条文。 现在订阅这些邮件列表的人每天都会收到上百封关于FreeBSD的信件。 设立列表的使用条文有助于维护讨论质量。否则这些讨论计划的列表将失去其意义。 如果不知道哪个邮件列表适合于发送您的问题, 请参见 如何从 FreeBSD-questions 邮件列表中更快地得到答案 在列表中发送任何问题之前, 请首先学习使用邮件列表的最佳方式, 例如如何通过阅读 邮件列表常见问题回答集 (FAQ) 文档, 来避免经常重复的讨论。 全部的邮件列表记录都可以在FreeBSD World Wide Web服务器上找到。此服务器提供了很棒的关键词搜寻功能,可让您找到FAQ的解答。 而在邮件列表上提问之前,请先搜寻是否已有答案。 列表摘要 一般性的列表: 以下的列表都是一般性的, 而且可以自由地加入,鼓励大家加入他们: 目录 用途 &a.cvsall.name; FreeBSD源代码的变动 &a.advocacy.name; FreeBSD鼓吹者 &a.announce.name; 重要的事件和里程碑 &a.arch.name; 架构和设计的讨论 &a.bugbusters.name; 与FreeBSD问题报告数据库和有关工具维护相关的讨论 &a.bugs.name; 报告FreeBSD的Bug &a.chat.name; 和技术无关的FreeBSD讨论区 &a.current.name; 讨论使用 &os.current; 有关的一些问题 &a.isp.name; ISP使用FreeBSD的讨论 &a.jobs.name; 与FreeBSD有关的工作机会 &a.policy.name; FreeBSD核心团队方针讨论。低流量并且只读的 &a.questions.name; 用户问题和技术支持 &a.security-notifications.name; 安全通知 &a.stable.name; 讨论使用 &os.stable; 有关的一些问题 &a.test.name; 在真正发送一个邮件到邮件列表之前可以先发送到这里测试 技术性的邮件列表: 以下的邮件列表是用来讨论技术性问题的。 在加入订阅及讨论之前请务必认真阅读每个列表主题,因为他们讨论的内容都是严格地被限制着的。 目录 用途 &a.acpi.name; ACPI 和电源管理的开发 &a.afs.name; 将 AFS 移植到 FreeBSD &a.aic7xxx.name; 为 &adaptec; AIC 7xxx 开发驱动 &a.alpha.name; 将 FreeBSD 移植到 Alpha 工作站 &a.amd64.name; 将 FreeBSD 移植到 AMD64 系统 &a.apache.name; 关于与 Apache 有关的 ports 的讨论 &a.arm.name; 将 FreeBSD 移植到 &arm; 处理器 &a.atm.name; 在 FreeBSD 上使用 ATM 网络 &a.audit.name; 源代码审核 &a.binup.name; 二进制更新系统的设计和开发 &a.bluetooth.name; 在 FreeBSD 上使用 &bluetooth; 技术 &a.cluster.name; 在集群环境中使用 FreeBSD &a.cvsweb.name; CVSweb 维护 &a.database.name; 讨论 FreeBSD 下开发和使用数据库 &a.doc.name; 创建 FreeBSD 相关文档 &a.drivers.name; 为 &os; 撰写驱动 &a.eclipse.name; &os; 上的 Eclipse IDE、工具、 富客户应用, 以及 ports 的用户讨论。 &a.embedded.name; 在嵌入式应用中使用 FreeBSD + + &a.eol.name; + 关于与 FreeBSD 有关, 但已不再为 FreeBSD Project + 所维护的软件的互助支持。 + + &a.emulation.name; 在 FreeBSD 上模拟其它系统, 如 Linux/&ms-dos;/&windows; &a.firewire.name; FreeBSD 的 &firewire; (iLink, IEEE 1394) 技术讨论 &a.fs.name; 文件系统 &a.geom.name; 针对 GEOM 的讨论和实现 &a.gnome.name; 移植 GNOMEGNOME应用程序 &a.hackers.name; 一般性的技术讨论 &a.hardware.name; 一般性的支持 FreeBSD 的硬件的讨论 &a.i18n.name; FreeBSD 的国际化 &a.ia32.name; 在 IA-32 (&intel; x86) 平台上运行 FreeBSD &a.ia64.name; 将 FreeBSD 移植到 &intel; 即将推出的 IA64 系统 &a.ipfw.name; 关于 IP 防火墙代码再设计的技术性讨论 &a.isdn.name; ISDN开发人员 &a.java.name; &java; 开发人员以及移植 &jdk;s 到 FreeBSD 的人们 &a.kde.name; 移植 KDEKDE 应用程序 &a.lfs.name; 移植 LFS 到FreeBSD上 &a.libh.name; 第二代的安装和 package 系统 &a.mips.name; 移植 FreeBSD 到 &mips; &a.mobile.name; 关于便携式计算机的讨论 &a.mozilla.name; 移植 Mozilla 到 FreeBSD 上 &a.multimedia.name; 多媒体应用程序 &a.newbus.name; 技术讨论关于总线架构 &a.net.name; 网络子系统和 TCP/IP 源代码的讨论 &a.openoffice.name; 移植 OpenOffice.org&staroffice; 到 FreeBSD 上 &a.performance.name; 高性能、负载下安装后的性能调整问题 &a.perl.name; 许多与 perl 相关的 ports 的维护 &a.pf.name; 关于 packet filter 防火墙系统的讨论 &a.platforms.name; 关于向非 &intel; 架构的平台上移植的讨论 &a.ports.name; 关于 Ports Collection 的讨论 &a.ports-bugs.name; ports bugs/PRs讨论 &a.ppc.name; 移植 FreeBSD 到 &powerpc; &a.proliant.name; 关于 FreeBSD 在 HP ProLiant 服务器平台上的技术讨论 &a.python.name; FreeBSD 专属的 Python 问题 &a.qa.name; 质量保证(QA)讨论, 通常在未发布之前 &a.rc.name; 关于 rc.d 系统及其开发的讨论 &a.realtime.name; FreeBSD 实时扩展的开发 &a.scsi.name; SCSI 子系统 &a.security.name; 系统安全 &a.small.name; 在嵌入式系统上使用 FreeBSD (已过时; 请使用 &a.embedded.name; 代替) &a.smp.name; 有关对称多处理器的设计讨论 &a.sparc.name; 移植 FreeBSD 到 &sparc; 系统 &a.standards.name; 让 FreeBSD 顺应 C99 以及 &posix; 标准 + + &a.sun4v.name; + 将 FreeBSD 移植到基于 &ultrasparc; T1 的系统上 + + &a.threads.name; 线程 &a.testing.name; FreeBSD 性能和稳定性测试 &a.tokenring.name; 在 FreeBSD 中支持 Token Ring &a.usb.name; 关于 &os; 的 USB 支持的讨论 &a.vuxml.name; 关于 VuXML 的问题讨论 &a.x11.name; 维护和支持在 FreeBSD 上运行的 X11 限制订阅的列表: 以下的列表是针对某些特定的读者而设的, 而且并不适合被当成是一般公开讨论区。您最好在某一技术讨论区参与讨论后再选择订阅这些 限制订阅的邮件列表,因为这样您可以了解到在这些讨论区发言所需要的礼仪。 目录 用途 &a.hubs.name; 运行镜象站点的成员(支持基本服务) &a.usergroups.name; 用户组调整 &a.vendors.name; 商家在发布之前的调整 &a.www.name; www.FreeBSD.org的维护 分类列表: 所有以上的列表在一个分类格式里面是可利用的。 一旦订阅了一个列表,您可以在您的账号选项里面设置您的分类选项。 CVS列表: 以下的邮件是给对FreeBSD源代码的变更记录有兴趣的人看的, 而且它们是只读的邮件列表,您不能发Email给他们。 列表 源位置 描述 &a.cvsall.name; /usr/(CVSROOT|doc|ports|projects|src) 所有对源代码的改变纪录 (其他 CVS commit 列表的超集) &a.cvs-doc.name; /usr/(doc|www) 所有对 doc 和 www 源代码的改变记录 &a.cvs-ports.name; /usr/ports 所有对 ports 源代码的改变记录 &a.cvs-projects.name; /usr/projects 所有对 projects 源代码的改变记录 &a.cvs-src.name; /usr/src 所有对 src 源代码的改变记录 如何订阅 订阅一个列表,点击上面的列表名字或到 &a.mailman.lists.link; 并点击进入您感兴趣的列表,这个列表的页面包含了所必需的订阅操作指南。 其实您只需发送邮件到 列表名@FreeBSD.org。 它将被再次转发到全世界的这个邮件列表的成员。 点击上面的 URL,在列表的底部可以从订阅的列表中退出。 也可以发送一个电子邮件到 列表名-unsubscribe@FreeBSD.org 来退订。 此外,我们要求您必须保持在技术性的邮件列表中只是讨论技术。 如果您只是对一些重要的公告感兴趣,建议您加入 &a.announce;, 它的通信量比较低。 列表规章 所有 FreeBSD 的邮件列表都有同样的基本规则, 所有人必须按照规则来做。 违反这些规则时, FreeBSD Postmaster postmaster@FreeBSD.org 会在前两次发送警告, 如果第三次违反, FreeBSD Postmaster 将从所有 FreeBSD 的邮件列表中删除这样的人, 并过滤来自发信人之后的所有邮件。 我们很遗憾必须要遵守这样的规则, 但今天的互联网是一个很混乱的环境, 它上面的很多约束机制, 都相当脆弱。 具体规则: 任何发表的主题都应当附合基本的列表概况。例如,如果列表是有关技术问题的, 那您发表的文章包含技术讨论。不要把不相关的讨论放在一起。 对于没有主题的自由形式的讨论,可以使用 FreeBSD-chat freebsd-chat@FreeBSD.org 不要将同一个问题发送到超过两个的邮件列表上,当有一个清晰和明显的必须要 发表到两个列表的要求时,也只能是两个。对于大多数的列表,已经有相当多的订户了, 除了一些比较深奥的问题(如-stable & -scsi) ,没有必要同时将一个问题发到多个列表上。 如果一个信息以这种方式(多个邮件列表在Cc行出现)被发送给您, 那Cc行在把它再发送出去之前也将被整理。 无论谁是最初发表者,都会导致您自己的交叉发送。 不容许进行人身攻击和亵渎(在前后的争论中),包括用户和开发人员。 应当遵守最起码的网络礼节,象需要征得同意才可以引用或张贴私人邮件等。 然而,也有非常少的情况下,这样的内容会符合列表规章, 因此,它会在最初给予警告(或禁止)。 严格的禁止非FreeBSD相关产品或服务的广告,一旦发现将马上取缔。 单独的列表规章: &a.acpi.name; ACPI和电源管理开发 &a.afs.name; Andrew文件系统 这个列表是用来讨论porting和从CMU/Transarc使用AFS。 &a.announce.name; 重要事件/里程碑 这是一个发布FreeBSD重大事件的邮件列表。这包括有关snapshots和其他版本的公告, 新的FreeBSD的性能的公告,还可以用于指派志愿者等等。这个列表比较小。 &a.arch.name; 架构和设计讨论 这个列表是讨论FreeBSD的架构。本质上应保证内容的纯技术性。例如主题是: 如何重新创建系统使其同时有几个自己构造的系统运行。 需要什么才能修复VFS来使Heidemann层工作。 我们怎么改变设备驱动程序接口以便能够在多种总线和体系结构上使用同样的驱动程序。 如何写一个网络驱动。 &a.audit.name; 源代码审核计划 这个是针对FreeBSD源代码审核计划的邮件列表, 虽然这最初是针对安全方面代码修正的讨论,现在它已经扩展到任何代码修正的讨论。 这个列表涉及补丁方面的问题比较多,可能普通的FreeBSD用户对此不感兴趣。 不与一个特定的代码修正相关的安全讨论将放在freebsd-security中。相反的, 所有的开发人员都被鼓励把他们的补丁发到这儿来, 特别是如果他们发现有一个错误可能会影响系统的完整性时。 &a.binup.name; FreeBSD二进制升级计划 这个列表主要是讨论二进制升级binup系统。 设计问题,执行细节,补丁,错误报告,状态报告,特性要求, 提交日志,和所有其他与 binup相关的东西都可以。 &a.bluetooth.name; FreeBSD 上的 &bluetooth; 这是一个 FreeBSD 的 &bluetooth; 用户聚集的讨论区。 这里欢迎关于设计问题、 实现细节、 补丁、 问题报告、 开发进度报告, 功能需求以及其他与 &bluetooth; 相关的讨论。 &a.bugbusters.name; 同等问题报告处理结果 这个列表的目的是作为一个调整和讨论论坛来服务于Bug列表的成员,Bugbuster列表成员 和其他任何的对PR数据库真正的有兴趣的成员。这个列表不是为了讨论关于Bug细节,补丁或PRs。 &a.bugs.name; Bug报告 这是一个报告FreeBSD的Bug的邮件列表。可以随时通过 &man.send-pr.1; 命令或WEB页面来提交Bug。 &a.chat.name; 与FreeBSD社区相关的非技术性项目 这个列表超出了其他有关非技术、社会信息的内容。 包括谈论Jordan看起来是否像一个机敏的侦探,是否句首的字母要大写, 谁喝了很多咖啡, 哪儿的啤酒酿造的最好,谁在他们的地下室里酿造了啤酒等等。对于偶然宣布重大的事件 (例如:将要举行的聚会,婚礼,生日,新工作等等)也能使用这种技术列表,除上述列举之外 任何事情都可以发布在-chat列表上。 &a.core.name; FreeBSD核心团队 这是一个只供核心成员内部使用的邮件列表,只有当一个与FreeBSD相关的严重的事情需要裁决或严格审核时, 才能发送消息到这个邮件列表。 &a.current.name; 关于使用&os.current;版的讨论 这是一个针对&os.current;用户的邮件列表。 它包括一些可能影响用户的新特性的警告,使用FreeBSD-current的一些指导。 任何运行CURRENT的人必须同意这个列表,这是一个纯技术的邮件列表。 &a.cvsweb.name; FreeBSD CVSweb计划 关于FreeBSD-CVSweb的使用,开发和维护的技术性讨论。 &a.doc.name; 文档计划 这个邮件列表是与FreeBSD创建的文档的出版和计划的讨论。 这个邮件列表的成员都会提交到The FreeBSD Documentation Project。 它是一个开放的列表,可以自由地加入和做贡献! &a.drivers.name; 为 &os; 撰写设备驱动 这是关于 &os; 上的设备驱动的技术论坛。 它主要供编写设备驱动的开发人员提出关于如何使用 &os; 内核提供的 API 来编写设备驱动程序的问题。 &a.eclipse.name; &os; 上的 Eclipse IDE、工具、 富客户应用, 以及 ports 的用户讨论。 这个邮件列表的目的, 是为在 &os; 平台上选择、 安装、 使用、 开发和维护 Eclipse IDE、 工具、 富客户应用的用户, 提供互助式支持, 以及为将 Eclipse IDE 和插件移植到 &os; 环境中提供帮助。 另一个目的是建立一个在 Eclipse 社区和 &os; 社区之间的交流管道, 以达到互惠互利。 尽管这个列表主要关注的是 Eclipse 用户的诉求, 它也为使用 Eclipse 框架开发 &os; 专用的应用提供了论坛。 &a.embedded.name; 在嵌入式应用中使用 FreeBSD 这个列表讨论关于在嵌入式系统中如何使用 FreeBSD 的话题。 这是一个技术性的邮件列表, 其主要内容是技术讨论。 针对这一邮件列表, 我们将嵌入式系统定义为那些不作为桌面系统、 只完成某些单一任务的计算设备。 这些实例包括路由器交换机和 PBX 这样的网络设备、 远程测量设备、 PDA、 PoS 系统,等等。 &a.emulation.name; 模拟其他系统, 例如 Linux/&ms-dos;/&windows; 这是一个讨论关于如何在 &os; 上运行为其他操作系统所撰写的程序的论坛。 + + &a.eol.name; + + + 关于与 FreeBSD 有关, 但已不再为 FreeBSD Project + 所维护的软件的互助支持。 + + 这个邮件列表主要用于那些有兴趣提供或使用针对已不再为 FreeBSD Project + 官方所支持 (例如, 以安全更新或补丁的形式) 的 FreeBSD 相关软件的用户或公司讨论。 + + + &a.firewire.name; &firewire; (iLink, IEEE 1394) 这个邮件列表是关于FreeBSD子系统&firewire; (aka IEEE 1394 aka iLink)的设计和执行。相关特定的主题包括标准,总线设计和他们的协议, 适配器板/卡/芯片设置,及他们的正确的代码的结构和实施。 &a.fs.name; 文件系统 关于FreeBSD文件系统的讨论。这是一个纯技术的邮件列表。 &a.geom.name; GEOM 针对GEOM和相关执行的讨论。这是一个纯技术的邮件列表。 &a.gnome.name; GNOME 讨论关于在FreeBSD系统上的GNOME桌面环境 这是一个纯技术的邮件列表。 &a.ipfw.name; IP防火墙 这是关于在FreeBSD里重新设计IP防火墙代码的技术讨论论坛。 &a.ia64.name; 移植FreeBSD到IA64 这是一个有关将FreeBSD移植到&intel; IA64架构上的技术讨论列表, 讨论一些相关的问题与解决方案。也欢迎对这些问题感兴趣的个别讨论者。 &a.isdn.name; ISDN通信 这是一个FreeBSD支持的ISDN系统开发的邮件列表。 &a.java.name; &java;开发 这是一个讨论&java; 应用开发和 &jdk;s的porting与维护的邮件列表。 &a.jobs.name; 工作的提供和寻找 这个论坛是针对与 &os; 相关的雇佣信息和个人简历, 比如: 如果您想找一个与 &os; 相关的工作或有一个工作需要 &os; 这是一个让您来广告的好地方。 这 是对一般性雇佣问题的邮件列表, 对这个问题已经有了足够多的论坛。 注意这个列表,像其他的 FreeBSD.org 邮件列表一样是会分发给全世界的订阅者的。 因此,您需要明白关于位置和地域问题,确定之间是容易联系和可合作的。 Email最好应该使用 —纯文本格式,不过基本的PDF,HTML和 很少其他的能被更多读者接受的格式也是可以的。µsoft; Word (.doc) 格式是被邮件列表服务器拒绝的。 &a.kde.name; KDE 讨论关于在FreeBSD系统上使用KDE。 这是一个纯技术的邮件列表。 &a.hackers.name; 技术讨论 这是一个与FreeBSD相关的技术讨论论坛,是一个主要的技术性邮件列表。 他是针对个别的工作在FreeBSD上的人来提出问题或讨论相关的解决方案, 也欢迎对这些问题感兴趣的个别的讨论者。这是一个纯技术的邮件列表。 &a.hardware.name; FreeBSD硬件的普通讨论 有关FreeBSD运行的硬件类型的普通讨论,包括是否该买的一些问题和建议。 &a.hubs.name; 镜象站点 人们运行FreeBSD的镜象站点的公告和讨论。 &a.isp.name; ISP供应商问题 这是一个讨论使用FreeBSD的ISP供应商的邮件列表。这是一个纯技术的邮件列表。 &a.openoffice.name; OpenOffice.org 关于OpenOffice.org&staroffice;. 的移植和维护。 &a.performance.name; 讨论关于调整及高速运行FreeBSD 这个邮件列表提供了一个为黑客,管理员和有关的团体去讨论与FreeBSD性能相关的主题的空间。 可以在这里进行讨论的包括在任意高负载下,体验版下或者是有限制的条件下安装FreeBSD。 非常鼓励自愿地为了改进FreeBSD性能的相关团体去订阅这个列表。 这是个高技术含量的列表理论上说适合有丰富经验的FreeBSD用户,黑客,或对FreeBSD的速度、性能 、升级感兴趣的管理员。这不是一个问答式的列表,关于这些应该去读相关文档,但他是 一个可以投稿的地方,或者了解关于待解决的与性能相关的主题。 &a.pf.name; 关于 packet filter 防火墙系统的问题和讨论 关于 FreeBSD 环境下 packet filter (pf) 防火墙系统的讨论。 这里欢迎技术讨论, 以及一般的应用问题。 此外, 这里也是讨论 ALTQ QoS 框架的合适场所。 &a.platforms.name; 移植到非 &intel; 平台上 跨平台的 FreeBSD 问题, 关于非 &intel; FreeBSD 移植版本的讨论和提议。 这是一个纯技术性的邮件列表, 其讨论内容严格限制为技术。 &a.policy.name; 核心团队策略的决定 这是一个很小的只读的有关核心团队策略决定的邮件列表。 &a.ports.name; ports的讨论 关于FreeBSD的ports collection (/usr/ports)的讨论, ports的基础构造和调整过的ports结构。这是一个纯技术的邮件列表。 &a.ports-bugs.name; ports bugs的讨论 讨论关于FreeBSD的ports collection (/usr/ports),问题报告 ports建议,或者ports的修正。这是一个纯技术的邮件列表。 &a.proliant.name; 关于 FreeBSD 在 HP ProLiant 服务器平台上的技术讨论 这个邮件列表用来讨论在 HP ProLiant 服务器上使用 FreeBSD, 包括讨论 ProLiant 专用的驱动、 管理软件、 配置工具, 以及 BIOS 更新等。 同样地, 这里也是讨论 hpasmd、 hpasmcli, 以及 hpacucli 模块的主要场所。 &a.python.name; FreeBSD 上的 Python 这是一个讨论关于如何在 FreeBSD 上改善 Python 支持的邮件列表。 这是一个纯技术的邮件列表。 它是为那些移植 Python、 其第三方模块, 以及 Zope 相关软件到 FreeBSD 上的人准备的。 这里也欢迎参与技术讨论的人。 &a.questions.name; 用户问题 这是一个有关FreeBSD问题的邮件列表。您不应当发送how to 问题给技术列表,除非您认为这个问题是非常可爱的技术问题。 &a.scsi.name; SCSI子系统 这是一个讨论FreeBSD的SCSI子系统的邮件列表。这是一个纯技术的列表。 &a.security.name; 安全问题 FreeBSD的计算机安全问题(DES,Kerberos,已知的安全漏洞和修复等)。 这是一个纯技术的邮件列表。注意:这不是一个问和答的列表,但是同时给出 问题和答案到FAQ是欢迎的。 &a.security-notifications.name; 安全通知 FreeBSD安全问题和修复的通知。这不是一个讨论列表,讨论的列表应当是FreeBSD-security &a.small.name; 在嵌入式应用程序中使用FreeBSD 这个列表讨论了与极小的和嵌入的FreeBSD安装的讨论主题。 这是一个纯技术的列表。 这一列表已被 &a.embedded.name; 代替。 &a.stable.name; 讨论关于&os.stable;版的使用 这是一个&os.stable;用户的邮件列表。它包括-STABLE的新特性可能会影响用户的警告。 任何运行STABLE的人应当经常关注这个列表。这是一个纯技术的列表。 &a.standards.name; C99 & POSIX一致 这是关于FreeBSD顺应C99和POSIX标准的技术讨论论坛。 &a.usb.name; 讨论 &os; 的 USB 支持 这个邮件列表是关于 &os; 上的 USB 支持的技术性讨论。 &a.usergroups.name; 用户组调整列表 这个邮件列表为协调从各地的使用群体到彼此相互讨论问题和 从核心团队中指定个人。这个邮件列表应被限制到大纲和协调用户组 计划的范围之内。 &a.vendors.name; 商家 讨论FreeBSD计划和FreeBSD软硬件商家的协调。 过滤邮件列表 &os;邮件列表是使用了多种过滤方法去消除垃圾邮件、病毒和其他没用的电子邮件。 这部分所描述的并不包括所有常用的保护邮件列表的消除方法。 邮件列表只包含一些允许的附件类型。所有在列表中有MIME类型的附件的电子邮件在 邮件列表中被转发之前将被过滤掉。 application/octet-stream application/pdf application/pgp-signature application/x-pkcs7-signature message/rfc822 multipart/alternative multipart/related multipart/signed text/html text/plain text/x-diff text/x-patch 一些邮件列表可以允许附件为其他MIME类型,但是以上列出的 应该被多数的邮件列表所采用。 如果一个电子邮件包含HTML和纯文本形式,HTML的形式将被删除。 如果一个电子邮件内容只是HTML形式,他将被转换为纯文本格式。 Usenet新闻组 除了FreeBSD两个特殊的新闻组,还有很多讨论FreeBSD或与FreeBSD用户相关的其他讨论组。 一些新闻组的关键词搜索档案是可以使用的, 有什么问题可以与Warren Toomey wkt@cs.adfa.edu.au联系。 BSD特殊的新闻组 comp.unix.bsd.freebsd.announce comp.unix.bsd.freebsd.misc de.comp.os.unix.bsd (德语) fr.comp.os.bsd (法语) it.comp.os.freebsd (意大利语) tw.bbs.comp.386bsd (繁体中文) Internet上其他的&unix;新闻组 comp.unix comp.unix.questions comp.unix.admin comp.unix.programmer comp.unix.shell comp.unix.user-friendly comp.security.unix comp.sources.unix comp.unix.advocacy comp.unix.misc comp.bugs.4bsd comp.bugs.4bsd.ucb-fixes comp.unix.bsd X Window系统 comp.windows.x.i386unix comp.windows.x comp.windows.x.apps comp.windows.x.announce comp.windows.x.intrinsics comp.windows.x.motif comp.windows.x.pex comp.emulators.ms-windows.wine World Wide Web服务器 &chap.eresources.www.inc; Email地址 下面的用户组提供了与FreeBSD相关的邮件地址。如果他被滥用的话, 这个列表的管理员有收回的权利。 工具 用户组 管理员 ukug.uk.FreeBSD.org Forwarding only freebsd-users@uk.FreeBSD.org Lee Johnston lee@uk.FreeBSD.org Shell账号 下面的用户组为积极支持FreeBSD的人们提供了shell账号。如果他被滥用的话, 这个列表的管理员有撤销的权利。 主机 访问 工具 管理员 dogma.freebsd-uk.eu.org Telnet/FTP/SSH Email, Web space, Anonymous FTP Lee Johnston lee@uk.FreeBSD.org diff --git a/zh_CN.GB2312/books/handbook/firewalls/chapter.sgml b/zh_CN.GB2312/books/handbook/firewalls/chapter.sgml index b9538b3288..2af0138dae 100644 --- a/zh_CN.GB2312/books/handbook/firewalls/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/firewalls/chapter.sgml @@ -1,3008 +1,3007 @@ Joseph J. Barbish Contributed by Brad Davis Converted to SGML and updated by 防火墙 防火墙 安全 防火墙 入门 防火墙的存在, 使得过滤出入系统的数据流成为可能。 防火墙可以使用一组或多组 规则 (rules), 来检查出入您的网络连接的数据包, 并决定允许或阻止它们通过。 这些规则通常可以检查数据包的某个或某些特征, 这些特征包括, 但不必限于协议类型、 来源或目的主机地址, 以及来源或目的端口。 防火墙可以大幅度地改善主机或网络的安全。 它可以用来完成下面的任务: 保护和隔离应用程序、 服务程序, 以及您内部网络上的机器, 不受那些来自公共的 Internet 网络上您所不希望的数据流量的干扰。 限制或禁止从内部网访问公共的 Internet 上的服务。 支持网络地址转换 (NAT), 它使得您的内部网络能够使用私有的 IP 地址, 并分享一条通往公共的 Internet 的连接 (使用一个 IP 地址, 或者一组公网地址)。 读完这章, 您将了解: 如何正确地定义包过滤规则。 &os; 中内建的集中防火墙之间的差异。 如何使用和配置 OpenBSD 的 PF 防火墙。 如何使用和配置 IPFILTER 如何使用和配置 IPFW 阅读这章之前, 您需要: 理解基本的 &os; 和 Internet 概念。 防火墙的概念 防火墙/primary> 规则集 建立防火墙规则集的基本方法有两种: 包容式的排斥式的。 排斥式的防火墙, 允许除了禁止的那些数据之外的所有网络流量通过。 包容式的防火墙正好相反。 后者只允许符合规则的流量通过, 而其他所有的流量都被阻止。 包容式防火墙一般说来要比排斥式防火墙安全, 因为他们显著地降低了由于允许不希望的网络流量通过所带来的风险。 如果使用了 带状态功能的防火墙 (stateful firewall), 则安全机制可以进一步地细化。 带状态功能的防火墙能够记录通过防火墙的连接, 进而只允许与现有连接匹配的连接, 或创建新的连接。 带状态功能的防火墙的缺点, 则是在很短时间内有大量的连接请求时, 它们可能会受到拒绝服务 (DoS) 攻击。 绝大多数防火墙都提供了同时启用两种防火墙的能力, 以便为站点提供更好的保护。 防火墙软件包 &os; 的基本系统内建了三种不同的防火墙软件包。 它们是 IPFILTER (也被称作 IPF)、 IPFIREWALL (也被称作 IPFW), 以及 OpenBSD 的 PacketFilter (也被称为 PF)。 &os; 也提供了两个内建的、 用于流量整形 (基本上是控制带宽占用) 的软件包: &man.altq.4; 和 &man.dummynet.4;。 Dummynet 在过去一直和 IPFW 紧密集成, 而 ALTQ 则需要配合 IPF/PF 使用。 IPF、 IPFW, 以及 PF 都是用规则来控制是否允许数据包出入您的系统, 虽然它们采取了不同的实现方法和规则语法。 &os; 包含多个内建的防火墙软件包的原因在于, 不同的人会有不同的需求和偏好。 任何一个防火墙软件包都很难说是最好的。 作者倾向于使用 IPFILTER, 因为它提供的状态式规则, 在 NAT 的环境中要简单许多, 而且它内建了 ftp 代理, 这简化了使用外部 FTP 服务时所需的配置。 由于所有的防火墙都基于检查所选定的包控制字段来实现功能, 撰写防火墙规则集时, 就必须了解 TCP/IP 是如何工作的, 以及包的控制字段在正常会话交互中的作用。 您可以在这个网站找到一份很好的解释文档: . OpenBSD Packet Filter (PF) 和 <acronym>ALTQ</acronym> 防火墙 PF 2003 年 7 月, OpenBSD 的防火墙, 也就是常说的 PF 被成功地移植到了 &os; 上, 并可以通过 &os; Ports Collection 来安装了; 第一个将 PF 集成到基本系统中的版本是 2004 年 11 月发行的 &os; 5.3。 PF 是一个完整的提供了大量功能的防火墙软件, 并提供了可选的 ALTQ (交错队列, Alternate Queuing) 功能。 ALTQ 提供了服务品质 (QoS) 带宽整形功能, 这个功能能够以基于过滤规则的方式来保障不同服务的带宽。 OpenBSD Project 在维护 PF 用户指南方面已经做了非常卓越的工作, 因此我们不打算在这本使用手册中进行更进一步的阐述, 以避免不必要的重复劳动。 更多的详细信息, 可以在 &os; 版本的 PF 网站上找到: 启用 PF PF 作为 &os; 5.3 和更高版本基本系统安装的一部分, 作为一个可以动态加载的模块出现。 如果在 rc.conf 中配置了 pf_enable="YES" 则系统会自动加载对应的内核模块。 可加载内核模块在构建时启用了 &man.pflog.4;。 这个模块假定 options INETdevice bpf 是存在的。 除非编译时指定了 NOINET6 (对 &os; 6.0-RELEASE 之前的版本) 或 NO_INET6 (对更新一些的版本) (例如在 &man.make.conf.5; 中定义) 它还需要 options INET6 一旦加载了这个内核模块, 或者将 PF 支持静态联编进内核, 就可以随时通过 pfctl 来启用或禁用 pf 了。 下面的例子展示了如何启用 pf &prompt.root; pfctl -e pfctl 命令提供了一种与 pf 防火墙交互的方法。 要了解进一步的信息, 参考 &man.pfctl.8; 联机手册是一个不错的办法。 内核选项 内核选项 device pf 内核选项 device pflog 内核选项 device pfsync 将下面这些选项加入到 &os; 内核的编译配置文件中并不是启用 PF 的强制性要求。 这里列出它们主要是为了介绍一些背景信息。 将 PF 编译到内核中之后, 就不再需要使用可加载内核模块了。 如何在内核编译配置中加入对于 PF 选项的例子可以在内核源代码中的 /usr/src/sys/conf/NOTES 这个文件中找到。 这里列举如下: device pf device pflog device pfsync device pf 用于启用 Packet Filter 防火墙的支持。 device pflog 启用可选的 &man.pflog.4; 伪网络设备, 用以通过 &man.bpf.4; 描述符来记录流量。 &man.pflogd.8; 服务可以用来存储信息, 并把它们以日志形式记录到磁盘上。 device pfsync 启用可选的 &man.pfsync.4; 伪网络设备, 用以监视 状态变更。 由于这不是那个可加载内核模块的一部分, 因此如果需要使用它, 就必须自行编译定制的内核了。 这些设置只有在您使用它们构建和安装新内核之后才会生效。 可用的 rc.conf 选项 您需要在 /etc/rc.conf 中添加如下配置, 以便在启动时激活 PF: pf_enable="YES" # 启用 PF (如果需要的话, 自动加载内核模块) pf_rules="/etc/pf.conf" # pf 使用的规则定义文件 pf_flags="" # 启动时传递给 pfctl 的其他选项 pflog_enable="YES" # 启动 pflogd(8) pflog_logfile="/var/log/pflog" # pflogd 用于记录日志的文件名 pflog_flags="" # 启动时传递给 pflogd 的其他选项 如果您的防火墙后面有一个 LAN, 而且需要通过它来转发 LAN 上的包, 或进行 NAT, 还必须同时启用下述选项: gateway_enable="YES" # 启用为 LAN 网关 启用 <acronym>ALTQ</acronym> ALTQ 只有在作为编译选项加入到 &os; 内核时, 才能使用。 ALTQ 目前还不是所有的可用网卡驱动都能够支持的。 请参见 &man.altq.4; 联机手册了解您正使用的 &os; 版本中的驱动支持情况。 下面这些选项将启用 ALTQ 以及一些附加的功能。 options ALTQ options ALTQ_CBQ # 基于分类的排列 (CBQ) options ALTQ_RED # 随机先期检测 (RED) options ALTQ_RIO # 对进入和发出的包进行 RED options ALTQ_HFSC # 带等级的包调度器 (HFSC) options ALTQ_PRIQ # 按优先级的排列 (PRIQ) options ALTQ_NOPCC # 在联编 SMP 内核时必须使用,禁止读时钟 options ALTQ 将启用 ALTQ 框架的支持。 options ALTQ_CBQ 用于启用基于分类的队列 (CBQ) 支持。 CBQ 允许您将连接分成不同的类别, 或者说, 队列, 以便在规则中为它们指定不同的优先级。 options ALTQ_RED 将启用随机预检测 (RED)。 RED 是一种用于防止网络拥塞的技术。 RED 度量队列的长度, 并将其与队列的最大和最小长度阈值进行比较。 如果队列过长, 则新的包将被丢弃。 如名所示, RED 从不同的连接中随机地丢弃数据包。 options ALTQ_RIO 将启用出入的随机预检测。 options ALTQ_HFSC 启用层次式公平服务平滑包调度器。 要了解关于 HFSC 进一步的信息, 请参见 options ALTQ_PRIQ 启用优先队列 (PRIQ)。 PRIQ 首先允许高优先级队列中的包通过。 options ALTQ_NOPCC 启用 ALTQSMP 支持。 如果是 SMP 系统, 则必须使用它。 建立过滤规则 Packet Filter 会从 &man.pf.conf.5; 文件中读取配置规则, 并根据那里的规则修改、 丢弃或让数据包通过。 默认安装的 &os; 已经提供了一个默认的、 包含一些有用例子和注释的 /etc/pf.conf 尽管 &os; 提供了自己的 /etc/pf.conf, 但这个文件和 OpenBSD 中的语法是一样的。 OpenBSD 开发团队提供了一个非常好的配置 pf 资源, 它可以在 找到。 在浏览 pf 用户手册时, 请时刻注意, 在 &os; 中所包含的 pf 的版本和 OpenBSD 中是不一样的。 在 &os; 5.X 中 pf 相当于 OpenBSD 3.5 中的版本, 而 &os; 6.X 中则相当于 OpenBSD 3.7。 关于 pf 的配置和使用问题, 可以在 &a.pf; 提出。 当然, 在提出问题之前, 别忘了查阅邮件列表的存档。 IPFILTER (IPF) 防火墙 防火墙 IPFILTER 这一节的内容正在撰写中。 其内容可能不总是十分准确。 IPFILTER 的作者是 Darren Reed。 IPFILTER 是独立于操作系统的: 它是一个开放源代码的应用, 并且已经被移植到了 &os;、 NetBSD、 OpenBSD、 SunOS、 HP/UX, 以及 Solaris 操作系统上。 IPFILTER 的支持和维护都相当活跃, 并且有规律地发布更新版本。 IPFILTER 提供了内核模式的防火墙和 NAT 机制, 这些机制可以通过用户模式运行的接口程序进行监视和控制。 防火墙规则可以使用 &man.ipf.8; 工具来动态地设置和删除。 NAT 规则可以通过 &man.ipnat.1; 工具来维护。 &man.ipfstat.8; 工具则可以用来显示 IPFILTER 内核部分的统计数据。 最后, 使用 &man.ipmon.8; 程序可以把 IPFILTER 的动作记录到系统日志文件中。 IPF 最初是使用一组 以最后匹配的规则为准 的策略来实现的, 这种方式只能支持无状态的规则。 随着时代的进步, IPF 被逐渐增强, 并加入了 quick 选项, 以及支持状态的 keep state 选项, 这使得规则处理逻辑变得更富有现代气息。 IPF 的官方文档介绍了传统的规则编写方法和文件处理逻辑。 新增的功能只是作为一些附加的选项出现, 如果能完全理解这些功能, 则对于建立更安全的防火墙就很有好处。 这一节中主要是针对 quick 选项, 以及支持状态的 keep state 选项的介绍。 这是包容式防火墙规则集最基本的编写要素。 包容式防火墙只允许与规则匹配的包通过。 这样, 您就既能够控制来自防火墙后面的机器请求 Internet 公网上的那些服务, 同时也可以控制来自 Internet 的请求能够访问内部网上的哪些服务。 所有其它的访问请求都会被阻止, 并记录下来。 包容式防火墙一般而言要远比排斥式的要安全, 而且也只需要定义允许哪些访问通过。 要获得关于传统规则处理方式的详细信息, 请参考: 以及 IPF FAQ 可以在 找到。 除此之外, 您还可以在 找到开放源代码的 IPFilter 的邮件列表存档, 并进行搜索。 启用 IPF IPFILTER 启用 IPF 作为 &os; 基本安装的一部分, 以一个独立的内核模块的形式提供。 如果在 rc.conf 中配置了 ipfilter_enable="YES", 系统就会自动地动态加载 IPF 内核模块。 这个内核模块在创建时启用了日志支持, 并加入了 default pass all 选项。 如果只是需要把默认的规则设置为 block all 的话, 并不需要把 IPF 编译到内核中。 可以简单地通过把这条规则加入自己的规则集来达到同样的目的。 内核选项 内核选项 IPFILTER 内核选项 IPFILTER_LOG 内核选项 IPFILTER_DEFAULT_BLOCK IPFILTER 内核选项 下面这些 &os; 内核编译选项并不是启用 IPF 所必需的。 这里只是作为背景知识来加以阐述。 如果将 IPF 编入了内核, 则对应的内核模块将不被使用。 关于 IPF 选项语句的内核编译配置的例子, 可以在内核源代码中的 /usr/src/sys/conf/NOTES 找到。 此处列举如下: options IPFILTER options IPFILTER_LOG options IPFILTER_DEFAULT_BLOCK options IPFILTER 用于启用 IPFILTER 防火墙的支持。 options IPFILTER_LOG 用于启用 IPF 的日志支持, 所有匹配了包含 log 的规则的包, 都会被记录到 ipl 这个包记录伪—设备中。 options IPFILTER_DEFAULT_BLOCK 将改变防火墙的默认动作, 进而, 所有不匹配防火墙的 pass 规则的包都会被阻止。 这些选项只有在您重新编译并安装内核之后才会生效。 可用的 rc.conf 选项 要在启动时激活 IPF, 您需要在 /etc/rc.conf 中增加下面的设置: ipfilter_enable="YES" # 启动 ipf 防火墙 ipfilter_rules="/etc/ipf.rules" # 将被加载的规则定义, 这是一个文本文件 ipmon_enable="YES" # 启动 IP 监视日志 ipmon_flags="-Ds" # D = 作为服务程序启动 # s = 使用 syslog 记录 # v = 记录 tcp 窗口大小、 ack 和顺序号(seq) # n = 将 IP 和端口映射为名字 如果您的 LAN 在防火墙后面, 并且使用了保留的私有 IP 地址范围, 那就需要增加下面的一些选项来启用 NAT 功能: gateway_enable="YES" # 启用作为 LAN 网关的功能 ipnat_enable="YES" # 启动 ipnat 功能 ipnat_rules="/etc/ipnat.rules" # 用于 ipnat 的规则定义文件 IPF ipf ipf 命令可以用来加载您自己的规则文件。 一般情况下, 您可以建立一个包括您自定义的规则的文件, 并使用这个命令来替换掉正在运行的防火墙中的内部规则: &prompt.root; ipf -Fa -f /etc/ipf.rules 表示清除所有的内部规则表。 用于指定将要被读取的规则定义文件。 这个功能使得您能够修改自定义的规则文件, 通过运行上面的 IPF 命令, 可以将正在运行的防火墙刷新为使用全新的规则集, 而不需要重新启动系统。 这对于测试新的规则来说就很方便, 因为您可以任意执行上面的命令。 请参考 &man.ipf.8; 联机手册以了解这个命令提供的其它选项。 &man.ipf.8; 命令假定规则文件是一个标准的文本文件。 它不能处理使用符号代换的脚本。 也确实有办法利用脚本的非常强大的符号替换能力来构建 IPF 规则。 要了解进一步的细节, 请参考 IPFSTAT ipfstat IPFILTER 统计 默认情况下, &man.ipfstat.8; 会获取并显示所有的累积统计, 这些统计是防火墙启动以来用户定义的规则匹配的出入流量, 您可以通过使用 ipf -Z 命令来将这些计数器清零。 请参见 &man.ipfstat.8; 联机手册以了解进一步的细节。 默认的 &man.ipfstat.8; 命令输出类似于下面的样子: input packets: blocked 99286 passed 1255609 nomatch 14686 counted 0 output packets: blocked 4200 passed 1284345 nomatch 14687 counted 0 input packets logged: blocked 99286 passed 0 output packets logged: blocked 0 passed 0 packets logged: input 0 output 0 log failures: input 3898 output 0 fragment state(in): kept 0 lost 0 fragment state(out): kept 0 lost 0 packet state(in): kept 169364 lost 0 packet state(out): kept 431395 lost 0 ICMP replies: 0 TCP RSTs sent: 0 Result cache hits(in): 1215208 (out): 1098963 IN Pullups succeeded: 2 failed: 0 OUT Pullups succeeded: 0 failed: 0 Fastroute successes: 0 failures: 0 TCP cksum fails(in): 0 (out): 0 Packet log flags set: (0) 如果使用了 (进入流量) 或者 (输出流量), 它就只获取并显示内核中所安装的对应过滤器规则的统计数据。 ipfstat -in 以规则号的形式显示进入的内部规则表。 ipfstat -on 以规则号的形式显示流出的内部规则表。 输出和下面的类似: @1 pass out on xl0 from any to any @2 block out on dc0 from any to any @3 pass out quick on dc0 proto tcp/udp from any to any keep state ipfstat -ih 显示内部规则表中的进入流量, 每一个匹配规则前面会同时显示匹配的次数。 ipfstat -oh 显示内部规则表中的流出流量, 每一个匹配规则前面会同时显示匹配的次数。 输出和下面的类似: 2451423 pass out on xl0 from any to any 354727 block out on dc0 from any to any 430918 pass out quick on dc0 proto tcp/udp from any to any keep state ipfstat 命令的一个重要的功能可以通过指定 参数来使用, 它会以类似 &man.top.1; 的显示 &os; 正运行的进程表的方式来显示统计数据。 当您的防火墙正在受到攻击的时候, 这个功能让您得以识别、 试验, 并查看攻击的数据包。 这个选项提还提供了实时选择希望监视的目的或源 IP、 端口或协议的能力。 请参见 &man.ipfstat.8; 联机手册以了解详细信息。 IPMON ipmon IPFILTER 记录日志 为了使 ipmon 能够正确工作, 必须打开 IPFILTER_LOG 这个内核选项。 这个命令提供了两种不同的使用模式。 内建模式是默认的模式, 如果您不指定 参数, 就会采用这种模式。 服务模式是持续地通过系统日志来记录的工作模式, 这样, 您就可以通过查看日志来了解过去曾经发生过的事情。 这种模式是 &os; 和 IPFILTER 配合工作的模式。 由于在 &os; 中提供了一个内建的系统日志自动轮转功能, 因此, 使用 syslogd 比默认的将日志信息记录到一个普通文件要好。 在默认的 rc.conf 文件中, 您会看到一个 ipmon_flags 语句, 指定了 标志: ipmon_flags="-Ds" # D = 作为服务程序启动 # s = 使用 syslog 记录 # v = 记录 tcp 窗口大小、 ack 和顺序号(seq) # n = 将 IP 和端口映射为名字 记录日志的好处是很明显的。 它提供了在事后重新审查相关信息, 例如哪些包被丢弃, 以及这些包的来源地址等等。 这将为查找攻击者提供非常有用的第一手资料。 即使启用了日志机制, IPF 仍然不会对其规则进行任何日志记录工作。 防火墙管理员可以决定规则集中的哪些应记录日志, 并在这些规则上加入 log 关键字。 一般来说, 只应记录拒绝性的规则。 作为惯例, 通常会有一条默认的、拒绝所有网络流量的规则, 并指定 log 关键字, 作为您的规则集的最后一条。 这样, 您就能够看到所有没有匹配任何规则的数据包。 IPMON 的日志 Syslogd 使用特殊的方法对日志数据进行分类。 它使用称为 facilitylevel 的组。 以 模式运行的 IPMON 采用 security 作为 facility 名。 所有由 IPMON 记录的数据都会进入 security。 如果需要, 可以用下列 levels 来进一步区分数据: LOG_INFO - 使用 "log" 关键字指定的通过或阻止动作 LOG_NOTICE - 同时记录通过的那些数据包 LOG_WARNING - 同时记录阻止的数据包 LOG_ERR - 进一步记录含不完整的包头的数据包 要设置 IPFILTER 来将所有的数据记录到 /var/log/ipfilter.log, 需要首先建立这个文件。 下面的命令可以完成这个工作: &prompt.root; touch /var/log/ipfilter.log syslog 功能可以通过在 /etc/syslog.conf 文件中的语句来定义。 syslog.conf 提供了相当多的用以控制 syslog 如何处理类似 IPF 这样的用用程序所产生的系统消息的方法。 您需要将下列语句加到 /etc/syslog.conf security.* /var/log/ipfilter.log 或将下列语句加入 /etc/syslog.conf 这里的 security.* 表示把所有的相关日志信息写到指定的文件中。 要让 /etc/syslog.conf 中的修改立即生效, 您可以重新启动计算机, 或者通过执行 /etc/rc.d/syslogd reload 来让它重新读取 /etc/syslog.conf 不要忘了修改 /etc/newsyslog.conf 来让您刚创建的日志进行轮转。 记录消息的格式 ipmon 生成的消息由空格分隔的数据字段组成。 所有的消息都包含的字段是: 接到数据包的日期。 接到数据包的时间。 其格式为 HH:MM:SS.F, 分别是小时、 分钟、 秒, 以及分秒 (这个数字可能有许多位)。 处理数据包的网络接口名字, 例如 dc0 组和规则的编号, 例如 @0:17 可以通过 ipfstat -in 来查看这些信息。 动作: p 表示通过, b 表示阻止, S 表示包头不全, n 表示没有匹配任何规则, L 表示 log 规则。 显示这些标志的顺序是: S, p, b, n, L。 大写的 P 或 B 表示记录包的原因是某个全局的日志配置, 而不是某个特定的规则。 地址。 这实际上包括三部分: 源地址和端口 (以逗号分开), 一个 -> 符号, 以及目的地址和端口。 209.53.17.22,80 -> 198.73.220.17,1722. PR, 后跟协议名称或编号, 例如, PR tcp。 len, 后跟包头的长度, 以及包的总长度, 例如 len 20 40。 对于 TCP 包, 则还会包括一个附加的字段, 由一个连字号开始, 之后是表示所设置的标志的一个字母。 请参见 &man.ipmon.8; 联机手册, 以了解这些字母所对应的标志。 对于 ICMP 包, 则在最后会有两个字段。 前一个总是 ICMP, 而后一个则是 ICMP 消息和子消息的类型, 中间以斜线分靠, 例如 ICMP 3/3 表示端口不可达消息。 构建采用符号替换的规则脚本 一些有经验的 IPF 会创建包含规则的文件, 并把它编写成能够与符号替换脚本兼容的方式。 这样做最大的好处是, 它能够让您只修改符号名字所代表的值, 而在脚本执行时直接替换掉所有的名符。 作为脚本, 您可以使用符号替换来把那些经常使用的值直接用于多个规则。 下面我们将给出一个例子。 这个脚本所使用的语法与 sh、 csh, 以及 tcsh 脚本。 符号替换的前缀字段是美元符号: $ 符号字段不使用 $ 前缀。 希望替换符号字段的值, 必须使用双引号 (") 括起来。 您的规则文件的开头类似这样: ############# IPF 规则脚本的开头 ######################## oif="dc0" # 外网接口的名字 odns="192.0.2.11" # ISP 的 DNS 服务器 IP 地址 myip="192.0.2.7" # 来自 ISP 的静态 IP 地址 ks="keep state" fks="flags S keep state" # 可以使用这个脚本来建立 /etc/ipf.rules 文件, # 也可以 "直接地" 运行它。 # # 请删除两个注释号之一。 # # 1) 保留下面一行, 则创建 /etc/ipf.rules: #cat > /etc/ipf.rules << EOF # # 2) 保留下面一行, 则 "直接地" 运行脚本: /sbin/ipf -Fa -f - << EOF # 允许发出到我的 ISP 的域名服务器的访问 pass out quick on $oif proto tcp from any to $odns port = 53 $fks pass out quick on $oif proto udp from any to $odns port = 53 $ks # 允许发出未加密的 www 访问请求 pass out quick on $oif proto tcp from $myip to any port = 80 $fks # 允许发出使用 TLS SSL 加密的 https www 访问请求 pass out quick on $oif proto tcp from $myip to any port = 443 $fks EOF ################## IPF 规则脚本的结束 ######################## 这就是所需的全部内容。 这个规则本身并不重要, 它们主要是用于体现如何使用符号代换字段, 以及如何完成值的替换。 如果上面的例子的名字是 /etc/ipf.rules.script, 就可以通过输入下面的命令来重新加载规则: &prompt.root; sh /etc/ipf.rules.script 在规则文件中嵌入符号有一个问题: IPF 无法识别符号替换, 因此它不能直接地读取这样的脚本。 这个脚本可以使用下面两种方法之一来使用: 去掉 cat 之前的注释, 并注释掉 /sbin/ipf 开头的那一行。 像其他配置一样, 将 ipfilter_enable="YES" 放到 /etc/rc.conf 文件中, 并在此后立刻执行脚本, 以创建或更新 /etc/ipf.rules 通过把 ipfilter_enable="NO" (这是默认值) 加到 /etc/rc.conf 中, 来禁止系统启动脚本开启 IPFILTER。 /usr/local/etc/rc.d/ 启动目录中增加一个类似下面的脚本。 应该给它起一个显而易见的名字, 例如 ipf.loadrules.sh。 请注意, .sh 扩展名是必需的。 #!/bin/sh sh /etc/ipf.rules.script 脚本文件必须设置为属于 root, 并且属主可读、 可写、 可执行。 &prompt.root; chmod 700 /usr/local/etc/rc.d/ipf.loadrules.sh 这样, 在系统启动时, 就会自动加载您的 IPF 规则了。 IPF 规则集 规则集是指一组编写好的依据包的值决策允许通过或阻止 ipf 规则。 包的双向交换组成了一个会话交互。 防火墙规则集对同一个包会进行两次处理, 第一次是它从公网的 Internet 主机到达的时候, 第二次是它离开并返回初始的 Internet 公网主机的时候。 每一个 TCP/IP 服务 (例如 telnet, www, 邮件等等) 是由协议预先定义的源或目的 IP 地址, 以及源或目的端口。 这是最基本的一些可以为防火墙规则所利用的, 判别是否允许服务通过的标准。 IPFILTER 规则处理顺序 IPF 最初被写成使用一组称作 以最后匹配的规则为准 的处理逻辑, 且只能处理无状态的规则。 随着时代的发展, IPF 进行了改进, 并提供了 quick 选项, 以及一个有状态的 keep state 选项。 后者使处理逻辑迅速地跟上了时代的步伐。 这一节中提供的一些指导, 是基于使用包含 quick 选项和有状态的 keep state 选项来进行阐述的。 这些是编写包容式防火墙规则集的基本要素。 包容式防火墙只允许与规则匹配的服务通过。 这样, 您就既能够控制来自防火墙后面的机器请求 Internet 公网上的那些服务, 同时也可以控制来自 Internet 的请求能够访问内部网上的哪些服务。 所有其它的访问请求都会被阻止, 并记录下来。 包容式防火墙一般而言要远比排斥式的要安全, 而且也只需要定义允许哪些访问通过。 当对防火墙规则进行操作时, 应该 谨慎行事。 某些配置可能会 将您反锁在 服务器外面。 安全起见, 您可以考虑在第一次进行防火墙配置时在本地控制台上, 而不是远程, 例如通过 ssh 来进行。 规则语法 IPFILTER 规则语法 这里给出的规则语法已经简化到只处理那些新式的带状态规则, 并且都是 第一个匹配的规则获胜 逻辑的。 要了解完整的传统规则语法描述, 请参见 &man.ipf.8; 联机手册。 # 字符开头的内容会被认为是注释。 这些注释可以出现在一行规则的末尾, 或者独占一行。 空行会被忽略。 规则由关键字组成。 这些关键字必须以一定的顺序, 从左到右出现在一行上。 接下来的文字中关键字将使用粗体表示。 某些关键字可能提供了子选项, 这些子选项本身可能也是关键字, 而且可能会提供更多的子选项。 下面的文字中, 每种语法都使用粗体的小节标题呈现, 并介绍了其上下文。 ACTION IN-OUT OPTIONS SELECTION STATEFUL PROTO SRC_ADDR,DST_ADDR OBJECT PORT_NUM TCP_FLAG STATEFUL ACTION = block | pass IN-OUT = in | out OPTIONS = log | quick | on 网络接口的名字 SELECTION = proto 协议名称 | 源/目的 IP | port = 端口号 | flags 标志值 PROTO = tcp/udp | udp | tcp | icmp SRC_ADD,DST_ADDR = all | from 对象 to 对象 OBJECT = IP地址 | any PORT_NUM = port 端口号 TCP_FLAG = S STATEFUL = keep state ACTION (动作) 动作对表示匹配规则的包应采取什么动作。 每一个规则 必须 包含一个动作。 可以使用下面两种动作之一: block 表示如果规则与包匹配, 则丢弃包。 pass 表示如果规则与包匹配, 则允许包通过防火墙。 IN-OUT 每个过滤器规则都必须明确地指定是流入还是流出的规则。 下一个关键字必须要么是 in, 要么是 out, 否则将无法通过语法检查。 in 表示规则应被应用于刚刚从 Internet 公网上收到的数据包。 out 表示规则应被应用于即将发出到 Internet 的数据包。 OPTIONS 这些选项必须按下面指定的顺序出现。 log 表示包头应被写入到 ipl 日志 (如前面 LOGGING 小节所介绍的那样), 如果它与规则匹配的话。 quick 表示如果给出的参数与包匹配, 则以这个规则为准, 这使得能够 "短路" 掉后面的规则。 这个选项对于使用新式的处理逻辑是必需的。 on 表示将网络接口的名称作为筛选参数的一部分。 接口的名字会在 &man.ifconfig.8; 的输出中显示。 使用这个选项, 则规则只会应用到某一个网络接口上的出入数据包上。 要配置新式的处理逻辑, 必须使用这个选项。 当记录包时, 包的头会被写入到 IPL 包日志伪设备中。 紧跟 log 关键字, 可以使用下面几个修饰符 (按照下列顺序): body 表示应同时记录包的前 128 字节的内容。 first 如果 log 关键字和 keep state 选项同时使用, 则这个选项只在第一个包上触发, 这样就不用记录每一个 keep state 包信息了。 SELECTION 这一节所介绍的关键字可以用于所检察的包的属性。 有一个关键字主题, 以及一组子选项关键字, 您必须从他们中选择一个。 以下是一些通用的属性, 它们必须按下面的顺序使用: PROTO proto 是一个主题关键字, 它必须与某个相关的子选项关键字配合使用。 这个值的作用是匹配某个特定的协议。 要使用新式的规则处理逻辑, 就必须使用这个选项。 tcp/udp | udp | tcp | icmp 或其他在 /etc/protocols 中定义的协议。 特殊的协议关键字 tcp/udp 可以用于匹配 TCPUDP 包, 引入这个关键字的作用是是避免大量的重复规则的麻烦。 SRC_ADDR/DST_ADDR 使用 all 关键词, 基本上相当于 from any to any 在没有配合其他关键字的情形。 from src to dst: from 和 to 关键字主要是用来匹配 IP 地址。 所有的规则都必须同时给出源和目的两个参数。 any 是一个可以用于匹配任意 IP 地址的特殊关键字。 例如, 您可以使用 from any to anyfrom 0.0.0.0/0 to anyfrom any to 0.0.0.0/0from 0.0.0.0 to any 以及 from any to 0.0.0.0 IP 地址可以按句点分隔的 IP 地址/掩码长度 的方式来指定, 也可以只指定一个句点分隔的 IP 地址。 如果无法使用子网掩码来表示 IP 的话, 表达地址就会很麻烦。 请参见下面的网页了解如何撰写掩码长度: PORT 如果为源或目的指定了匹配端口, 规则就只能应用于 TCPUDP 包了。 当编写端口比较规则时, 可以指定 /etc/services 中所定义的名字, 也可以直接用端口号来指定。 如果端口号出现在源对象一侧, 则被认为是源端口号; 反之, 则被认为是目的端口号。 要使用新式的规则处理逻辑, 就必须与 to 对象配合使用这个选项。 使用的例子: from any to any port = 80 端口的比较是以数字的形式进行的, 可以使用比较算符来指定, 也可以指定一个范围。 port "=" | "!=" | "<" | ">" | "<=" | ">=" | "eq" | "ne" | "lt" | "gt" | "le" | "ge". 要指定端口范围, 可以使用 "<>" | "><"。 在源和目的匹配参数之后, 需要使用下面两个参数, 才能够使用新式的规则处理逻辑。 <acronym>TCP</acronym>_FLAG 标志只对 TCP 过滤使用。 这些字母用来表达 TCP 包头的标志。 新式的规则处理逻辑使用 flags S 参数来识别 tcp 会话开始的请求。 STATEFUL keep state 表示如果有一个包与规则匹配, 则其筛选参数应激活有状态的过滤机制。 如果使用新式的处理逻辑, 则这个选项是必需的。 有状态过滤 IPFILTER 有状态过滤 有状态过滤将网络流量当作一种双向的包交换来处理。 如果激活它, keep-state 会动态地为每一个相关的包在双向会话交互过程中产生内部规则。 它能够确认发起者和包的目的地之间的会话是有效的双向包交换过程的一部分。 如果包与这些规则不符, 则将自动地拒绝。 状态保持也使得 ICMP 包能够与 TCP 或 UDP 会话相关。 因此, 如果您在浏览网站时收到允许的状态保持规则匹配的 ICMP 类型 3 代码 4 响应, 则这些响应会被自动地允许进入。 所有 IPF 能够处理的包, 都可以作为某种活跃会话的一部分, 即使它是另一种协议的, 也会被允许进入。 所发生的事情是: 将要通过联入公网的网络接口发出的包, 首先会经过动态状态表的检查。 如果包与会话中预期的下一个包匹配, 则防火墙就会允许包通过, 而会话的交互流信息也会在动态状态表中进行更新, 而其他的包, 则将使用发出规则集来检查。 发到联入 Internet 公网的包, 也会首先经过动态规则表的检查。 如果与会话中预期的下一个包匹配, 则防火墙就允许它通过, 并更新动态状态表。 其他包仍会使用进入规则集进行检查。 当会话结束时, 对应的项会在动态状态表中删除。 有状态过滤使得您能够集中于阻止/允许新的会话。 一旦新会话被允许通过, 则所有后续的包就都被自动地允许通过, 而伪造的包则被自动地拒绝。 如果新的会话被阻止, 则后续的包也都不会被允许通过。 有状态过滤从技术角度而言, 在阻止目前攻击者常用的洪水式攻击来说, 具有更好的抗御能力。 包容式规则集的例子 下面的规则集是如何编写非常安全的包容式防火墙规则集的一个范例。 包容式防火墙只让允许的服务通过, 而所有其他的访问都会被默认地拒绝。 所有的防火墙都有至少两个接口对应的默认规则, 从而使防火墙能够正常工作。 所有的类 &unix; 系统, 包括 &os; 都使用 lo0 和 IP 地址 127.0.0.1 用于操作系统中内部的通讯。 防火墙规则必须允许这些包无阻碍地通过。 接入 Internet 公网的网络接口, 是放置规则并允许将访问请求发到 Internet 以及接收响应的地方。 这有可能是用户模式的 PPP tun0 接口, 如果您的网卡同 DSL 或电缆调制解调器相联的话。 如果有至少一个网卡与防火墙后的内网 LAN 相联, 这些网络接口就应该有一个规则来允许来自这些 LAN 接口的包无阻碍地通过。 一般说来, 规则应被组织为三个主要的小节: 所有允许自由通过的接口规则, 发到公网接口的规则, 以及进入公网接口的规则。 每一个公网接口规则中, 经常会匹配到的规则应该放置在尽可能靠前的位置。 而最后一个规则应该是阻止包通过, 并记录它们。 下面防火墙规则集中, Outbound 部分是一些使用 'pass' 的规则, 这些规则指定了允许访问的公网 Internet 服务, 并且指定了 'quick'、 'on'、 'proto'、 'port', 以及 'keep state' 这些选项。 'proto tcp' 规则还指定了 'flag' 这个选项, 这样会话的第一个包将出发状态机制。 接下来的 Inbound 一节, 则首先阻止所有不希望的数据包。 这样做有两个原因, 其一是被阻止的包可能会被后面的规则允许, 从而并不妨碍获得授权的服务正常工作; 其二是这避免了那些不常见的包由于匹配到最后一条规则而触发日志, 规则集中的最后一条规则是阻止并记录所有的包, 通过这样的记录, 就比较容易找到攻击系统的人, 并为采取法律措施收集证据。 需要注意的另一件事情是, 如果收到了不希望的数据包, 则这些包会被丢弃, 而不是给出什么响应。 这样做的好处是, 攻击者无法了解包是否已经被您的系统收到。 攻击者所能了解到的信息越少, 攻陷您的系统所需要花费的时间也就越长。 我们在这里记录的连入的 'nmap OS 指纹' 探测企图, 一般来说正是攻击者所做的第一件事。 如果您看到了 'log first' 规则的日志, 就应该用 ipfstat -hio 命令来看看那个规则被匹配的次数, 以便了解系统是否正在或曾被攻击。 如果记录的包的端口号并不是您所知道的, 可以在 /etc/services 了解端口号通常的用途。 参考下面的网页, 了解木马使用的端口: 下面是我在自己的系统中使用的完整的, 非常安全的 '包容式' 防火墙规则集。 直接使用这个规则集不会给您造成问题, 您所要做的只是注释掉那些您不需要的服务。 如果在日志中发现了希望阻止的记录, 只需在 inbound 小节中增加一条阻止规则集可。 您必须将每一个规则中的 dc0 替换为您系统上接入 Internet 的网络接口名称, 例如, 用户环境下的 PPP 应该是 tun0 /etc/ipf.rules 中加入下面的内容: ################################################################# # No restrictions on Inside LAN Interface for private network # Not needed unless you have LAN ################################################################# #pass out quick on xl0 all #pass in quick on xl0 all ################################################################# # No restrictions on Loopback Interface ################################################################# pass in quick on lo0 all pass out quick on lo0 all ################################################################# # Interface facing Public Internet (Outbound Section) # Interrogate session start requests originating from behind the # firewall on the private network # or from this gateway server destine for the public Internet. ################################################################# # Allow out access to my ISP's Domain name server. # xxx must be the IP address of your ISP's DNS. # Dup these lines if your ISP has more than one DNS server # Get the IP addresses from /etc/resolv.conf file pass out quick on dc0 proto tcp from any to xxx port = 53 flags S keep state pass out quick on dc0 proto udp from any to xxx port = 53 keep state # Allow out access to my ISP's DHCP server for cable or DSL networks. # This rule is not needed for 'user ppp' type connection to the # public Internet, so you can delete this whole group. # Use the following rule and check log for IP address. # Then put IP address in commented out rule & delete first rule pass out log quick on dc0 proto udp from any to any port = 67 keep state #pass out quick on dc0 proto udp from any to z.z.z.z port = 67 keep state # Allow out non-secure standard www function pass out quick on dc0 proto tcp from any to any port = 80 flags S keep state # Allow out secure www function https over TLS SSL pass out quick on dc0 proto tcp from any to any port = 443 flags S keep state # Allow out send & get email function pass out quick on dc0 proto tcp from any to any port = 110 flags S keep state pass out quick on dc0 proto tcp from any to any port = 25 flags S keep state # Allow out Time pass out quick on dc0 proto tcp from any to any port = 37 flags S keep state # Allow out nntp news pass out quick on dc0 proto tcp from any to any port = 119 flags S keep state # Allow out gateway & LAN users non-secure FTP ( both passive & active modes) # This function uses the IPNAT built in FTP proxy function coded in # the nat rules file to make this single rule function correctly. # If you want to use the pkg_add command to install application packages # on your gateway system you need this rule. pass out quick on dc0 proto tcp from any to any port = 21 flags S keep state # Allow out secure FTP, Telnet, and SCP # This function is using SSH (secure shell) pass out quick on dc0 proto tcp from any to any port = 22 flags S keep state # Allow out non-secure Telnet pass out quick on dc0 proto tcp from any to any port = 23 flags S keep state # Allow out FBSD CVSUP function pass out quick on dc0 proto tcp from any to any port = 5999 flags S keep state # Allow out ping to public Internet pass out quick on dc0 proto icmp from any to any icmp-type 8 keep state # Allow out whois for LAN PC to public Internet pass out quick on dc0 proto tcp from any to any port = 43 flags S keep state # Block and log only the first occurrence of everything # else that's trying to get out. # This rule enforces the block all by default logic. block out log first quick on dc0 all ################################################################# # Interface facing Public Internet (Inbound Section) # Interrogate packets originating from the public Internet # destine for this gateway server or the private network. ################################################################# # Block all inbound traffic from non-routable or reserved address spaces block in quick on dc0 from 192.168.0.0/16 to any #RFC 1918 private IP block in quick on dc0 from 172.16.0.0/12 to any #RFC 1918 private IP block in quick on dc0 from 10.0.0.0/8 to any #RFC 1918 private IP block in quick on dc0 from 127.0.0.0/8 to any #loopback block in quick on dc0 from 0.0.0.0/8 to any #loopback block in quick on dc0 from 169.254.0.0/16 to any #DHCP auto-config block in quick on dc0 from 192.0.2.0/24 to any #reserved for docs block in quick on dc0 from 204.152.64.0/23 to any #Sun cluster interconnect block in quick on dc0 from 224.0.0.0/3 to any #Class D & E multicast ##### Block a bunch of different nasty things. ############ # That I do not want to see in the log # Block frags block in quick on dc0 all with frags # Block short tcp packets block in quick on dc0 proto tcp all with short # block source routed packets block in quick on dc0 all with opt lsrr block in quick on dc0 all with opt ssrr # Block nmap OS fingerprint attempts # Log first occurrence of these so I can get their IP address block in log first quick on dc0 proto tcp from any to any flags FUP # Block anything with special options block in quick on dc0 all with ipopts # Block public pings block in quick on dc0 proto icmp all icmp-type 8 # Block ident block in quick on dc0 proto tcp from any to any port = 113 # Block all Netbios service. 137=name, 138=datagram, 139=session # Netbios is MS/Windows sharing services. # Block MS/Windows hosts2 name server requests 81 block in log first quick on dc0 proto tcp/udp from any to any port = 137 block in log first quick on dc0 proto tcp/udp from any to any port = 138 block in log first quick on dc0 proto tcp/udp from any to any port = 139 block in log first quick on dc0 proto tcp/udp from any to any port = 81 # Allow traffic in from ISP's DHCP server. This rule must contain # the IP address of your ISP's DHCP server as it's the only # authorized source to send this packet type. Only necessary for # cable or DSL configurations. This rule is not needed for # 'user ppp' type connection to the public Internet. # This is the same IP address you captured and # used in the outbound section. pass in quick on dc0 proto udp from z.z.z.z to any port = 68 keep state # Allow in standard www function because I have apache server pass in quick on dc0 proto tcp from any to any port = 80 flags S keep state # Allow in non-secure Telnet session from public Internet # labeled non-secure because ID/PW passed over public Internet as clear text. # Delete this sample group if you do not have telnet server enabled. #pass in quick on dc0 proto tcp from any to any port = 23 flags S keep state # Allow in secure FTP, Telnet, and SCP from public Internet # This function is using SSH (secure shell) pass in quick on dc0 proto tcp from any to any port = 22 flags S keep state # Block and log only first occurrence of all remaining traffic # coming into the firewall. The logging of only the first # occurrence stops a .denial of service. attack targeted # at filling up your log file space. # This rule enforces the block all by default logic. block in log first quick on dc0 all ################### End of rules file ##################################### <acronym>NAT</acronym> NAT IP 伪装 NAT 网络地址转换 NAT NAT 是 网络地址转换(Network Address Translation) 的缩写。 对于那些熟悉 &linux; 的人来说, 这个概念叫做 IP 伪装 (Masquerading); NAT 和 IP 伪装是完全一样的概念。 由 IPF 的 NAT 提供的一项功能是, 将防火墙后的本地局域网 (LAN) 共享一个 ISP 提供的 IP 地址来接入 Internet 公网。 有些人可能会问, 为什么需要这么做。 一般而言, ISP 会为非商业用户提供动态的 IP 地址。 动态地址意味着每次登录到 ISP 都有可能得到不同的 IP 地址, 无论是采用电话拨号登录, 或使用 cable 以及 DSL 调制解调器的方式。 这个 IP 是您与 Internet 公网交互时使用的身份。 现在考虑家中有五台 PC 需要访问 Internet 的情形。 您可能需要向 ISP 为每一台 PC 所使用的独立的 Internet 账号付费, 并且拥有五根电话线。 有了 NAT, 您就只需要一个 ISP 账号, 然后将另外四台 PC 的网卡通过交换机连接起来, 并通过运行 &os; 系统的那台机器作为网关连接出去。 NAT 会自动地将每一台 PC 在内网的 LAN IP 地址, 在离开防火墙时转换为公网的 IP 地址。 此外, 当数据包返回时, 也将进行逆向的转换。 NAT 通常是在没有向 ISP 请求许可, 或事先知会的情况下进行的, 因而如果被发现, 有时可能会成为 ISP 撤销您的账号的一个借口。 商业用户一般来说会购买昂贵得多的 Internet 线路, 通常会获得一组长期有效的静态 IP 地址块。 ISP 一般会希望并同意商业用户在他们的内网中使用 NAT 在 IP 地址空间中, 有一些特殊的范围是保留供经过 NAT 的内网 LAN IP 地址使用的。 根据 RFC 1918, 您可以使用下面这些 IP 范围用于内网, 它们不会在 Internet 公网上路由: 起始 IP 10.0.0.0 - 结束 IP 10.255.255.255 起始 IP 172.16.0.0 - 结束 IP 172.31.255.255 起始 IP 192.168.0.0 - 结束 IP 192.168.255.255 IP<acronym>NAT</acronym> NAT 以及 IPFILTER ipnat NAT 规则是通过 ipnat 命令加载的。 默认情况下, NAT 规则会保存在 /etc/ipnat.rules 文件中。 请参见 &man.ipnat.1; 了解更多的详情。 如果在 NAT 已经启动之后想要修改 NAT 规则, 可以修改保存 NAT 规则的那个文件, 然后在执行 ipnat 命令时加上 参数, 以删除在用的 NAT 内部规则表, 以及所有地址翻译表中已有的项。 要重新加载 NAT 规则, 可以使用类似下面的命令: &prompt.root; ipnat -CF -f /etc/ipnat.rules 如果想要看看您系统上 NAT 的统计信息, 可以用下面的命令: &prompt.root; ipnat -s 要列出当前的 NAT 表的映射关系, 使用下面的命令: &prompt.root; ipnat -l 要显示详细的信息并显示与规则处理和当前的规则/表项: &prompt.root; ipnat -v IP<acronym>NAT</acronym> 规则 NAT 规则非常的灵活, 能够适应商业用户和家庭用户的各种不同的需求。 这里所介绍的规则语法已经被简化, 以适应非商用环境中的一般情况。 完整的规则语法描述, 请参考 &man.ipnat.5; 联机手册中的介绍。 NAT 规则的写法与下面的例子类似: map IF LAN_IP_RANGE -> PUBLIC_ADDRESS 关键词 map 出现在规则的最前面。 IF 替换为对外的网络接口名。 LAN_IP_RANGE 是内网中的客户机使用的地址范围。 通常情况下, 这应该是类似 192.168.1.0/24 的地址。 PUBLIC_ADDRESS 既可以是外网的 IP 地址, 也可以是 0/32 这个特殊的关键字, 它表示分配到 IF 上的所有地址。 <acronym>NAT</acronym> 的工作原理 当包从 LAN 到达防火墙, 而目的地址是公网地址时, 它首先会通过 outbound 过滤规则。 接下来, NAT 会得到包, 并按自顶向下的顺序处理规则, 而第一个匹配的规则将生效。 NAT 接下来会根据包对应的接口名字和源 IP 地址检查所有的规则。 如果包和某个 NAT 规则匹配, 则会检查包的 [源 IP 地址, 例如, 内网的 IP 地址] 是否在 NAT 规则中箭头左侧指定的 IP 地址范围匹配。 如果匹配, 则包的原地址将被根据用 0/32 关键字指定的 IP 地址重写。 NAT 将向它的内部 NAT 表发送此地址, 这样, 当包从 Internet 公网中返回时, 就能够把地址映射回原先的内网 IP 地址, 并在随后使用过滤器规则来处理。 启用 IP<acronym>NAT</acronym> 要启用 IPNAT, 只需在 /etc/rc.conf 中加入下面一些语句。 使机器能够在不同的网络接口之间进行包的转发, 需要: gateway_enable="YES" 每次开机时自动启动 IPNAT ipnat_enable="YES" 指定 IPNAT 规则集文件: ipnat_rules="/etc/ipnat.rules" 大型 LAN 中的 <acronym>NAT</acronym> 对于在一个 LAN 中有大量 PC, 以及包含多个 LAN 的情形, 把所有的内网 IP 地址都映射到同一个公网 IP 上会导致资源不够的问题, 因为同一个端口可能在许多做了 NAT 的 LAN PC 上被多次使用, 并导致碰撞。 有两种方法来缓解这个难题。 指定使用哪些端口 普通的 NAT 规则类似于: map dc0 192.168.1.0/24 -> 0/32 上面的规则中, 包的源端口在包通过 IPNAT 时时不会发生变化的。 通过使用 portmap 关键字, 您可以要求 IPNAT 只使用一定范围内的端口地址。 比如说, 下面的规则将让 IPNAT 把源端口改为指定范围内的端口: map dc0 192.168.1.0/24 -> 0/32 portmap tcp/udp 20000:60000 使用 auto 关键字可以让配置变得更简单一些, 它会要求 IPNAT 自动地检测可用的端口并使用: map dc0 192.168.1.0/24 -> 0/32 portmap tcp/udp auto 使用公网地址池 对很大的 LAN 而言, 总有一天会达到这样一个临界值, 此时的 LAN 地址已经多到了无法只用一个公网地址表现的程度。 如果有可用的一块公网 IP 地址, 则可以将这些地址作为一个 地址池 来使用, 让 IPNAT 来从这些公网 IP 地址中挑选用于发包的地址, 并将其为这些包创建映射关系。 例如, 如果将下面这个把所有包都映射到同一公网 IP 地址的规则: map dc0 192.168.1.0/24 -> 204.134.75.1 稍作修改, 就可以用子网掩码来表达 IP 地址范围: map dc0 192.168.1.0/24 -> 204.134.75.0/255.255.255.0 或者用 CIDR 记法来指定的一组地址了: map dc0 192.168.1.0/24 -> 204.134.75.0/24 端口重定向 非常流行的一种做法是, 将 web 服务器、 邮件服务器、 数据库服务器以及 DNS 分别放到 LAN 上的不同的 PC 上。 这种情况下, 来自这些服务器的网络流量仍然应该被 NAT, 但必须有办法把进入的流量发到对应的局域网的 PC 上。 IPNAT 提供了 NAT 重定向机制来解决这个问题。 考虑下面的情况, 您的 web 服务器的 LAN 地址是 10.0.10.25, 而您的唯一的公网 IP 地址是 20.20.20.5, 则可以编写这样的规则: rdr dc0 20.20.20.5/32 port 80 -> 10.0.10.25 port 80 或者: rdr dc0 0/32 port 80 -> 10.0.10.25 port 80 另外, 也可以让 LAN 地址 10.0.10.33 上运行的 LAN DNS 服务器来处理公网上的 DNS 请求: rdr dc0 20.20.20.5/32 port 53 -> 10.0.10.33 port 53 udp FTP 和 <acronym>NAT</acronym> FTP 是一个在 Internet 如今天这样为人所熟知之前就已经出现的恐龙, 那时, 研究机构和大学是通过租用的线路连到一起的, 而 FTP 则被用于在科研人员之间共享大文件。 那时, 数据的安全性并不是需要考虑的事情。 若干年之后, FTP 协议则被埋进了正在形成中的 Internet 骨干, 而它使用明文来交换用户名和口令的缺点, 并没有随着新出现的一些安全需求而得到改变。 FTP 提供了两种不同的风格, 即主动模式和被动模式。 两者的区别在于数据通道的建立方式。 被动模式相对而言要更加安全, 因为数据通道是由发起 ftp 会话的一方建立的。 关于 FTP 以及它所提供的不同模式, 在 进行了很好的阐述。 IP<acronym>NAT</acronym> 规则 IPNAT 提供了一个内建的 FTP 代理选项, 它可以在 NAT map 规则中指定。 它能够监视所有外发的 FTP 主动或被动模式的会话开始请求, 并动态地创建临时性的过滤器规则, 只打开用于数据通道的端口号。 这样, 就消除了 FTP 一般会给防火墙带来的, 需要大范围地打开高端口所可能带来的安全隐患。 下面的规则可以处理来自内网的 FTP 访问: map dc0 10.0.10.0/29 -> 0/32 proxy port 21 ftp/tcp 这个规则能够处理来自网关的 FTP 访问: map dc0 0.0.0.0/0 -> 0/32 proxy port 21 ftp/tcp 这个则处理所有来自内网的非 FTP 网络流量: map dc0 10.0.10.0/29 -> 0/32 FTP map 规则应该在普通的 map 规则之前出现。 所有的包会从最上面的第一个规则开始进行检查。 匹配的顺序是网卡名称, 内网源 IP 地址, 以及它是否是 FTP 包。 如果所有这些规则都匹配成功, 则 FTP 代理将建立一个临时的过滤规则, 以便让 FTP 会话的数据包能够正常出入, 同时对这些包进行 NAT。 所有的 LAN 数据包, 如果没有匹配第一条规则, 则会继续尝试匹配下面的规则, 并最终被 NAT IP<acronym>NAT</acronym> FTP 过滤规则 如果使用了 NAT FTP 代理, 则只需要为 FTP 创建一个规则。 如果没有使用 FTP 代理, 则需要下面三个规则: # Allow out LAN PC client FTP to public Internet # Active and passive modes pass out quick on rl0 proto tcp from any to any port = 21 flags S keep state # Allow out passive mode data channel high order port numbers pass out quick on rl0 proto tcp from any to any port > 1024 flags S keep state # Active mode let data channel in from FTP server pass in quick on rl0 proto tcp from any to any port = 20 flags S keep state FTP <acronym>NAT</acronym> 代理的 bug 在 IPFILTER 的 3.4.31 版中, 直到整个 FTP 会话直到将要结束之前, FTP 代理都会像文档中介绍的那样。 但一旦有一方要求关闭会话, 则来自远程 FTP 服务器 21 端口的一个包会被阻止, 并在日志中记下这一情况。 NAT FTP/代理显然过早地删除了临时规则, 而不是等待远程 FTP 服务器确认它。 有人就这个问题在 IPF 的邮件列表中发表了问题报告。 解决这个问题的方法是, 要么增加一条过滤规则来摆脱不希望的日志消息, 或者什么都不做, 并忽略日志中的 FTP 连入错误信息。 绝大多数人并不经常使用外部的 FTP 服务。 block in quick on rl0 proto tcp from any to any port = 21 IPFW 防火墙 IPFW 这一节的内容正在撰写中。 其内容可能不总是十分准确。 IPFIREWALL (IPFW) 是一个由 &os; 发起的防火墙应用软件, 它由 &os; 的志愿者成员编写和维护。 它使用了传统的无状态规则和规则编写方式, 以期达到简单状态逻辑所期望的目标。 标准的 &os; 安装中, IPFW 所给出的规则集样例 (可以在 /etc/rc.firewall 中找到) 非常简单, 建议不要不加修改地直接使用。 该样例中没有使用状态过滤, 而该功能在大部分的配置中都是非常有用的, 因此这一节并不以系统自带的样例作为基础。 IPFW 的无状态规则语法, 是由一种提供复杂的选择能力的技术支持的, 这种技术远远超出了一般的防火墙安装人员的知识水平。 IPFW 是为满足专业用户, 以及掌握先进技术的电脑爱好者们对于高级的包选择需求而设计的。 要完全释放 IPFW 的规则所拥有的强大能力, 需要对不同的协议的细节有深入的了解, 并根据它们独特的包头信息来编写规则。 这一级别的详细阐述超出了这本手册的范围。 IPFW 由七个部分组成, 其主要组件是内核的防火墙过滤规则处理器, 及其集成的数据包记帐工具、 日志工具、 用以触发 NAT 工具的 'divert' (转发) 规则、 高级特殊用途工具、 dummynet 流量整形机制, 'fwd rule' 转发工具, 桥接工具, 以及 ipstealth 工具。 启用 IPFW IPFW 启用 IPFW 是基本的 &os; 安装的一部分, 以单独的可加载内核模块的形式提供。 如果在 rc.conf 中加入 firewall_enable="YES" 语句, 就会自动地加载对应的内核模块。 除非您打算使用由它提供的 NAT 功能, 一般情况下并不需要把 IPFW 编进 &os; 的内核。 如果将 firewall_enable="YES" 加入到 rc.conf 中并重新启动系统, 则下列信息将在启动过程中, 以高亮的白色显示出来: ipfw2 initialized, divert disabled, rule-based forwarding disabled, default to deny, logging disabled 可加载内核模块在编译时加入了记录日志的能力。 要启用日志功能, 并配置详细日志记录的限制, 需要在 /etc/sysctl.conf 中加入一些配置。 这些设置将在重新启动之后生效: net.inet.ip.fw.verbose=1 net.inet.ip.fw.verbose_limit=5 内核选项 内核选项 IPFIREWALL 内核选项 IPFIREWALL_VERBOSE 内核选项 IPFIREWALL_VERBOSE_LIMIT IPFW 内核选项 把下列选项在编译 &os; 内核时就加入, 并不是启用 IPFW 所必需的, 除非您需要使用 NAT 功能。 这里只是将这些选项作为背景知识来介绍。 options IPFIREWALL 这个选项将 IPFW 作为内核的一部分来启用。 options IPFIREWALL_VERBOSE 这个选项将启用记录通过 IPFW 的匹配了包含 'log' 关键字规则的每一个包的功能。 options IPFIREWALL_VERBOSE_LIMIT=5 以每项的方式, 限制通过 &man.syslogd.8; 记录的包的个数。 如果在比较恶劣的环境下记录防火墙的活动可能会需要这个选项。 它能够避免潜在的针对 syslog 的洪水式拒绝服务攻击。 内核选项 IPFIREWALL_DEFAULT_TO_ACCEPT options IPFIREWALL_DEFAULT_TO_ACCEPT 这个选项默认地允许所有的包通过防火墙, 如果您是第一次配置防火墙, 使用这个选项将是一个不错的主意。 options IPV6FIREWALL options IPV6FIREWALL_VERBOSE options IPV6FIREWALL_VERBOSE_LIMIT options IPV6FIREWALL_DEFAULT_TO_ACCEPT 这些选项与 IPv4 的对应选项功能一样, 它们是针对 IPv6 的。 如果不使用 IPv6, 则不带任何规则的 IPV6FIREWALL 将阻止所有的 IPv6 包。 内核选项 IPDIVERT options IPDIVERT 这一选项启用 NAT 功能。 如果内核选项中没有加入 IPFIREWALL_DEFAULT_TO_ACCEPT, 或将您的防火墙设置配置为允许所有的进入包, 则所有发到本机或发出的包都会被阻止。 <filename>/etc/rc.conf</filename> Options - 如果没有将 IPFW 编入内核, 则您需要在 - /etc/rc.conf 中加入下列语句来加载它: + 启用防火墙: firewall_enable="YES" 要选择由 &os; 提供的几种防火墙类型中的一种来作为默认配置, 您需要阅读 /etc/rc.firewall 文件并选出合适的类型, 然后在 /etc/rc.conf 中加入类似下面的配置: firewall_type="open" 您还可以指定下列配置规则之一: open — 允许所有流量通过。 client — 只保护本机。 simple — 保护整个网络。 closed — 完全禁止除回环设备之外的全部 IP 流量。 UNKNOWN — 禁止加载防火墙规则。 filename — 到防火墙规则文件的绝对路径。 有两种加载自定义 ipfw 防火墙规则的方法。 其一是将变量 firewall_type 设为包含不带 &man.ipfw.8; 命令行选项的 防火墙规则 文件的完整路径。 下面是一个简单的规则集例子: add block in all add block out all 除此之外, 也可以将 firewall_script 变量设为包含 ipfw 命令的可执行脚本, 这样这个脚本会在启动时自动执行。 与前面规则集文件等价的规则脚本如下: #!/bin/sh ipfw -q flush ipfw add block in all ipfw add block out all 如果 firewall_type 设为 clientsimple, 则还应查看在 /etc/rc.firewall 中的默认规则, 以确认它们与所在机器的配置相一致。 此外, 请注意这一章中的例子均假定 firewall_script/etc/ipfw.rules 启用日志: firewall_logging="YES" 设置 firewall_logging 的唯一作用是, 系统将把 net.inet.ip.fw.verbose sysctl 变量置为 1 (参见 )。 并没有能够设置日志限制的 rc.conf 变量, 不过这种限制可以通过设置某些 sysctl 变量来完成, 可以手工进行操作, 也可以写到 /etc/sysctl.conf 文件中: net.inet.ip.fw.verbose_limit=5 如果您的计算机是作为网关使用的, 也就是它通过 &man.natd.8; 提供网络地址翻译 (NAT), 请参见 以了解需要在 /etc/rc.conf 中配置的选项。 IPFW 命令 ipfw ipfw 命令是在防火墙运行时, 用于在其内部规则表中手工逐条添加或删除防火墙规则的标准工具。 这一方法的问题在于, 一旦您的关闭计算机或停机, 则所有增加或删除或修改的规则也就丢掉了。 把所有的规则都写到一个文件中, 并在启动时使用这个文件来加载规则, 或一次大批量地替换防火墙规则, 那么推荐使用这里介绍的方法。 ipfw 的另一个非常实用的功能是将所有正在运行的防火墙规则显示出来。 IPFW 的记账机制会为每一个规则动态地创建计数器, 用以记录与它们匹配的包的数量。 在测试规则的过程中, 列出规则及其计数器是了解它们是否工作正常的重要手段。 按顺序列出所有的规则: &prompt.root; ipfw list 列出所有的规则, 同时给出最后一次匹配的时间戳: &prompt.root; ipfw -t list 列出所有的记账信息、 匹配规则的包的数量, 以及规则本身。 第一列是规则的编号, 随后是发出包匹配的数量, 进入包的匹配数量, 最后是规则本身。 &prompt.root; ipfw -a list 列出所有的动态规则和静态规则: &prompt.root; ipfw -d list 同时显示已过期的动态规则: &prompt.root; ipfw -d -e list 将计数器清零: &prompt.root; ipfw zero 只把规则号为 NUM 的计数器清零: &prompt.root; ipfw zero NUM IPFW 规则集 规则集是一组根据包中选择的数值使用 allow 或 deny 写出的 ipfw 规则。 在两个主机之前的双向包交换组成了一次会话交互。 防火墙规则集, 会对同一个包处理两次: 第一次是包从公网上到达防火墙时, 而第二次则是包返回 Internet 公网上的主机时。 每一个 TCP/IP 服务 (例如 telnet, www, mail, 等等), 都有事先定义好的协议, 以及一个端口号。 这可以作为建立允许或阻止规则时的基本选择依据。 IPFW 规则处理顺序 当有数据包进入防火墙时, 会从规则集里的第一个规则开始进行比较, 并自顶向下地进行匹配。 当包与某个选择规则参数相匹配时, 将会执行规则所定义的动作, 并停止规则集搜索。 这种策略, 通常也被称作 最先匹配者获胜 的搜索方法。 如果没有任何与包相匹配的规则, 那么它就会根据强制的 ipfw 默认规则, 也就是 65535 号规则截获。 一般情况下这个规则是阻止包, 而且不给出任何回应。 如果规则定义的动作是 countskiptotee 规则的话, 搜索会继续。 这里所介绍的规则, 都是使用了那些包含状态功能的, 也就是 'keep state'、 'limit'、 'in'/'out'、 或者 'via' 选项的规则。 这是编写包容式防火墙规则集所需的基本框架。 包容式防火墙只允许与规则匹配的包通过。 这样, 您就既能够控制来自防火墙后面的机器请求 Internet 公网上的那些服务, 同时也可以控制来自 Internet 的请求能够访问内部网上的哪些服务。 所有其它的访问请求都会被阻止, 并记录下来。 包容式防火墙一般而言要远比排斥式的要安全, 而且也只需要定义允许哪些访问通过。 在操作防火墙规则时应谨慎行事, 如果操作不当, 有可能将自己反锁在外面。 规则语法 IPFW 规则语法 这里所介绍的规则语法已经经过了简化, 只包括了建立标准的包容式防火墙规则集所必需的那些。 要了解完整的规则语法说明, 请参见 &man.ipfw.8; 联机手册。 规则是由关键字组成的: 这些关键字必须以特定的顺序从左到右书写。 下面的介绍中, 关键字使用粗体表示。 某些关键字还包括了子选项, 这些自选向本身可能也是关键字, 有些还可以包含更多的子选项。 # 用于表示开始一段注释。 它可以出现在一个规则的后面, 也可以独占一行。 空行会被忽略。 CMD RULE_NUMBER ACTION LOGGING SELECTION STATEFUL CMD 每一个新的规则都应以 add 作为前缀, 它表示将规则加入内部表。 RULE_NUMBER 每一个规则都必须包含一个规则编号。 ACTION 每一个规则可以与下列的动作之一相关联, 所指定的动作将在进入的数据包与规则所指定的选择标准相匹配时执行。 allow | accept | pass | permit 这些关键字都表示允许匹配规则的包通过防火墙, 并停止继续搜索规则。 check-state 根据动态规则表检查数据包。 如果匹配, 则执行规则所指定的动作, 亦即生成动态规则; 否则, 转移到下一个规则。 check-state 规则没有选择标准。 如果规则集中没有 check-state 规则, 则会在第一个 keep-state 或 limit 规则处, 对动态规则表实施检查。 deny | drop 这两个关键字都表示丢弃匹配规则的包。 同时, 停止继续搜索规则。 LOGGING log or logamount 当数据包与带 log 关键字的规则匹配时, 将通过名为 SECURITY 的 facility 来把消息记录到 syslogd。 只有在记录的次数没有超过 logamount 参数所指定的次数时, 才会记录日志。 如果没有指定 logamount, 则会以 sysctl 变量 net.inet.ip.fw.verbose_limit 所指定的限制为准。 如果将这两种限制值之一指定为零, 则表示不作限制。 万一达到了限制数, 可以通过将规则的日志计数或包计数清零来重新启用日志, 请参见 ipfw reset log 命令来了解细节。 日志是在所有其他匹配条件都验证成功之后, 在针对包实施最终动作 (accept, deny) 之前进行的。 您可以自行决定哪些规则应启用日志。 SELECTION 这一节所介绍的关键字主要用来描述检查包的哪些属性, 用以判断包是否与规则相匹配。 下面是一些通用的用于匹配包特征的属性, 它们必须按顺序使用: udp | tcp | icmp 也可以指定在 /etc/protocols 中所定义的协议。 这个值定义的是匹配的协议, 在规则中必须指定它。 from src to dst from 和 to 关键字用于匹配 IP 地址。 规则中必须同时指定源和目的两个参数。 如果需要匹配任意 IP 地址, 可以使用特殊关键字 any。 还有一个特殊关键字, 即 me, 用于匹配您的 &os; 系统上所有网络接口上所配置的 IP 地址, 它可以用于表达网络上的其他计算机到防火墙 (也就是本机), 例如 'from me to any' 或 'from any to me' 或 'from 0.0.0.0/0 to any' 或 'from any to 0.0.0.0/0' 或 'from 0.0.0.0 to any' 或 'from any to 0.0.0.0' 以及 'from me to 0.0.0.0'。 IP 地址可以通过 带点的 IP 地址/掩码长度, 或者一个带点的 IP 地址的形式来指定。 这是编写规则时所必需的。 如果不清楚如何写掩码长度, 请参见 port number 这个参数主要用于那些支持端口号的协议 (例如 TCP 和 UDP)。 如果要通过端口号匹配某个协议, 就必须指定这个参数。 此外, 也可以通过服务的名字 (根据 /etc/services) 来指定服务, 这样会比使用数字指定端口号直观一些。 in | out 相应地, 匹配进入和发出的包。 这里的 in 和 out 都是关键字, 在编写匹配规则时, 必需作为其他条件的一部分来使用。 via IF 根据指定的网络接口的名称精确地匹配进出的包。 这里的 via 关键字将使得接口名称成为匹配过程的一部分。 setup 要匹配 TCP 会话的发起请求, 就必须使用它。 keep-state 这是一个必须使用的关键字。 在发生匹配时, 防火墙将创建一个动态规则, 其默认行为是, 匹配使用同一协议的、从源到目的 IP/端口 的双向网络流量。 limit {src-addr | src-port | dst-addr | dst-port} 防火墙只允许匹配规则时, 与指定的参数相同的 N 个连接。 可以指定至少一个源或目的地址及端口。 'limit' 和 'keep-state' 不能在同一规则中同时使用。 'limit' 提供了与 'keep-state' 相同的功能, 并增加了一些独有的能力。 状态规则选项 IPFW 带状态过滤 有状态过滤将网络流量当作一种双向的包交换来处理。 它提供了一种额外的检查能力, 用以检测会话中的包是否来自最初的发送者, 并在遵循双向包交换的规则进行会话。 如果包与这些规则不符, 则将自动地拒绝它们。 'check-state' 用来识别在 IPFW 规则集中的包是否符合动态规则机制的规则。 如果匹配, 则允许包通过, 此时防火墙将创建一个新的动态规则来匹配双向交换中的下一个包。 如果不匹配, 则将继续尝试规则集中的下一个规则。 动态规则机制在 SYN-flood 攻击下是脆弱的, 因为这种情况会产生大量的动态规则, 从而耗尽资源。 为了抵抗这种攻击, 从 &os; 中加入了一个叫做 limit 的新选项。 这个选项可以用来限制符合规则的会话允许的并发连接数。 如果动态规则表中的规则数超过限制, 则包将被丢弃。 记录防火墙消息 IPFW 记录日志 记录日志的好处是显而易见的: 它提供了在事后检查所发生的状况的方法, 例如哪些包被丢弃了, 这些包的来源和目的地, 从而为您提供找到攻击者所需的证据。 即使启用了日志机制, IPFW 也不会自行生成任何规则的日志。 防火墙管理员需要指定规则集中的哪些规则应该记录日志, 并在这些规则上增加 log 动作。 一般来说, 只有 deny 规则应记录日志, 例如对于进入的 ICMP ping 的 deny 规则。 另外, 复制默认的 ipfw 终极 deny 规则, 并加入 log 动作来作为您的规则集的最后一条规则也是很常见的用法。 这样, 您就能看到没有匹配任何一条规则的那些数据包。 日志是一把双刃剑, 如果不谨慎地加以利用, 则可能会陷入过多的日志数据中, 并导致磁盘被日志塞满。 将磁盘填满是 DoS 攻击最为老套的手法之一。 由于日志除了会写入磁盘之外, 还会输出到 root 的控制台屏幕上, 因此有过多的日志信息是很让人恼火的事情。 IPFIREWALL_VERBOSE_LIMIT=5 内核选项将限制同一个规则发到系统日志程序 syslogd 的连续消息的数量。 当内核启用了这个选项时, 某一特定规则所产生的连续消息的数量将封顶为这个数字。 一般来说, 没有办法从连续 200 条一模一样的日志信息中获取更多有用的信息。 举例来说, 如果同一个规则产生了 5 次消息并被记录到 syslogd, 余下的相同的消息将被计数, 并像下面这样发给 syslogd: last message repeated 45 times 所有记录的数据包包消息, 默认情况下会最终写到 /var/log/security 文件中, 后者在 /etc/syslog.conf 文件里进行了定义。 编写规则脚本 绝大多数有经验的 IPFW 用户会创建一个包含规则的文件, 并且, 按能够以脚本形式运行的方式来书写。 这样做最大的一个好处是, 可以大批量地刷新防火墙规则, 而无须重新启动系统就能够激活它们。 这种方法在测试新规则时会非常方便, 因为同一过程在需要时可以多次执行。 作为脚本, 您可以使用符号替换来撰写那些经常需要使用的值, 并用同一个符号在多个规则中反复地表达它。 下面将给出一个例子。 这个脚本使用的语法同 'sh'、 'csh' 以及 'tcsh' 脚本兼容。 符号替换字段使用美元符号 $ 作为前缀。 符号字段本身并不使用 $ 前缀。 符号替换字段的值必须使用 "双引号" 括起来。 可以使用类似下面的规则文件: ############### start of example ipfw rules script ############# # ipfw -q -f flush # Delete all rules # Set defaults oif="tun0" # out interface odns="192.0.2.11" # ISP's DNS server IP address cmd="ipfw -q add " # build rule prefix ks="keep-state" # just too lazy to key this each time $cmd 00500 check-state $cmd 00502 deny all from any to any frag $cmd 00501 deny tcp from any to any established $cmd 00600 allow tcp from any to any 80 out via $oif setup $ks $cmd 00610 allow tcp from any to $odns 53 out via $oif setup $ks $cmd 00611 allow udp from any to $odns 53 out via $oif $ks ################### End of example ipfw rules script ############ 这就是所要做的全部事情了。 例子中的规则并不重要, 它们主要是用来表示如何使用符号替换。 如果把上面的例子保存到 /etc/ipfw.rules 文件中, 您就可以通过输入下面的命令来加载它。 &prompt.root; sh /etc/ipfw.rules /etc/ipfw.rules 这个文件可以放到任何位置, 也可以命名为随便什么别的名字。 也可以手工执行下面的命令来达到类似的目的: &prompt.root; ipfw -q -f flush &prompt.root; ipfw -q add check-state &prompt.root; ipfw -q add deny all from any to any frag &prompt.root; ipfw -q add deny tcp from any to any established &prompt.root; ipfw -q add allow tcp from any to any 80 out via tun0 setup keep-state &prompt.root; ipfw -q add allow tcp from any to 192.0.2.11 53 out via tun0 setup keep-state &prompt.root; ipfw -q add 00611 allow udp from any to 192.0.2.11 53 out via tun0 keep-state 带状态规则集 以下的这组非-NAT 规则集, 是如何编写非常安全的 '包容式' 防火墙的一个例子。 包容式防火墙只允许匹配了 pass 规则的包通过, 而默认阻止所有的其他数据包。 必须有至少两个网络接口, 并且在其上配置了规则才能使防火墙正常工作。 所有类 &unix; 操作系统, 也包括 &os;, 都设计为允许使用网络接口 lo0 和 IP 地址 127.0.0.1 来完成操作系统内部的通讯。 防火墙必须包含一组规则, 使这些数据包能够无障碍地收发。 接入 Internet 公网的那个网络接口上, 应该配置授权和访问控制, 来限制对外的访问, 以及来自 Internet 公网的访问。 这个接口很可能是您的 ppp 接口, 例如 tun0, 或者您接在 DSL 或电缆 modem 上的网卡。 如果有至少一个网卡接入了防火墙后的内网 LAN, 则必须为这些接口配置规则, 以便让这些接口之间的包能够顺畅地通过。 所有的规则应被组织为三个部分, 所有应无阻碍地通过的规则, 公网的发出规则, 以及公网的接收规则。 公网接口相关的规则的顺序, 应该是最经常用到的放在尽可能靠前的位置, 而最后一个规则, 则应该是阻止那个接口在那一方向上的包。 发出部分的规则只包含一些 'allow' 规则, 允许选定的那些唯一区分协议的端口号所指定的协议通过, 以允许访问 Internet 公网上的这些服务。 所有的规则中都指定了 proto, port, in/out, via 以及 keep state 这些选项。 'proto tcp' 规则同时指定 'setup' 选项, 来区分开始协议会话的包, 以触发将包放入 keep state 规则表中的动作。 接收部分则首先阻止所有不希望的包, 在这里有两个目的。 首先是, 这些包被禁止掉之后, 就不会由于匹配了后面的某个规则而被允许。 其次, 明确地禁止这些包, 就不会再在日志中记录它们而形成干扰。 防火墙的最后一条规则是阻止并记录所有包, 这样, 您就可以留下用于起诉攻击您的系统的人的有用记录。 另一件需要注意的事情是, 不希望的数据包一般来说不会有任何响应, 这些数据包会被丢弃并消失。 这样, 攻击者也就无法了解他的数据包是否到达了您的系统。 而攻击者了解的信息越少, 它们攻陷系统所需的时间也就越长。 当记录的包使用的端口号不是您所熟悉的那些时, 可以看一看 /etc/services/ 或到 并查找一下端口号, 以了解其用途。 另外, 您也可以在这个网页上了解常见木马所使用的端口: 包容式规则集的例子 下面是一个非-NAT 的规则集, 它是一个完整的包容式规则集。 使用它作为您的规则集不会有什么问题。 只需把那些不需要的服务对应的 pass 规则注释掉就可以了。 如果您在日志中看到消息, 而且不想再看到它们, 只需在接收部分增加一个一个 deny 规则。 您可能需要把 'dc0' 改为接入公网的接口的名字。 对于使用用户态 ppp 的用户而言, 应该是 'tun0'。 您可以看出这些规则中的模式。 所有请求 Internet 公网上服务的会话开始包, 都使用了 keep-state。 所有来自 Internet 的授权服务请求, 都采用了 limit 选项来防止洪水式攻击。 所有的规则都使用了 in 或者 out 来说明方向。 所有的规则都使用了 via 接口名来指定应该匹配通过哪一个接口的包。 这些规则都应放到 /etc/ipfw.rules ################ Start of IPFW rules file ############################### # Flush out the list before we begin. ipfw -q -f flush # Set rules command prefix cmd="ipfw -q add" pif="dc0" # public interface name of NIC # facing the public Internet ################################################################# # No restrictions on Inside LAN Interface for private network # Not needed unless you have LAN. # Change xl0 to your LAN NIC interface name ################################################################# #$cmd 00005 allow all from any to any via xl0 ################################################################# # No restrictions on Loopback Interface ################################################################# $cmd 00010 allow all from any to any via lo0 ################################################################# # Allow the packet through if it has previous been added to the # the "dynamic" rules table by a allow keep-state statement. ################################################################# $cmd 00015 check-state ################################################################# # Interface facing Public Internet (Outbound Section) # Interrogate session start requests originating from behind the # firewall on the private network or from this gateway server # destine for the public Internet. ################################################################# # Allow out access to my ISP's Domain name server. # x.x.x.x must be the IP address of your ISP.s DNS # Dup these lines if your ISP has more than one DNS server # Get the IP addresses from /etc/resolv.conf file $cmd 00110 allow tcp from any to x.x.x.x 53 out via $pif setup keep-state $cmd 00111 allow udp from any to x.x.x.x 53 out via $pif keep-state # Allow out access to my ISP's DHCP server for cable/DSL configurations. # This rule is not needed for .user ppp. connection to the public Internet. # so you can delete this whole group. # Use the following rule and check log for IP address. # Then put IP address in commented out rule & delete first rule $cmd 00120 allow log udp from any to any 67 out via $pif keep-state #$cmd 00120 allow udp from any to x.x.x.x 67 out via $pif keep-state # Allow out non-secure standard www function $cmd 00200 allow tcp from any to any 80 out via $pif setup keep-state # Allow out secure www function https over TLS SSL $cmd 00220 allow tcp from any to any 443 out via $pif setup keep-state # Allow out send & get email function $cmd 00230 allow tcp from any to any 25 out via $pif setup keep-state $cmd 00231 allow tcp from any to any 110 out via $pif setup keep-state # Allow out FBSD (make install & CVSUP) functions # Basically give user root "GOD" privileges. $cmd 00240 allow tcp from me to any out via $pif setup keep-state uid root # Allow out ping $cmd 00250 allow icmp from any to any out via $pif keep-state # Allow out Time $cmd 00260 allow tcp from any to any 37 out via $pif setup keep-state # Allow out nntp news (i.e. news groups) $cmd 00270 allow tcp from any to any 119 out via $pif setup keep-state # Allow out secure FTP, Telnet, and SCP # This function is using SSH (secure shell) $cmd 00280 allow tcp from any to any 22 out via $pif setup keep-state # Allow out whois $cmd 00290 allow tcp from any to any 43 out via $pif setup keep-state # deny and log everything else that.s trying to get out. # This rule enforces the block all by default logic. $cmd 00299 deny log all from any to any out via $pif ################################################################# # Interface facing Public Internet (Inbound Section) # Interrogate packets originating from the public Internet # destine for this gateway server or the private network. ################################################################# # Deny all inbound traffic from non-routable reserved address spaces $cmd 00300 deny all from 192.168.0.0/16 to any in via $pif #RFC 1918 private IP $cmd 00301 deny all from 172.16.0.0/12 to any in via $pif #RFC 1918 private IP $cmd 00302 deny all from 10.0.0.0/8 to any in via $pif #RFC 1918 private IP $cmd 00303 deny all from 127.0.0.0/8 to any in via $pif #loopback $cmd 00304 deny all from 0.0.0.0/8 to any in via $pif #loopback $cmd 00305 deny all from 169.254.0.0/16 to any in via $pif #DHCP auto-config $cmd 00306 deny all from 192.0.2.0/24 to any in via $pif #reserved for docs $cmd 00307 deny all from 204.152.64.0/23 to any in via $pif #Sun cluster interconnect $cmd 00308 deny all from 224.0.0.0/3 to any in via $pif #Class D & E multicast # Deny public pings $cmd 00310 deny icmp from any to any in via $pif # Deny ident $cmd 00315 deny tcp from any to any 113 in via $pif # Deny all Netbios service. 137=name, 138=datagram, 139=session # Netbios is MS/Windows sharing services. # Block MS/Windows hosts2 name server requests 81 $cmd 00320 deny tcp from any to any 137 in via $pif $cmd 00321 deny tcp from any to any 138 in via $pif $cmd 00322 deny tcp from any to any 139 in via $pif $cmd 00323 deny tcp from any to any 81 in via $pif # Deny any late arriving packets $cmd 00330 deny all from any to any frag in via $pif # Deny ACK packets that did not match the dynamic rule table $cmd 00332 deny tcp from any to any established in via $pif # Allow traffic in from ISP's DHCP server. This rule must contain # the IP address of your ISP.s DHCP server as it.s the only # authorized source to send this packet type. # Only necessary for cable or DSL configurations. # This rule is not needed for .user ppp. type connection to # the public Internet. This is the same IP address you captured # and used in the outbound section. #$cmd 00360 allow udp from any to x.x.x.x 67 in via $pif keep-state # Allow in standard www function because I have apache server $cmd 00400 allow tcp from any to me 80 in via $pif setup limit src-addr 2 # Allow in secure FTP, Telnet, and SCP from public Internet $cmd 00410 allow tcp from any to me 22 in via $pif setup limit src-addr 2 # Allow in non-secure Telnet session from public Internet # labeled non-secure because ID & PW are passed over public # Internet as clear text. # Delete this sample group if you do not have telnet server enabled. $cmd 00420 allow tcp from any to me 23 in via $pif setup limit src-addr 2 # Reject & Log all incoming connections from the outside $cmd 00499 deny log all from any to any in via $pif # Everything else is denied by default # deny and log all packets that fell through to see what they are $cmd 00999 deny log all from any to any ################ End of IPFW rules file ############################### 一个 <acronym>NAT</acronym> 和带状态规则集的例子 NAT 以及 IPFW 要使用 IPFW 的 NAT 功能, 还需要进行一些额外的配置。 除了其他 IPFIREWALL 语句之外, 还需要在内核编译配置中加上 'option divert' 语句。 /etc/rc.conf 中, 除了普通的 IPFW 配置之外, 还需要加入: natd_enable="YES" # Enable NATD function natd_interface="rl0" # interface name of public Internet NIC natd_flags="-dynamic -m" # -m = preserve port numbers if possible 将带状态规则与转发 natd 规则 (网络地址转换) 会使规则集的编写变得非常复杂。 check-state 的位置, 以及 'divert natd' 规则将变得非常关键。 这样一来, 就不再有简单的顺序处理逻辑流程了。 提供了一种新的动作类型, 称为 'skipto'。 要使用 skipto 命令, 就必须给每一个规则进行编号, 以确定 skipto 规则号是您希望跳转到的位置。 下面给出了一些未加注释的例子来说明如何编写这样的规则, 用以帮助您理解包处理规则集的处理顺序。 处理流程从规则文件最上边的第一个规则开始处理, 并自顶向下地尝试每一个规则, 直到找到匹配的规则, 且数据包从防火墙中放出为止。 请注意规则号 100 101, 450, 500, 以及 510 的位置非常重要。 这些规则控制发出和接收的包的地址转换过程, 这样它们在 keep-state 动态表中的对应项中就能够与内网的 LAN IP 地址关联。 另一个需要注意的是, 所有的 allow 和 deny 规则都指定了包的方向 (也就是 outbound 或 inbound) 以及网络接口。 最后, 请注意所有发出的会话请求都会请求 skipto rule 500 以完成网络地址转换。 下面以 LAN 用户使用 web 浏览器访问一个 web 页面为例。 Web 页面使用 80 来完成通讯。 当包进入防火墙时, 规则 100 并不匹配, 因为它是发出而不是收到的包。 它能够通过规则 101, 因为这是第一个包, 因而它还没有进入动态状态保持表。 包最终到达规则 125, 并匹配该规则。 最终, 它会通过接入 Internet 公网的网卡发出。 这之前, 包的源地址仍然是内网 IP 地址。 一旦匹配这个规则, 就会触发两个动作。 keep-state 选项会把这个规则发到 keep-state 动态规则表中, 并执行所指定的动作。 动作是发到规则表中的信息的一部分。 在这个例子中, 这个动作是 "skipto rule 500"。 规则 500 NAT 包的 IP 地址, 并将其发出。 请务必牢记, 这一步非常重要。 接下来, 数据包将到达目的地, 之后返回并从规则集的第一条规则开始处理。 这一次, 它将与规则 100 匹配, 其目的 IP 地址将被映射回对应的内网 LAN IP 地址。 其后, 它会被 check-state 规则处理, 进而在暨存会话表中找到对应项, 并发到 LAN。 数据包接下来发到了内网 LAN PC 上, 而后者则会发送从远程服务器请求下一段数据的新数据包。 这个包会再次由 check-state 规则检查, 并找到发出的表项, 并执行其关联的动作, 即 'skipto 500'。 包跳转到规则 500 并被 NAT 后发出。 在接收一侧, 已经存在的会话的数据包, 会被 check-state 规则自动地处理, 并放到转发 natd 规则。 我们需要解决的问题是, 阻止所有的坏数据包, 而只允许授权的服务。 例如在防火墙上运行了 Apache 服务, 而我们希望人们在访问 Internet 公网的同时, 也能够访问本地的 web 站点。 新的接入开始请求包将匹配规则 100, 而 IP 地址则为防火墙所在的服务器而映射到了 LAN IP。 此后, 包会匹配所有我们希望检查的那些令人生厌的东西, 并最终匹配规则 425。 一旦发生匹配, 会发生两件事。 数据包会被发到 keep-state 动态表, 但此时, 所有来自那个源 IP 的会话请求的数量会被限制为 2。 这一做法能够挫败针对指定端口上服务的 DoS 攻击。 动作同时指定了包应被发到 LAN 上。 包返回时, check-state 规则会识别出包属于某一已经存在的会话交互, 并直接把它发到规则 500 做 NAT, 并发到发出接口。 示范规则集 #1: #!/bin/sh cmd="ipfw -q add" skip="skipto 500" pif=rl0 ks="keep-state" good_tcpo="22,25,37,43,53,80,443,110,119" ipfw -q -f flush $cmd 002 allow all from any to any via xl0 # exclude LAN traffic $cmd 003 allow all from any to any via lo0 # exclude loopback traffic $cmd 100 divert natd ip from any to any in via $pif $cmd 101 check-state # Authorized outbound packets $cmd 120 $skip udp from any to xx.168.240.2 53 out via $pif $ks $cmd 121 $skip udp from any to xx.168.240.5 53 out via $pif $ks $cmd 125 $skip tcp from any to any $good_tcpo out via $pif setup $ks $cmd 130 $skip icmp from any to any out via $pif $ks $cmd 135 $skip udp from any to any 123 out via $pif $ks # Deny all inbound traffic from non-routable reserved address spaces $cmd 300 deny all from 192.168.0.0/16 to any in via $pif #RFC 1918 private IP $cmd 301 deny all from 172.16.0.0/12 to any in via $pif #RFC 1918 private IP $cmd 302 deny all from 10.0.0.0/8 to any in via $pif #RFC 1918 private IP $cmd 303 deny all from 127.0.0.0/8 to any in via $pif #loopback $cmd 304 deny all from 0.0.0.0/8 to any in via $pif #loopback $cmd 305 deny all from 169.254.0.0/16 to any in via $pif #DHCP auto-config $cmd 306 deny all from 192.0.2.0/24 to any in via $pif #reserved for docs $cmd 307 deny all from 204.152.64.0/23 to any in via $pif #Sun cluster $cmd 308 deny all from 224.0.0.0/3 to any in via $pif #Class D & E multicast # Authorized inbound packets $cmd 400 allow udp from xx.70.207.54 to any 68 in $ks $cmd 420 allow tcp from any to me 80 in via $pif setup limit src-addr 1 $cmd 450 deny log ip from any to any # This is skipto location for outbound stateful rules $cmd 500 divert natd ip from any to any out via $pif $cmd 510 allow ip from any to any ######################## end of rules ################## 下面的这个规则集基本上和上面一样, 但使用了易于读懂的编写方式, 并给出了相当多的注解, 以帮助经验较少的 IPFW 规则编写者更好地理解这些规则到底在做什么。 示范规则集 #2: #!/bin/sh ################ Start of IPFW rules file ############################### # Flush out the list before we begin. ipfw -q -f flush # Set rules command prefix cmd="ipfw -q add" skip="skipto 800" pif="rl0" # public interface name of NIC # facing the public Internet ################################################################# # No restrictions on Inside LAN Interface for private network # Change xl0 to your LAN NIC interface name ################################################################# $cmd 005 allow all from any to any via xl0 ################################################################# # No restrictions on Loopback Interface ################################################################# $cmd 010 allow all from any to any via lo0 ################################################################# # check if packet is inbound and nat address if it is ################################################################# $cmd 014 divert natd ip from any to any in via $pif ################################################################# # Allow the packet through if it has previous been added to the # the "dynamic" rules table by a allow keep-state statement. ################################################################# $cmd 015 check-state ################################################################# # Interface facing Public Internet (Outbound Section) # Interrogate session start requests originating from behind the # firewall on the private network or from this gateway server # destine for the public Internet. ################################################################# # Allow out access to my ISP's Domain name server. # x.x.x.x must be the IP address of your ISP's DNS # Dup these lines if your ISP has more than one DNS server # Get the IP addresses from /etc/resolv.conf file $cmd 020 $skip tcp from any to x.x.x.x 53 out via $pif setup keep-state # Allow out access to my ISP's DHCP server for cable/DSL configurations. $cmd 030 $skip udp from any to x.x.x.x 67 out via $pif keep-state # Allow out non-secure standard www function $cmd 040 $skip tcp from any to any 80 out via $pif setup keep-state # Allow out secure www function https over TLS SSL $cmd 050 $skip tcp from any to any 443 out via $pif setup keep-state # Allow out send & get email function $cmd 060 $skip tcp from any to any 25 out via $pif setup keep-state $cmd 061 $skip tcp from any to any 110 out via $pif setup keep-state # Allow out FreeBSD (make install & CVSUP) functions # Basically give user root "GOD" privileges. $cmd 070 $skip tcp from me to any out via $pif setup keep-state uid root # Allow out ping $cmd 080 $skip icmp from any to any out via $pif keep-state # Allow out Time $cmd 090 $skip tcp from any to any 37 out via $pif setup keep-state # Allow out nntp news (i.e. news groups) $cmd 100 $skip tcp from any to any 119 out via $pif setup keep-state # Allow out secure FTP, Telnet, and SCP # This function is using SSH (secure shell) $cmd 110 $skip tcp from any to any 22 out via $pif setup keep-state # Allow out whois $cmd 120 $skip tcp from any to any 43 out via $pif setup keep-state # Allow ntp time server $cmd 130 $skip udp from any to any 123 out via $pif keep-state ################################################################# # Interface facing Public Internet (Inbound Section) # Interrogate packets originating from the public Internet # destine for this gateway server or the private network. ################################################################# # Deny all inbound traffic from non-routable reserved address spaces $cmd 300 deny all from 192.168.0.0/16 to any in via $pif #RFC 1918 private IP $cmd 301 deny all from 172.16.0.0/12 to any in via $pif #RFC 1918 private IP $cmd 302 deny all from 10.0.0.0/8 to any in via $pif #RFC 1918 private IP $cmd 303 deny all from 127.0.0.0/8 to any in via $pif #loopback $cmd 304 deny all from 0.0.0.0/8 to any in via $pif #loopback $cmd 305 deny all from 169.254.0.0/16 to any in via $pif #DHCP auto-config $cmd 306 deny all from 192.0.2.0/24 to any in via $pif #reserved for docs $cmd 307 deny all from 204.152.64.0/23 to any in via $pif #Sun cluster $cmd 308 deny all from 224.0.0.0/3 to any in via $pif #Class D & E multicast # Deny ident $cmd 315 deny tcp from any to any 113 in via $pif # Deny all Netbios service. 137=name, 138=datagram, 139=session # Netbios is MS/Windows sharing services. # Block MS/Windows hosts2 name server requests 81 $cmd 320 deny tcp from any to any 137 in via $pif $cmd 321 deny tcp from any to any 138 in via $pif $cmd 322 deny tcp from any to any 139 in via $pif $cmd 323 deny tcp from any to any 81 in via $pif # Deny any late arriving packets $cmd 330 deny all from any to any frag in via $pif # Deny ACK packets that did not match the dynamic rule table $cmd 332 deny tcp from any to any established in via $pif # Allow traffic in from ISP's DHCP server. This rule must contain # the IP address of your ISP's DHCP server as it's the only # authorized source to send this packet type. # Only necessary for cable or DSL configurations. # This rule is not needed for 'user ppp' type connection to # the public Internet. This is the same IP address you captured # and used in the outbound section. $cmd 360 allow udp from x.x.x.x to any 68 in via $pif keep-state # Allow in standard www function because I have Apache server $cmd 370 allow tcp from any to me 80 in via $pif setup limit src-addr 2 # Allow in secure FTP, Telnet, and SCP from public Internet $cmd 380 allow tcp from any to me 22 in via $pif setup limit src-addr 2 # Allow in non-secure Telnet session from public Internet # labeled non-secure because ID & PW are passed over public # Internet as clear text. # Delete this sample group if you do not have telnet server enabled. $cmd 390 allow tcp from any to me 23 in via $pif setup limit src-addr 2 # Reject & Log all unauthorized incoming connections from the public Internet $cmd 400 deny log all from any to any in via $pif # Reject & Log all unauthorized out going connections to the public Internet $cmd 450 deny log all from any to any out via $pif # This is skipto location for outbound stateful rules $cmd 800 divert natd ip from any to any out via $pif $cmd 801 allow ip from any to any # Everything else is denied by default # deny and log all packets that fell through to see what they are $cmd 999 deny log all from any to any ################ End of IPFW rules file ############################### diff --git a/zh_CN.GB2312/books/handbook/geom/chapter.sgml b/zh_CN.GB2312/books/handbook/geom/chapter.sgml index ad50739fbe..98ed74168b 100644 --- a/zh_CN.GB2312/books/handbook/geom/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/geom/chapter.sgml @@ -1,436 +1,434 @@ Tom Rhodes 原作 GEOM: 模块化磁盘变换框架 概述 GEOM GEOM 磁盘框架 GEOM 本章将介绍以 &os; GEOM 框架来使用磁盘。 这包括了使用这一框架来配置的主要的 RAID 控制工具。 这一仗不会深入讨论 GEOM 如何处理或控制 I/O、 其下层的子系统或代码。 您可以从 &man.geom.4; 联机手册及其众多 SEE ALSO 参考文献中得到这些信息。 这一章也不是对 RAID 配置的权威介绍, 它只介绍由 支持GEOM 的 RAID 级别。 读完这章, 您将了解: 通过 GEOM 支持的 RAID 类型。 如何使用基本工具来配置和管理不同的 RAID 级别。 如何通过 GEOM 使用镜像、 条带、 加密和挂接在远程的磁盘设备。 如何排除挂接在 GEOM 框架上的磁盘设备的问题。 阅读这章之前, 您应: 理解 &os; 如何处理磁盘设备 ()。 了解如何配置和安装新的 &os; 内核 ()。 GEOM 介绍 GEOM 允许访问和控制类 (classes) — 主引导记录、 BSD 标签 (label), 等等 — 通过使用 provider, 或在 /dev 中的特殊文件。 它支持许多软件 RAID 配置, GEOM 能够向操作系统, 以及在其上运行的工具提供透明的访问方式。 Tom Rhodes 原作 Murray Stokely RAID0 - 条带 GEOM 条带 条带是一种将多个磁盘驱动器合并为一个卷的方法。 许多情况下, 这是通过硬件控制器来完成的。 GEOM 磁盘子系统提供了 RAID0 的软件支持, 它也成为磁盘条带。 RAID0 系统中, 数据被分为多个块, 这些块将分别写入阵列的所有磁盘。 与先前需要等待系统将 256k 数据写到一块磁盘上不同, RAID0 系统, 能够同时分别将打碎的 64k 写到四块磁盘上, 从而提供更好的 I/O 性能。 这一性能提升还能够通过使用多个磁盘控制器来进一步改进。 RAID0 条带中的每一个盘的尺寸必须一样, 因为 I/O 请求是分散到多个盘上的, 以便让这些盘上的读写并行完成。 磁盘条带图 在未格式化的 ATA 磁盘上建立条带 加载 geom_stripe 模块: - &prompt.root; kldload geom_stripe.ko + &prompt.root; kldload geom_stripe 确信存在合适的挂接点 (mount point)。 如果这个卷将成为根分区, 那么暂时把它挂接到其他位置i, 如 /mnt &prompt.root; mkdir /mnt 确定将被做成条带卷的磁盘的设备名, 并创建新的条带设备。 举例而言, - 下面的命令可以把两个未用的、 尚未分区的 ATA 磁盘: + 要将两个未用的、 尚未分区的 ATA 磁盘 /dev/ad2 和 - /dev/ad3 标记为条带卷成员。 + /dev/ad3 做成一个条带设备: &prompt.root; gstripe label -v st0 /dev/ad2 /dev/ad3 - 此外还需要用下面的命令在新卷上创建分区表: + 接着需要写标准的 label, 也就是通常所说的分区表到新卷上, + 并安装标准的引导代码: &prompt.root; bsdlabel -wB /dev/stripe/st0 上述过程将在 /dev/stripe 目录中的 st0 设备基础上建立两个新设备。 这包括 st0a 和 - st0c。 现在需要在 + st0c。 这时, 就可以在 st0a 设备上用下述 - newfs 命令来建立文件系统: + newfs 命令来建立文件系统了: &prompt.root; newfs -U /dev/stripe/st0a 在屏幕上将滚过一些数字, 整个操作应该能在数秒内完成。 现在可以挂接刚刚做好的卷了。 - 下列命令可以用来手工挂接新创建的条带盘: + 要挂接刚创建的条带盘: &prompt.root; mount /dev/stripe/st0a /mnt 要在启动过程中自动挂接这个条带上的文件系统, 需要把关于卷的信息放到 /etc/fstab 文件中: &prompt.root; echo "/dev/stripe/st0a /mnt ufs rw 2 2" \ >> /etc/fstab 此外, geom_stripe 模块也必须通过在 /boot/loader.conf 中增加下述设置, 以便在系统初始化过程中自动加载。 &prompt.root; echo 'geom_stripe_load="YES"' >> /boot/loader.conf RAID1 - 镜像 GEOM 磁盘镜像 镜像是一种许多公司和家庭用户使用的不需中断的备份技术。 当存在镜像时, 它的意思是说 磁盘B 简单地复制 磁盘A。 或者, 也可能是 磁盘C+D 复制 磁盘A+B。 无论磁盘如何配置, 共同的特征, 都是磁盘或卷的信息会被复制。 随后,在无需中断服务或访问的情况下, 可以很容易地复原和备份这些信息, 甚至把它们存储到其他更安全的地方。 要开始做这件事, 首先要确保系统中有两个同样大的磁盘驱动器, 下面的例子假定使用直接访问方式 (Direct Access, &man.da.4;) SCSI 的磁盘。 首先需要把 &os; 安装到第一块磁盘上, 并建立两个分区。 第一个分区将成为交换区, 其尺寸应该是两倍的 RAM 尺寸, 而余下的空间, 则作为根 (/) 文件系统来使用。 当然, 也可以为其他挂接点划分不同的分区; 但是, 这将使难度提高一个量级, 因为您将不得不手工修改 &man.bsdlabel.8; 和 &man.fdisk.8; 的设置。 重新启动系统, 并等待其完全初始化完。 当这个过程完成之后, 以 root 用户的身份登录。 创建 /dev/mirror/gm 设备, 并将其连接到 /dev/da1 &prompt.root; gmirror label -vnb round-robin gm0 /dev/da1 系统应会给出下列回应: Metadata value stored on /dev/da1. Done. 初始化 GEOM, 这将加载 /boot/kernel/geom_mirror.ko 内核模块: &prompt.root; gmirror load 这个命令应该会在 /dev/mirror 目录中创建 gm0 设备节点。 - 安装通用的 fdisk 标签以及引导区代码, - 到刚刚创建的 gm0 设备上: + 在刚创建的 gm0 + 设备上安装通用的 fdisk 标签以及引导区代码: &prompt.root; fdisk -vBI /dev/mirror/gm0 接下来安装通用的 bsdlabel 信息: &prompt.root; bsdlabel -wB /dev/mirror/gm0s1 如果存在多个区段 (slice) 或分区 (partition), 则需要修改一部分上面命令的参数。 它们必须与另一个盘上对应的区段和分区匹配。 - 使用 &man.newfs.8; 工具来, - 在 gm0s1a 设备节点上创建默认的文件系统: + 使用 &man.newfs.8; 工具来在 gm0s1a + 设备上建立默认的 UFS + 文件系统: &prompt.root; newfs -U /dev/mirror/gm0s1a 这将让系统输出很多信息和一系列数字。 不必为此担心, 只需看看是否有错误提示就可以了, 如果没问题, 接下来把它挂到 /mnt 挂接点上面: &prompt.root; mount /dev/mirror/gm0s1a /mnt 现在需要把所有引导盘上的数据迁移到新的文件系统上了。 下面的例子使用了 &man.dump.8; 和 &man.restore.8; 这两个命令; 不过, 用 &man.dd.1; 在这里也可以达到完全一样的目的。 &prompt.root; dump -L -0 -f- / |(cd /mnt && restore -r -v -f-) 这个操作必须在所有文件系统上都作一遍。 您可以将前述命令中的文件系统, 改为所希望的文件系统的位置。 接下来应该编辑复制出来的 /mnt/etc/fstab 文件, 并删去或注释掉交换文件 需要注意的是, 在 fstab 注释掉交换文件, 通常会需要您以其他方式重建交换空间。 请参见 以了解进一步的细节。 。 修改其他文件系统对应的信息, 以便让它们使用新盘。 参考下面的例子: # Device Mountpoint FStype Options Dump Pass# #/dev/da0s2b none swap sw 0 0 /dev/mirror/gm0s1a / ufs rw 1 1 接下来需要建一个 boot.conf 文件, 在当前和新盘的根分区上各放一份。 这个文件将 帮助 系统的 BIOS 从正确的驱动器上引导: &prompt.root; echo "1:da(1,a)/boot/loader" > /boot.config &prompt.root; echo "1:da(1,a)/boot/loader" > /mnt/boot.config 在所有的分区上都放这些是为了保证系统能够正确引导。 如果由于某种原因系统无法从新的根分区读数据, 则还有一根救命稻草。 - 接下来, 在 - /boot/loader.conf 中加入一些新的设置: + 用下面的命令来确保系统引导时会加载 geom_mirror.ko &prompt.root; echo 'geom_mirror_load="YES"' >> /mnt/boot/loader.conf - 这将让 &man.loader.8; 在系统初始化过程中自动加载 - geom_mirror.ko 模块。 - 最后重新启动系统: &prompt.root; shutdown -r now 如果一切顺利, 系统将从 gm0s1a 设备启动, 并给出 login 提示等待用户登录。 如果发生错误, 请查阅接下来的故障排除环节。 我们接着将 da0 磁盘也加入 gm0 设备: &prompt.root; gmirror configure -a gm0 &prompt.root; gmirror insert gm0 /dev/da0 此处 告诉 &man.gmirror.8; 采用自动同步, 或换言之: 自动地将磁盘的写操作做镜像处理。 联机手册中详细解释了如何重建, 以及替换磁盘, 只不过它用 data 表示这里的 gm0 故障排除 系统拒绝引导 如果系统引导时出现类似下面的提示: ffs_mountroot: can't find rootvp Root mount failed: 6 mountroot> 这种情况应使用电源或复位按钮重启机器。 在引导菜单中, 选择第六 (6) 个选项。 这将让系统进入 &man.loader.8; 提示符。 在此处手工加载内核模块: - OK? load geom_mirror.ko + OK? load geom_mirror OK? boot 如果这样做能解决问题, 则说明由于某种原因模块没有被正确加载。 可以通过在内核配置文件中加入: options GEOM_MIRROR 然后重新编译和安装内核来解决这个问题。 GEOM Gate 网络设备 通过 gate 工具, GEOM 支持以远程方式使用设备, 例如磁盘、 CD-ROM、 文件等等。 这和 NFS 类似。 在开始工作之前, 首先要创建一个导出文件。 这个文件的作用是指定谁可以访问导出的资源, 以及提供何种级别的访问授权。 例如, 要把第一块 SCSI 盘的第四个 slice 导出, 对应的 /etc/gg.exports 会是类似下面的样子: 192.168.1.0/24 RW /dev/da0s4d 这表示允许同属私有子网的所有机器访问 da0s4d 分区上的文件系统。 要导出这个设备, 首先请确认它没有被挂接, 然后是启动 &man.ggated.8; 服务: &prompt.root; ggated 现在我们将在客户机上 mount 该设备, 使用下面的命令: &prompt.root; ggatec create -o rw 192.168.1.1 /dev/da0s4d ggate0 &prompt.root; mount /dev/ggate0 /mnt 到此为止, 设备应该已经可以通过挂接点 /mnt 访问了。 请注意, 如果设备已经被服务器或网络上的任何其他机器挂接, 则前述操作将会失败。 如果不再需要使用这个设备, 就可以使用 &man.umount.8; 命令来安全地将其卸下了, 这一点和其他磁盘设备类似。 diff --git a/zh_CN.GB2312/books/handbook/l10n/chapter.sgml b/zh_CN.GB2312/books/handbook/l10n/chapter.sgml index fa14c0cc67..78534b6427 100644 --- a/zh_CN.GB2312/books/handbook/l10n/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/l10n/chapter.sgml @@ -1,844 +1,849 @@ Andrey Chernov Contributed by Michael C. Wu Rewritten by 本地化-I18N/L10N使用和设置 概述 FreeBSD是一个由分布于全世界的用户和贡献者支持的项目。 这章将讨论FreeBSD的国际化和本地化的问题,允许非英语用户也能使用FreeBSD很好地工作。 在系统和应用水平上,主要是通过执行i18N标准来实现的,所以这里我们将为读者提供详细的介绍。 读完这一章,您将了解到: 不同的语言和地域是如何在现代操作系统上进行编码的。 如何为您的登入shell设置本地化。 如何配置您的控制台为非英语语言。 languages. 如何使用不同的语言来有效地使用X Windows。 在哪里可以找到更多有关开发符合i18N标准的应用程序的信息。 阅读这章之前,您应当了解: 怎样安装额外的第三方程序()。 基础知识 I18N/L10N 是什么? 国际化 本地化 本地化 开发人员把internationalization简写成I18N,中间的数字是前后两个字母间的字母个数。 L10N依据localization 使用同样的命名规则。 I18N/L10N方法、协议和应用结合在一起,允许用户使用他们自己所选择的语言。 I18N应用程序使用I18N工具来编程。它允许开发人员写一个简单的文件, 就可以将显示的菜单和文本翻译成本地语言。我们非常鼓励程序员遵循这种规则。 为什么要使用I18N/L10N? I18N/L10N标准能够很好地支持您查看、输入或处理非英语语言。 I18N支持哪些语言? I18N和L10N不是FreeBSD特有的。当前,它能支持世界上绝大部分主力语言, 包括但不限于:中文,德文,日文,朝鲜文,法文,俄文,越南文等等。 使用本地化语言 I18N不是FreeBSD特有的,它是一个规则。我们鼓励您帮助FreeBSD完善这一规则。 locale 本地化设置需要具备三个条件:语言代码 (Language Code)、 国家代码 (Country Code) 和编码(Encoding)。 本地名字可以用下面这些部分来构造: 语言代码_国家代码.编码 语言和国家代码 语言代码 国家代码 为了用特殊的语言来对FreeBSD系统进行本地化(或其他类&unix;系统), 用户必须要知道相应的国家和语言代码(国家代码告诉应用程序使用哪一种语言规范)。 此外,WEB浏览器,SMTP/POP服务器,web服务器等都是以这个为基础的。下面就是一个国家和语言代码的例子: 语言/国家代码 描述 en_US 美国英语 ru_RU 俄语 zh_CN 简体中文 编码 编码 ASCII 一些语言不使用 ASCII 编码,它们使用8-位, 宽或多字节的字符, 更多的信息请参考 &man.multibyte.3;。 比较老的应用程序可能会无法识别它们, 并误认为是控制字符。 比较新的应用程序通常会认出 8-位字符。 随实现的不同, 用户可能不得不将宽或多字节字符支持编入应用程序, 或进行一些额外的配置, 才能够正常使用它们。 要输入和处理宽或多字节字符, FreeBSD Ports Collection 已经为每种语言提供了不同的程序。 请参考各个 FreeBSD Port 中的 I18N 文档。 特别需要指出的是, 用户可能需要查看应用程序的文档, 以确定如何正确地配置它, 或需要为 configure/Makefile/编译器 指定什么样的参数。 记住下面这些: 特定语言的简单C字符集 (参见 &man.multibyte.3;),例如 ISO8859-1, ISO8859-15, KOI8-R, CP437。 宽字节或多字节编码,如EUC, Big5。 您可以在IANA Registry检查一下现行的字符集列表。 与此不同的是, &os; 使用与 X11-兼容的本地编码模式。 I18N应用程序 在FreeBSD Ports和Package系统里面,I18N应用程序已经使用I18N 来命名。然而它们不是总支持需要的语言。 本地化设置 通常只要在登入shell里面设置LANG为本地化, 一般通过设置用户的 ~/.login_conf 或用户shell的启动文件(~/.profile~/.bashrc, ~/.cshrc)。没有必要设置 LC_CTYPELC_CTIME。 更多的信息请参考特定语言的FreeBSD文档。 您应当在您的配置文件中设置下面两个变量: POSIX LANG 为&posix;设置本地化语言功能。 MIME MM_CHARSET应用程序的MIME字符集。 这包括用户的shell配置,特定的应用配置和X11配置。 设置本地化的方法 本地化 登入分类 有两种方法来设置本地化,接下来都会描述。 第一种 (推荐) 就是在 登入分类里面指定环境变量。 第二种方法是把环境变量加到shell的启动文件里面。 登入分类方法 这种方法允许把本地化名称和MIME字符集的环境变量赋给可能的shell, 而不是加到每个特定shell的启动文件里面。 用户级设置 Level Setup 允许普通用户自己完成这个设置,而管理员级设置需要超级用户权限。 用户级设置 这有一个设置用户根目录文件.login_conf的小例子, 它为上述两个变量设置了Latin-1编码。 me:\ :charset=ISO-8859-1:\ :lang=de_DE.ISO8859-1: 繁体中文BIG-5编码 这是一个为.login_conf设置繁体中文的BIG-5编码的例子。应该设置下面的大部分变量, 因为很多软件都没有为中文,日文和韩文设置正确的本地化变量。 #Users who do not wish to use monetary units or time formats #of Taiwan can manually change each variable me:\ :lang=zh_TW.Big5:\ :lc_all=zh_TW.Big:\ :lc_collate=zh_TW.Big5:\ :lc_ctype=zh_TW.Big5:\ :lc_messages=zh_TW.Big5:\ :lc_monetary=zh_TW.Big5:\ :lc_numeric=zh_TW.Big5:\ :lc_time=zh_TW.Big5:\ :charset=big5:\ :xmodifiers="@im=xcin": #Setting the XIM Input Server 更多的信息参考管理员级设置和&man.login.conf.5; 管理员级设置 检查用户的登入分类在 /etc/login.conf里面是否设置了正确的语言。主要确定下面的几个设置: language_name:accounts_title:\ :charset=MIME_charset:\ :lang=locale_name:\ :tc=default: 再次使用前面的Latin-1编码的例子: german:German Users Accounts:\ :charset=ISO-8859-1:\ :lang=de_DE.ISO8859-1:\ :tc=default: 在修改用户的登入类型之前, 您应执行下面的命令 &prompt.root; cap_mkdb /etc/login.conf 以便使在 /etc/login.conf 中新增的配置生效。 使用 &man.vipw.8; 改变登入类型。 vipw 使用vipw添加新用户,看起来像下面这样: user:password:1111:11:language:0:0:User Name:/home/user:/bin/sh 用&man.adduser.8;改变登入类型。 adduser 登入分类 adduser添加新用户看起来像下面这样: /etc/adduser.conf里面设置defaultclass = 语言。应该记住,您必须为使用其它语言的所有用户设置 缺省类别。 每一次使用&man.adduser.8;的时候,一个特定语言的可选择性回答会像下面这样给出: Enter login class: default []: 如果您打算给每一个用户使用另外一种语言,您应该这样: &prompt.root; adduser -class language 使用&man.pw.8;改变登入类型。 pw 如果您使用&man.pw.8;来添加新用户,应该这样使用: &prompt.root; pw useradd user_name -L language Shell启动文件方法 不推荐使用这种方法,因为它需要给每一个可能的shell程序一个不同的启动文件。 应该用登入分类方法来代替这种方法。 MIME locale 为了设置本地化名称和MIME字符集,只要在/etc/profile/etc/csh.login启动文件里面设置这两个变量。下面我们使用德语做例子: /etc/profile里面: LANG=de_DE.ISO8859-1; export LANG MM_CHARSET=ISO-8859-1; export MM_CHARSET 或在/etc/csh.login里面: setenv LANG de_DE.ISO8859-1 setenv MM_CHARSET ISO-8859-1 另外,您可以把上面的设置添加到/usr/share/skel/dot.profile (和前面的/etc/profile一样),或者/usr/share/skel/dot.login (和前面的/etc/csh.login一样)。 对于X11: $HOME/.xinitrc里面: LANG=de_DE.ISO8859-1; export LANG 或者: setenv LANG de_DE.ISO8859-1 依赖您的shell(看上面)。 控制台设置 对于所有的简单C字符集,在/etc/rc.conf中用正在讨论的语言设置正确的控制台字符: font8x16=font_name font8x14=font_name font8x8=font_name 这儿的font_name来自于/usr/share/syscons/fonts目录, 不带.fnt后缀。 sysinstall keymap screenmap 您还需要确定正确地为您的 C 字符集配置了 keymap 和 screenmap, 这一工作可以通过 sysinstall (在 &os; 5.2 之前的版本是 /stand/sysinstall) 来完成。。 进入 sysinstall 之后, 选择 ConfigureConsole。 此外, 您也可以将下面的设置加入 /etc/rc.conf scrnmap=screenmap_name keymap=keymap_name keychange="fkey_number sequence" 这儿的screenmap_name是来自/usr/share/syscons/scrnmaps目录, 不带.scm后缀。 一个带影射字体的屏幕布局通常被作为一个工作区, 用来在VGA适配器字体矩阵上扩展8位到9位。 如果屏幕字体是使用一个8位的排列,要移动这些字母离开这些区域。 如果您在/etc/rc.conf里面启用了moused daemon: moused_enable="YES" 那么需要在下一段检查鼠标指针信息。 moused 默认情况下, &man.syscons.4;驱动程序的鼠标指针在字符集中占用0xd0-0xd3的范围。 如果您的语言使用这个范围,您必须把指针范围移出这个范围。 要绕过这个问题, 需要在 /etc/rc.conf 中加入: mousechar_start=3 这里, keymap_name 来自于 /usr/share/syscons/keymaps 目录, 但去掉了 .kbd 后缀。 如果不确定应该使用哪一个键盘布局, 则可以使用 &man.kbdmap.1; 来测试, 而无需反复重启。 通常, keychange 是设定功能键时, 匹配选定的终端类型来说是必需的, 因为功能键序列无法在键盘布局中定义。 此外您还应该检查并确认在 /etc/ttys 中已经为所有的 ttyv* 项配置了正确的终端类型。 目前, 相关的默认定义是: 字符集设置 终端类型 ISO8859-1 or ISO8859-15 cons25l1 ISO8859-2 cons25l2 ISO8859-7 cons25l7 KOI8-R cons25r KOI8-U cons25u CP437 (VGA default) cons25 US-ASCII cons25w 对于多字节字符语言,可以您的在 /usr/ports/language 目录中使用正确的FreeBSD port。一些port以控制台出现, 而系统把它作为串行vtty终端,因此, 必须为 X11 和伪串行控制台准备足够的vtty终端。 下面是在控制台中使用其他语言的应用程序的部分列表: 语言 特定区域 Traditional Chinese (BIG-5) chinese/big5con Japanese japanese/kon2-16dot or japanese/mule-freewnn Korean korean/han X11设置 虽然X11不是FreeBSD计划的一部分, 但我们已经为FreeBSD用户包含了一些信息。 具体细节可以参考&xorg; Web 站点 或是您使用的 X11 Server 的网站。 ~/.Xresources里面,您可以适当调整特定应用程序的I18N设置(如字体,菜单等)。 显示字体 X11 True Type 字体服务器 安装 &xorg; 服务器 (x11-servers/xorg-server) 或 &xfree86; 服务器 (x11-servers/XFree86-4-Server), 然后安装对应语言的 &truetype; 字体。 请设置正确的地区信息, 这将让您能够在菜单和其它地方看到所选择的语言。 输入非英语字符 X11输入方法(XIM) X11输入方法(XIM)协议是所有X11客户端的一个新标准。 所有将作为XIM客户端来写的X11应用程序从XIM输入服务器输入。 不同的语言有几种XIM服务器可用。 打印机设置 一些简单的C字符集通常是用硬编码来编码进打印机的。更宽或多位的字符集需要特定的设置, 我们推荐使用apsfilter。您也可以使用特定语言转换器把文档转换为 &postscript;或PDF格式。 内核和文件系统 FreeBSD 的快速文件系统 (FFS) 是完全支持 8-位 字符的, 因此它可以被用于任何简单的 C 字符集 (参见 &man.multibyte.3;), 但在文件系统中不会保存字符集的名字; 也就是说, 它不加修改地保存 8-位信息, 而并不知道如何编码。 正式说来, FFS 目前还不支持任何形式的宽或多字节字符集。 不过, 某些宽或多字符集提供了独立的针对 FFS 的补丁来帮助启用关于它们的支持。 目前这些要么是无法移植的, 要么过于粗糙, 因此我们不打算把它们加入到源代码中。 请参考相关语言的 Web 站点, 以了解关于这些补丁的进一步情况。 DOS Unicode FreeBSD &ms-dos;已经能够配置成用在&ms-dos;上,Unicode字符集和可选的FreeBSD文件系统字符集的更多信息, 请参考 &man.mount.msdosfs.8; 联机手册。 编译I18N程序 许多FreeBSD Ports已经支持I18N了。他们中的一些都用-I18N作标记。 这些和其他很多程序已经内建I18N的支持,不需要考虑其他的事项了。 MySQL 然而一些像MySQL这样的应用程序需要重新配置字符集,可在 Makefile里面设置,或者直接把参数传递给configure 本地化FreeBSD Andrey Chernov Originally contributed by 俄语(KOI8-R编码) 本地化 俄语 关于KOI8-R编码的更多信息请查阅KOI8-R参考(Russian Net Character Set) 本地设置 把下面的行加入到您的~/.login_conf文件: me:My Account:\ :charset=KOI8-R:\ :lang=ru_RU.KOI8-R: 参看前面的设置本地化的例子。 控制台设置 把下面一行加到 /etc/rc.conf mousechar_start=3 并在 /etc/rc.conf 里面增加如下设置: keymap="ru.koi8-r" scrnmap="koi8-r2cp866" font8x16="cp866b-8x16" font8x14="cp866-8x14" font8x8="cp866-8x8" 对于/etc/ttys里面的ttyv*记录,要使用 cons25r作为终端类型。 参看前面的设置控制台的例子。 打印机设置 打印机 既然绝大多数带俄语字符的打印机遵循CP866的标准, 那么需要一个针对KOI8-R到CP866转换的特定输出过滤器。这样的一个过滤器默认的安装在 /usr/libexec/lpr/ru/koi2alt。 一个支持俄语的打印机的/etc/printcap记录看起来是这样的: lp|Russian local line printer:\ :sh:of=/usr/libexec/lpr/ru/koi2alt:\ :lp=/dev/lpt0:sd=/var/spool/output/lpd:lf=/var/log/lpd-errs: 更多信息参考&man.printcap.5;手册页。 &ms-dos;文件系统和俄语文件名 下面的例子是在挂上&ms-dos; 文件系统后,启用对俄语文件名支持的&man.fstab.5;记录: /dev/ad0s2 /dos/c msdos rw,-Wkoi2dos,-Lru_RU.KOI8-R 0 0 选项 用于选择地区名称, 而 则用于设置字符转换表。 要使用 选项, 则一定要首先挂接 /usr, 然后再挂接 &ms-dos; 分区, 因为转换表是放在 /usr/libdata/msdosfs 的。 要了解进一步的细节, 请参考 &man.mount.msdosfs.8; 联机手册。 X11设置 首先请进行前面介绍的 非-X 的本地化设置。 如果您正使用 &xorg;, 请安装 x11-fonts/xorg-fonts-cyrillic package。 检查您 /etc/X11/xorg.conf 文件中的 "Files" 小节。 下面的行, 应加到任何其它 FontPath 项之前: FontPath "/usr/X11R6/lib/X11/fonts/cyrillic/misc" FontPath "/usr/X11R6/lib/X11/fonts/cyrillic/75dpi" FontPath "/usr/X11R6/lib/X11/fonts/cyrillic/100dpi" - 如果您使用一个高分辨率的显示模式,可以交换75 dpi 和100 dpi行。 + 如果希望使用高分辨率的现实模式, 则应把 100 dpi 的配置行放在 75 dpi 前面。 + + + 请查看 ports 中的其它西里尔字体。 要激活俄语键盘, 需要在 xorg.conf 文件的 "Keyboard" 小节中加入下列内容: Option "XkbLayout" "us,ru" Option "XkbOptions" "grp:toggle" 要确信XkbDisable 已经关闭 (注释掉) 了。 RUS/LAT的切换用CapsLock。老的CapsLock功能可以通过 ShiftCapsLock 来模拟(只有在LAT模式的时候)。 - 对于 grp:caps_toggle - 而言, RUS/LAT 开关将作为 CapsLock 使用。 + 使用 grp:caps_toggle + 时, RUS/LAT 切换键将是 右 Alt, + 而使用 grp:ctrl_shift_toggle 则表示切换键是 + CtrlShift。 旧的 CapsLock 功能仍可通过 ShiftCapsLock (只对 LAT 模式有效)。 对于 grp:toggle 而言 RUS/LAT 开关则是 Right Alt。 由于不明原因, grp:caps_toggle&xorg; 中无法使用。 如果您的键盘上有 &windows; 键, 但发现 RUS 模式下, 某些非字母键映射不正常, 则应在您的 xorg.conf 文件中加入下面这行: Option "XkbVariant" ",winkeys" 俄语的 XKB 键盘可能并不为某些不具备本地化功能的应用程序所支持。 本地化程序最低限度应在程序启动时调用 XtSetLanguageProc (NULL, NULL, NULL); 函数。 参见 KOI8-R for X Window 以获得关于对 X11 应用进行本地化的指导。 设置繁体中文 本地化 繁体中文 FreeBSD-Taiwan计划有一个使用很多中文ports的中文化指南在 。 目前, FreeBSD 中文化指南 的维护人员是 沈俊兴 statue@freebsd.sinica.edu.tw 沈俊兴 statue@freebsd.sinica.edu.tw 利用 FreeBSD-Taiwan 的 zh-L10N-tut建立了 Chinese FreeBSD Collection (CFC)。 相关的 packages 和脚本等可以在 找到。 德语本地化(适合所有的ISO 8859-1语言) 本地化 德语 Slaven Rezic eserte at cs.tu-berlin.de 写了一个在FreeBSD机器下如何使用日尔曼语言的德语指南。 可以在下找到。 日语和韩语本地化 本地化 日语 本地化 韩语 日语本地化请参考,韩语参考 非英语的FreeBSD文档 一些FreeBSD的贡献者已经将部分FreeBSD文档翻译成了其他语言。 可以通过主站 或者 /usr/share/doc 查到。 diff --git a/zh_CN.GB2312/books/handbook/multimedia/chapter.sgml b/zh_CN.GB2312/books/handbook/multimedia/chapter.sgml index e5699a0887..335ccbc3aa 100644 --- a/zh_CN.GB2312/books/handbook/multimedia/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/multimedia/chapter.sgml @@ -1,1577 +1,1557 @@ Ross Lippert 编辑: 雪平 中文翻译: 多媒体 概述 FreeBSD 广泛地支持各种声卡, 让您可以从容地享受来自您的计算机的高保真输出。 这包括了录制和播放 MPEG Audio Layer 3 (MP3)、 WAV、 以及 Ogg Vorbis 等许多种格式声音的能力。 FreeBSD 同时也包括了许多的应用程序,让您可以录音、 增加声音效果以及控制附加的MIDI设备。 要是乐于动手, FreeBSD 也能支持播放一般的视频文件和 DVD。 对各种视频媒体进行编码、 转换和播放的应用程序比起处理声音的应用程序略少一些。 例如, 在撰写这章时, FreeBSD Ports Collection 中还没有类似 audio/sox 那样好的重编码工具能够用来在不同的格式之间转换。 不过, 这个领域的软件研发进展是很快的。 本章将介绍配置声卡的必要步骤。 X11 的安装和配置 () 里已经考虑到了您显卡的问题, 但要想有更好的播放效果, 仍需要调整一些东西。 读了本章后,您将知道: 如何配置系统识别声卡。 运用样本程序去测试声卡工作的方法。 如何排除声卡安装中的问题。 如何播放和编码MP3以及其它格式的音频。 X 服务器如何支持视频。 哪些好的视频播放/压缩ports 如何播放 DVD、 .mpg 以及 .avi 文件。 如何从CD和DVD中提取文件。 怎样配置电视卡。 如何配置图像扫描仪。 在读本章这前,您应该: 知道如何配置、安装一个新的内核 () 用&man.mount.8; 命令去装载CD光盘,至少会产生一个错误, 更糟的情况下会产生 kernel panic。 这种媒体所用的编码与通常的ISO文件系统是不同的。 Moses Moore 贡献者 Marc Fonvieille Enhanced for &os; 5.X by 安装声卡 配置系统 PCI ISA 声卡 在开始之前,您应该清楚声卡类型、所用的芯片以及它是 PCI 还是 ISA 卡。 FreeBSD 支持种类繁多的 PCI 和 ISA 卡。检查 Hardware Notes 中支持的音频设备列表看看是否支持您的声卡。 这份文档也只论及支持您的声卡的驱动程序。 内核 配置 要使用声卡, 就应装载正确的驱动程序。完成的方式有两种: 最简单的是使用命令 &man.kldload.8; 来装载一个内核模块,在命令行输入 &prompt.root; kldload snd_emu10k1 或者在文件 /boot/loader.conf 里加入一行,内容如下 snd_emu10k1_load="YES" 上边实例用于 Creative &soundblaster; Live! 声卡。 其它可装载的模块列在文件/boot/defaults/loader.conf里边。 如果不知道应该使用哪个驱动, 您可以尝试加载 snd_driver module: &prompt.root; kldload snd_driver 这是个 meta 驱动,一次加载了最常见的设备驱动。 这会提高搜索正确驱动的速度。也可以通过 /boot/loader.conf 工具来加载所有的声卡驱动。 如果希望在加载了 snd_driver meta 驱动之后了解到底选择了哪种声卡, 可以通过使用 cat /dev/sndstat 来查询 /dev/sndstat 文件。 另外,您也可以把支持您声卡的代码静态地编译到内核里去。 下一节就采用这种方式支持硬件给出提示。 关于重新编译内核,请参考 定制内核使其支持声卡 要做的第一件事情就是添加通用音频驱动 &man.sound.4; 到内核中,您需要添加下面这行到内核配置文件中: device sound 接下来就是加入对我们所用声卡的支持了。 首先需要确定我们的声卡需要使用哪一个驱动。 您可以参考 硬件兼容列表 所列出的音频设备, 以确定您声卡的驱动。 例如, Creative &soundblaster; Live! 声卡由 &man.snd.emu10k1.4; 驱动来支持。 要添加它, 需要在内核编译配置文件中加入下面一行: device snd_emu10k1 一定要阅读驱动的联机手册了解如何使用它们。 关于内核配置文件中声卡驱动的写法, 也可以在 /usr/src/sys/conf/NOTES 文件。 非即插即用的 ISA 卡可能需要您为内核提供一些关于声卡配置的信息 (IRQ、 I/O 端口, 等等)。 这项工作可以通过 /boot/device.hints 文件来完成。 系统启动时, &man.loader.8; 将读取这个文件, 并将其中的配置传给内核。 例如, 旧式的 Creative &soundblaster; 16 ISA 非即插即用卡需要使用 &man.snd.sbc.4; 驱动并配合 snd_sb16(4)。 您可以在内核编译配置文件中增加如下配置: device snd_sbc device snd_sb16 还有下面这些到 /boot/device.hints中: hint.sbc.0.at="isa" hint.sbc.0.port="0x220" hint.sbc.0.irq="5" hint.sbc.0.drq="1" hint.sbc.0.flags="0x15" 这样,声卡使用 0x220 I/O 端口和 IRQ 5 /boot/device.hints 文件的写法会在声卡驱动的联机手册中描述。 在 &os; 4.X 上, 这些配置只能直接写进内核配置文件中。 上面所展示的是默认的配置。 有时候, 您可能需要更改 IRQ 或其他配置, 以适应声卡的实际情况。 查看 &man.snd.sbc.4; 联机手册了解更多信息。 测试声卡 用修改过的内核重起,或者加载了需要的模块之后, 声卡将会出现在您的系统消息缓存中 (&man.dmesg.8;),就像这样: pcm0: <Intel ICH3 (82801CA)> port 0xdc80-0xdcbf,0xd800-0xd8ff irq 5 at device 31.5 on pci0 pcm0: [GIANT-LOCKED] pcm0: <Cirrus Logic CS4205 AC97 Codec> 声卡的状态可以通过 /dev/sndstat 文件来查询: &prompt.root; cat /dev/sndstat FreeBSD Audio Driver (newpcm) Installed devices: pcm0: <Intel ICH3 (82801CA)> at io 0xd800, 0xdc80 irq 5 bufsz 16384 kld snd_ich (1p/2r/0v channels duplex default) 您系统的输出可能与此不同。如果没有看到 pcm 设备,回顾并检查一下前面做的。 重新检查您的内核配置文件并保证选择了正确的设备。 常见问题列在一节。 如果一切正常,您现在应该拥有一个多功能声卡了。 如果您的 CD-ROM 或者 DVD-ROM 驱动器适当的与声卡相关联, 您可以把 CD 放入驱动器并用 &man.cdcontrol.1; 来播放: &prompt.user; cdcontrol -f /dev/acd0 play 1 许多应用程序,比如 audio/workman 可以提供一个友好的界面。 您可能想要安装一个应用程序比如 audio/mpg123 来听 MP3 音频文件。一个快速的测试声卡正在发送数据到 /dev/dsp 的方式,像这样做: &prompt.user; cat filename > /dev/dsp 这里 filename 可以是任意文件。 这行命令会产生一些噪音,证明声卡果真在工作。 声卡混音级别可以通过 &man.mixer.8; 命令更改。 更多细节可以在 &man.mixer.8; 联机手册中找到。 常见问题 设备节点 I/O 端口 IRQ DSP 错误信息 解决方法 unsupported subdevice XX 一个或多个设备节点没有正确地建立。重复上面的步骤。 sb_dspwr(XX) timed out I/O端口没有设置正确。 bad irq XX IRQ设置不正确。确信设定的IRQ和声卡的IRQ是一样的。 xxx: gus pcm not attached, out of memory 没有足够的内存空间供设置使用。 xxx: can't open /dev/dsp! 使用命令 fstat | grep dsp 进行检查是否有其它的程序打开了设备。 值得注意的是 esoundKDE 提供的声卡支持经常是造成麻烦的祸根。 Munish Chopra 贡献者 利用多个声源 同时有多个声源的声音在播放, 这是完全可能的, 例如当 esound 或者 artsd 不支持与其它程序共享音频设备时。 FreeBSD可以通过 虚拟声道(Virtual Sound Channels) 来达到, 具体设置用工具 &man.sysctl.8; 来完成。 虚拟的声道可以能过在内核里混合声音来混合声卡里播放的声道。 使用两条sysctl命令来设置虚拟声道的数目。 如果您是 root 用户, 执行下面的操作: &prompt.root; sysctl hw.snd.pcm0.vchans=4 &prompt.root; sysctl hw.snd.maxautovchans=4 上面的实例设定了4个虚拟声道,这也是实际上所使用的数目。hw.snd.pcm0.vchanspcm0的虚拟声道数,一当链接上一个设备它就可配置了。 hw.snd.maxautovchans是分配给新的音频设备的虚拟声道数, 此时这个设备要用 &man.kldload.8; 来链接。 因为 pcm 模块可以独立装载许多硬件驱动程序, 因此 hw.snd.maxautovchans 也就可以存储分配给以后链接到的设备的虚拟声道数。 您不能在使用某个设备的时候改变其虚拟通道数。 首先需要关闭所有使用该设备的程序, 如音乐播放器或声音服务。 如果不使用 &man.devfs.5;, 就必须把应用程序指向 /dev/dsp0.x, 这里x 为0到3, 因为在上面的例子里 hw.snd.pcm.0.vchans 被设为了4。 在使用&man.devfs.5;的系统里,上边那些会自动分配给用户。 Josef El-Rayes 这一节的作者是 如何设置混音器通道值 - - 只有 &os; 5.3-RELEASE 和更新的版本中才支持这一功能。 - - 不同的混音通道的默认音量是硬编码进 &man.pcm.4; 驱动程序的。 同时,也有很多应用或服务程序提供了允许用户直接设置并记住这些值的功能。 不过这并不是一个很好的解决方案, 您可能希望在驱动一级有一个可以设置的默认值。 这可以通过在 /boot/device.hints 定义适当的值来实现。 例如: hint.pcm.0.vol="100" 这将在 &man.pcm.4; 模块加载时, 将通道音量设置为默认的 100。 Chern Lee 贡献者 MP3音频 MP3 (MPEG Layer 3 Audio)达到过CD音质的效果,FreeBSD工作站没理由会缺少这样的好东东。 MP3播放器 目前为止, 最为流行的 X11 MP3 播放器是 XMMS (X 多媒体系统)。 Winamp 的肤面可以直接用于 XMMS, 因为它的 GUI 几乎和 Nullsoft 的 Winamp 完全一样。 另外, XMMS 也提供了内建的插件支持。 XMMS 可以通过 multimedia/xmms port 或 package 来安装。 XMMS 的界面很直观, 它提供了播放列表、 图形化均衡器等等。 如果您熟悉 Winamp, 就会感觉 XMMS 很容易使用。 audio/mpg123 port 提供了一个命令行界面的 MP3 播放器。 mpg123 可以在执行时通过命令行指定声音设备和要播放的 MP3 文件, 如下所示: &prompt.root; mpg123 -a /dev/dsp1.0 Foobar-GreatestHits.mp3 High Performance MPEG 1.0/2.0/2.5 Audio Player for Layer 1, 2 and 3. Version 0.59r (1999/Jun/15). Written and copyrights by Michael Hipp. Uses code from various people. See 'README' for more! THIS SOFTWARE COMES WITH ABSOLUTELY NO WARRANTY! USE AT YOUR OWN RISK! Playing MPEG stream from Foobar-GreatestHits.mp3 ... MPEG 1.0 layer III, 128 kbit/s, 44100 Hz joint-stereo /dev/dsp1.0 应该换成您的系统上的 dsp 设备。 抓取CD音轨 在对CD或CD音轨编码成MP3之前, CD上的音频数据应先抓到硬盘里。 这个可以通过复制原始的CDDA(CD数字音频)数据成为波形(WAV)文件。 工具 cdda2wavsysutils/cdrtools 套件的一部份,可用来从CD中获取音频及其相关信息。 把CD放到光驱里,下面的命令可以完成 (作为 root用户) 把整张 CD 分割成单个 (每个音轨) 的WAV文件:/para> &prompt.root; cdda2wav -D 0,1,0 -B cdda2wav 支持 ATAPI (IDE)光驱。 从IDE光驱中抓取音轨, 需要用设备名称代替SCSI的单元号。 例如, 想从 IDE 光驱中抓取第7道音轨: &prompt.root; cdda2wav -D /dev/acd0a -t 7 参数 表示 SCSI 设备 0,1,0, 与命令 cdrecord -scanbus的输出相对应。 抓取单轨,要使用选项,如下所示: &prompt.root; cdda2wav -D 0,1,0 -t 7 这个实例用于抓取第七个音轨。要抓取一定范围的音轨,如从1到7: &prompt.root; cdda2wav -D 0,1,0 -t 1+7 利用&man.dd.1;也可以从ATAPI光驱中抓取音轨,从 可以了解更多。 MP3 编码 现今,可选的MP3编码器是lameLame可以从ports树里的 audio/lame 处找到。 利用抓取的WAV文件,下边的命令就可以把 audio01.wav 转换成audio01.mp3 &prompt.root; lame -h -b 128 \ --tt "Foo Song Title" \ --ta "FooBar Artist" \ --tl "FooBar Album" \ --ty "2001" \ --tc "Ripped and encoded by Foo" \ --tg "Genre" \ audio01.wav audio01.mp3 128 kbits 是标准的MP3位率(bitrate)。 许多人可能喜欢更高的品质例如 160 或 192。 更高的位率, 会使 MP3 占用更多的磁盘空间--但音质会更高。选项 控制 高品质但低速度 (higher quality but a little slower) 模式的开关。 选项 表示把 ID3 标签--通常包含了歌曲的信息, 植入到MP3文件里。 其它的编码选项可以查询 lame 的联机手册。 MP3 解码 要把MP3歌曲刻录成音乐CD,就需要把它转换成非压缩的波形(WAV)格式。 XMMSmpg123 都支持把MP3输出成非压缩格式文件。 XMMS中输出到磁盘: 启动 XMMS. 在窗口里右击鼠标,弹出XMMS菜单。 选项(Options)里选择设定(Preference) 改变输出插件成写磁盘插件(Disk Writer Plugin) 配置(Configure) 输入或选择一个目录用于存放解压的文件。 象平常一样,把MP3文件装入到XMMS里边, 把音量调节到100%并且关掉EQ设定。 按一下播放(Play)XMMS 如同在播放mp3一样,只是听不到声音。 实际上是在播放mp3到一个文件里。 要想再听MP3歌曲,记得把默认的输出插件设回原来的值。 mpg123进行标准输出: 执行 mpg123 -s audio01.mp3 > audio01.pcm XMMS输出的文件是波形(WAV)格式, 而mpg123 则把MP3转换成无压缩的PCM 音频数据。两种格式都支持用 cdrecord 刻录成音乐CD。 使用 &man.burncd.8; 您就必须使用无压缩的PCM。 如果选择波形格式, 就要注意在每道开始时的一小点杂音, 这段声音是波形文件的头部份。 可以使用工具 SoX 来轻松去除。 SoX 可从 audio/sox port 或包(package)中安装得到: &prompt.user; sox -t wav -r 44100 -s -w -c 2 track.wav track.raw 阅读 这部份可以了解到更多在 FreeBSD 里刻盘的信息。 Ross Lippert 贡献者 视频回放 视频回放是个很新并且迅速发展中的应用领域。 一定要有耐心,因为不是所有的事情都象处音频那么顺利。 在开始之前,您要了解显卡的类型以及它所用的芯片的类型。 尽管 &xorg;&xfree86; 支持大量的显卡, 但能达到好的回放效果的却寥寥无几。 在X11运行时,您可以使用命令 &man.xdpyinfo.1; 获得使用您的显卡的X服务器所支持的扩展列表。 为了评估各种播放器和设置,您需要有一小段用作测试的MPEG文件。 由于一些DVD播放器会默认地在 /dev/dvd 里去找DVD文件, 因此, 您会发样建立符号链接到恰当的设备会很有用: - &prompt.root; ln -sf /dev/acd0c /dev/dvd -&prompt.root; ln -sf /dev/racd0c /dev/rdvd - - 在使用了 FreeBSD 5.X 的 &man.devfs.5; 里, 有一个略微不同的推荐链接集: - &prompt.root; ln -sf /dev/acd0 /dev/dvd &prompt.root; ln -sf /dev/acd0 /dev/rdvd 注意:由于&man.devfs.5;本身的原因, 像这样手工建立的链接在重启后将不会存在。 想要无论什么时候您启动系统都能自动建立符号链接, 那就把下边这行加到 /etc/devfs.conf 里边: link acd0 dvd link acd0 rdvd 另外,DVD解密要求调用专用的DVD-ROM函数,要求把许可定到DVD设备里。 - - kernel options (内核选项) - CPU_ENABLE_SSE - - - 前面讨论的一些 ports 要正确地联编有赖于下列内核的选项设置。 - 在试图联编之前, 把这一选项增加到内核配置文件中去, 联编新的内核, - 并重启系统: - - options CPU_ENABLE_SSE - - 为了增强用于共享内存的X11接口,推荐增加一些 &man.sysctl.8; 参数的值: + 为了改善 X11 界面使用共享内存的能力, 建议提高一些 &man.sysctl.8; 变量的值: kern.ipc.shmmax=67108864 kern.ipc.shmall=32768 测定视频的性能 XVideo SDL DGA 在X11下有几种可以显示图像的方式。 到底哪个能工作很大程序上依赖于硬件。 首先, 下边描述的每一种方法在不同的硬件上都会有不同的品质。 其次, 在X11里的图像显示近来引起普遍的关注, 随着 &xorg;&xfree86; 的每一个版本, 都会有很大的突破。 常见图像接口列表: X11: 一般性的使用共享内存的X11输出。 XVideo: 一种X11接口扩展,支持任何X11图像的可拖拉。 SDL: 简单直接媒体层。 DGA: 直接图片存取。 SVGAlib: 低层次掌控图片层。 XVideo &xorg;&xfree86; 4.X 有种扩展叫做XVideo (或称Xvideo, Xv, xv), 它可以通过一个特殊的加速器直接把图像显示在可拖拉的对象里。 即使在低端的计算机 (例如我的PIII 400 Mhz膝上电脑), 这个扩展也提供了很好的播放质量。 要了解这一扩展是否在正常工作, 使用 xvinfo 命令: &prompt.user; xvinfo 如果显示结果如下,那您的显卡就支持XVideo: X-Video Extension version 2.2 screen #0 Adaptor #0: "Savage Streams Engine" number of ports: 1 port base: 43 operations supported: PutImage supported visuals: depth 16, visualID 0x22 depth 16, visualID 0x23 number of attributes: 5 "XV_COLORKEY" (range 0 to 16777215) client settable attribute client gettable attribute (current value is 2110) "XV_BRIGHTNESS" (range -128 to 127) client settable attribute client gettable attribute (current value is 0) "XV_CONTRAST" (range 0 to 255) client settable attribute client gettable attribute (current value is 128) "XV_SATURATION" (range 0 to 255) client settable attribute client gettable attribute (current value is 128) "XV_HUE" (range -180 to 180) client settable attribute client gettable attribute (current value is 0) maximum XvImage size: 1024 x 1024 Number of image formats: 7 id: 0x32595559 (YUY2) guid: 59555932-0000-0010-8000-00aa00389b71 bits per pixel: 16 number of planes: 1 type: YUV (packed) id: 0x32315659 (YV12) guid: 59563132-0000-0010-8000-00aa00389b71 bits per pixel: 12 number of planes: 3 type: YUV (planar) id: 0x30323449 (I420) guid: 49343230-0000-0010-8000-00aa00389b71 bits per pixel: 12 number of planes: 3 type: YUV (planar) id: 0x36315652 (RV16) guid: 52563135-0000-0000-0000-000000000000 bits per pixel: 16 number of planes: 1 type: RGB (packed) depth: 0 red, green, blue masks: 0x1f, 0x3e0, 0x7c00 id: 0x35315652 (RV15) guid: 52563136-0000-0000-0000-000000000000 bits per pixel: 16 number of planes: 1 type: RGB (packed) depth: 0 red, green, blue masks: 0x1f, 0x7e0, 0xf800 id: 0x31313259 (Y211) guid: 59323131-0000-0010-8000-00aa00389b71 bits per pixel: 6 number of planes: 3 type: YUV (packed) id: 0x0 guid: 00000000-0000-0000-0000-000000000000 bits per pixel: 0 number of planes: 0 type: RGB (packed) depth: 1 red, green, blue masks: 0x0, 0x0, 0x0 同时注意:列出来的格式(YUV2, YUV12, 等等) 并不总是随着 XVdieo的每一次执行而存在。没有它们可能或迷惑有些人。 如果结果看起来是这样: X-Video Extension version 2.2 screen #0 no adaptors present 那么您的显卡可以就不支持XVideo功能。 如果您的卡不支持XVideo, 则只是说明您的显示器在满足刷新图像的计算要求上存在更大的困难。 尽管显卡和处理器很重要,您仍然会有个不错的显示效果。 此外, 您也可以参考我们提供的文献, 在 中有所介绍。 简单直接媒体层 简单直接媒体层(SDL),原意是做为 µsoft.windows;、BeOS 以及 &unix; 之间的端口层,允许跨平台应用发展,更高效地利用声卡和图形卡。SDL 层可以在低层访问硬件, 有时这样做就比 X11 接口层更为高效。 关于 SDL, 可以参考 devel/sdl12 直接图形存取 直接图形存取 (Direct Graphics Access) 是一种 X11 扩展, 通过它, 应用程序能够绕过 X 服务, 并直接修改画面缓存 (framebuffer)。 由于它依赖一种底层的内存映射来实现其功能, 因此使用它的程序必须以 root 身份来执行。 DGA 扩展可以通过 &man.dga.1; 来完成测试和性能测量。 运行 dga 时, 它将随按键改变现实的颜色。 按 q 退出这个程序。 Ports 和 包(Packages) 对视频的解决 视频 ports 视频 包 这部份主要讨论在 FreeBSD Ports 集中提供的可用于视频回放的软件。 视频回放在软件发展中是个很活跃的领域, 并且各种不同程序的功能可能与这里的描述不尽相同。 首先要弄清楚的重要一点是在 FreeBSD 上使用的视频程序其发展与在 Linux 里使用的是一样的。 大部份程序都还处在β阶段。使用 FreeBSD 的包可能面对的问题: 一个应用程序不能播放其它程序制作的文件。 一个应用程序不能播放其自已制作的文件。 不同机上的同样的程序,各自重新建立(rebuild)了一次, 播放同一个文件结果也会有不同。 一个看起来没什么的过滤器, 如图像尺寸的调整, 也有可能因为一个调整例程的问题变得很不象样。 应用程序频繁地留下垃圾(dumps core)。 没有随 port 一起安装的文档可以在网上或者 port 的 work 目录中找到。 这些程序中许多也体现了 Linux主义。即, 有些问题来自于(程序)使用的标准库存在于Linux的发行版中, 或者有些是 Linux 内核的功能, 而该程序的作者事先所假定了的是 Linux内核。这些问题并不总是被 port 编护人员注意到或处理过, 这也就可能导致如下问题: 使用/proc/cpuinfo去检测处理器的特性。 滥用线程可能导致一个程序悬挂完成,而不是完全中止。 软件还不属于FreeBSD Ports集,而又与其它程序经常地一起使用。 现在,这些程序的开发人员也已同 port 的维护人员进行了联合, 以减少制作port时出错。 MPlayer MPlayer 是近来开发的同时也正迅速发展着的一个视频播放器。 MPlayer 团队的目标是在 Linux 和其它 UNIX 系统中的速度和机动性能。 在团队的创始人实在受不了当时可用的播放器的性能时, 这个计划就开始了。 有人也许会说图形接口已经成为新型设计的牺牲品。 但是一但您习惯了命令行选项和按键控制方式,它就能表现得很好。 创建MPlayer MPlayer making MPlayer 可以从 multimedia/mplayer 找到。 MPlayer 在联编过程中会进行许多硬件检测, 而得到的可执行文件因此将无法移植到其他系统中使用。 因此, 从 ports 完成联编而不是安装预编译的包就很重要。 另外, 在 make 命令行还可以指定许多选项, 在 Makefile 中有所描述, 接下来我们开始联编: &prompt.root; cd /usr/ports/multimedia/mplayer &prompt.root; make N - O - T - E Take a careful look into the Makefile in order to learn how to tune mplayer towards you personal preferences! For example, make WITH_GTK1 builds MPlayer with GTK1-GUI support. If you want to use the GUI, you can either install /usr/ports/multimedia/mplayer-skins or download official skin collections from http://www.mplayerhq.hu/homepage/dload.html 默认的 port 选项对于绝大多数用户来来说是够用了。 不过, 如果您需要 XviD 编解码器, 则必须指定 WITH_XVID 这个命令行选项。 默认的 DVD 设备也可以用 WITH_DVD_DEVICE 选项来定义, 其默认值是 /dev/acd0 撰写这一章的时候, MPlayer port 的联编过程包括了 HTML 文档和两个可执行文件, mplayermencoder, 后者是一个视频再编码工具。 MPlayer 的 HTML 文档提供了丰富的内容。 如果读者发现本章中缺少关于视频硬件的一些信息, 则 MPlayer 的文档将是十分详尽的补充。 如果您正在找关于 &unix; 中的视频支持的资料, 您绝对应该花一些时间来阅读 MPlayer 的文档。 使用MPlayer MPlayer 使用 任何 MPlayer 用户必须在主目录下建立一个叫 .mplayer 的子目录。 输入下边的内容来建立这个必须的子目录: &prompt.user; cd /usr/ports/multimedia/mplayer &prompt.user; make install-user mplayer的手册里列出了它的命令选项。 HTML文档里有更为详细的信息。 这部份里, 我们只是描述了很少的常见应用。 要播放一个文件,如 testfile.avi, 可以通过各种视频接口当中的某一个去设置 选项: &prompt.user; mplayer -vo xv testfile.avi &prompt.user; mplayer -vo sdl testfile.avi &prompt.user; mplayer -vo x11 testfile.avi &prompt.root; mplayer -vo dga testfile.avi &prompt.root; mplayer -vo 'sdl:dga' testfile.avi 所有这些选项都是值得一试的, 因为它们的性能依赖很多因素,并且都与硬件密切相关。 要播放 DVD, 需要把 testfile.avi 改为 。 这里 N 是要播放的节目编号, 而 DEVICE 则是 DVD-ROM 的设备节点。 例如, 要播放 /dev/dvd 的第三个节目: &prompt.root; mplayer -vo xv dvd://3 -dvd-device /dev/dvd 可以在编译 MPlayer 时, 通过 WITH_DVD_DEVICE 来指定默认的 DVD 设备。 系统内定的默认设备是 /dev/acd0。 更多细节, 请参考 port 的 Makefile 要停止、暂停、前进等等,可以参考设定的按键---这些可以通过 mplayer -h 得到或查看手册。 另外,回放的重要选项是:用于全屏模式的 和起辅助完成作用的 为了让 mplayer 的命令行不是太长,使用者可以通过建立一个文件 .mplayer/config 来设定如下默认选项: vo=xv fs=yes zoom=yes 最后,mplayer可以把DVD题目(title)抓取成为 .vob文件。为了从DVD中导出第二个题目,请输入: &prompt.root; mplayer -dumpstream -dumpfile out.vob dvd://2 -dvd-device /dev/dvd 输出文件 out.vob 将是 MPEG 并且可以被这部份描述的其它利用。 mencoder mencoder 在使用 mencoder 之前, 首先熟悉其 HTML 文档中所介绍的选项是一个不错的主意。 它提供了联机手册, 但如果没有 HTML 文档则帮助不大。 有无数种方法来提高视频品质、 降低比特率、 修改格式, 而这些技巧可能会影响性能。 下面是几个例子, 第一个是简单地复制: &prompt.user; mencoder input.avi -oac copy -ovc copy -o output.avi 不正确的命令选项组合可能使生成的文件不能被mplayer播放。因此,如果您只是想抓取文件,一定在mplayer里使用 转换input.avi成为带有MPEG3音频编码 (要求audio/lame )的MPEG4编码: &prompt.user; mencoder input.avi -oac mp3lame -lameopts br=192 \ -ovc lavc -lavcopts vcodec=mpeg4:vhq -o output.avi 这样就产生了可被mplayerxine播放的输出。 input.avi 可以换成 并以 root 的身份来执行, 以重新对 DVD 节目进行编码。 由于您第一次做这样的工作时很可能会对结果不太满意, 建议您首先把节目复制成文件, 然后对它进行操作。 xine视频播放器 xine视频播放器是一个关注范围很广的项目,它不仅看准多合一的视频解决,而且出品了一个可再用的基本库和一个可扩展插件的可执行模块。发行有和port版本-- multimedia/xine xine播放器仍然很粗糙,但这很显然与好开头无关。实际上xine 即需要一个快速的带有快速显卡的CPU,也支持XVideo的扩展。图形界面(GUI)可以使用,但很勉强。 到写这章时,还没有可用于播放CSS编码的DVD文件的输入模块随同 xine一起发行。 第三方的建造(builds)里内建有这样的模块, 但都不属于FreeBSD Ports 集。 MPlayer相比,xine 为用户考虑得更多,但同时,对用户来说也少了很多有条理的控制方式。xine 播放器在XVideo接口上做得不错。 默认情况下,播放器xine启动的时后会使用图形界面。那么就可以使用菜单打开指定的文件: &prompt.user; xine 另外,没有图形界面也可以使用如下命令立即打开播放文件: &prompt.user; xine -g -p mymovie.avi 使用transcode transcode 这个软件并不是播放器, 而是一系列用于对视频和音频文件进行重新编码的工具。 通过使用 transcode, 就可以拥有使用带 stdin/stdout 接口的命令行工具来合并视频文件, 以及修复坏损文件的能力。 在联编 multimedia/transcode port 时可以指定大量选项, 我们建议使用下面的命令行来构建 transcode &prompt.root; make WITH_OPTIMIZED_CFLAGS=yes WITH_LIBA52=yes WITH_LAME=yes WITH_OGG=yes \ WITH_MJPEG=yes -DWITH_XVID=yes 对于多数用户而言, 前述配置已经足够了。 为了说明 transcode 的功能, 下面的例子展示了如何将 DivX 转换为 PAL MPEG-1 文件 (PAL VCD): &prompt.user; transcode -i input.avi -V --export_prof vcd-pal -o output_vcd &prompt.user; mplex -f 1 -o output_vcd.mpg output_vcd.m1v output_vcd.mpa 生成的 MPEG 文件, output_vcd.mpg, 可以通过 MPlayer 来播放。 您甚至可以直接将这个文件烧录到 CD-R 介质上来创建 Video CD, 如果希望这样做的话, 需要安装 multimedia/vcdimagersysutils/cdrdao 这两个程序。 transcode 提供了联机手册, 但您仍应参考 transcode wiki 以了解更多信息和例子。 进一步了解 FreeBSD里不同的视频软件包正迅速发展中。很可能在不久的将来,这里所谈到的问题都将得到解决。同时,有些人想超越FreeBSD的声/像(A/V)能力,那他们就不得不从一些FAQ和指南里学知识,并使用一些不同的应用程序。这里就给这些读者指出一些补充信息。 MPlayer 文档是很技术性的。这些文档可以给那些希望获得关于&unix;视频高级技术的人们提供参考。MPlayer邮件列表很不喜欢没耐心阅读文档的人,如果您发现什么问题想报告给他们,请首先RTFM。 xine HOWTO里边有一章是关于提高性能的,对所有的播放器都很适应。 最后是一些很有前途的程序,读者可以试一下: Avifile,它就是 multimedia/avifile port。 Ogle 它就是 multimedia/ogle port。 Xtheater multimedia/dvdauthor,一个制作 DVD 节目的源码开放包。 Josef El-Rayes 原创: Marc Fonvieille 改编: 安装电视卡 电视卡 介绍 电视卡可以让您在您的计算机里观看到无线或有线电视。许多卡是通过RCA或S-video输入接收复合视频,而且有些卡还带有调频广播接收器。 &os; 通过&man.bktr.4;驱动程序,提供了对基于PCI的电视卡的支持,要求这些卡使用的是Brooktree Bt848/849/878/879 或 Conexant CN-878/Fusion 878a视频采集芯片。您还要确保这个板上带的有被支持的调谐器,参考&man.bktr.4;手册查看所支持的调谐器列表。 增加驱动程序 要使用您的卡,您就要装载&man.bktr.4;驱动程序。这个可以通过往/boot/loader.conf里边添加下边一行来实现。象这样: bktr_load="YES" 另外,您也可以静态地这个支持编译到内核里去,要是这样的话,就把下边几行加到内核配置里去: device bktr device iicbus device iicbb device smbus 这些附加的设备驱动程序是必须的,因为卡的各组成部分是能过一根I2C总线相互连接在一起的。然后建立安装新的内核。 一旦这个支持被加到了您的系统里,您须要重启系统。在启动过程中,您的电视卡应该显示为up(启动),象这样: bktr0: <BrookTree 848A> mem 0xd7000000-0xd7000fff irq 10 at device 10.0 on pci0 iicbb0: <I2C bit-banging driver> on bti2c0 iicbus0: <Philips I2C bus> on iicbb0 master-only iicbus1: <Philips I2C bus> on iicbb0 master-only smbus0: <System Management Bus> on bti2c0 bktr0: Pinnacle/Miro TV, Philips SECAM tuner. 当然,这些信息可能因您的硬件不同而有所区别。但是您应该能检查那个调制器是否被正确检测到了,可能要忽略一些检测到的同&man.sysctl.8; MIB(管理系统库)和内核配置文件选项一起的参数。例如,如果您想强制使用Philips(飞利浦) SECAM制式的调谐器 ,您就应把下列行加到内核配置文件里: options OVERRIDE_TUNER=6 或者,您直接使用&man.sysctl.8;: &prompt.root; sysctl hw.bt848.tuner=6 请参见 &man.bktr.4; 手册和 /usr/src/sys/conf/NOTES 文件, 以了解更多详细关于可用选项的资料。 有用的应用程序 要使用您的电视卡,您需要安装下列应用程序之一: multimedia/fxtv提供窗口电视(TV-in-a-window)功能和图像/声音/图像采集功能。 multimedia/xawtv也是一款电视应用程序,功能同fxtv一样。 misc/alevt解码和显示Videotext/Teletext。 audio/xmradio,一款用于一些电视卡的调频电台调谐器的程序。 audio/wmtune,一款用于电台调谐器的便捷的桌面程序。 更多的程序在&os; Ports Collection(Ports 集)里。 问题解决 如果您的电视卡遇到了什么问题,您应该首先检查一下您的视频采集芯片和调谐器是不是真正的被&man.bktr.4;驱动程序支持,并且是不是使用了正确的配置选项。想得到更多支持和关于您的电视卡的各种问题,您可以接触和使用&a.multimedia.name; 邮件列表的压缩包。 Marc Fonvieille 撰写人 图象扫描仪 图象扫描仪 介绍 像任何其他的现代操作系统一样,&os; 可以使用图像扫描仪。 对扫描仪的标准的访问是通过 &os; Ports Collection 中的 SANE (Scanner Access Now Easy) API 提供的。 SANE 也会使用一些 &os; 设备驱动来访问扫描仪硬件。 &os; 支持 SCSI 和 USB 扫描仪。 在做任何配置之前请确保您的扫描仪被 SANE 支持。SANE 有一个 支持的设备列表,可以为您提供有关扫描仪的支持情况和状态的信息。 &man.uscanner.4; 手册页也提供了一个支持的 USB 扫描仪列表。 内核配置 上面提到 SCSI 和 USB 接口都是支持的。 取决于您的扫描仪接口, 需要不同的设备驱动程序。 USB 接口 默认的 GENERIC 内核包含了支持 USB 扫描仪需要的设备驱动。 如果您决定使用一个定制的内核, 确保下面在您的内核配置文件中存在下面这些行: device usb device uhci device ohci device uscanner 取决于您主板上的 USB 芯片, 您只需要 device uhci 或者 device ohci 中的一种,但是两个都在 内核配置文件中是没有害处的。 如果您不想重新编译内核而且您的内核也不是 GENERIC 的, 您可以用 &man.kldload.8; 命令直接加载 &man.uscanner.4; 设备驱动模块: &prompt.root; kldload uscanner 要在每次系统启动的时候加载这个模块, 添加下面这行到 /boot/loader.conf 中: uscanner_load="YES" 在用正确的内核重新启动后, 或者在加载了需要的模块之后,插上您的 USB 扫描仪。 扫描仪会出现在您的系统消息缓存 (&man.dmesg.8;)中,就像这样: uscanner0: EPSON EPSON Scanner, rev 1.10/3.02, addr 2 这表明我们的扫描仪正在使用 /dev/uscanner0 设备节点。 SCSI 接口 如果您的扫描仪是 SCSI 接口的, 重要的是要知道您使用哪种 SCSI 控制器。 取决于所使用的 SCSI 芯片, 您需要调整内核配置文件。 GENERIC 的内核支持最常用的 SCSI 控制器。 请阅读 NOTES 文件并在您的内核配置文件中添加正确的行。 除了 SCSI 适配器驱动之外, 您还需要在内核配置文件中增加下述配置: device scbus device pass 一旦完全编译好您的内核, 您就可以在启动时的系统消息缓冲中看到这些设备: pass2 at aic0 bus 0 target 2 lun 0 pass2: <AGFA SNAPSCAN 600 1.10> Fixed Scanner SCSI-2 device pass2: 3.300MB/s transfers 如果您的扫描仪没有在系统启动的时候加电, 很可能还需要强制手动检测一下,用 &man.camcontrol.8; 命令执行一次 SCSI 总线扫描: &prompt.root; camcontrol rescan all Re-scan of bus 0 was successful Re-scan of bus 1 was successful Re-scan of bus 2 was successful Re-scan of bus 3 was successful 然后扫描仪就会出现在 SCSI 设备列表里: &prompt.root; camcontrol devlist <IBM DDRS-34560 S97B> at scbus0 target 5 lun 0 (pass0,da0) <IBM DDRS-34560 S97B> at scbus0 target 6 lun 0 (pass1,da1) <AGFA SNAPSCAN 600 1.10> at scbus1 target 2 lun 0 (pass3) <PHILIPS CDD3610 CD-R/RW 1.00> at scbus2 target 0 lun 0 (pass2,cd0) 有关 SCSI 设备的更多细节,可以查看 &man.scsi.4; 和 &man.camcontrol.8; 手册页。 SANE 配置 SANE 系统分为两部分: 后端(graphics/sane-backends) 和前端(graphics/sane-frontends)。 后端部分提供到扫描仪自身的访问。 SANE 支持设备列表详细说明了哪一个后端可以支持您的图象扫描仪。 如果您想使用您的设备,就必须为您的扫描仪选定正确的后端。 前端部分提供图形化的扫描界面 (xscanimage)。 要做的第一件事就是安装 graphics/sane-backends port 或者 package。然后,使用 sane-find-scanner 命令来检查 SANE 系统做的扫描仪检测: &prompt.root; sane-find-scanner -q found SCSI scanner "AGFA SNAPSCAN 600 1.10" at /dev/pass3 输出显示了扫描仪的接口类型和扫描仪连接到系统上的设备节点。 生产厂家和产品型号可能没有显示,不过不重要。 一些 USB 扫描仪需要您加载固件,后端的手册页中有这方面的解释。 您也应该阅读 &man.sane-find-scanner.1; 和 &man.sane.7; 手册页。 现在我们需要检查扫描仪是否可以被扫描前端识别。 默认情况下, SANE 后端自带一个叫做 &man.scanimage.1; 的命令行工具。 这个命令允许您列出设备以及从命令行执行图片扫描。 选项用来列出扫描仪设备: &prompt.root; scanimage -L device `snapscan:/dev/pass3' is a AGFA SNAPSCAN 600 flatbed scanner 如果没有输出任何信息, 或提示没有识别到扫描仪, 则说明 &man.scanimage.1; 无法识别它。 如果发生这种情况, 您就需要修改扫描仪支持后端的配置文件, 并定义所使用的扫描设备。 /usr/local/etc/sane.d/ 目录中包含了所有的后端配置文件。 这类识别问题经常会在某些 USB 扫描仪上发生。 例如, 对于在 中所使用的 USB 扫描仪, sane-find-scanner 会给出下面的信息: &prompt.root; sane-find-scanner -q found USB scanner (UNKNOWN vendor and product) at device /dev/uscanner0 扫描仪被正确的探测到了,它使用 USB 接口,连接在 /dev/uscanner0 设备节点上。 我们现在可以检查看看扫描仪是否被正确的识别: &prompt.root; scanimage -L No scanners were identified. If you were expecting something different, check that the scanner is plugged in, turned on and detected by the sane-find-scanner tool (if appropriate). Please read the documentation which came with this software (README, FAQ, manpages). 既然扫描仪没有被识别,我们就需要编辑 /usr/local/etc/sane.d/epson.conf 文件。所用的扫描仪型号是 &epson.perfection; 1650, 这样我们知道扫描仪应使用 epson 后端。确保阅读后端配置文件中的帮助注释。 改动非常简单:注释掉导致您的扫描仪使用错误接口的所有行 (在我们这种情况下,我们将注释掉从 scsi 开始的所有行,因为我们的扫描仪使用 USB 接口),然后在文件的结尾添加指定的接口和所用的设备节点。 这种情况下,我们添加下面这行: usb /dev/uscanner0 请确保阅读后端配置文件提供的注释以及后端手册页了解更多细节, 并使用正确的语法。我们现在可以检验扫描仪是否被识别到了: &prompt.root; scanimage -L device `epson:/dev/uscanner0' is a Epson GT-8200 flatbed scanner 我们的 USB 扫描仪被识别到了。如果商标和型号不匹配也不重要。 相关的关键一条是 `epson:/dev/uscanner0' 字段, 这个给了我们正确地后端名称和正确的设备节点。 一旦 scanimage -L 命令可以看到扫描仪, 配置就完成了。设备现在准备好等待扫描了。 &man.scanimage.1; 允许我们从命令行执行图片扫描, 相比之下使用图形用户界面来执行图片扫描会更好。 SANE 提供了一个简单但实用的图形界面: xscanimage (graphics/sane-frontends)。 Xsane (graphics/xsane)是另一个流行的图形扫描前端。 这个前端提供了一些高级特性, 比如多样的扫描模式(photocopy,fax,等。), 色彩校正,批量扫描,等等。这两个程序都可以作为 GIMP 的插件使用。 授予其他用户扫描权限 前面所有的操作都是用 root 权限来完成的。You may however, need 然而您可能需要让其他的用户也可以访问扫描仪。 用户需要有扫描仪所用的设备节点的读和写权限。 比如,我们的 USB 扫描仪使用设备节点 /dev/uscanner0,这个节点属于 operator 组。将用户 joe 添加到 operator 组会允许他使用扫描仪: &prompt.root; pw groupmod operator -m joe 要了解更多细节, 请阅读 &man.pw.8; 联机手册。 此外, 还需要为 /dev/uscanner0 设备节点设置正确的写入权限 (0660 或 0664), 因为默认情况下, operator 组只能读这个设备节点。 这项工作可以通过在 /etc/devfs.rules 文件中添加如下设置来自东完成: [system=5] add path uscanner0 mode 660 随后您还需要在 /etc/rc.conf 中添加下面的内容并重新启动: devfs_system_ruleset="system" 关于这些配置的进一步细节请参考联机手册 &man.devfs.8;。 当然, 考虑安全的原因, 在您将用户添加到任何组, 尤其是 operator 组时, 都应三思而后行。 diff --git a/zh_CN.GB2312/books/handbook/network-servers/chapter.sgml b/zh_CN.GB2312/books/handbook/network-servers/chapter.sgml index d7737fa848..5d3ae9d37d 100644 --- a/zh_CN.GB2312/books/handbook/network-servers/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/network-servers/chapter.sgml @@ -1,4334 +1,4354 @@ Murray Stokely Reorganized by 网络服务器 概要 本章将覆盖某些在 &unix; 系统上常用的网络服务。话题将会涉及 如何安装、配置、测试和维护多种不同类型的网络服务。本章节中将提 供大量配置文件的样例,期望能够对您有所裨益。 在读完本章之后,您将会知道: 如何管理 inetd 如何设置运行一个网络文件系统。 如何配置一个网络信息服务器以共享用户帐号。 如何通过DHCP自动配置网络。 如何配置一个域名服务器。 如何设置Apache HTTP 服务器。 如何设置文件传输(FTP)服务器。 如何使用Samba为 &windows; 客户端设置文件和打印服务。 如何同步时间和日期,以及如何设置使用NTP协议的时间服务器。 在阅读此章节之前,您应当: 理解有关/etc/rc中脚本的基本知识。 熟悉基本网络术语。 懂得如何安装额外的第三方软件()。 Chern Lee Contributed by 为 &os; 6.1-RELEASE 进行了更新, 由 The &os; Documentation Project <application>inetd</application> <quote>超级服务器</quote> 总览 &man.inetd.8; 有时也被称作 Internet 超级服务器, 因为它可以为多种服务管理连接。 当 inetd 收到连接时, 它能够确定连接所需的程序, 启动相应的进程, 并把 socket 交给它 (服务 socket 会作为程序的标准输入、 输出和错误输出描述符)。 使用 inetd 来运行那些负载不重的服务有助于降低系统负载, 因为它不需要为每个服务都启动独立的服务程序。 一般说来, inetd 主要用于启动其它服务程序, 但它也有能力直接处理某些简单的服务, 例如 chargenauth, 以及 daytime 这一节将介绍关于如何通过命令行选项, 以及配置文件 /etc/inetd.conf 来对 inetd 进行配置的一些基础知识。 设置 inetd 是通过 &man.rc.8; 系统启动的。 inetd_enable 选项默认设为 NO, 但可以在安装系统时, 由用户根据需要通过 sysinstall 来打开。 将 inetd_enable="YES"inetd_enable="NO" 写入 /etc/rc.conf 可以启用或禁用系统启动时 inetd 的自动启动。 命令: /etc/rc.d/inetd rcvar 可以显示目前的设置。 此外, 您还可以通过 inetd_flags 参数来向 inetd 传递额外的其它参数。 命令行选项 与多数服务程序类似, inetd 也提供了为数众多的用以控制其行为的参数。 完整的参数列表如下: inetd 这些参数都可以通过 /etc/rc.confinetd_flags 选项来传给 inetd。 默认情况下, inetd_flags 设为 -wW -C 60, 者表示希望为 inetd 的服务启用 TCP wrapping, 并阻止来自同一 IP 每分钟超过 60 次的请求。 初学的用户可能会很高兴地发现这些选项通常并不需要进行修改, 前面提到的速率限制选项在您的服务器收到过量请求的连接时, 则会有效地发挥作用。 完整的参数列表, 可以在 &man.inetd.8; 联机手册中找到。 -c maximum 指定单个服务的最大并发访问数量,默认为不限。 也可以在此服务的具体配置里面通过改掉。 -C rate 指定单个服务一分钟内能被单个IP地址调用的最大次数, 默认不限。也可以在此服务的具体配置里面通过 改掉。 -R rate 指定单个服务一分钟内能被调用的最大次数,默认为256。 设为0 则允许不限次数调用。 -s maximum 指定同一 IP 同时请求同一服务时允许的最大值; 默认值为不限制。 您可以通过 参数来以服务为单位进行限制。 <filename>inetd.conf</filename> 对于 inetd 的配置, 是通过 /etc/inetd.conf 文件来完成的。 在修改了 /etc/inetd.conf 之后, 可以使用下面的命令来强制 inetd 重新读取配置文件: 重新加载 <application>inetd</application> 配置文件 &prompt.root; /etc/rc.d/inetd reload 配置文件中的每一行都是一个独立的服务程序。 在这个文件中, 前面有 # 的内容被认为是注释。 /etc/inetd.conf 文件的格式如下: service-name socket-type protocol {wait|nowait}[/max-child[/max-connections-per-ip-per-minute[/max-child-per-ip]]] user[:group][/login-class] server-program server-program-arguments 下面是针对 IPv4 的 &man.ftpd.8; 服务的例子: ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l service-name 指明各个服务的服务名。其服务名必须与/etc/services中列出的一致。 这将决定inetd会监听哪个port。 一旦有新的服务需要添加,必须先在/etc/services里面添加。 socket-type 可以是streamdgramraw或者 seqpacketstream 用于基于连接的 TCP 服务;而 dgram 则用于使用 UDP 协议的服务。 protocol 下列之一: 协议 说明 tcp, tcp4 TCP IPv4 udp, udp4 UDP IPv4 tcp6 TCP IPv6 udp6 UDP IPv6 tcp46 Both TCP IPv4 and v6 udp46 Both UDP IPv4 and v6 {wait|nowait}[/max-child[/max-connections-per-ip-per-minute[/max-child-per-ip]]] 指明从inetd 里头调用的服务是否可以自己处理socket. socket类型必须使用, 而stream socket daemons, 由于通常使用多线程方式,应当使用 . 通常把多个 socket 丢给单个服务进程, 而 则 会为每个新的 socket 生成一个子进程。 选项能够配置 inetd 能为本服务派生出的最大子进程数量。 如果某特定服务需要限定最高10个实例, 把/10 放到后头就可以了。 指定 /0 表示不限制子进程的数量。 除了 之外, 还有两个选项可以限制来自同一位置到特定服务的最大连接数。 可以限制特定 IP 地址每分钟的总连接数, 例如, 限制任何 IP 地址每分钟最多连接十次。 则可以限制为某一 IP 地址在任何时候所启动的子进程数量。 这些选项对于防止针对服务器有意或无意的资源耗竭和拒绝服务 (DoS) 攻击十分有用。 这个字段中, 必须指定 两者之一。 而 则是可选项。 流式多线程服务, 并且不配置任何 限制时, 其配置为: nowait 同一个服务, 但希望将服务启动的数量限制为十个时, 则是: nowait/10 同样配置, 限制每个 IP 地址每分钟最多连接二十次, 而同时启动的子进程最多十个, 应写作: nowait/10/20 下面是 &man.fingerd.8; 服务的默认配置: finger stream tcp nowait/3/10 nobody /usr/libexec/fingerd fingerd -s 最后这个例子中, 将子进程数限制为 100 个, 而任意 IP 最多同时建立 5 个连接: nowait/100/0/5 user 该开关指定服务将以什么用户身份运行。一般而言,服务运行身份是 root。基于安全目的,可以看到有些服务以 daemon身份,或者是最小特权的 nobody身份运行。 server-program 当连接到来时,执行服务程序的全路径。如果服务是由 inetd内置提供的,以代替。 server-program-arguments 调用到时,该开关 的值通过argv[0]通过传递给服务而工作。 如果命令行为:mydaemon -d,则 mydaemon -d 开关的值。同样的,如果服务是由inetd 内置提供的,这里还是 Security 随安装时所选的模式不同, 许多 inetd 的服务可能已经默认启用。 如果确实不需要某个特定的服务, 则应考虑禁用它。 在 /etc/inetd.conf 中, 将对应服务的那行前面加上 #, 然后 重新加载 inetd 配置 就可以了。 某些服务, 例如 fingerd, 可能是完全不需要的, 因为它们提供的信息可能对攻击者有用。 某些服务在设计时是缺少安全意识的, 或者有过长或压根没有连接请求的超时机制。 这使得攻击者能够通过缓慢地对这些服务发起连接, 并耗尽可用的资源。 对于这种情况, 设置 限制, 来制约服务的行为是个好办法。 默认情况下,TCP wrapping 是打开的。参考 &man.hosts.access.5; 手册,以获得更多关于在各种 inetd 调用的服务上设置TCP限制的信息。 杂项 daytimetimeechodiscardchargen, 以及 auth 都是由 inetd 提供的内建服务。 auth 服务提供了网络身份服务, 它可以配置为提供不同级别的服务, 而其它服务则通常只能简单的打开或关闭。 参考 &man.inetd.8; 手册获得更多信息。 Tom Rhodes Reorganized and enhanced by Bill Swingle Written by 网络文件系统(NFS) NFS 网络文件系统是FreeBSD支持的文件系统中的一种, 也被称为 NFSNFS允许一个系统在网络上与它人共享目录和文件。通过使用NFS,用户和程序可以象访问本地文件 一样访问远端系统上的文件。 以下是NFS最显而易见的好处: 本地工作站使用更少的磁盘空间,因为通常的数据可以存放在一 台机器上而且可以通过网络访问到。 用户不必在每个网络上机器里头都有一个home目录。Home目录 可以被放在NFS服务器上并且在网络上处处可用。 诸如软驱,CDROM,和 &iomegazip; 之类的存储设备可以在网络上面被别的机器使用。 这可以减少整个网络上的可移动介质设备的数量。 <acronym>NFS</acronym>是如何工作的 NFS 至少包括两个主要的部分: 一台服务器, 以及至少一台客户机, 客户机远程地访问保存在服务器上的数据。 要让这一切运转起来, 需要配置并运行几个程序。 服务器必须运行以下服务: NFS server (服务) 文件服务器 UNIX 客户机 rpcbind mountd nfsd 服务 描述 nfsd NFS,为来自NFS客户端的 请求服务。 mountd NFS挂载服务,处理&man.nfsd.8;递交过来的请求。 rpcbind 此服务允许 NFS 客户程序查询正在被 NFS 服务使用的端口。 客户端同样运行一些进程,比如 nfsiodnfsiod处理来自NFS的请求。 这是可选的,而且可以提高性能,对于普通和正确的操作来说并不是必须的。 参考&man.nfsiod.8;手册获得更多信息。 配置<acronym>NFS</acronym> NFS configuration NFS的配置过程相对简单。这个过程只需要 对/etc/rc.conf文件作一些简单修改。 NFS服务器这端,确认/etc/rc.conf 文件里头以下开关都配上了: rpcbind_enable="YES" nfs_server_enable="YES" mountd_flags="-r" 只要NFS服务被置为enable,mountd 就能自动运行。 在客户端一侧,确认下面这个开关出现在 /etc/rc.conf里头: nfs_client_enable="YES" /etc/exports文件指定了哪个文件系统 NFS应该输出(有时被称为共享)。 /etc/exports里面每行指定一个输出的文件系统和 哪些机器可以访问该文件系统。在指定机器访问权限的同时,访问选项 开关也可以被指定。有很多开关可以被用在这个文件里头,不过不会在这 里详细谈。您可以通过阅读&man.exports.5; 手册来发现这些开关。 以下是一些/etc/exports的例子: NFS export examples 下面是一个输出文件系统的例子, 不过这种配置与您所处的网络环境及其配置密切相关。 例如, 如果要把 /cdrom 输出给与服务器域名相同的三台计算机 (因此例子中只有机器名, 而没有给出这些计算机的域名), 或在 /etc/hosts 文件中进行了这种配置。 标志表示把输出的文件系统置为只读。 由于使用了这个标志, 远程系统在输出的文件系统上就不能写入任何变动了。 /cdrom -ro host1 host2 host3 下面的例子可以输出/home给三个以IP地址方式表示的主机。 对于在没有配置DNS服务器的私有网络里头,这很有用。 此外, /etc/hosts 文件也可以用以配置主机名;参看 &man.hosts.5; 。 标记允许子目录被作为挂载点。 也就是说,客户端可以根据需要挂载需要的目录。 /home -alldirs 10.0.0.2 10.0.0.3 10.0.0.4 下面几行输出 /a ,以便两个来自不同域的客户端可以访问文件系统。 标记授权远端系统上的 root 用户在被输出的文件系统上以root身份进行读写。 如果没有特别指定 -maproot=root 标记, 则即使用户在远端系统上是 root 身份, 也不能修改被输出文件系统上的文件。 /a -maproot=root host.example.com box.example.org 为了能够访问到被输出的文件系统,客户端必须被授权。 请确认客户端在您的 /etc/exports 被列出。 /etc/exports 里头,每一行里面,输出信息和文件系统一一对应。 一个远程主机每次只能对应一个文件系统。而且只能有一个默认入口。比如,假设 /usr 是独立的文件系统。这个 /etc/exports 就是无效的: # Invalid when /usr is one file system /usr/src client /usr/ports client 一个文件系统,/usr, 有两行指定输出到同一主机, client. 解决这一问题的正确的格式是: /usr/src /usr/ports client 在同一文件系统中, 输出到指定客户机的所有目录, 都必须写到同一行上。 没有指定客户机的行会被认为是单一主机。 这限制了你可以怎样输出的文件系统, 但对绝大多数人来说这不是问题。 下面是一个有效输出列表的例子, /usr/exports 是本地文件系统: # Export src and ports to client01 and client02, but only # client01 has root privileges on it /usr/src /usr/ports -maproot=root client01 /usr/src /usr/ports client02 # The client machines have root and can mount anywhere # on /exports. Anyone in the world can mount /exports/obj read-only /exports -alldirs -maproot=root client01 client02 /exports/obj -ro 在修改了 /etc/exports 文件之后, 就必须让 mountd 服务重新检查它, 以便使修改生效。 一种方法是通过给正在运行的服务程序发送 HUP 信号来完成: &prompt.root; kill -HUP `cat /var/run/mountd.pid` 或指定适当的参数来运行 mountd &man.rc.8; 脚本: - &prompt.root; /etc/rc.d/mountd reload + &prompt.root; /etc/rc.d/mountd onereload 关于使用 rc 脚本的细节, 请参见 另外, 系统重启动可以让 FreeBSD 把一切都弄好。 尽管如此, 重启不是必须的。 以 root 身份执行下面的命令可以搞定一切。 NFS 服务器端: &prompt.root; rpcbind &prompt.root; nfsd -u -t -n 4 &prompt.root; mountd -r NFS 客户端: &prompt.root; nfsiod -n 4 现在每件事情都应该就绪,以备挂载一个远端文件系统。 在这些例子里头, 服务器名字将是:server ,而客户端的名字将是: client。 如果您只打算临时挂载一个远端文件系统或者只是打算作测试配置正确与否, 只要在客户端以 root 身份执行下面的命令: NFS mounting &prompt.root; mount server:/home /mnt 这条命令会把服务端的 /home 目录挂载到客户端的 /mnt 上。 如果配置正确,您应该可以进入客户端的 /mnt 目录并且看到所有服务端的文件。 如果您打算让系统每次在重启动的时候都自动挂载远端的文件系统,把那个文件系统加到 /etc/fstab 文件里头去。下面是例子: server:/home /mnt nfs rw 0 0 &man.fstab.5; 手册里有所有可用的开关。 + + + + 某些应用程序 (例如 mutt) + 需要文件上锁支持才能正常运行。 在使用 + NFS 时, 可以用 rpc.lockd + 来支持文件上锁功能。 要启用它, + 需要在服务器和客户机的 /etc/rc.conf 中加入 + (假定两端均已配好了 NFS): + + rpc_lockd_enable="YES" +rpc_statd_enable="YES" + + 然后使用下述命令启动该程序: + + &prompt.root; /etc/rc.d/nfslocking start + + 如果并不需要真的在 NFS 客户机和 + NFS 服务器间确保上锁的语义, + 可以让 NFS 客户机在本地上锁, + 方法是使用 &man.mount.nfs.8; 时指定 参数。 + 请参见 &man.mount.nfs.8; 联机手册以了解更多细节。 + + + 实际应用 NFS 有很多实际应用。下面是比较常见的一些: NFS uses 多个机器共享一台CDROM或者其他设备。这对于在多台机器中安装软件来说更加便宜跟方便。 在大型网络中,配置一台中心 NFS 服务器用来放置所有用户的home目录可能会带来便利。 这些目录能被输出到网络以便用户不管在哪台工作站上登录,总能得到相同的home目录。 几台机器可以有通用的/usr/ports/distfiles 目录。 这样的话,当您需要在几台机器上安装port时,您可以无需在每台设备上下载而快速访问源码。 Wylie Stilwell Contributed by Chern Lee Rewritten by 通过 <application>amd</application> 自动地挂接 amd 自动挂接服务 &man.amd.8; (自动挂接服务) 能够自动地在访问时挂接远程的文件系统。 如果文件系统在一段时间之内没有活动, 则会被 amd 自动卸下。 通过使用 amd, 能够提供一个持久挂接以外的选择, 而后者往往需要列入 /etc/fstab amd 通过将自己以 NFS 服务器的形式, 附加到 /host/net 目录上来工作。 当访问这些目录中的文件时, amd 将查找相应的远程挂接点, 并自动地挂接。 /net 用于挂接远程 IP 地址上导出的文件系统, 而 /host 则用于挂接远程主机名上的文件系统。 访问 /host/foobar/usr 中的文件, 相当于告诉 amd 尝试挂接在主机 foobar 上导出的 /usr 通过 <application>amd</application> 来挂接导出的文件系统 您可以通过使用 showmount 命令来查看远程主机上导出的文件系统。 例如, 要查看 foobar 上导出的文件系统, 可以用: &prompt.user; showmount -e foobar Exports list on foobar: /usr 10.10.10.0 /a 10.10.10.0 &prompt.user; cd /host/foobar/usr 如同在前面例子中所看到的, showmount 显示了导出的 /usr。 当进入 /host/foobar/usr 这个目录时, amd 将尝试解析主机名 foobar 并自动地挂接需要的文件系统导出。 amd 可以通过启动脚本来启动, 方法是在 /etc/rc.conf 中加入: amd_enable="YES" 除此之外, 还可以给 amd 通过 amd_flags 选项来传递额外的参数。 默认情况下, amd_flags 为: amd_flags="-a /.amd_mnt -l syslog /host /etc/amd.map /net /etc/amd.map" /etc/amd.map 文件定义了挂接导出文件系统时所使用的默认选项。 /etc/amd.conf 文件, 则定义了更多关于 amd 的高级功能选项。 请参考 &man.amd.8; 和 &man.amd.conf.5; 联机手册, 以了解进一步的情况。 John Lind Contributed by 与其他系统集成时的常见问题 某些特定的 ISA PC 系统上的以太网适配器上有一些限制, 这些限制可能会导致严重的网络问题, 特别是与 NFS 配合使用时。 这些问题并非 FreeBSD 所特有的, 但 FreeBSD 系统会受到这些问题的影响。 这样的问题, 几乎总是在当 (FreeBSD) PC 系统与高性能的工作站, 例如 Silicon Graphics, Inc., 和 Sun Microsystems, Inc. 的工作站联网时发生。 NFS 挂接能够正常工作, 而且一些操作也可能成功, 但服务器会很快变得对客户机不太理会, 虽然对其他客户机的请求仍然能够正常处理。 这种情况通常发生在客户端, 无论它是一个 FreeBSD 系统或是终端。 在许多系统上, 一旦发生了这样的问题, 通常没办法正常地关闭客户机。 唯一的办法通常是让终端复位, 因为这一 NFS 状况没有办法被解决。 尽管 正确的 解决办法, 是为 FreeBSD 系统配备一块高性能的、 适用的以太网适配器, 然而也有办法绕过问题并得到相对满意的结果。 如果 FreeBSD 系统是 服务器, 则在客户机挂接时, 应该指定 。 如果 FreeBSD 系统是 客户机, 则应加入 参数。 这些选项可以通过在对应的 fstab 的第四个字段加入, 以便让客户机能够自动地挂接, 或者通过 &man.mount.8; 的 参数在手工挂接时指定。 还需要注意的是另一个问题, 有时会被误认为是和上面一样的问题。 这个问题多见于 NFS 服务器和客户机在不同的网络上时。 如果是这种情况, 一定要 确定 您的路由器确实把必需的 UDP 信息路由到了目的地, 否则您将什么也做不了。 下面的例子中, fastws 是主机 (接口) 的名字, 它是一台高性能的终端, 而 freebox 是另一台主机 (接口) 的名字, 它是一个使用较低性能的以太网适配器的 FreeBSD 系统。 同时, /sharedfs 将被导出成为 NFS 文件系统 (参见 &man.exports.5;), 而 /project 将是客户机上挂接这一导出文件系统的挂接点。 所有的应用场景中, 请注意附加选项, 例如 以及 可能是您的应用所需要的。 关于 FreeBSD 系统 (freebox) 作为客户机的示范 /etc/fstab 文件, 见于 freebox 之上: fastws:/sharedfs /project nfs rw,-r=1024 0 0 freebox 上手工挂接: &prompt.root; mount -t nfs -o -r=1024 fastws:/sharedfs /project 以 FreeBSD 系统作为服务器的例子, 是 fastws 上的 /etc/fstab freebox:/sharedfs /project nfs rw,-w=1024 0 0 fastws 上手工挂接的命令是: &prompt.root; mount -t nfs -o -w=1024 freebox:/sharedfs /project 几乎所有的 16-位 以太网控制器, 都能够在没有上述读写尺寸限制的情况下正常工作。 对于那些关心到底是什么问题的人, 下面是失败如何发生的解释, 同时这也说明了为什么这是一个无法恢复的问题。 典型情况下, NFS 会使用一个 为单位进行操作, 其尺寸是 8 K (虽然它可能会将操作分成更小尺寸的分片)。 由于最大的以太网包尺寸大约是 1500 字节, 因此 NFS 会分成多个以太网包, 虽然在更高层的代码看来它仍然是一个完整的单元, 并在接收方重新组装, 作为一个整体来 确认。 高性能的工作站, 可以将构成 NFS 单元的包迅速发出, 其节奏会快到标准允许的最大限度。 在容量较小的卡上, 后来的包会冲掉同一单元内的较早的包, 因而整个单元无法被重建或确认。 其结果是, 工作站将超时并重试, 但仍然是完整的 8 K 单元, 这一过程将无休止地重复下去。 如果将单元尺寸限制在以太网包尺寸之下, 我们就能够确保每一个以太网包都能够被独立地接收和确认, 从而避免了上面的死锁情形。 溢出在高性能工作站将数据库投向 PC 系统时仍会发生, 但在更好的网卡上, 能够保证这类溢出不会在每一个 NFS 单元 上都发生。 当出现溢出时, 被影响的单元被重传, 因而此时有很大的机会它将被正确接收、 重组, 并确认。 Bill Swingle Written by Eric Ogren Enhanced by Udo Erdelhoff 网络信息服务 (NIS/YP) 它是什么? NIS Solaris HP-UX AIX Linux NetBSD OpenBSD NIS, 表示网络信息服务 (Network Information Services), 最初由 Sun Microsystems 开发, 用于 &unix; (最初是 &sunos;) 系统的集中管理。 目前, 它基本上已经成为了业界标准; 所有主流的类 &unix; 系统 (&solaris;, HP-UX, &aix;, Linux, NetBSD, OpenBSD, FreeBSD, 等等) 都支持 NIS 黄页 (yellow pages)NIS NIS 也就是人们所熟知的黄页(Yellow Pages), 但由于商标的问题, Sun 将其改名为现在的名字。 旧的术语 (以及 yp), 仍然经常可以看到, 并被广泛使用。 NIS 这是一个基于 RPC 的客户机/服务器系统, 它允许在一个 NIS 域中的一组机器共享一系列配置文件。 这样, 系统管理员就可以配置只包含最基本配置数据的 NIS 客户机系统, 并在单点上增加、 删除或修改配置数据。 Windows NT 尽管实现的内部细节截然不同, 这和 &windowsnt; 域系统非常类似, 以至于可以将两者的基本功能相互类比。 您应该知道的术语和进程 有一系列术语和重要的用户进程将在您在 FreeBSD 上实现 NIS 时用到, 无论是在创建 NIS 服务器, 或作为 NIS 客户机: rpcbind portmap 术语 说明 NIS 域名 NIS 主服务器和所有其客户机 (包括从服务器) 会使用同一 NIS 域名。 和 &windowsnt; 域名类似, NIS 域名与 DNS 无关。 rpcbind 必须运行这个程序, 才能够启用 RPC (远程过程调用, NIS 用到的一种网络协议)。 如果没有运行 rpcbind, 则没有办法运行 NIS 服务器, 或作为 NIS 客户机。 ypbind 绑定(bind) NIS 客户机到它的 NIS 服务器上。 这样, 它将从系统中获取 NIS 域名, 并使用 RPC 连接到服务器上。 ypbind 是 NIS 环境中, 客户机-服务器通讯的核心; 如果客户机上的 ypbind 死掉的话, 它将无法访问 NIS 服务器。 ypserv 只应在 NIS 服务器上运行它; 这是 NIS 的服务器进程。 如果 &man.ypserv.8; 死掉的话, 则服务器将不再具有响应 NIS 请求的能力 (此时, 如果有从服务器的话, 则会接管操作)。 有一些 NIS 的实现 (但不是 FreeBSD 的这个) 的客户机上, 如果之前用过一个服务器, 而那台服务器死掉的话, 并不尝试重新连接到另一个服务器。 通常, 发生这种情况时, 唯一的办法就是重新启动服务器进程 (或者, 甚至重新启动服务器) 或客户机上的 ypbind 进程。 rpc.yppasswdd 另一个只应在 NIS 主服务器上运行的进程; 这是一个服务程序, 其作用是允许 NIS 客户机改变它们的 NIS 口令。 如果没有运行这个服务, 用户将必须登录到 NIS 主服务器上, 并在那里修改口令。 它是如何工作的? 在 NIS 环境中, 有三种类型的主机: 主服务器, 从服务器, 以及客户机。 服务器的作用是充当主机配置信息的中央数据库。 主服务器上保存着这些信息的权威副本, 而从服务器则是保存这些信息的冗余副本。 客户机依赖于服务器向它们提供这些信息。 许多文件的信息可以通过这种方式来共享。 通常情况下, master.passwdgroup, 以及 hosts 是通过 NIS 分发的。 无论什么时候, 如果客户机上的某个进程请求这些本应在本地的文件中的资料的时候, 它都会向所绑定的 NIS 服务器发出请求, 而不使用本地的版本。 机器类型 NIS 主服务器 一台 NIS 主服务器。 这台服务器, 和 &windowsnt; 域控制器类似, 会维护所有 NIS 客户机所使用的文件。 passwdgroup, 以及许多其他 NIS 客户机所使用的文件, 都被存放到主服务器上。 可以将一台 NIS 主服务器用在多个 NIS 域中。 然而, 本书不打算对这种配置进行介绍, 因为这种配置, 通常只出现在小规模的 NIS 环境中。 NIS 从服务器 NIS 从服务器。 这一概念, 与 &windowsnt; 的备份域控制器类似。 NIS 从服务器, 用于维护 NIS 主服务器的数据文件副本。 NIS 从服务器提供了一种冗余, 这在许多重要的环境中是必需的。 此外, 它也帮助减轻了主服务器的负荷: NIS 客户机总是挂接到最先响应它们的 NIS 服务器上, 而这也包括来自从服务器的响应。 NIS 客户机 NIS 客户机。 NIS 客户机, 和多数 &windowsnt; 工作站类似, 通过 NIS 服务器 (或对于 &windowsnt; 工作站, 则是 &windowsnt; 域控制器) 来完成登录时的身份验证过程。 使用 NIS/YP 这一节将通过实例介绍如何配置 NIS 环境。 - 这一节假定您正运行的是 - FreeBSD 3.3 或更高版本。 这里给出的方法 - 或许 可以在 FreeBSD - 3.0 以上的其他版本上使用, 但不保证。 - - 规划 假定您正在管理大学中的一个小型实验室。 在这个实验室中, 有 15 台 FreeBSD 机器, 目前尚没有集中的管理点; 每一台机器上有自己的 /etc/passwd/etc/master.passwd。 这些文件通过人工干预的方法来保持与其他机器上版本的同步; 目前, 如果您在实验室中增加一个用户, 将不得不在所有 15 台机器上手工执行 adduser 命令。 毋庸置疑, 这一现状必须改变, 因此您决定将整个实验室转为使用 NIS, 并使用两台机器作为服务器。 因此, 实验室的配置应该是这样的: 机器名 IP 地址 机器的角色 ellington 10.0.0.2 NIS 主服务器 coltrane 10.0.0.3 NIS 从服务器 basie 10.0.0.4 教员工作站 bird 10.0.0.5 客户机 cli[1-11] 10.0.0.[6-17] 其他客户机 如果您是首次配置 NIS, 仔细思考如何进行规划就十分重要。 无论您的网络的大小如何, 都必须进行几个决策。 选择 NIS 域名 NIS 域名 这可能不是您过去使用的 域名(domainname)。 它的规范的叫法, 应该是 NIS 域名。 当客户机广播对此信息的请求时, 它会将 NIS 域的名字作为请求的一部分发出。 这样, 统一网络上的多个服务器, 就能够知道谁应该回应请求。 您可以把 NIS 域名想象成以某种方式相关的一组主机的名字。 一些机构会选择使用它们的 Internet 域名来作为 NIS 域名。 并不推荐这样做, 因为在调试网络问题时, 这可能会导致不必要的困扰。 NIS 域名应该是在您网络上唯一的, 并且有助于了解它所描述的到底是哪一组机器。 例如对于 Acme 公司的美工部门, 可以考虑使用 acme-art 这样的 NIS 域名。 在这个例子中, 您使用的域名是 test-domain SunOS 然而, 某些操作系统 (最著名的是 &sunos;) 会使用其 NIS 域名作为 Internet 域名。 如果您的网络上存在包含这类限制的机器, 就 必须 使用 Internet 域名来作为您的 NIS 域名。 服务器的物理要求 选择 NIS 服务器时, 需要时刻牢记一些东西。 NIS 的一个不太好的特性就是其客户机对于服务器的依赖程度。 如果客户机无法与其 NIS 域的服务器联系, 则这台机器通常会陷于不可用的状态。 缺少用户和组信息, 会使绝大多数系统进入短暂的冻结状态。 基于这样的考虑, 您需要选择一台不经常重新启动, 或用于开发的机器来承担其责任。 如果您的网络不太忙, 也可以使用运行着其他服务的机器来安放 NIS 服务, 只是需要注意, 一旦 NIS 服务器不可用, 则 所有 的 NIS 客户机都会受到影响。 NIS 服务器 所有的 NIS 信息的正规版本, 都被保存在一台单独的称作 NIS 主服务器的机器上。 用于保存这些信息的数据库, 称为 NIS 映射(map)。 在 FreeBSD 中, 这些映射被保存在 /var/yp/[domainname] 里, 其中 [domainname] 是提供服务的 NIS 域的名字。 一台 NIS 服务器, 可以同时支持多个域, 因此可以建立很多这样的目录, 所支撑一个域对应一个。 每一个域都会有一组独立的映射。 NIS 主和从服务器, 通过 ypserv 服务程序来处理所有的 NIS 请求。 ypserv 有责任接收来自 NIS 客户机的请求, 翻译请求的域, 并将名字映射为相关的数据库文件的路径, 然后将来自数据库的数据传回客户机。 配置 NIS 主服务器 NIS 服务器配置 配置主 NIS 服务器相对而言十分的简单, 而其具体步骤则取决于您的需要。 FreeBSD 提供了一步到位的 NIS 支持。 您需要做的全部事情, 只是在 /etc/rc.conf 中加入一些配置, 其他工作会由 FreeBSD 完成。 nisdomainname="test-domain" 这一行将在网络启动 (例如重新启动) 时, 把 NIS 域名配置为 test-domain nis_server_enable="YES" 这将要求 FreeBSD 在网络子系统启动之后立即启动 NIS 服务进程。 nis_yppasswdd_enable="YES" 这将启用 rpc.yppasswdd 服务程序, 如前面提到的, 它允许用户在客户机上修改自己的 NIS 口令。 随 NIS 配置的不同, 可能还需要增加其他一些项目。 请参见 关于 NIS 服务器同时充当 NIS 客户机 这一节, 以了解进一步的情况。 现在, 所需要做的最后的工作是以超级用户身份执行 /etc/netstart 命令。 这将依据 /etc/rc.conf 为您配置好所有的东西。 初始化 NIS 映射 NIS 映射 NIS 映射 是一些数据库文件, 它们位于 /var/yp 目录中。 这些文件基本上都是根据 NIS 主服务器的 /etc 目录自动生成的, 唯一的例外是: /etc/master.passwd 文件。 一般来说, 您会有非常充分的理由不将 root 以及其他管理帐号的口令发到所有 NIS 域上的服务器上。 因此, 在开始初始化 NIS 映射之前, 我们应该: &prompt.root; cp /etc/master.passwd /var/yp/master.passwd &prompt.root; cd /var/yp &prompt.root; vi master.passwd 这里, 删除掉和系统有关的帐号对应的项 (binttykmemgames, 等等), 以及其他不希望被扩散到 NIS 客户机的帐号 (例如 root 和任何其他 UID 0 (超级用户) 的帐号)。 确认 /var/yp/master.passwd 这个文件是同组用户, 以及其他用户不可读的 (模式 600)! 如果需要的话, 用 chmod 命令来改它。 Tru64 UNIX 完成这些工作之后, 就可以初始化 NIS 映射了! FreeBSD 提供了一个名为 ypinit 的脚本来帮助您完成这项工作 (详细信息, 请见其联机手册)。 请注意, 这个脚本在绝大多数 &unix; 操作系统上都可以找到, 但并不是所有操作系统的都提供。 在 Digital UNIX/Compaq Tru64 UNIX 上它的名字是 ypsetup。 由于我们正在生成的是 NIS 主服务器的映射, 因此应该使用 ypinit 参数。 如果已经完成了上述步骤, 要生成 NIS 映射, 只需执行: ellington&prompt.root; ypinit -m test-domain Server Type: MASTER Domain: test-domain Creating an YP server will require that you answer a few questions. Questions will all be asked at the beginning of the procedure. Do you want this procedure to quit on non-fatal errors? [y/n: n] n Ok, please remember to go back and redo manually whatever fails. If 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: coltrane next host to add: ^D The current list of NIS servers looks like this: ellington coltrane Is this correct? [y/n: y] y [..output from map generation..] NIS Map update completed. ellington has been setup as an YP master server without any errors. ypinit 应该会根据 /var/yp/Makefile.dist 来创建 /var/yp/Makefile 文件。 创建完之后, 这个文件会假定您正在操作只有 FreeBSD 机器的单服务器 NIS 环境。 由于 test-domain 还有一个从服务器, 您必须编辑 /var/yp/Makefile ellington&prompt.root; vi /var/yp/Makefile 应该能够看到这样一行, 其内容是 NOPUSH = "True" (如果还没有注释掉的话)。 配置 NIS 从服务器 NIS 从服务器 配置 NIS 从服务器, 甚至比配置主服务器还要简单。 登录到从服务器上, 并按照前面的方法, 编辑 /etc/rc.conf 文件。 唯一的区别是, 在运行 ypinit 时需要使用 参数。 这里的 选项, 同时要求提供 NIS 主服务器的名字, 因此我们的命令行应该是: coltrane&prompt.root; ypinit -s ellington test-domain Server Type: SLAVE Domain: test-domain Master: ellington Creating an YP server will require that you answer a few questions. Questions will all be asked at the beginning of the procedure. Do you want this procedure to quit on non-fatal errors? [y/n: n] n Ok, please remember to go back and redo manually whatever fails. If 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. 现在应该会有一个叫做 /var/yp/test-domain 的目录。 在这个目录中, 应该保存 NIS 主服务器上的映射的副本。 接下来需要确定这些文件都及时地同步更新了。 在从服务器上, 下面的 /etc/crontab 项将帮助您确保这一点: 20 * * * * root /usr/libexec/ypxfr passwd.byname 21 * * * * root /usr/libexec/ypxfr passwd.byuid 这两行将强制从服务器将映射与主服务器同步。 由于主服务器会尝试确保所有其 NIS 映射的变动都知会从服务器, 因此这些项并不是绝对必需的, 尽管如此, 强制更新能够保证这些对依赖于服务器的系统至关重要的口令信息及时地同步。 同时, 在繁忙的网络上, 有时也会出现映射同步更新不完全的情况。 现在, 在从服务器上执行 /etc/netstart, 就可以启动 NIS 服务了。 NIS 客户机 NIS 客户机会通过 ypbind 服务程序来与特定的 NIS 服务器建立一种称作绑定的联系。 ypbind 会检查系统的默认域 (这是通过 domainname 命令来设置的), 并开始在本地网络上广播 RPC 请求。 这些请求会指定 ypbind 尝试绑定的域名。 如果已经配置了服务器, 并且这些服务器接到了广播, 它将回应 ypbind, 后者则记录服务器的地址。 如果有多个可用的服务器 (例如一个主服务器, 加上多个从服务器), ypbind 将使用第一个响应的地址。 从这一时刻开始, 客户机会把所有的 NIS 请求直接发给那个服务器。 ypbind 偶尔会 ping 服务器以确认其仍然在正常运行。 如果在合理的时间内没有得到响应, 则 ypbind 会把域标记为未绑定, 并再次发起广播, 以期找到另一台服务器。 设置 NIS 客户机 NIS 客户机配置 配置一台 FreeBSD 机器作为 NIS 客户机是非常简单的。 编辑 /etc/rc.conf 文件, 并在其中加上下面几行, 以设置 NIS 域名, 并在网络启动时启动 ypbind nisdomainname="test-domain" nis_client_enable="YES" 要从 NIS 服务器导入所有的口令项, 需要从您的 /etc/master.passwd 文件中删除所有用户, 并使用 vipw 在这个文件的最后一行加入: +::::::::: 这一行将让 NFS 服务器的口令映射中的帐号能够登录。 也有很多修改这一行来配置 NIS 客户机的办法。 请参见稍后的 netgroups 小节 以了解进一步的情况。 要了解更多信息, 可以参阅 O'Reilly 的 Managing NFS and NIS 这本书。 需要至少保留一个本地帐号 (也就是不通过 NIS 导入) 在您的 /etc/master.passwd 文件中, 而这个帐号应该是 wheel 组的成员。 如果 NIS 发生不测, 这个帐号可以用来远程登录, 成为 root, 并修正问题。 要从 NIS 服务器上导入组信息, 需要在 /etc/group 文件末尾加入: +:*:: 完成这些步骤之后, 就应该可以通过运行 ypcat passwd 来看到 NIS 服务器的口令映射了。 NIS 的安全性 基本上, 任何远程用户都可以发起一个 RPC 到 &man.ypserv.8; 并获得您的 NIS 映射的内容, 如果远程用户了解您的域名的话。 要避免这类未经授权的访问, &man.ypserv.8; 支持一个称为 securenets 的特性, 用以将访问限制在一组特定的机器上。 在启动过程中, &man.ypserv.8; 会尝试从 /var/yp/securenets 中加载 securenet 信息。 这个路径随 参数改变。 这个文件包含了一些项, 每一项中包含了一个网络标识和子网掩码, 中间用空格分开。 以 # 开头的行会被认为是注释。 示范的 securenets 文件如下所示: # allow connections from local host -- mandatory 127.0.0.1 255.255.255.255 # allow connections from any host # on the 192.168.128.0 network 192.168.128.0 255.255.255.0 # allow connections from any host # between 10.0.0.0 to 10.0.15.255 # this includes the machines in the testlab 10.0.0.0 255.255.240.0 如果 &man.ypserv.8; 接到了来自匹配上述任一规则的地址的请求, 则它会正常处理请求。 反之, 则请求将被忽略, 并记录一条警告信息。 如果 /var/yp/securenets 文件不存在, 则 ypserv 会允许来自任意主机的请求。 ypserv 程序也支持 Wietse Venema 的 TCP Wrapper 软件包。 这样, 管理员就能够使用 TCP Wrapper 的配置文件来代替 /var/yp/securenets 完成访问控制。 尽管这两种访问控制机制都能够提供某种程度的安全, 但是, 和特权端口检查一样, 它们无法避免 IP 伪造 攻击。 您的防火墙应该阻止所有与 NIS 有关的访问。 使用 /var/yp/securenets 的服务器, 可能会无法为某些使用陈旧的 TCP/IP 实现的 NIS 客户机服务。 这些实现可能会在广播时, 将主机位都设置为 0, 或在计算广播地址时忽略子网掩码。 尽管这些问题可以通过修改客户机的配置来解决, 其他一些问题也可能导致不得不淘汰那些客户机系统, 或者不使用 /var/yp/securenets 在使用陈旧的 TCP/IP 实现的系统上, 使用 /var/yp/securenets 是一个非常糟糕的做法, 因为这将导致您的网络上的 NIS 丧失大部分功能。 TCP Wrappers 使用 TCP Wrapper 软件包, 会导致您的 NIS 服务器的响应延迟增加。 而增加的延迟, 则可能会导致客户端程序超时, 特别是在繁忙的网络或者很慢的 NIS 服务器上。 如果您的某个客户机因此而产生一些异常, 则应将这些客户机变为 NIS 从服务器, 并强制其绑定自己。 不允许某些用户登录 在我们的实验室中, basie 这台机器, 是一台教员专用的工作站。 我们不希望将这台机器拿出 NIS 域, 而主 NIS 服务器上的 passwd 文件, 则同时包含了教员和学生的帐号。 这时应该怎么做? 有一种办法来禁止特定的用户登录机器, 即使他们身处 NIS 数据库之中。 要完成这一工作, 只需要在客户机的 /etc/master.passwd 文件中加入一些 -username 这样的项, 其中, username 是希望禁止登录的用户名。 一般推荐使用 vipw 来完成这个工作, 因为 vipw 会对您在 /etc/master.passwd 文件上所作的修改进行合法性检查, 并在编辑结束时重新构建口令数据库。 例如, 如果希望禁止用户 bill 登录 basie, 我们应该: basie&prompt.root; vipw [在末尾加入 -bill, 并退出] vipw: rebuilding the database... vipw: done basie&prompt.root; cat /etc/master.passwd root:[password]:0:0::0:0:The super-user:/root:/bin/csh toor:[password]:0:0::0:0:The other super-user:/root:/bin/sh daemon:*:1:1::0:0:Owner of many system processes:/root:/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; Udo Erdelhoff Contributed by 使用 Netgroups netgroups 前一节介绍的方法, 在您需要为非常少的用户和/或机器进行特殊的规则配置时还算凑合。 在更大的网络上, 您 一定会 忘记禁止某些用户登录到敏感的机器上, 或者, 甚至必须单独地修改每一台机器的配置, 因而丢掉了 NIS 最重要的优越性: 集中式 管理。 NIS 开发人员为这个问题提供的解决方案, 被称作 netgroups。 它们的作用和语义, 基本上可以等同于 &unix; 文件系统上使用的组。 主要的区别是它们没有数字化的 ID, 以及可以在 netgroup 中同时包含用户和其他 netgroup。 Netgroups 被设计用来处理大的、 复杂的包含数百用户和机器的网络。 一方面, 在您不得不处理这类情形时, 这是一个很有用的东西。 而另一方面, 它的复杂性又使得通过非常简单的例子很难解释 netgroup 到底是什么。 这一节的其余部分的例子将展示这个问题。 假设您在实验室中成功地部署 NIS 引起了上司的兴趣。 您接下来的任务是将 NIS 域扩展, 以覆盖校园中的一些其他的机器。 下面两个表格中包括了新用户和新机器, 及其简要说明。 用户名 说明 alpha, beta IT 部门的普通雇员 charlie, delta IT 部门的学徒 echo, foxtrott, golf, ... 普通雇员 able, baker, ... 目前的实习生 机器名 说明 war, death, famine, pollution 最重要的服务器。 只有 IT 部门的雇员才允许登录这些机器。 pride, greed, envy, wrath, lust, sloth 不太重要的服务器, 所有 IT 部门的成员, 都可以登录这些机器。 one, two, three, four, ... 普通工作站。 只有 真正的 雇员才允许登录这些机器。 trashcan 一台不包含关键数据的旧机器。 即使是实习生, 也允许登录它。 如果您尝试通过一个一个地阻止用户来实现这些限制, 就需要在每一个系统的 passwd 文件中, 为每一个不允许登录该系统的用户添加对应的 -user 行。 如果忘记了任何一个, 就可能会造成问题。 在进行初始配置时, 正确地配置也许不是什么问题, 但随着日复一日地添加新用户, 总有一天 您会忘记为新用户添加某个行。 毕竟, Murphy 是一个乐观的人。 使用 netgroups 来处理这一状况可以带来许多好处。 不需要单独地处理每一个用户; 您可以赋予用户一个或多个 netgroups 身份, 并允许或禁止某一个 netgroup 的所有成员登录。 如果添加了新的机器, 只需要定义 netgroup 的登录限制。 如果增加了新用户, 也只需要将用户加入一个或多个 netgroup。 这些变化是相互独立的: 不再需要 对每一个用户和机器执行 ……。 如果您的 NIS 配置经过了谨慎的规划, 就只需要修改一个中央的配置文件, 就能够允许或禁止访问某台机器的权限了。 第一步是初始化 NIS 映射 netgroup。 FreeBSD 的 &man.ypinit.8; 默认情况下并不创建这个映射, 但它的 NIS 实现能够在创建这个映射之后立即对其提供支持。 要创建空映射, 简单地输入 ellington&prompt.root; vi /var/yp/netgroup 并开始增加内容。 在我们的例子中, 至少需要四个 nergruop: IT 雇员, IT 学徒, 普通雇员和实习生。 IT_EMP (,alpha,test-domain) (,beta,test-domain) IT_APP (,charlie,test-domain) (,delta,test-domain) USERS (,echo,test-domain) (,foxtrott,test-domain) \ (,golf,test-domain) INTERNS (,able,test-domain) (,baker,test-domain) IT_EMP, IT_APP 等等, 是 netgroup 的名字。 每一个括号中的组中, 都有一些用户帐号。 组中的三个字段是: 在哪些机器上能够使用这些项。 如果不指定主机名, 则项在所有机器上都有效。 如果指定了主机, 则很容易造成混淆。 属于这个 netgroup 的帐号。 帐号的 NIS 域。 您可以从其他 NIS 域中把帐号导入到您的 netgroup 中, 如果您管理多个 NIS 域的话。 每一个字段都可以包括通配符。 参见 &man.netgroup.5; 了解更多细节。 netgroups Netgroup 的名字一般来说不应超过 8 个字符, 特别是当您的 NIS 域中有机器打算运行其它操作系统的时候。 名字是区分大小写的; 使用大写字母作为 netgroup 的名字, 能够让您更容易地区分用户、 机器和 netgroup 的名字。 某些 NIS 客户程序 (FreeBSD 以外的那些) 可能无法处理含有大量项的 netgroup。 例如, 某些早期版本的 &sunos; 会在 netgroup 中包含多于 15 个 时出现问题。 要绕过这个问题, 可以创建多个 子netgroup,每一个中包含少于 15 个用户, 以及一个包含所有 子netgroup 的真正的 netgroup: BIGGRP1 (,joe1,domain) (,joe2,domain) (,joe3,domain) [...] BIGGRP2 (,joe16,domain) (,joe17,domain) [...] BIGGRP3 (,joe31,domain) (,joe32,domain) BIGGROUP BIGGRP1 BIGGRP2 BIGGRP3 如果需要超过 225 个用户, 可以继续重复上面的过程。 激活并分发新的 NIS 映射非常简单: ellington&prompt.root; cd /var/yp ellington&prompt.root; make 这个操作会生成三个 NIS 映射, 即 netgroupnetgroup.byhostnetgroup.byuser。 用 &man.ypcat.1; 可以检查这些 NIS 映射是否可用了: ellington&prompt.user; ypcat -k netgroup ellington&prompt.user; ypcat -k netgroup.byhost ellington&prompt.user; ypcat -k netgroup.byuser 第一个命令的输出, 应该与 /var/yp/netgroup 的内容相近。 第二个命令, 如果没有指定本机专有的 netgroup, 则应该没有输出。 第三个命令, 则用于显示某个用户对应的 netgroup 列表。 客户机的设置也很简单。 要配置服务器 war, 只需进入 &man.vipw.8; 并把 +::::::::: 改为 +@IT_EMP::::::::: 现在, 只有 netgroup IT_EMP 中定义的用户会被导入到 war 的口令数据库中, 因此只有这些用户能够登录。 不过, 这个限制也会作用于 shell 的 ~, 以及所有在用户名和数字用户 ID 之间实施转换的函数的功能。 换言之, cd ~user 将不会正常工作, 而 ls -l 也将显示数字的 ID 而不是用户名, 并且 find . -user joe -print 将失败, 并给出 No such user 的错误信息。 要修正这个问题, 您需要导入所有的用户项, 而 不允许他们登录服务器 这可以通过在 /etc/master.passwd 加入另一行来完成。 这行的内容是: +:::::::::/sbin/nologin, 意思是 导入所有的项, 但导入项的 shell 则替换为 /sbin/nologin。 通过在 /etc/master.passwd 中增加默认值, 可以替换掉 passwd 中的任意字段。 务必确认 +:::::::::/sbin/nologin 这一行出现在 +@IT_EMP::::::::: 之后。 否则, 所有从 NIS 导入的用户帐号将以 /sbin/nologin 作为登录 shell。 完成上面的修改之后, 在 IT 部门有了新员工时, 只需修改一个 NIS 映射就足够了。 您也可以用类似的方法, 在不太重要的服务器上, 把先前本地版本的 /etc/master.passwd 中的 +::::::::: 改为: +@IT_EMP::::::::: +@IT_APP::::::::: +:::::::::/sbin/nologin 相关的用于普通工作站的配置则应是: +@IT_EMP::::::::: +@USERS::::::::: +:::::::::/sbin/nologin 一切平安无事, 直到数周后, 有一天策略发生了变化: IT 部门也开始招收实习生了。 IT 实习生允许使用普通的终端, 以及不太重要的服务器; 而 IT 学徒, 则可以登录主服务器。 您增加了新的 netgroup IT_INTERN, 以及新的 IT 实习生到这个 netgroup 并开始修改每一台机器上的配置…… 老话说得好:牵一发, 动全身 NIS 通过 netgroup 来建立 netgroup 的能力, 正可以避免这样的情形。 一种可能的方法是建立基于角色的 netgroup。 例如, 您可以创建称为 BIGSRV 的 netgroup, 用于定义最重要的服务器上的登录限制, 以及另一个成为 SMALLSRV 的 netgroup, 用以定义次重要的服务器, 以及第三个, 用于普通工作站的 netgroup USERBOX。 这三个 netgroup 中的每一个, 都包含了允许登录到这些机器上的所有 netgroup。 您的 NIS 映射中的新项如下所示: BIGSRV IT_EMP IT_APP SMALLSRV IT_EMP IT_APP ITINTERN USERBOX IT_EMP ITINTERN USERS 这种定义登录限制的方法, 在您能够将机器分组并加以限制的时候可以工作的相当好。 不幸的是, 这是种例外, 而非常规情况。 多数时候, 需要按机器去定义登录限制。 与机器相关的 netgroup 定义, 是处理上述策略改动的另一种可能的方法。 此时, 每台机器的 /etc/master.passwd 中, 都包含两个 + 开头的行。 第一个用于添加允许登录的 netgroup 帐号, 而第二个则用于增加其它帐号, 并把 shell 设置为 /sbin/nologin。 使用 全大写 的机器名作为 netgroup 名是个好主意。 换言之, 这些行应该类似于: +@BOXNAME::::::::: +:::::::::/sbin/nologin 一旦在所有机器上都完成了这样的修改, 就再也不需要修改本地的 /etc/master.passwd 了。 所有未来的修改都可以在 NIS 映射中进行。 这里是一个例子, 其中展示了在这一应用情景中所需要的 netgroup 映射, 以及其它一些常用的技巧: # Define groups of users first IT_EMP (,alpha,test-domain) (,beta,test-domain) IT_APP (,charlie,test-domain) (,delta,test-domain) DEPT1 (,echo,test-domain) (,foxtrott,test-domain) DEPT2 (,golf,test-domain) (,hotel,test-domain) DEPT3 (,india,test-domain) (,juliet,test-domain) ITINTERN (,kilo,test-domain) (,lima,test-domain) D_INTERNS (,able,test-domain) (,baker,test-domain) # # Now, define some groups based on roles USERS DEPT1 DEPT2 DEPT3 BIGSRV IT_EMP IT_APP SMALLSRV IT_EMP IT_APP ITINTERN USERBOX IT_EMP ITINTERN USERS # # And a groups for a special tasks # Allow echo and golf to access our anti-virus-machine SECURITY IT_EMP (,echo,test-domain) (,golf,test-domain) # # machine-based netgroups # Our main servers WAR BIGSRV FAMINE BIGSRV # User india needs access to this server POLLUTION BIGSRV (,india,test-domain) # # This one is really important and needs more access restrictions DEATH IT_EMP # # The anti-virus-machine mentioned above ONE SECURITY # # Restrict a machine to a single user TWO (,hotel,test-domain) # [...more groups to follow] 如果您正使用某种数据库来管理帐号, 应该可以使用您的数据库的报告工具来创建映射的第一部分。 这样, 新用户就自动地可以访问这些机器了。 最后的提醒: 使用基于机器的 netgroup 并不总是适用的。 如果正在为学生实验室部署数十台甚至上百台同样的机器, 您应该使用基于角色的 netgroup, 而不是基于机器的 netgroup, 以便把 NIS 映射的尺寸保持在一个合理的范围内。 需要牢记的事项 这里是一些其它在使用 NIS 环境时需要注意的地方。 每次需要在实验室中增加新用户时, 必须 在 NIS 服务器上加入用户, 而且 一定要记得重建 NIS 映射。 如果您忘记了这样做, 新用户将无法登录除 NIS 主服务器之外的任何其它机器。 例如, 如果要在实验室增加新用户 jsmith, 我们需要: &prompt.root; pw useradd jsmith &prompt.root; cd /var/yp &prompt.root; make test-domain 也可以运行 adduser jsmith 而不是 pw useradd jsmith. 将管理用的帐号排除在 NIS 映射之外。 一般来说, 您不希望这些管理帐号和口令被扩散到那些包含不应使用它们的用户的机器上。 确保 NIS 主和从服务器的安全, 并尽可能减少其停机时间。 如果有人攻入或简单地关闭这些机器, 则整个实验室的任也就无法登录了。 这是集中式管理系统中最薄弱的环节。 如果没有保护好 NIS 服务器, 您就有大批愤怒的用户需要对付了! NIS v1 兼容性 FreeBSD 的 ypserv 提供了某些为 NIS v1 客户提供服务的支持能力。 FreeBSD 的 NIS 实现, 只使用 NIS v2 协议, 但其它实现可能会包含 v1 协议, 以提供对旧系统的向下兼容能力。 随这些系统提供的 ypbind 服务将首先尝试绑定 NIS v1 服务器, 即使它们并不真的需要它 (有些甚至可能会一直广播搜索请求, 即使已经从某台 v2 服务器得到了回应也是如此)。 注意, 尽管支持一般的客户机调用, 这个版本的 ypserv 并不能处理 v1 的映射传送请求; 因而, 它就不能与较早的支持 v1 协议的 NIS 服务器配合使用, 无论是作为主服务器还是从服务器。 幸运的是, 现今应该已经没有仍然在用的这样的服务器了。 同时作为 NIS 客户机的 NIS 服务器 在多服务器域的环境中, 如果服务器同时作为 NIS 客户, 在运行 ypserv 时要特别小心。 一般来说, 强制服务器绑定自己要比允许它们广播绑定请求要好, 因为这种情况下它们可能会相互绑定。 某些怪异的故障, 很可能是由于某一台服务器停机, 而其它服务器都依赖其服务所导致的。 最终, 所有的客户机都会超时并绑定到其它服务器, 但这个延迟可能会相当可观, 而且恢复之后仍然存在再次发生此类问题的隐患。 您可以强制一台机器绑定到特定的服务器, 这是通过 ypbind 参数来完成的。 如果不希望每次启动 NIS 服务器时都手工完成这项工作, 可以在 /etc/rc.conf 中加入: nis_client_enable="YES" # run client stuff as well nis_client_flags="-S NIS domain,server" 参见 &man.ypbind.8; 以了解更多情况。 口令格式 NIS 口令格式 在实现 NIS 时, 口令格式的兼容性问题是一种最为常见的问题。 假如您的 NIS 服务器使用 DES 加密口令, 则它只能支持使用 DES 的客户机。 例如, 如果您的网络上有 &solaris; NIS 客户机, 则几乎肯定需要使用 DES 加密口令。 要检查您的服务器和客户机使用的口令格式, 需要查看 /etc/login.conf。 如果主机被配置为使用 DES 加密的口令, 则 default class 将包含类似这样的项: default:\ :passwd_format=des:\ :copyright=/etc/COPYRIGHT:\ [Further entries elided] 其他一些可能的 passwd_format 包括 blfmd5 (分别对应于 Blowfish 和 MD5 加密口令)。 如果修改了 /etc/login.conf, 就必须重建登录性能数据库, 这是通过以 root 身份运行下面的程序来完成的: &prompt.root; cap_mkdb /etc/login.conf 已经在 /etc/master.passwd 中的口令的格式不会被更新, 直到用户在登录性能数据库重建 之后 首次修改口令为止。 接下来, 为了确保所有的口令都按照您选择的格式加密了, 还需要检查 /etc/auth.confcrypt_default 给出的优先选择的口令格式。 要完成此工作, 将您选择的格式放到列表的第一项。 例如, 当使用 DES 加密的口令时, 对应项应为: crypt_default = des blf md5 在每一台基于 &os; 的 NIS 服务器和客户机上完成上述工作之后, 就可以肯定您的网络上它们都在使用同样的口令格式了。 如果在 NIS 客户机上做身份验证时发生问题, 这也是第一个可能出现问题的地方。 注意: 如果您希望在混合的网络上部署 NIS 服务器, 可能就需要在所有系统上都使用 DES, 因为这是所有系统都能够支持的最低限度的公共标准。 Greg Sutter Written by 网络自动配置 (DHCP) 什么是 DHCP? 动态主机配置协议 DHCP Internet Software Consortium (ISC) DHCP, 动态主机配置协议, 是一种让系统得以连接到网络上, 并获取所需要的配置参数手段。 FreeBSD 6.0 之前的版本, 采用的是 ISC (Internet Software Consortium) 的 DHCP 客户端 (&man.dhclient.8;) 实现。 更高版本使用的则是来自 OpenBSD 3.7 的 OpenBSD dhclient。 这里提供的所有关于 dhclient 的信息, 都是以 ISC 或 OpenBSD DHCP 客户端程序为准的。 DHCP 服务器是 ISC 软件包的一部分。 这一节都介绍哪些内容 这一节描述了 ISC 和 DHCP 系统中的客户端, 以及和 ISC DHCP 系统中的服务器端的组件。 客户端程序, dhclient, 是随 FreeBSD 作为它的一部分提供的; 而服务器部分, 则可以通过 net/isc-dhcp3-server port 得到。 &man.dhclient.8;、 &man.dhcp-options.5;、 以及 &man.dhclient.conf.5; 联机手册, 加上下面所介绍的参考文献, 都是非常有用的资源。 它如何工作 UDP 当 DHCP 客户程序, dhclient 在客户机上运行时, 它会开始广播请求配置信息的消息。 默认情况下, 这些请求是在 UDP 端口 68 上。 服务器通过 UDP 67 给出响应, 向客户机提供一个 IP 地址, 以及其他有关的配置参数, 例如子网掩码、 路由器, 以及 DNS 服务器。 所有这些信息都会以 DHCP lease 的形式给出, 并且只在一段特定的时间内有效 (这是由 DHCP 服务器的维护者配置的)。 这样, 那些已经断开网络的客户机使用的陈旧的 IP 地址就能被自动地回收了。 DHCP 客户程序可以从服务器端获取大量的信息。 关于能获得的信息的详细列表, 请参考 &man.dhcp-options.5;。 FreeBSD 集成 FreeBSD 完全地集成了 ISC 或 OpenBSD 的 DHCP 客户端, dhclient (取决于您运行的 &os; 版本)。 DHCP 客户端被安装程序直接支持, 并且是基本系统的一部分。 这使得您不再需要去了解那些已经运行了 DHCP 服务器的网络的具体配置参数。 从 FreeBSD 3.2 开始, 每一个发行版中均包含 dhclient sysinstall sysinstall 能够支持 DHCP。 在 sysinstall 中配置网络接口时, 它询问的第二个问题便是: Do you want to try DHCP configuration of the interface? (您是否希望在此接口上尝试 DHCP 配置?)。 如果做肯定的回答, 则将运行 dhclient, 一旦成功, 则将自动地填写网络配置信息。 要在系统启动时使用 DHCP, 您必须做两件事: DHCP 需求 您的内核中, 必须包含 bpf 设备。 如果需要这样做, 需要将 device bpf 添加到内核的编译配置文件中, 并重新编译内核。 要了解关于编译内核的进一步信息, 请参见 bpf 设备已经是 FreeBSD 发行版中默认的 GENERIC 内核的一部分了, 因此如果您没有对内核进行定制, 则不用创建一份新的内核配置文件, DHCP 就能工作了。 对于那些安全意识很强的人来说, 您应该知道 bpf 也是包侦听工具能够正确工作的条件之一 (当然, 它们还需要以 root 身份运行才行)。 bpf 使用 DHCP 所必须的, 但如果您对安全非常敏感, 则很可能会有理由不把 bpf 加入到您的内核配置中, 直到您真的需要使用 DHCP 为止。 编辑您的 /etc/rc.conf 并加入下面的设置: ifconfig_fxp0="DHCP" 务必将 fxp0 替换为您希望自动配置的网络接口的名字, 您可以在 找到更进一步的介绍。 如果您希望使用另一位置的 dhclient, 或者需要给 dhclient 传递其他参数, 还可以添加下面的配置 (根据需要进行修改): dhcp_program="/sbin/dhclient" dhcp_flags="" DHCP 服务器 DHCP 服务器, dhcpd, 是作为 net/isc-dhcp3-server port 的一部分提供的。 这个 port 包括了 ISC DHCP 服务器及其文档。 文件 DHCP 配置文件 /etc/dhclient.conf dhclient 需要一个配置文件, /etc/dhclient.conf。 一般说来, 这个文件中只包括注释, 而默认值基本上都是合理的。 这个配置文件在 &man.dhclient.conf.5; 联机手册中进行了进一步的阐述。 /sbin/dhclient dhclient 是一个静态连编的, 它被安装到 /sbin 中。 &man.dhclient.8; 联机手册给出了关于 dhclient 的进一步细节。 /sbin/dhclient-script dhclient-script 是一个 FreeBSD 专用的 DHCP 客户端配置脚本。 在 &man.dhclient-script.8; 中对它进行了描述, 但一般来说, 用户不需要对其进行任何修改, 就能够让一切正常运转了。 /var/db/dhclient.leases DHCP 客户程序会维护一个数据库来保存有效的 lease, 它们被以日志的形式保存到这个文件中。 &man.dhclient.leases.5; 给出了更为细致的介绍。 进阶读物 DHCP 协议的完整描述是 RFC 2131。 关于它的其他信息资源的站点 也提供了详尽的资料。 安装和配置 DHCP 服务器 这一章包含哪些内容 这一章提供了关于如何在 FreeBSD 系统上使用 ISC (Internet 软件协会) 的 DHCP 实现套件来架设 DHCP 服务器的信息。 DHCP 套件中的服务器部分并没有作为 FreeBSD 的一部分来提供, 因此您需要安装 net/isc-dhcp3-server port 才能提供这个服务。 请参见 以了解关于如何使用 Ports Collection 的进一步详情。 安装 DHCP 服务器 DHCP 安装 为了在您的 FreeBSD 系统上进行配置以便作为 DHCP 服务器来使用, 需要把 &man.bpf.4; 设备编译进内核。 要完成这项工作, 需要将 device bpf 加入到您的内核配置文件中, 并重新联编内核。 要得到关于如何联编内核的进一步信息, 请参见 bpf 设备是 FreeBSD 所附带的 GENERIC 内核中已经联入的组件, 因此您并不需要为了让 DHCP 正常工作而特别地定制内核。 如果您有较强的安全意识, 应该注意 bpf 同时也是让听包程序能够正确工作的设备 (尽管这类程序仍然需要以特权用户身份运行)。 bpf 使用 DHCP 所必需的, 但如果您对安全非常敏感, 您可能会不希望将 bpf 放进内核, 直到您真的认为 DHCP 是必需的为止。 接下来要做的是编辑示范的 dhcpd.conf, 它由 net/isc-dhcp3-server port 安装。 默认情况下, 它的名字应该是 /usr/local/etc/dhcpd.conf.sample, 在开始修改之前, 您需要把它复制为 /usr/local/etc/dhcpd.conf 配置 DHCP 服务器 DHCP dhcpd.conf dhcpd.conf 包含了一系列关于子网和主机的定义, 下面的例子可以帮助您理解它: option domain-name "example.com"; option domain-name-servers 192.168.4.100; option subnet-mask 255.255.255.0; default-lease-time 3600; max-lease-time 86400; ddns-update-style none; subnet 192.168.4.0 netmask 255.255.255.0 { range 192.168.4.129 192.168.4.254; option routers 192.168.4.1; } host mailhost { hardware ethernet 02:03:04:05:06:07; fixed-address mailhost.example.com; } 这个选项指定了提供给客户机作为默认搜索域的域名。 请参考 &man.resolv.conf.5; 以了解关于这一概念的详情。 这个选项用于指定一组客户机使用的 DNS 服务器, 它们之间以逗号分隔。 提供给客户机的子网掩码。 客户机可以请求租约的有效期, 而如果没有, 则服务器将指定一个租约有效期, 也就是这个值 (单位是秒)。 这是服务器允许租出地址的最大时长。 如果客户机请求了更长的租期, 则它将得到一个地址, 但其租期仅限于 max-lease-time 秒。 这个选项用于指定 DHCP 服务器在一个地址被接受或释放时是否应对应尝试更新 DNS。 在 ISC 实现中, 这一选项是 必须指定的 指定地址池中可以用来分配给客户机的 IP 地址范围。 在这个范围之间, 以及其边界的 IP 地址将分配给客户机。 定义客户机的默认网关。 主机的硬件 MAC 地址 (这样 DHCP 服务器就能够在接到请求时知道请求的主机身份)。 指定总是得到同一 IP 地址的主机。 请注意在此处使用主机名是对的, 因为 DHCP 服务器会在返回租借地址信息之前自行解析主机名。 在配制好 dhcpd.conf 之后, 应在 /etc/rc.conf 中启用 DHCP 服务器, 也就是增加: dhcpd_enable="YES" dhcpd_ifaces="dc0" 此处的 dc0 接口名应改为 DHCP 服务器需要监听 DHCP 客户端请求的接口 (如果有多个, 则用空格分开)。 接下来, 可以用下面的命令来启动服务: &prompt.root; /usr/local/etc/rc.d/isc-dhcpd.sh start 如果未来您需要修改服务器的配置, 请务必牢记发送 SIGHUP 信号给 dhcpd不会 导致配置文件的重新加载, 而这在其他服务程序中则是比较普遍的约定。 您需要发送 SIGTERM 信号来停止进程, 然后使用上面的命令来重新启动它。 文件 DHCP 配置文件 /usr/local/sbin/dhcpd dhcpd 是静态连接的, 并安装到 /usr/local/sbin 中。 随 port 安装的 &man.dhcpd.8; 联机手册提供了关于 dhcpd 更为详尽的信息。 /usr/local/etc/dhcpd.conf dhcpd 需要配置文件, 即 /usr/local/etc/dhcpd.conf 才能够向客户机提供服务。 这个文件需要包括应提供给客户机的所有信息, 以及关于服务器运行的其他信息。 此配置文件的详细描述可以在随 port 安装的 &man.dhcpd.conf.5; 联机手册上找到。 /var/db/dhcpd.leases DHCP 服务器会维护一个它签发的租用地址数据库, 并保存在这个文件中, 这个文件是以日志的形式保存的。 随 port 安装的 &man.dhcpd.leases.5; 联机手册提供了更详细的描述。 /usr/local/sbin/dhcrelay dhcrelay 在更为复杂的环境中, 可以用来支持使用 DHCP 服务器转发请求给另一个独立网络上的 DHCP 服务器。 如果您需要这个功能, 需要安装 net/isc-dhcp3-relay port。 &man.dhcrelay.8; 联机手册提供了更为详尽的介绍。 Chern Lee Contributed by Tom Rhodes Daniel Gerzo 域名系统 (<acronym>DNS</acronym>) 纵览 BIND &os; 在默认情况下使用一个版本的 BIND (Berkeley Internet Name Domain), 这是目前最为流行的 DNS 协议实现。 DNS 是一种协议, 可以通过它将域名同 IP 地址相互对应。 例如, 查询 www.FreeBSD.org 将得到 &os; Project 的 web 服务器的 IP 地址, 而查询 ftp.FreeBSD.org 则将得到响应的 FTP 机器的 IP 地址。 类似地, 也可以做相反的事情。 查询 IP 地址可以得到其主机名。 当然, 完成 DNS 查询并不需要在系统中运行域名服务器。 目前, 默认情况下&os; 使用的是 BIND9 DNS 服务软件。 我们内建于系统中的版本提供了增强的安全特性、 新的文件目录结构, 以及自动的 &man.chroot.8; 配置。 DNS 在 Internet 上的 DNS 是通过一套较为复杂的权威根域名系统, 顶级域名 (TLD), 以及一系列小规模的, 提供少量域名解析服务并对域名信息进行缓存的域名服务器组成的。 目前, BIND 由 Internet Software Consortium 维护。 术语 要理解这份文档, 需要首先了解一些相关的 DNS 术语。 resolver (解析器) reverse DNS (反向 DNS) root zone (根域) 术语 定义 正向 DNS 将域名映射到 IP 地址 原点 (Origin) 表示特定域文件所在的域 named, BIND, 域名服务器 在 &os; 中 BIND 域名服务器软件包的常见叫法。 解析器 (Resolver) 计算机用以向域名服务器查询域名信息的一个系统进程 反向 DNS 与正向 DNS 相对; 将 IP 地址映射为主机名 根域 Internet 域层次的起点。 所有的域都在根域之下, 类似文件系统中, 文件都在根目录之下那样。 域 (Zone) 独立的域, 子域, 或者由同一机构管理的 DNS 的一部分。 例子 域的例子: . 是根域。 org. 是根域之下的一个顶级域名 (TLD)。 example.org. 是在 org. TLD 之下的一个域。 1.168.192.in-addr.arpa 是一个表示所有 192.168.1.* IP 地址空间中 IP 地址的域。 如您所见, 域名中越细节的部分会越靠左出现。 例如, example.org. 就比 org. 范围更小, 而 org. 又比根域更小。 域名各个部分的格局与文件系统十分类似: /dev 目录在根目录中, 等等。 运行域名服务器的理由 域名服务器通常会有两种形式: 权威域名服务器, 以及缓存域名服务器。 下列情况需要有权威域名服务器: 想要向全世界提供 DNS 信息, 并对请求给出权威应答。 注册了类似 example.org 的域, 而需要将 IP 指定到其下的主机名上。 某个 IP 地址块需要反向 DNS 项 (IP 到主机名)。 备份服务器, 或常说的从 (slave) 服务器, 会在主服务器出现问题或无法访问时来应答查询请求。 下列情况需要有缓存域名服务器: 本地的 DNS 服务器能够缓存, 并比直接向外界的域名服务器请求更快地得到应答。 当有人查询 www.FreeBSD.org 时,解析器通常会向上级 ISP 的域名服务器发出请求, 并获得回应。 如果有本地的缓存 DNS 服务器, 查询只有在第一次被缓存 DNS 服务器发到外部世界。 其他的查询不会发向局域网外, 因为它们已经有在本地的缓存了。 DNS 如何运作 在 &os; 中, BIND 服务程序被称为 named, 其原因显而易见。 文件 描述 &man.named.8; BIND 服务程序 &man.rndc.8; 域名服务控制程序 /etc/namedb BIND 存放域名信息的位置 /etc/namedb/named.conf 域名服务配置文件 随在服务器上配置的域的性质不同, 域的定义文件一般会存放到 /etc/namedb 目录中的 masterslave, 或 dynamic 子目录里。 这些文件包含了在域名服务器发出回应时所需的 DNS 信息。 启动 BIND BIND starting (启动) 由于 BIND 是默认安装的, 因此配置它相对而言很简单。 默认的 named 配置是在 &man.chroot.8; 环境中提供基本的域名解析服务。 如果希望启动一下这种配置, 可以执行下面的命令: &prompt.root; /etc/rc.d/named forcestart 如果希望 named 服务在每次启动的时候都能够启动, 需要在 /etc/rc.conf 中加入: named_enable="YES" 当然, 除了这份文档所介绍的配置选项之外, 在 /etc/namedb/named.conf 中还有很多其它的选项。 不过, 如果您需要了解 &os; 中用于启动 named 的那些选项的话, 则可以查看 /etc/defaults/rc.conf 中的 named_* 参数, 并参考 &man.rc.conf.5; 联机手册。 除此之外, 也是一个不错的起点。 配置文件 BIND configuration files (配置文件) 目前, named 的配置文件存放于 /etc/namedb 目录中, 在使用前需要根据需要进行修改, 除非只打算用它来完成简单的域名解析任务。 同时这个目录也是进行绝大多数配置的地方。 使用 <command>make-localhost</command> 要为 localhost 配置主域, 需要进入 /etc/namedb 目录, 并运行下面的命令: &prompt.root; sh make-localhost 如果一切正常的话, 在 master 子目录中会增加一组文件。 本地域名对应的文件是 localhost.rev, 而 IPv6 对应的配置则是 localhost-v6.rev。 作为默认配置, 所需的信息已经放到了 named.conf 文件中。 <filename>/etc/namedb/named.conf</filename> // $FreeBSD$ // // Refer to the named.conf(5) and named(8) man pages, and the documentation // in /usr/share/doc/bind9 for more details. // // If you are going to set up an authoritative server, make sure you // understand the hairy details of how DNS works. Even with // simple mistakes, you can break connectivity for affected parties, // or cause huge amounts of useless Internet traffic. options { directory "/etc/namedb"; pid-file "/var/run/named/pid"; dump-file "/var/dump/named_dump.db"; statistics-file "/var/stats/named.stats"; // If named is being used only as a local resolver, this is a safe default. // For named to be accessible to the network, comment this option, specify // the proper IP address, or delete this option. listen-on { 127.0.0.1; }; // If you have IPv6 enabled on this system, uncomment this option for // use as a local resolver. To give access to the network, specify // an IPv6 address, or the keyword "any". // listen-on-v6 { ::1; }; // In addition to the "forwarders" clause, you can force your name // server to never initiate queries of its own, but always ask its // forwarders only, by enabling the following line: // // forward only; // If you've got a DNS server around at your upstream provider, enter // its IP address here, and enable the line below. This will make you // benefit from its cache, thus reduce overall DNS traffic in the Internet. /* forwarders { 127.0.0.1; }; */ 正如注释所言, 如果希望从上级缓存中受益, 可以在此处启用 forwarders。 正常情况下, 域名服务器会逐级地查询 Internet 来找到特定的域名服务器, 直到得到答案为止。 这个选项将让它首先查询上级域名服务器 (或另外提供的域名服务器), 从而从它们的缓存中得到结果。 如果上级域名服务器是一个繁忙的高速域名服务器, 则启用它将有助于改善服务品质。 127.0.0.1 不会 正常工作。 一定要把地址改为您上级服务器的 IP 地址。 /* * If there is a firewall between you and nameservers you want * to talk to, you might need to uncomment the query-source * directive below. Previous versions of BIND always asked * questions using port 53, but BIND versions 8 and later * use a pseudo-random unprivileged UDP port by default. */ // query-source address * port 53; }; // If you enable a local name server, don't forget to enter 127.0.0.1 // first in your /etc/resolv.conf so this server will be queried. // Also, make sure to enable it in /etc/rc.conf. zone "." { type hint; file "named.root"; }; zone "0.0.127.IN-ADDR.ARPA" { type master; file "master/localhost.rev"; }; // RFC 3152 zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA" { type master; file "master/localhost-v6.rev"; }; // NB: Do not use the IP addresses below, they are faked, and only // serve demonstration/documentation purposes! // // Example slave zone config entries. It can be convenient to become // a slave at least for the zone your own domain is in. Ask // your network administrator for the IP address of the responsible // primary. // // Never forget to include the reverse lookup (IN-ADDR.ARPA) zone! // (This is named after the first bytes of the IP address, in reverse // order, with ".IN-ADDR.ARPA" appended.) // // Before starting to set up a primary zone, make sure you fully // understand how DNS and BIND works. There are sometimes // non-obvious pitfalls. Setting up a slave zone is simpler. // // NB: Don't blindly enable the examples below. :-) Use actual names // and addresses instead. /* An example master zone zone "example.net" { type master; file "master/example.net"; }; */ /* An example dynamic zone key "exampleorgkey" { algorithm hmac-md5; secret "sf87HJqjkqh8ac87a02lla=="; }; zone "example.org" { type master; allow-update { key "exampleorgkey"; }; file "dynamic/example.org"; }; */ /* Examples of forward and reverse slave zones zone "example.com" { type slave; file "slave/example.com"; masters { 192.168.1.1; }; }; zone "1.168.192.in-addr.arpa" { type slave; file "slave/1.168.192.in-addr.arpa"; masters { 192.168.1.1; }; }; */ named.conf 中, 还给出了从域、转发域和反解析域的例子。 如果新增了域, 就必需在 named.conf 中加入对应的项目。 例如, 用于 example.org 的域文件的描述类似下面这样: zone "example.org" { type master; file "master/example.org"; }; 语句所标示的那样, 这是一个主域, 其信息保存在 /etc/namedb/master/example.org 中, 如 语句所示。 zone "example.org" { type slave; file "slave/example.org"; }; 在从域的情形中, 所指定的域的信息会从主域名服务器传递过来, 并保存到对应的文件中。 当主域服务器发生问题或不可达时, 从域名服务器就有一份可用的域名信息, 从而能够对外提供服务。 域文件 BIND zone files (域文件) 下面的例子展示了用于 example.org 的主域文件 (存放于 /etc/namedb/master/example.org): $TTL 3600 ; 1 hour example.org. IN SOA ns1.example.org. admin.example.org. ( 2006051501 ; Serial 10800 ; Refresh 3600 ; Retry 604800 ; Expire 86400 ; Minimum TTL ) ; DNS Servers IN NS ns1.example.org. IN NS ns2.example.org. ; MX Records IN MX 10 mx.example.org. IN MX 20 mail.example.org. IN A 192.168.1.1 ; Machine Names localhost IN A 127.0.0.1 ns1 IN A 192.168.1.2 ns2 IN A 192.168.1.3 mx IN A 192.168.1.4 mail IN A 192.168.1.5 ; Aliases www IN CNAME @ 请注意以 . 结尾的主机名是全称主机名, 而结尾没有 . 的则是相对于原点的主机名。 例如, www 将被转换为 www.原点. 在这个假想的域信息文件中, 我们的原点是 example.org., 因此 www 将被当作 www.example.org. 域信息文件的格式如下: 记录名 IN 记录类型 值 DNS 记录 最常用的 DNS 记录: SOA 域权威开始 NS 权威域名服务器 A 主机地址 CNAME 别名对应的正规名称 MX 邮件传递服务器 PTR 域名指针 (用于反向 DNS) example.org. IN SOA ns1.example.org. admin.example.org. ( 2006051501 ; Serial 10800 ; Refresh after 3 hours 3600 ; Retry after 1 hour 604800 ; Expire after 1 week 86400 ) ; Minimum TTL of 1 day example.org. 域名, 同时也是这个域信息文件的原点。 ns1.example.org. 该域的主/权威域名服务器。 admin.example.org. 此域的负责人的电子邮件地址, 其中 @ 被换掉了。 (admin@example.org 对应 admin.example.org) 2006051501 文件的序号。 每次修改域文件时都必须增加这个数字。 现今, 许多管理员会考虑使用 yyyymmddrr 这样的格式来表示序号。 2006051501 通常表示上次修改于 05/15/2006, 而后面的 01 则表示在那天的第一次修改。 序号非常重要, 它用于通知从域服务器更新数据。 IN NS ns1.example.org. 这是一个 NS 项。 每个准备提供权威应答的服务器都必须有一个对应项。 localhost IN A 127.0.0.1 ns1 IN A 192.168.1.2 ns2 IN A 192.168.1.3 mx IN A 192.168.1.4 mail IN A 192.168.1.5 A 记录指明了机器名。 正如在前面所按倒的, ns1.example.org 将解析为 192.168.1.2 IN A 192.168.1.1 这一行把当前原点 example.org 指定为使用 IP 地址 192.168.1.1 www IN CNAME @ 正规名 (CNAME) 记录通常用于为某台机器指定别名。 在这个例子中, 将 www 指定成了 机器的一个别名, 后者的名字与域名 example.org 相同 (192.168.1.1)。 CNAME 也可以用来提供主机别名, 或将一个主机名以轮转 (round robin) 方式指定到多台服务器。 MX 记录 IN MX 10 mail.example.org. MX 记录表示哪个邮件服务器负责接收发到这个域的邮件。 mail.example.org 是邮件服务器的主机名, 而 10 则是它的优先级。 可以有多台邮件服务器, 其优先级分别是 10、 20 等等。 尝试向 example.org 投递邮件的服务器, 会首先尝试优先级最高的 MX (优先级数值最低的记录)、 接着尝试次高的, 并重复这一过程直到邮件递送到达为止。 对于 in-addr.arpa 域名信息文件 (反向 DNS), 使用了同样的格式, 只是 PTR 项代替了 A 或 CNAME 的位置。 $TTL 3600 1.168.192.in-addr.arpa. IN SOA ns1.example.org. admin.example.org. ( 2006051501 ; Serial 10800 ; Refresh 3600 ; Retry 604800 ; Expire 3600 ) ; Minimum IN NS ns1.example.org. IN NS ns2.example.org. 1 IN PTR example.org. 2 IN PTR ns1.example.org. 3 IN PTR ns2.example.org. 4 IN PTR mx.example.org. 5 IN PTR mail.example.org. 这个文件给出了上述假想域中 IP 地址到域名的映射关系。 缓存域名服务器 BIND 缓存域名服务器 缓存域名服务器是对任何域都不提供权威解析的域名服务器。 它自己简单地完成查询, 并记住这些查询以备后续使用。 要建立这样的服务器, 只需像平时一样配置一个域名服务器, 而不配置域就可以了。 安全 尽管 BIND 是最为常用的 DNS 实现, 但它总是有一些安全问题。 时常会有人发现一些可能的甚至可以利用的安全漏洞。 尽管 &os; 会自动将 named 放到 &man.chroot.8; 环境中运行, 但仍有一些其它可用的安全机制来帮助您规避潜在的针对 DNS 服务的攻击。 阅读 CERT 的安全公告, 并订阅 the &a.security-notifications; 是一个有助于帮助您了解最新 Internet 及 &os; 安全问题的好习惯。 如果发现了问题, 确保源代码是最新的, 并重新联编一份 named 不会给您带来任何麻烦。 进一步阅读 BIND/named 联机手册: &man.rndc.8; &man.named.8; &man.named.conf.5; 官方的 ISC BIND 页面 Official ISC BIND Forum BIND FAQ O'Reilly DNS 和 BIND 第 5 版 RFC1034 - 域名 - 概念和工具 RFC1035 - 域名 - 实现及其标准 Murray Stokely Contributed by Apache HTTP 服务器 web 服务器 配置 Apache 纵览 &os; 被用于运行许多全球最为繁忙的 web 站点。 大多数 Internet 上的 web 服务器, 都使用 Apache HTTP 服务器Apache 软件包可以在您的 FreeBSD 安装盘上找到。 如果没有在首次安装时附带安装 Apache, 则可以通过 www/apache13www/apache20 port 来安装。 一旦成功地安装了 Apache, 就必须对其进行配置。 这一节介绍了 1.3.X 版本的 Apache HTTP 服务器 的配置, 因为它是随 &os; 一同使用的最多的版本。 Apache 2.X 引入了很多新技术, 但在此并不讨论。 要了解关于 Apache 2.X 的更多资料, 请参见 配置 Apache 配置文件 主要的 Apache HTTP Server 配置文件, 在 &os; 上会安装为 /usr/local/etc/apache/httpd.conf。 这是一个典型的 &unix; 文本配置文件, 它使用 # 作为注释符。 关于全部配置选项的详尽介绍超出了本书的范围, 这里将只介绍最常被修改的那些。 ServerRoot "/usr/local" 这指定了 Apache 安装的顶级目录。 执行文件被放到服务器根目录 (server root) 的 binsbin 子目录中, 而配置文件则位于 etc/apache ServerAdmin you@your.address 这个地址是在服务器发生问题时应发送电子邮件的地址, 它会出现在服务器生成的页面上, 例如错误页面。 ServerName www.example.com ServerName 允许您配置发送回客户端的主机名, 如果您的服务器被用户以别的名字访问 (例如, 使用 www 而不是主机本身的真实名字)。 DocumentRoot "/usr/local/www/data" DocumentRoot: 这个目录是您的文档所在的目录。 默认情况下, 所有的请求都会从这个位置去获取, 但也可以通过符号连接和别名指定其它的位置。 在修改配置之前备份 Apache 的配置文件永远是一个好习惯。 一旦对初始配置满意了, 就可以开始运行 Apache 了。 运行 <application>Apache</application> Apache 启动和停止 与许多其它网络服务不同, Apache 并不依赖 inetd 超级服务器来运行。 一般情况下会把它配置为一个独立的服务器, 以期在客户的 web 浏览器连入 HTTP 请求时, 能够获得更好的性能。 它提供了一个 shell 脚本来使启动、 停止和重新启动服务器变得尽可能地简单。 首次启动 Apache, 只需执行: &prompt.root; /usr/local/sbin/apachectl start 可以在任何时候使用下面的命令来停止服务: &prompt.root; /usr/local/sbin/apachectl stop 当由于某种原因修改了配置文件之后, 需要重启服务器: &prompt.root; /usr/local/sbin/apachectl restart 要在重启 Apache 服务器时不中断当前的连接, 则应运行: &prompt.root; /usr/local/sbin/apachectl graceful 更多的信息, 可以在 &man.apachectl.8; 联机手册中找到。 要在系统启动时启动 Apache, 则应在 /etc/rc.conf 中加入: apache_enable="YES" 如果您希望在系统引导时启动 Apache httpd 程序并指定其它一些选项, 则可以把下面的行加到 rc.conf apache_flags="" 现在 web 服务器就开始运行了, 您可以使用 web 浏览器打开 http://localhost/。 默认显示的 web 页面是 /usr/local/www/data/index.html 虚拟主机 Apache 支持两种不同类型的虚拟主机。 第一种方法是基于名字的虚拟主机。 基于名字的虚拟主机使用客户机发来的 HTTP/1.1 头来辨别主机名。 这使得不同的域得以共享同一个 IP 地址。 要配置 Apache 来使用基于名字的虚拟主机, 需要把类似下面的项加到您的 httpd.conf 中: NameVirtualHost * 如果您的 web 服务器的名字是 www.domain.tld, 而您希望建立一个 www.someotherdomain.tld 的虚拟域, 则应在 httpd.conf 中加入: <VirtualHost *> ServerName www.domain.tld DocumentRoot /www/domain.tld </VirtualHost> <VirtualHost *> ServerName www.someotherdomain.tld DocumentRoot /www/someotherdomain.tld </VirtualHost> 您需要把上面的地址和文档路径改为所使用的那些。 要了解关于虚拟主机的更多信息, 请参考官方的 Apache 文档, 这些文档可以在 找到。 Apache 模块 Apache 模块 有许多不同的 Apache 模块, 它们可以在基本的服务器基础上提供许多附加的功能。 FreeBSD 的 Ports Collection 为安装 Apache 和常用的附加模块提供了非常方便的方法。 mod_ssl web 服务器 安全 SSL 密码学 mod_ssl 这个模块使用 OpenSSL 库, 来提供通过 安全套接字层 (SSL v2/v3) 和 传输层安全 (TLS v1) 协议的强加密能力。 这个模块提供了从某一受信的证书签署机构申请签名证书所需的所有工具, 您可以藉此在 &os; 上运行安全的 web 服务器。 如果您未曾安装 Apache, 也可以直接安装一份包含了 mod_ssl 的版本的 Apache 1.3.X, 其方法是通过 www/apache13-modssl port 来进行。 SSL 支持已经作为 Apache 2.X 的一部分提供, 您可以通过 www/apache20 port 来安装后者。 使用 Perl & PHP 的动态网站 在过去几年中, 越来越多的企业开始通过 Internet 以期扩大它们的收入和影响。 这也为交互式 web 内容提出了更多的要求。 尽管一些公司, 如 µsoft;, 提供了基于它们专有产品的解决方案, 但开源社区也给出了自己的答案。 目前, 最为常用的动态 web 内容实现两种方法是 mod_perl & mod_php mod_perl mod_perl Perl Apache/Perl 集成计划, 将 Perl 程序设计语言的强大功能, 与 Apache HTTP 服务器 紧密地结合到了一起。 通过 mod_perl 模块, 可以完全使用 Perl 来撰写 Apache 模块。 此外, 服务器中嵌入的持久性解释器, 消除了由于启动外部的解释器为 Perl 脚本的启动所造成的性能损失。 mod_perl 通过多种方式提供。 要使用 mod_perl, 应该注意 mod_perl 1.0 只能配合 Apache 1.3 而 mod_perl 2.0 只能配合 Apache 2 使用。 mod_perl 1.0 可以通过 www/mod_perl 安装, 而以静态方式联编的版本, 则可以通过 www/apache13-modperl 来安装。 mod_perl 2.0 则可以通过 www/mod_perl2 安装。 Tom Rhodes Written by mod_php mod_php PHP PHP, 也称为 PHP: Hypertext Preprocessor, 是一种特别适合于 Web 开发的通用脚本语言。 它能够很容易地嵌入到 HTML 之中, 其语法接近于 C、 &java;, 以及 Perl, 以期让 web 开发人员的一迅速撰写动态生成的页面。 要获得用于 Apache web 服务器的 PHP5 支持, 可以从安装 lang/php5 port 开始。 在首次安装 lang/php5 port 的时候, 系统会自动显示可用的一系列 OPTIONS (配置选项)。 如果您没有看到菜单, 例如由于过去曾经安装过 lang/php5 port 等等, 可以用下面的命令再次显示配置菜单, 在 port 的目录中执行: &prompt.root; make config 在配置选项对话框中, 选中 APACHE 这一项, 就可以联编出用于与 Apache web 服务器配合使用的可动态加载的 mod_php5 模块了。 由于各式各样的原因 (例如, 出于已经部署的 web 应用的兼容性考虑), 许多网站仍在使用 PHP4。 如果您需要 mod_php4 而不是 mod_php5, 请使用 lang/php4 port。 lang/php4 port 也支持许多 lang/php5 port 提供的配置和编译时选项。 前面我们已经成功地安装并配置了用于支持动态 PHP 应用所需的模块。 请检查并确认您已将下述配置加入到了 /usr/local/etc/apache/httpd.conf 中: 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> 这些工作完成之后, 还需要使用 apachectl 命令来完成一次 graceful restart 以便加载 PHP 模块: &prompt.root; apachectl graceful 在未来您升级 PHP 时, make config 这步操作就不再是必需的了; 您所选择的 OPTIONS 会由 &os; 的 Ports 框架自动保存。 在 &os; 中的 PHP 支持是高度模块化的, 因此基本安装的功能十分有限。 增加其他功能的支持非常简单, 只需通过 lang/php5-extensions port 即可完成。 这个 port 提供了一个菜单驱动的界面来帮助完成 PHP 扩展的安装。 另外, 也可以通过对应的 port 来单独安装扩展。 例如, 要将对于 MySQL 数据库服务器的支持加入 PHP5, 只需简单地安装 databases/php5-mysql port。 安装完扩展之后, 必须重新启动 Apache 服务器, 来令其适应新的配置变更: &prompt.root; apachectl graceful Murray Stokely Contributed by 文件传输协议 (FTP) FTP 服务器 纵览 文件传输协议 (FTP) 为用户提供了一个简单的, 与 FTP 服务器交换文件的方法。 &os; 系统中包含了 FTP 服务软件, ftpd。 这使得在 &os; 上建立和管理 FTP 服务器变得非常简单。 配置 最重要的配置步骤是决定允许哪些帐号访问 FTP 服务器。 一般的 &os; 系统包含了一系列系统帐号分别用于执行不同的服务程序, 但未知的用户不应被允许登录并使用这些帐号。 /etc/ftpusers 文件中, 列出了不允许通过 FTP 访问的用户。 默认情况下, 这包含了前述的系统帐号, 但也可以在这里加入其它不应通过 FTP 访问的用户。 您可能会希望限制通过 FTP 登录的某些用户, 而不是完全阻止他们使用 FTP。 这可以通过 /etc/ftpchroot 文件来完成。 这一文件列出了希望对 FTP 访问进行限制的用户和组的表。 而在 &man.ftpchroot.5; 联机手册中, 已经对此进行了详尽的介绍, 故而不再赘述。 FTP 匿名 如果您想要在服务器上启用匿名的 FTP 访问, 则必须建立一个名为 ftp 的 &os; 用户。 这样, 用户就可以使用 ftpanonymous 和任意的口令 (习惯上, 应该是以那个用户的邮件地址作为口令) 来登录和访问您的 FTP 服务器。 FTP 服务器将在匿名用户登录时调用 &man.chroot.2;, 以便将其访问限制在 ftp 用户的主目录中。 有两个文本文件可以用来指定显示在 FTP 客户程序中的欢迎文字。 /etc/ftpwelcome 文件中的内容将在用户连接上之后, 在登录提示之前显示。 在成功的登录之后, 将显示 /etc/ftpmotd 文件中的内容。 请注意后者是相对于登录环境的, 因此对于匿名用户而言, 将显示 ~ftp/etc/ftpmotd 一旦正确地配置了 FTP 服务器, 就必须在 /etc/inetd.conf 中启用它。 这里需要做的全部工作就是将注释符 # 从已有的 ftpd 行之前去掉: ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l 所介绍的那样, 修改这个文件之后, 必须让 inetd 重新加载它, 才能使新的设置生效。 现在可以通过输入下面的命令来登录您的 FTP 服务器了: &prompt.user; ftp localhost 维护 syslog 日志文件 FTP ftpd 服务程序使用 &man.syslog.3; 来记录消息。 默认情况下, 系统日志将把和 FTP 相关的消息记录到 /var/log/xferlog 文件中。 FTP 日志的位置, 可以通过修改 /etc/syslog.conf 中如下所示的行来修改: ftp.info /var/log/xferlog FTP 匿名 一定要小心对待在匿名 FTP 服务器中可能遇到的潜在问题。 一般而言, 允许匿名用户上传文件应三思。 您可能发现自己的 FTP 站点成为了交易未经授权的商业软件的论坛, 或发生更糟糕的情况。 如果不需要匿名的 FTP 上传, 可以在文件上配置权限, 使得您能够在其它匿名用户能够下载这些文件之前复查它们。 Murray Stokely Contributed by 为 µsoft.windows; 客户机提供文件和打印服务 (Samba) Samba 服务器 Microsoft Windows 文件服务器 Windows 客户机 打印服务器 Windows 客户机 纵览 Samba 是一个流行的开源软件包, 它提供了针对 µsoft.windows; 客户机的文件和打印服务。 这类客户机可以连接并使用 FreeBSD 系统上的文件空间, 就如同使用本地的磁盘一样, 或者像使用本地打印机一样使用 FreeBSD 上的打印机。 Samba 软件包可以在您的 FreeBSD 安装盘上找到。 如果您没有在初次安装 FreeBSD 时安装 Samba, 则可以通过 net/samba3 port 或 package 来安装。 配置 默认的 Samba 配置文件会以 /usr/local/etc/smb.conf.default 的名字安装。 这个文件必须复制为 /usr/local/etc/smb.conf 并进行定制, 才能开始使用 Samba smb.conf 文件中包含了 Samba 的运行时配置信息, 例如对于打印机的定义, 以及希望共享给 &windows; 客户机的 共享文件系统Samba 软件包包含了一个称为 swat 的 web 管理工具, 后者提供了配置 smb.conf 文件的简单方法。 使用 Samba Web 管理工具 (SWAT) Samba Web 管理工具 (SWAT) 是一个通过 inetd 运行的服务程序。 因此, 需要把 /etc/inetd.conf 中下面几行的注释去掉, 才能够使用 swat 来配置 Samba swat stream tcp nowait/400 root /usr/local/sbin/swat 中所介绍的那样, 在修改了这个配置文件之后, 必须让 inetd 重新加载配置, 才能使其生效。 一旦在 inetd.conf 中启用了 swat, 就可以用浏览器访问 connect to 了。 您将首先使用系统的 root 帐号登录。 只要成功地登录进了 Samba 配置页面, 就可以浏览系统的文档, 或从 Globals(全局) 选项卡开始配置了。 Globals 小节对应于 [global] 小节中的变量, 前者位于 /usr/local/etc/smb.conf 中。 全局配置 无论是使用 swat, 还是直接编辑 /usr/local/etc/smb.conf, 通常首先要配置的 Samba 选项都是: workgroup NT 域名或工作组名, 其他计算机将通过这些名字来找到服务器。 netbios name NetBIOS 这个选项用于设置 Samba 服务器的 NetBIOS 名字。 默认情况下, 这是所在主机的 DNS 名字的第一部分。 server string 这个选项用于设置通过 net view 命令, 以及某些其他网络工具可以查看到的关于服务器的说明性文字。 安全配置 /usr/local/etc/smb.conf 中的两个最重要的配置, 是选定的安全模型, 以及客户机上用户的口令存放后端。 下面的语句控制这些选项: security 最常见的选项形式是 security = sharesecurity = user。 如果您的客户机使用用户名, 并且这些用户名与您的 &os; 机器一致, 一般应选择用户级 (user) 安全。 这是默认的安全策略, 它要求客户机首先登录, 然后才能访问共享的资源。 如果采用共享级 (share) 安全, 则客户机不需要用有效的用户名和口令登录服务器, 就能够连接共享的资源。 这是较早版本的 Samba 中的默认值。 passdb backend NIS+ LDAP SQL 数据库 Samba 提供了若干种不同的验证后端模型。 您可以通过 LDAP、 NIS+、 SQL 数据库, 或经过修改的口令文件, 来完成客户端的身份验证。 默认的验证模式是 smbpasswd, 这也是本章将介绍的全部内容。 假设您使用的是默认的 smbpasswd 后端, 则必须首先创建一个 /usr/local/private/smbpasswd 文件, 来允许 Samba 对客户进行身份验证。 - 如果您打算让所有的 &unix; 用户帐号都能够从 &windows; + 如果您打算让 &unix; 用户帐号能够从 &windows; 客户机上登录, 可以使用下面的命令: - &prompt.root; grep -v "^#" /etc/passwd | make_smbpasswd > /usr/local/private/smbpasswd -&prompt.root; chmod 600 /usr/local/private/smbpasswd + &prompt.root; smbpasswd -a username - 请参见 Samba 的文档, + 请参见 + 官方的 Samba HOWTO 以了解关于配置选项的进一步信息。 按照前面给出的描述, 您应该已经可以启动 Samba 了。 启动 <application>Samba</application> net/samba3 port 会增加一个新的用于控制 Samba 的启动脚本。 要启用这个脚本, 以便用它来完成启动、 停止或重启 Samba 的任务, 需要在 /etc/rc.conf 文件中加入: samba_enable="YES" 这也同时配置了在系统引导时启动 Samba 配置好之后, 就可以在任何时候通过下面的命令来启动 Samba 了: &prompt.root; /usr/local/etc/rc.d/samba start Starting SAMBA: removing stale tdbs : Starting nmbd. Starting smbd. 请参见 以了解关于使用 rc 脚本的进一步信息。 Samba 事实上包含了三个相互独立的服务程序。 您应该能够看到 nmbdsmbd 两个服务程序都是通过 samba.sh 脚本启动的。 如果在 smb.conf 中启用了 winbind 名字解析服务, 则应该可以看到 winbindd 服务被启动起来。 可以在任何时候通过下面的命令来停止运行 Samba &prompt.root; /usr/local/etc/rc.d/samba.sh stop Samba 是一个复杂的软件包, 它提供了用于与 µsoft.windows; 网络进行集成的各式各样的功能。 要了解关于这里所介绍的基本安装以外的其它功能, 请访问 Tom Hukins Contributed by 通过 NTP 进行时钟同步 NTP 纵览 随着时间的推移, 计算机的时钟会倾向于漂移。 网络时间协议 (NTP) 是一种确保您的时钟保持准确的方法。 许多 Internet 服务依赖、 或极大地受益于本地计算机时钟的准确性。 例如, web 服务器可能会接收到一个请求, 要求如果文件在某一时刻之后修改过才发送它。 在局域网环境中, 共享文件的计算机之间的时钟是否同步至关重要, 因为这样才能使时间戳保持一致。 类似 &man.cron.8; 这样的程序, 也依赖于正确的系统时钟, 才能够准确地执行操作。 NTP ntpd FreeBSD 附带了 &man.ntpd.8; NTP 服务器, 它可以用于查询其它的 NTP 服务器, 并配置本地计算机的时钟, 或者为其它机器提供服务。 选择合适的 NTP 服务器 NTP 选择服务器 为了同步您的系统时钟, 需要首先找到至少一个 NTP 服务器以供使用。 网络管理员, 或 ISP 都可能会提供用于这样目的的 NTP 服务器—请查看他们的文档以了解是否是这样。 另外, 也有一个在线的 公开的 NTP 服务器列表, 您可以从中选一个较近的 NTP 服务器。 请确认您选择的服务器的访问策略, 如果需要的话, 申请一下所需的许可。 选择多个相互不连接的 NTP 服务器是一个好主意, 这样在某个服务器不可达, 或者时钟不可靠时就可以有别的选择。 这是因为, &man.ntpd.8; 会智能地选择它收到的响应—它会更倾向于使用可靠的服务器。 配置您的机器 NTP 配置 基本配置 ntpdate 如果只想在系统启动时同步时钟, 则可以使用 &man.ntpdate.8;。 对于经常重新启动, 并且不需要经常同步的桌面系统来说这比较适合, 但绝大多数机器都应该运行 &man.ntpd.8;。 在引导时使用 &man.ntpdate.8; 来配合运行 &man.ntpd.8; 也是一个好主意。 &man.ntpd.8; 渐进地修正时钟, 而 &man.ntpdate.8; 则直接设置时钟, 无论机器的当前时间和正确时间有多大的偏差。 要启用引导时的 &man.ntpdate.8;, 需要把 ntpdate_enable="YES" 加到 /etc/rc.conf 中。 此外, 还需要通过 ntpdate_flags 来设置同步的服务器和选项, 它们将传递给 &man.ntpdate.8;。 NTP ntp.conf 一般配置 NTP 是通过 /etc/ntp.conf 文件来进行配置的, 其格式在 &man.ntp.conf.5; 中进行了描述。 下面是一个例子: server ntplocal.example.com prefer server timeserver.example.org server ntp2a.example.net driftfile /var/db/ntp.drift 这里, server 选项指定了使用哪一个服务器, 每一个服务器都列为移行。 如果某一台服务器上指定了 prefer (偏好) 参数, 如上面的 ntplocal.example.com, 则会优先选择这个服务器。 如果偏好的服务器和其他服务器的响应存在显著的差别, 则丢弃它的响应, 否则将使用来自它的响应, 而不理会其他服务器。 一般来说, prefer 参数应该标注在非常精确的 NTP 时源, 例如那些包含特殊的时间监控硬件的服务器上。 driftfile 选项, 则指定了用来保存系统时钟频率偏差的文件。 &man.ntpd.8; 程序使用它来自动地补偿时钟的自然漂移, 从而使时钟即使在切断了外来时源的情况下, 仍能保持相当的准确度。 另外, driftfile 选项也保存上一次响应所使用的 NTP 服务器的信息。 这个文件包含了 NTP 的内部信息, 它不应被任何其他进程修改。 控制您的服务器的访问 默认情况下, NTP 服务器可以被整个 Internet 上的主机访问。 如果在 /etc/ntp.conf 中指定 restrict 参数, 则可以控制允许哪些机器访问您的服务器。 如果希望拒绝所有的机器访问您的 NTP 服务器, 只需在 /etc/ntp.conf 中加入: restrict default ignore 如果只希望子网内的机器通过您的服务器同步时钟, 而不允许它们配置为服务器, 或作为同步时钟的节点来时用, 则加入 restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap 这里, 需要把 192.168.1.0 改为您网络上的 IP 地址, 并把 255.255.255.0 改为您的子网掩码。 /etc/ntp.conf 可能包含多个 restrict 选项。 要了解进一步的细节, 请参见 &man.ntp.conf.5; 的 Access Control Support(访问控制支持) 小节。 运行 NTP 服务器 要让 NTP 服务器在系统启动时随之开启, 需要把 ntpd_enable="YES" 加入到 /etc/rc.conf 中。 如果希望向 &man.ntpd.8; 传递更多参数, 需要编辑 /etc/rc.conf 中的 ntpd_flags 要在不重新启动机器的前提下启动服务器, 需要手工运行 ntpd, 并带上 /etc/rc.conf 中的 ntpd_flags 所指定的参数。 例如: &prompt.root; ntpd -p /var/run/ntpd.pid 在临时性的 Internet 连接上使用 ntpd &man.ntpd.8; 程序的正常工作并不需要永久性的 Internet 连接。 然而, 如果您的临时性连接是配置为按需拨号的, 那么防止 NTP 通讯频繁触发拨号, 或保持连接就有必要了。 如果您使用用户级 PPP, 可以使用 filter 语句, 在 /etc/ppp/ppp.conf 中进行必要的设置。 例如: 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 要了解进一步的信息, 请参考 &man.ppp.8; 的 PACKET FILTERING(包过滤) 小节, 以及 /usr/share/examples/ppp/ 中的例子。 某些 Internet 访问提供商会阻止低编号的端口, 这会导致 NTP 无法正常工作, 因为响应无法到达您的机器。 进一步的信息 关于 NTP 服务器的文档, 可以在 /usr/share/doc/ntp/ 找到 HTML 格式的版本。 diff --git a/zh_CN.GB2312/books/handbook/ports/chapter.sgml b/zh_CN.GB2312/books/handbook/ports/chapter.sgml index 43d4323e25..67e99e4749 100644 --- a/zh_CN.GB2312/books/handbook/ports/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/ports/chapter.sgml @@ -1,1241 +1,1245 @@ 安装应用程序: Packages 和 Ports 概述 ports packages FreeBSD 将许多系统工具捆绑作为基本系统的一部分。 然而, 要完成实际的工作, 可能还需要安装更多的第三方应用。 FreeBSD 提供了两种补充的技术, 用以在您的系统中安装第三方软件: FreeBSD Ports 套件 (用于从源代码安装), 以及 packages (用以从预编译的二进制版本安装)。 这两种方法都可以用于从本地介质, 或从网上直接安装您喜欢的应用程序的最新版本。 读完这章,您将了解到: 如何安装第三方的二进制软件包。 如何使用 ports 套件从源代码构建第三方软件。 如何删除先前安装的软件包。 如何改动Ports Collection里面的一些参数,定制软件使用。 如何找到您需要的软件包。 如何升级您的应用软件。 软件安装预览 如果您以前使用过 &unix; 系统,那典型的第三方软件安装的步骤是像下面描述的: 下载这个软件,软件的发行版可能是源代码格式,或是一个二进制包。 解开软件(其中代表性的是用 &man.compress.1;, &man.gzip.1;, 或 &man.bzip2.1; 压缩过的tar包)。 阅读相关文档,了解如何安装。 (多半一个文件名是INSTALLREADME, 或在doc/ 目录下的一些文档) 如果软件是以源代码形式发布的,那就需要编译它。可能需要编辑一个 Makefile文件, 或运行 configure脚本,和其他的一些工作。 测试和安装软件。 如果一切顺利的话,就这么简单。如果您在安装一个软件包时发生一些错误, 您可能需要编辑一下它的代码,以使它能正常工作。 您可以继续使用 传统的方式安装软件。 然而, FreeBSD 提供了两种技术: packages 和 ports。 就在写这篇文章的时候, 已经有超过 &os.numports; 个第三方的应用程序可以使用了。 对于任意一个应用程序包,是一个可以下载的FreeBSD package文件。这个 FreeBSD package包含了编译好的的副本, 还有一些配置文件或文档。 一个下载的包文件可以用 FreeBSD 的包管理命令来操作, 例如 &man.pkg.add.1;,&man.pkg.delete.1;, &man.pkg.info.1; 等等。 可以使用一个简单的命令安装一个新的应用程序。 一个FreeBSD的port是一个可以自动从源代码编译成应用程序的文件集合。 记住,如果您自己来编译的话,需要执行很多步的操作 (解压, 补丁, 编译, 安装)。 这些整理 port 的文件集合包含了系统需要完成这个工作的必需信息。 您可以运行一些简单的命令, 那些源代码就可以自动地下载, 解开, 打补丁, 编译, 直至安装完成。 实际上,ports 系统也能做出被 pkg_add 的程序包和不久就要讲到的其他包管理命令来安装的软件包。 Packages 和 ports 是互相 依赖 的。 假设您想安装一个依赖于已经安装的特定库的应用程序。 应用程序和那个库都已经应用于 FreeBSD ports 和 packages。 如果您使用 命令或 ports 系统来添加应用程序, 两个都必须注意库是否被安装, 如果没有, 它会自动先安装库。 这里给出的两种技术是很相似的,您可能会奇怪为什么 FreeBSD 会弄出这两种技术。 其实, packages 和 ports 都有它们自己的长处, 使用哪一种完全取决于您自己的喜好。 Package的优点 一个压缩的 package 通常要比一个压缩的包含源代码的应用程序小得多。 package 不需要进行额外的编译。 对于大型应用程序如 MozillaKDEGNOME 来说这显得尤为重要, 特别是在您的系统资源比较差的情况下。 package不需要您知道如何在FreeBSD上编译软件的详细过程。 Ports 的优点 package 在编译时通常使用比较保守的选项, 这是为了保证它们能够运行在大多数的系统上。 通过从 port 安装, 您可以细微调整编译选项来产生适合于处理器的代码 (针对于 Pentium IV 或 AMD 的 Athlon CPU)。 一些软件包已经把与它们相关的能做和不能做的事情的选项都编译进去了。 例如, Apache 可能就配置了很多的选项。 从 port 中安装时, 您不一定要接受默认的选项, 可以自己来设置。 在一些例子中,一个软件有不同的配置存在多个package。 例如, Ghostscript存在 ghostscript package 和 ghostscript-nox11 package两个配置package, 这取决于您是否安装了X11服务器。 这样的调整对package是可能的, 但如果一个应用程序有超过一个或两个不同的编译时间选项时, 就不行了。 一些软件的许可条件禁止采用二进制形式发行。 它们必须带上源代码。 一些人不信任二进制发行形式。 至少有了源代码, (理论上) 可以亲自阅读它,寻找潜在的问题。 如果您要自己对软件打补丁,您就需要有源代码。 一些人喜欢整天围着源代码转, 所以他们喜欢亲自阅读源代码, 修改源代码等等。 保持更新 ports, 订阅邮件列表 &a.ports; 和递交错误报告 &a.ports-bugs;。 安装任何应用程序之前, 应首先检查 上是否有关于您所安装的应用程序的安全问题报告。 您也可以安装 security/portaudit, 它能够自动地检查已经安装的应用程序的漏洞; 此外, 在您安装程序之前它也会首先检查是否存在已知的漏洞。 另外, 您也可以使用 portaudit -F -a 这个命令在安装了某个软件包之后作出检查。 这章的其余部分将介绍如何使用packages和ports来安装和管理第三方软件。 寻找您要的应用程序 在您安装任何应用程序之前,需要知道您需要什么,那个应用程序叫什么。 FreeBSD中可用的应用程序正在不断地增长着。幸运的是, 有许多方法可以找到您所需要的程序: FreeBSD站点上有一个可以搜索到的当前所有可用的应用程序列表,在 http://www.FreeBSD.org/ports/。 它分很多种类,您既可以通过程序的名称来搜索, 也可以在分类中列出所有可用的应用程序 (如果您知道名字), 也可以在分类中列出所有可用的应用程序。 FreshPorts Dan Langille 维护着网站 FreshPorts,在 。 FreshPort时刻 追踪 着在 ports 中应用程序的变化。当有任何程序被升级时,他们就会发 email 提醒您。 FreshMeat 如果您不知道您想要的应用程序的名字,可以通过 () 网站来查找, 如果找到了应用程序, 您可以回 FreeBSD 的主站去看一下这个应用程序是否已经被 port 进去了。 如果您知道一个port的准确名字, 但需要知道在哪个类别里面能找到它,您可以使用 &man.whereis.1; 这个命令。简单地输入 whereis filefile 就是您想安装的程序名字。 如果系统找到了它, 您将被告知在它在哪里, 例如: &prompt.root; whereis lsof lsof: /usr/ports/sysutils/lsof 结果告诉我们这个命令lsof (一个系统配置程序)可以在 /usr/ports/sysutils/lsof目录中找到。 还有另外的一个寻找您需要的port的方法--是用ports collecton 内嵌的搜索机制。要使用这个搜索, 您需要先到 /usr/ports目录下面。 在那个目录里面, 运行make search name=program-nameprogram-name 就是您想寻找的程序名字。 举个例子, 如果您想找 lsof &prompt.root; cd /usr/ports &prompt.root; make search name=lsof Port: lsof-4.56.4 Path: /usr/ports/sysutils/lsof Info: Lists information about open files (similar to fstat(1)) Maint: obrien@FreeBSD.org Index: sysutils B-deps: R-deps: 在输出的内容里面您要特别注意包含 Path: 的这行将告诉您在哪里可以找到这个 port。 如果要安装此 port, 那其他输出的信息不是必须的, 但是还是显示输出了。 为了更深入的搜索,您还可以用 make search key=stringstring就是您想搜索的部分内容。 它将搜索port的名字、 注释, 描述和从属关系, 如果您不知道您想搜索的程序名字, 可以利用它搜索一些关键主题来找到您需要的。 上面说的这些方法, 搜索的关键字没有大小写区分的。 搜索 LSOF的结果将和搜索lsof的结果一样。 Chern Lee Contributed by 使用Packages系统 一个package的安装 packages installing pkg_add 您可以用 &man.pkg.add.1; 这个命令从本地文件或网络上的服务器来安装一个 FreeBSD 软件包。 在本地手动下载一个package,并安装它 &prompt.root; ftp -a ftp2.FreeBSD.org Connected to ftp2.FreeBSD.org. 220 ftp2.FreeBSD.org FTP server (Version 6.00LS) ready. 331 Guest login ok, send your email address as password. 230- 230- This machine is in Vienna, VA, USA, hosted by Verio. 230- Questions? E-mail freebsd@vienna.verio.net. 230- 230- 230 Guest login ok, access restrictions apply. Remote system type is UNIX. Using binary mode to transfer files. ftp> cd /pub/FreeBSD/ports/packages/sysutils/ 250 CWD command successful. ftp> get lsof-4.56.4.tgz local: lsof-4.56.4.tgz remote: lsof-4.56.4.tgz 200 PORT command successful. 150 Opening BINARY mode data connection for 'lsof-4.56.4.tgz' (92375 bytes). 100% |**************************************************| 92375 00:00 ETA 226 Transfer complete. 92375 bytes received in 5.60 seconds (16.11 KB/s) ftp> exit &prompt.root; pkg_add lsof-4.56.4.tgz 如果您没有本地package的安装盘 (如 FreeBSD CD-ROM), 可以执行 &man.pkg.add.1; 命令并加上 选项。 这将迫使程序自动决定目标文件的正确格式和版本, 然后自动从一个 FTP 站点寻找和安装 package。 pkg_add &prompt.root; pkg_add -r lsof 上面的例子将下载正确的package, 而不需要用户的干预就可以安装。 如果您想指定 FreeBSD package 的镜像站点, 替换主站点, 就必须设置 PACKAGESITE 这个环境变量, 覆盖原来的设置。 &man.pkg.add.1; 使用 &man.fetch.3; 下载文件, 可以使用多种环境变量, 包含 FTP_PASSIVE_MODEFTP_PROXY, 和 FTP_PASSWORD。 如果您使用 FTP/HTTP 代理或在防火墙后面, 您可能需要设置这些环境变量。 详细的列表请参考 &man.fetch.3;。上述例子中用 lsof 替代了 lsof-4.56.4。 当使用远程安装 Package 的时候软件名字不需要包含版本号。 &man.pkg.add.1; 将自动的找到这个软件最新的版本。 如果您使用 &os.current; 或 &os.stable;版本的FreeBSD, &man.pkg.add.1; 将下载您的应用软件的最新版本。 如果您使用 -RELEASE 版本的 FreeBSD, 它将会获得与您的版本相应的软件包版本。 您可以通过修改环境变量 PACKAGESITE 来改变这一行为。 例如, 如果您运行 &os; 5.4-RELEASE 系统, 默认情况下 &man.pkg.add.1; 将尝试从 ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-5.4-release/Latest/ 下载预编译的软件包。 如果您希望强制 &man.pkg.add.1; 下载 &os; 5-STABLE 的软件包, 则可以将 PACKAGESITE 设置为 ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-5-stable/Latest/ 软件包采用 .tgz.tbz 两种格式。您可以在 下面或从 FreeBSD 的发行光盘找到, 它在每一个 4CD 的 FreeBSD 发行版的 /packages目录中。 软件包的设计规划与 /usr/ports 树一致。 每个分类都有自己的目录, 所有的软件包可以在目录 All中找到。 软件包系统的目录结构与ports的设计规划一致; 它们共同构成了整个 package/port。 软件包的管理 packages managing &man.pkg.info.1; 是用于列出已安装的所有软件包列表和描述的程序。 pkg_info &prompt.root; pkg_info cvsup-16.1 A general network file distribution system optimized for CV docbook-1.2 Meta-port for the different versions of the DocBook DTD ... &man.pkg.version.1;是一个用来统计所有安装的软件包版本的工具。 它可以用来比较本地 package 的版本与 ports 目录中的当前版本是否一致。 pkg_version &prompt.root; pkg_version cvsup = docbook = ... 在第二列的符号指出了安装版本的相关时间和本地ports目录树中可用的版本。 符号 含义 = 在本地ports树中与已安装的软件包版本相匹配。 < 已安装的版本要比在ports树中的版本旧。 >已安装的版本要比在ports树中的版本新 (本地的port树可能没有更新)。 ? 已安装的软件包无法在ports索引中找到。 (可能发生这种事情,举个例子, 您早先安装的一个 port 从 port 树中移出或改名了) *软件包有很多版本。 删除一个软件包 pkg_delete packages deleting 要删除先前安装的软件package,只要使用&man.pkg.delete.1; 工具。 &prompt.root; pkg_delete xchat-1.7.1 其它 所有已安装的 package 信息都保存在 /var/db/pkg 目录下。 安装文件的列表和每个 package 的内容和描述都能在这个目录的相关文件中找到。 使用Ports Collection 下面的几个小节中, 给出了关于如何使用 Ports 套件来在您的系统中安装或卸载程序的介绍。 关于可用的 make targets 以及环境变量的介绍, 可以在 &man.ports.7; 中找到。 获得Ports Collection 在您能使用 ports 之前, 您必须先获得 Ports Collection — 本质上是 /usr/ports 目录下的一堆 Makefile、 补丁和描述文件。 在您安装 FreeBSD 系统的时候, sysinstall 会询问您是否需要安装 Ports Collection。 如果您选择 no, 那您可以用下面的指令来安装 Ports Collection: CVSup 方法 保持您本地 Ports 套件最新的一种快捷的方法, 是使用 CVSup 来进行更新。 如果您希望了解更多关于 CVSup 的细节, 请参见 使用 CVSup。 在首次运行 CVSup 之前, 务必确认 /usr/ports 是空的! 如果您之前已经用其他地方安装了一份 Ports 套件, 则 CVSup 可能不会自动删除已经在上游服务器上删除掉的补丁文件。 安装 net/cvsup-without-gui 软件包: &prompt.root; pkg_add -r cvsup-without-gui 请参见 如何安装 CVSup () 以了解更多细节。 运行 cvsup &prompt.root; cvsup -L 2 -h cvsup.FreeBSD.org /usr/share/examples/cvsup/ports-supfile cvsup.FreeBSD.org 改为离您较近的 CVSup 服务器。 请参见 CVSup 镜像 () 中的镜像站点完整列表。 有时可能希望使用自己的 ports-supfile, 比如说, 不想每次都通过命令行来指定所使用的 CVSup 服务器。 这种情况下, 需要以 root 身份将 /usr/share/examples/cvsup/ports-supfile 复制到新的位置, 例如 /root 或您的主目录。 编辑 ports-supfile CHANGE_THIS.FreeBSD.org 修改成离您较近的 CVSup 服务器。 可以参考 CVSup 镜像 () 中的镜像站点完整列表。 接下来按如下的方式运行 cvsup &prompt.root; cvsup -L 2 /root/ports-supfile 此后运行 &man.cvsup.1; 命令将下载最近所进行的改动, 并将它们应用到您的 Ports Collection 上, 不过这一过程并不重新联编您系统上的 ports。 Portsnap 方式 Portsnap 是另一种用于发布 Ports 套件的方法。 它最早从 &os; 6.0 开始引入。 在较早的系统中, 您可以通过 sysutils/portsnap package 来安装它: &prompt.root; pkg_add -r portsnap 请参见 使用 Portsnap 以了解关于全部 Portsnap 功能的详细描述。 如果您使用 &os; 6.1-RELEASE, 或通过 port 或 package 安装了较新版本的 Portsnap 的话, 可以直接跳过这一步。 /usr/ports 将在首次使用 &man.portsnap.8; 命令时自动创建。 而如果您使用的是较早期版本的 Portsnap, 就只能手工创建空的 /usr/ports 目录了。 &prompt.root; mkdir /usr/ports 下载压缩的 Ports 套件快照到 /var/db/portsnap。 您可以根据需要在这之后关闭 Internet 连接。 &prompt.root; portsnap fetch 假如您是首次运行 Portsnap, 则需要将快照释放到 /usr/ports &prompt.root; portsnap extract 如果您已经有装好的 /usr/ports 而您只想更新, 则应执行下面的命令: &prompt.root; portsnap update Sysinstall 方式 这种方法需要使用 sysinstall 从安装介质上安装 Ports 套件。 注意, 安装的将是发布发行版时的旧版 Ports 套件。 如果您能访问 Internet, 应使用前面介绍的方法之一。 root 身份运行 sysinstall (对 &os; 5.2 之前的版本, 应执行 /stand/sysinstall): &prompt.root; sysinstall 用光标向下选择 Configure, 并按 Enter 向下并选择 Distributions, 按 Enter 选择 ports, 并按 Space 选择 Exit, 并按 Enter 选择所希望的安装介质, 例如 CDROM、 FTP, 等等。 选择 Exit 并按 Enter X 退出 sysinstall 安装 Ports ports 安装 当提到 Ports Collection 时, 第一个要说明的就是何谓 skeleton。 简单地说, port skeleton 是让一个程序在 FreeBSD 上简洁地编译并安装的所需文件的最小组合。 每个 port skeleton 包含: 一个 MakefileMakefile 包括好几个部分, 指出应用程序是如何编译以及将被安装在系统的哪些地方。 一个 distinfo 文件。这个文件包括这些信息: 这些文件用来对下载后的文件校验和进行检查, 使用 &man.md5.1; 来确保在下载过程中文件没有被破坏。 一个 files 目录。 这个目录包括在 FreeBSD 系统上编译和安装程序需要用到的补丁。 这些补丁基本上都是些小文件, 指出特定文件作了哪些修正。 它们都是纯文本的的格式,基本上是这样的 删除第 10 行将第 26 行改为这样 ..., 补丁文件也被称作 diffs, 他们由 &man.diff.1; 程序生成。 这个目录也包含了在编译 port 时要用到的其它文件。 一个 pkg-descr 文件。 这是一个提供更多细节,有软件的多行描述。 一个 pkg-plist 文件。 这是即将被安装的所有文件的列表。它告诉 ports 系统在卸载时需要删除哪些文件。 一些ports还有些其它的文件, 例如 pkg-message。 ports 系统在一些特殊情况下会用到这些文件。 如果您想知道这些文件更多的细节以及 ports 的概要, 请参阅 FreeBSD Porter's Handbook port里面包含着如何编译源代码的指令, 但不包含真正的源代码。 您可以在网上或 CD-ROM 上获得源代码。 源代码可能被开发者发布成任何格式。 一般来说应该是一个被 tar 和 gzip 过的文件, 或者是被一些其他的工具压缩或未压缩的文件。 ports中这个程序源代码标示文件叫 distfile, 安装 &os; port的方法还不止这两种。 您必须使用 root 用户登录后安装 ports。 在安装任何 port 之前, 应该首先确保已经更新到了最新的 Ports Collection, 并检查 中是否有与那个 port 有关的安全问题。 在安装应用程序之前, 可以使用 portaudit 来自动地检查是否存在已知的安全问题。 这个工具同样可以在 Ports Collection (security/portaudit) 中找到。 在安装新的 port 之前, 可以考虑先运行一下 portaudit -F 来抓取最新的漏洞数据库。 在每天的周期性系统安全检察时, 数据库会被自动更新, 并且会在这之后实施安全审计。 欲了解进一步的情况,请参阅 &man.portaudit.1; 和 &man.periodic.8;。 Ports 套件假定您有可用的 Internet 连接。 如果您没有, 则需要将 distfile 手工放到 /usr/ports/distfiles 中。 要开始操作, 首先进入要安装 port 的目录: &prompt.root; cd /usr/ports/sysutils/lsof 一旦进入了 lsof 的目录,您将会看到这个port的结构。 下一步就是 make,或说 联编 这个 port。 只需在命令行简单地输入 make 命令就可轻松完成这一工作。 做好之后,您可以看到下面的信息: &prompt.root; make >> lsof_4.57D.freebsd.tar.gz doesn't seem to exist in /usr/ports/distfiles/. >> Attempting to fetch from ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/. ===> Extracting for lsof-4.57 ... [extraction output snipped] ... >> Checksum OK for lsof_4.57D.freebsd.tar.gz. ===> Patching for lsof-4.57 ===> Applying FreeBSD patches for lsof-4.57 ===> Configuring for lsof-4.57 ... [configure output snipped] ... ===> Building for lsof-4.57 ... [compilation output snipped] ... &prompt.root; 注意,一旦编译完成,您就会回到命令行。 下一步安装 port, 要安装它只需要在 make 命令后跟上一个单词 install 即可: &prompt.root; make install ===> Installing for lsof-4.57 ... [installation output snipped] ... ===> Generating temporary packing list ===> Compressing manual pages for lsof-4.57 ===> Registering installation for lsof-4.57 ===> SECURITY NOTE: This port has installed the following binaries which execute with increased privileges. &prompt.root; 一旦您返回到提示符,您就可以运行您刚刚安装的程序了。因为 lsof 是一个赋予特殊权限的程序, 因此显示了一个安全警告。 在编译和安装 ports 的时候, 您应该留意任何出现的警告。 删除工作目录是个好主意, 这个目录中包含了全部在编译过程中用到的临时文件。 这些文件不仅会占用宝贵的磁盘空间, 而且可能会给升级新版本的 port 时带来麻烦。 &prompt.root; make clean ===> Cleaning for lsof-4.57 &prompt.root; 使用 make install clean 可以一步完成 makemake installmake clean 这三个分开的步骤的工作。 一些 shell 会缓存环境变量 PATH 中指定的目录里的可执行文件, 以加速查找它们的速度。 如果您使用的是这类 shell, 在安装 port 之后可能需要执行 rehash 命令, 然后才能运行新安装的那些命令。 这个命令可以在类似 tcsh 的 shell 中使用。 对于类似 sh 的 shell, 对应的命令是 hash -r。 请参见您的 shell 的文档以了解进一步的情况。 某些第三方 DVD-ROM 产品, 如 FreeBSD Mall 的 FreeBSD Toolkit 中包含了 distfiles。 这些文件可以与 Ports 套件配合使用。 将 DVD-ROM 挂接到 /cdrom。 如果您使用不同的挂接点, 则应设置 make 变量 CD_MOUNTPTS。 如果盘上有需要的 distfiles, 则会自动使用。 请注意, 少数 ports 并不允许通过 CD-ROM 发行。 这可能是由于下载之前需要填写注册表格, 或者不允许再次发布, 或者有一些其它原因。 如果您希望安装在 CD-ROM 上没有的 port, 就需要在线操作了。 ports 系统使用 &man.fetch.1; 去下载文件, 它有很多可以设置的环境变量, 其中包括 FTP_PASSIVE_MODEFTP_PROXY, 和 FTP_PASSWORD。 如果您在防火墙之后,或使用 FTP/HTTP代理, 您就可能需要设置它们。 完整的说明请看 &man.fetch.3;。 当使用者不是所有时间都能连接上网络, 则可以利用 make fetch。 您只要在顶层目录 (/usr/ports) 下运行这个命令, 所有需要的文件都将被下载。 这个命令也同样可以在下级类别目录中使用, 例如: /usr/ports/net。 注意, 如果一个port有一些依赖的库或其他 port, 它将 下载这些依赖的 port 的 distfile 文件, 如果您想获取所有依赖的 port 的所有 distfile, 请用 fetch-recursive 命令代替 fetch命令。 您可以在一个类别或在顶级目录编译所有的 port, 或者使用上述提到的 make fetch命令。 这样是非常危险的, 因为有一些port不能并存。 或者有另一种可能, 一些port会安装两个不同的文件, 但是却是相同的文件名。 在一些罕见的例子中, 用户可能需要在除了 MASTER_SITES 以外的一个站点(本地已经下载下来的文件)去获得一个文件包。 您可以用以下命令不使用 MASTER_SITES: &prompt.root; cd /usr/ports/directory &prompt.root; make MASTER_SITE_OVERRIDE= \ ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/ fetch 在这个例子中,我们把 MASTER_SITES这个选项改为了 ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/ 一些 port 允许 (或甚至要求) 您指定编译选项来 启用/禁用 应用程序中非必需的功能, 一些安全选项, 以及其他可以订制的内容。 具有代表性的包括 www/mozillasecurity/gpgme、 以及 mail/sylpheed-claws。 如果存在这样的选项, 通常会在编译时给出提示。 改变默认的 Ports 目录 有时, 使用不同的工作临时目录和目标目录可能很有用 (甚至是必要的)。 可以用 WRKDIRPREFIXPREFIX 这两个变量来改变默认的目录。 例如: &prompt.root; make WRKDIRPREFIX=/usr/home/example/ports install 将把编译 /usr/home/example/ports 中的 port 并把所有的文件安装到 /usr/local &prompt.root; make PREFIX=/usr/home/example/local install 将在 /usr/ports 编译它并安装到 /usr/home/example/local 当然, &prompt.root; make WRKDIRPREFIX=../ports PREFIX=../local install 将包含两种设置 (没有办法在这一页把它写完, 但您应该已经知道怎么回事了)。 另外, 这些变量也可以作为环境变量来设置。 请参考您的 shell 的联机手册上关于如何设置环境变量的说明。 处理 <command>imake</command> 一些 port 使用 imake (这是 X Window 系统的一部分) 不能正常地配合 PREFIX, 它们会坚持把文件安装到 /usr/X11R6 下面。 类似地, 一些 Perl port 会忽略 PREFIX 并把文件安装到 Perl 的目录中。 让这些 port 尊重 PREFIX 是困难甚至是不可能的事情。 卸载已经安装的 Ports ports 卸载 现在您已经了解了如何安装 ports, 并希望进一步了解如何卸载, 特别是在安装了某个之后发现不合适的 port 时。 我们将卸载前面例子 (假如您没有注意的话, 是 lsof) 中安装的 port。 Ports 可以同 packages 以完全相同的方式 (在 Packages 一节 中进行了介绍) 卸载, 方法是使用 &man.pkg.delete.1; 命令: &prompt.root; pkg_delete lsof-4.57 升级 Ports ports 升级 首先, 使用 &man.pkg.version.1; 命令来列出 Ports Collection 中提供了更新版本的那些 port: &prompt.root; pkg_version -v <filename>/usr/ports/UPDATING</filename> 在您更新了 Ports 套件之后, 在升级 port 之前, 应查看 /usr/ports/UPDATING。 这个文件中介绍了在升级时用户应注意的问题, 以及一些可能需要进行的操作。 这可能包括更改文件格式、 配置文件位置的变动, 以及与先前版本的兼容性等等。 如果 UPDATING 与本书中介绍的内容不同, 请以 UPDATING 为准。 使用 Portupgrade 来更新 Ports portupgrade portupgrade 工具是设计来简化升级已安装的 port 的操作的。 它通过 sysutils/portupgrade port 来提供。 您可以像其它 port 那样, 使用 make install clean 命令来安装它: &prompt.root; cd /usr/ports/sysutils/portupgrade &prompt.root; make install clean 使用 pkgdb -F 命令来扫描已安装的 port 的列表, 并修正其所报告的不一致。 在每次升级之前, 有规律地执行它是个好主意。 运行 portupgrade -a 时, portupgrade 将开始并升级系统中所安装的所有过时的 ports。 如果您希望在每个升级操作时得到确认, 应指定 参数。 &prompt.root; portupgrade -ai 如果您只希望升级某个特定的应用程序, 而非全部可用的 port, 应使用 portupgrade pkgname。 如果 portupgrade 应首先升级指定应用程序的话, 则应指定 参数。 &prompt.root; portupgrade -R firefox 要使用预编译的 package 而不是 ports 来进行安装, 需要指定 。 如果指定了这个选项, portupgrade 会搜索 PKG_PATH 中指定的本地目录, 如果没有找到, 则从远程站点下载。 如果本地没有找到, 而且远程站点也没有成功地下载预编译包, 则 portupgrade 将使用 ports。 要禁止使用 port, 可以指定 &prompt.root; portupgrade -PR gnome2 如果只想下载 distfiles (或者, 如果指定了 的话, 是 packages) 而不想构建或安装任何东西, 可以使用 。 要了解更多细节, 请参考 &man.portupgrade.1;。 使用 Portmanager 来升级 Ports portmanager Portmanager 是另一个用以简化已安装 port 升级操作的工具。 它可以通过 sysutils/portmanager port 安装: &prompt.root; cd /usr/ports/sysutils/portmanager &prompt.root; make install clean 可以通过这个简单的命令来升级所有已安装的 port: &prompt.root; portmanager -u 如果希望 Portmanager 在进行每步操作之前都给出提示, 应使用 参数。 Portmanager 也可以用来在系统中安装新的 ports。 与通常的 make install clean 命令不同, 它会在联编和安装您所选择的 port 之前升级所有依赖包。 &prompt.root; portmanager x11/gnome2 如果关于所选 port 的依赖有任何问题, 可以用 Portmanager 来以正确的顺序重新构建它们。 完成之后, 有问题的 port 也将被重新构建。 &prompt.root; portmanager graphics/gimp -f 要了解更多信息, 请参见 Portmanager 联机手册。 Ports 和磁盘空间 ports disk-space 使用 Ports 套件会最终用完磁盘空间。 在通过 ports 联编和安装软件之后, 您应记得清理临时的 work 目录, 其方法是使用 make clean 命令。 您可以使用下面的命令来清理整个 Ports 套件: &prompt.root; portsclean -C 随着时间的推移, 您可能会在 distfiles 目录中积累下大量源代码文件。 您可以手工删除这些文件, 也可以使用下面的命令来删除所有 port 都不引用的文件: &prompt.root; portsclean -D + 除此之外, 也可以用下列命令删去目前安装的 port 没有使用的源码包文件: + + &prompt.root; portsclean -DD + 这个 portsclean 工具是 portupgrade 套件的一部分。 不要忘记删除那些已经安装, 但已不再使用的 ports。 用于自动完成这种工作的一个好工具是 sysutils/pkg_cutleaves port。 安装之后的待办事宜 通常,您通过port安装完一个软件后,可以阅读它带的一些文档(如果它包含文档的话), 或需要编辑它的配置文件,来确保这个软件的运行, 或在机器启动的时候启动(如果它是一个服务的话),等等。 对于不同的软件有着不同的配置步骤。不管怎样, 如果您装好了一个软件,但是不知道下一步怎么办的时候, 这些小技巧可能可以帮助您: 使用 &man.pkg.info.1; 命令,它能找到安装了哪些文件,以及装在哪里。 举个例子,如果您安装了 FooPackage version 1.0.0, 那么这个命令 &prompt.root; pkg_info -L foopackage-1.0.0 | less 将显示这个软件包安装的所有文件,您要特别注意在man/目录里面的文件, 它们可能是手册,etc/目录里面的配置文件,以及 doc/目录下面更多的文档。 如果您不确定已经安装好的软件版本,您可以使用这样的命令 &prompt.root; pkg_info | grep -i foopackage 它将会找到所有已安装的软件包名字中包含foopackage 的软件包。 对于其他的查找, 您只需要在命令行中替换 foopackage 一旦一些软件手册已被您确认安装,您可以使用 &man.man.1; 查看它。 同样的,如果有的话,您还可以完整的查看一遍配置文件的示例,以及任何额外的文档。 如果应用软件有网站, 您还可以从网站上找到文档,常见问题的解答,或其他更多。 如果您不知道它们的网站地址,请使用下面的命令 &prompt.root; pkg_info foopackage-1.0.0 一个 WWW: 行, 如果它存在, 它将提供一个这个应用程序的网站URL. Ports 如果需要在服务器启动时运行(就像互联网服务器), 它通常会把一个脚本的样例放入 /usr/local/etc/rc.d 目录。为了保证正确性, 您可以查看这个脚本, 并编辑或更改这个脚本的名字。 详情请看启动服务。 如何处理坏掉的 Ports 如果您发现某个 port 无法正常工作, 有几件事值得尝试, 包括: 问题报告数据库 中查找是否有尚未提交的修正。 如果有, 可以使用所提议的修正。 要求 port 的监护人 (maintainer) 提供帮助。 输入 make maintainer 或阅读 Makefile 查找监护人的电子邮件地址。 请记得把 port 的名字和版本写在邮件里 (Makefile 中的 $FreeBSD:这一行) 并把错误输出的头几行发给 maintainer。 某些 ports 并非一个人维护, 而是写了一个 邮件列表。 许多, 但并非所有 port, 使用类似 freebsd-listname@FreeBSD.org 这样的地址。 请在提出问题时考虑这一点。 特别地, 由 freebsd-ports@FreeBSD.org 监护的 port, 实际上并没有人维护。 订阅这个邮件列表的人们会感谢您提供的修正和支持。 我们一直都需要更多志愿者! 如果您没有得到回应, 则可以使用 &man.send-pr.1; 来提交问题报告 (请参见 如何撰写 FreeBSD 问题报告)。 修正它! Porter 手册 中提供了关于 Ports 基础设施的详细信息, 通过了解这些内容, 您就能修正偶然坏掉的 port, 或甚至提交自己的 port 了! 从较近的 FTP 站点下载一个编译好的安装包。 中央的 package collection 在 ftp.FreeBSD.orgpackages 目录中, 但 在此之前 一定记得先看看 本地镜像 上是否已经有了! 通常情况下这些安装包都可以直接使用, 而且应该比自行编译快一些。 安装过程本身可以通过 &man.pkg.add.1; 来完成。 diff --git a/zh_CN.GB2312/books/handbook/preface/preface.sgml b/zh_CN.GB2312/books/handbook/preface/preface.sgml index b5aef5221f..55b48f5f8c 100644 --- a/zh_CN.GB2312/books/handbook/preface/preface.sgml +++ b/zh_CN.GB2312/books/handbook/preface/preface.sgml @@ -1,534 +1,534 @@ 前言 预期的读者 作为 FreeBSD 的新用户,您将会在本手册第一部分找到 FreeBSD 的安装方法,同时逐渐引入概念和习俗来加强 &unix; 基础。 阅读这部分只需要您有探索的精神和接受新概念的能力。 读完这些之后,手册中很漫长的第二部分是 FreeBSD 中系统管理员感兴趣的所有主题的全面参考。 在阅读这些章节的内容时所需要的背景知识都注释在每一章节的大纲里面, 如果需要,可在阅读前进行预习。 要获得附加的信息来源列表,请查阅 相对于第二版的改动 您目前看到的这本手册的第三版是 FreeBSD 文档计划的成员历时两年完成的顶峰之作。 第三版包含了如下的的主要变动: , 配置和优化, 进行了扩充并增加了关于 ACPI 电源和资源管理, cron 系统实用程序,以及更多的内核优化选项的相关内容。 , 安全 一章增加了虚拟专用网 (VPNs), 文件访问控制表 (ACLs), 以及安全公告的内容。 , 强制访问控制 (MAC) 是这一版新增的章节。 它解释了什么是 MAC, 以及这一机制如何使您的 FreeBSD 系统更安全。 , 存储, 在原有基础上增加了 USB 存储设备, 文件系统快照, 文件系统容限, 基于文件及网络的文件系统, 以及与加密磁盘分区有关的内容。 ,Vinum, 是这一版中的新章节。 描述了如何使用这种提供了设备无关的逻辑磁盘、软件 RAID-0, RAID-1 和 RAID-5 的卷管理系统——Vinum。 ,PPP 和 SLIP 一章中增加了排除故障的说明。 , 电子邮件 一章中增加了关于如何使用其它的邮件传输代理、 SMTP 认证, UUCP, fecthmail, procmail, 以及其它进阶内容。 ,网络服务, 是新版中全新的一章。 这一章包括了如何架设 Apache HTTP 服务器, FTPd,以及用于支持 Microsoft Windows 客户的 Samba。 一些段落来自原先的 , 进阶网络应用 一章。 ,进阶网络应用 一章增加了关于在 FreeBSD 中使用蓝牙设备, 安装无线网络, 以及使用异步传输模式 (ATM) 网络的内容。 增加了一份词汇表, 用以说明整本书中出现的术语。 对于全书中图表进行了进一步的美化工作。 相对于第一版的改变 本手册的第二版是 FreeBSD 文档计划的成员历时两年完成的顶峰之作。 第二版包含了如下的的主要变动: 添加了完整的索引。 用图形替换了以前所有用 ASCII 插图。 每个章节添加了标准大纲,列出了该章所包含的信息和读者所应该了解的知识。 内容逻辑地分成三个部分: 起步系统管理附录 (安装 FreeBSD) 新版本中使用了抓屏图片,使新用户更容易的领会正文。 (&unix; 基础)扩充了进程、守护进程和信号的附加信息。 (安装应用程序) 扩充了二进制包管理的附加信息。 (X Window 系统) 新版本中着重介绍使用现代桌面技术例如 &xfree86; 4.x 上的 KDEGNOME (FreeBSD 启动过程)对第一版内容进行扩充。 (存储) 由第一版中两个单独的章节磁盘备份合并而成。 我们认为这两部分作为一个整体比较容易理解。同时 RAID (包括硬件和软件 RAID) 部分也被添加进来。 (串口通信) 对第一版进行完善,并为 FreeBSD 4.x/5.x 做了更新。 (PPP 和 SLIP) 全部更新。 许多新的内容被添加到 (高级网络). (电子邮件)增加了关于配置 sendmail 的信息。 (&linux; 兼容性) 增加了关于安装 &oracle;&sap.r3; 的信息。 第二版中也涵盖了下列主题: 配置和调整()。 多媒体() 本手册的组织 这本手册分成了三个逻辑清晰的部分。第一部分 起步 涵盖了 FreeBSD 的安装和基本使用方法。 读者可根据自己的情况按顺序或者跳过一些熟悉的主题来阅读。第二部分 常用操作 涵盖了 FreeBSD 常用的功能, 这部分可以不按顺序阅读。每个部分由一个简明的大纲开始, 这个大纲描述本章节涵盖的内容和读者应该已经知道的知识。 这主要是让读者可以更好的选择感兴趣的章节阅读。第三部分 系统管理 涵盖了 FreeBSD 高级用户所感兴趣的广泛的话题。 第四部分 网络通讯 包括了网络和服务的话题, 而第五部分则是资源信息的附录。 , 介绍 向新用户介绍 FreeBSD。它描述了 FreeBSD 计划的历史、目标和开发模式。 ,安装 本章将会带领用户完成安装过程。一些高级安装主题, 例如如何通过串行控制台安装,也涵盖在内。 ,&unix; 基础 本章涵盖了 FreeBSD 操作系统基础命令和功能。 如果熟悉 &linux; 或者其他类 &unix; 操作系统,则可以跳过这章。 ,安装应用程序 本章涵盖如何用 FreeBSD 的 Ports Collection 和标准二进制软件包来安装第三方软件。 ,X Window 系统 本章概要地描述了 X Window System 系统并详细地介绍了如何在 FreeBSD 上使用它。 此外他也描述了常用的桌面环境, 例如 KDEGNOME ,桌面应用 列出了一些常用的桌面应用程序,比如 web 浏览器和办公套件, 描述了在 FreeBSD 上如何安装它们。 ,多媒体 展示了如何为您的系统设置声卡和视频回放支持。 也描述了一些简单的音频和视频应用程序。 ,配置 FreeBSD 内核 解释了为什么需要配置一个新内核并提供了配置、 编译、安装自定义内核的详细说明。 ,打印 描绘了 FreeBSD 上打印机管理, 包括横幅页、打印统计,还有初始的设置。 ,&linux; 二进制兼容 描述了 FreeBSD 的 &linux; 兼容特性。 也提供了许多流行的 &linux; 应用程序的详细的安装说明, 比如 &oracle;&sap.r3;,还有 &mathematica; ,配置和调整 本章描述了管理员调整 FreeBSD 系统以优化性能时可能用到的一些参数。 也描述了 FreeBSD 中的各种配置文件以及它们所在的位置。 ,启动过程 本章描述 FreeBSD 的启动过程并且解释了如何用配置选项来控制这个过程。 ,用户和基本帐号管理 本章描述了如何创建和操作用户帐号, 同样也论述了设置用户资源限制和其他账号管理任务的方法。 , 安全 描述了保证 FreeBSD 系统安全可以使用的许多工具, 这包括 Kerberos, IPsec 以及 OpenSSH。 , 强制访问控制 解释了何谓强制访问控制 (MAC) 以及如何利用这一机制来加强 FreeBSD 系统的安全。 ,存储 本章描述了怎样用 FreeBSD 来管理存储介质和文件系统,包括物理磁盘、RAID 阵列、光学和磁带媒体、后备存储磁盘以及网络文件系统。 , GEOM 介绍了 FreeBSD 中的 GEOM 框架是什么, 以及如何配置它所支持的各级 RAID。 , Vinum 本章描述了怎样使用逻辑卷管理器 Vinum。它提供了设备无关的逻辑磁盘和软件 RAID-0、RAID-1 以及 RAID-5。 ,本地化 本章描述了如何在 FreeBSD 上使用非英语语言。它涵盖了系统和应用程序级的本地化。 , 最前沿 介绍了 FreeBSD-STABLE、 FreeBSD-CURRENT 以及 FreeBSD 发行版本之间的差异。 描述了一般用户如何紧跟开发过程并从中受益。 ,串行通信 本章解释了如何连接终端和调制解调器到 FreeBSD 系统,包括拨入和拨出连接。 ,PPP 和 SLIP 本章描述了如何用 FreeBSD 通过使用 PPP,SLIP 或者基于以太网的 PPP(PPPoE)来连接远程系统。 , 电子邮件 本章解释了一个 email 服务器的不同组成部分并且简单讨论了关于最流行的 mail 服务器软件 sendmail 的配置。 , 网络服务 提供了详细的指引和示范配置文件以说明如何将一台 FreeBSD 机器作为网络文件系统服务器, 域名服务器, 网络信息服务器或时间同步服务器来使用的方法。 , 防火墙 解释了基于软件的防火墙的原理, 并提供了关于配置 FreeBSD 上的几种防火墙的详细说明。 , 高级网络应用 描述了许多关于网络的主题,包括如何在您的局域网中共享 - Internet 连接, 高级路由话题, 无线网络, 蓝牙, ATM, IPv6以及许多高级话题。 + Internet 连接, 高级路由话题, 无线网络, &bluetooth;, ATM, IPv6以及许多高级话题。 ,获取 FreeBSD 列出了获得 FreeBSD 安装 CDROM 或 DVDROM 的不同资源,也提供了允许您自由下载 FreeBSD 的不同 Internet 站点。 ,参考书目 由于本手册触及到了很多不同的主题,因而可能引发您想要获取更多详细的讲解。 参考书目列出了很多写作这本书时参考的好书。 ,Internet 上的资源 讲述了很多对 FreeBSD 用户有用的能够提出问题并进行技术交流的关于 FreeBSD 的论坛。 ,PGP 秘钥 列出了一些 FreeBSD 开发者的 PGP 签名。 本书中使用的一些约定 为了使本书保持一致性和易读性特做了以下约定: 排版约定 斜体 斜体 字用来表示文件名、URLs、强调文字和术语的主流用法。 等宽 等宽 字体用来表示错误信息、 命令、 环境变量、 port 的名字、 主机名、 用户名、 组名、 设备名、 变量名, 以及代码片断。 粗体 粗体 字用来表示应用程序、命令和关键字。 用户输入 按键用粗体来突出于其他文本。 组合键意味着字用‘+’连接时,同时的按下它们,例如: Ctrl Alt Del 表示您应该同时按下 CtrlAltDel 键。 按顺序依次键入的关键字通常是用逗号隔开,例如: Ctrl X , Ctrl S 这意味着用户应该同时按CtrlX,然后同时按 CtrlS 示例 E:\> 开头的例子代表一个 &ms-dos; 命令。除非另有说明,这些命令都可以在一个现代的 µsoft.windows; 命令行窗口环境被执行。 E:\> tools\fdimage floppies\kern.flp A: 以 &prompt.root; 开头的例子代表必须以 FreeBSD 超级用户身份执行的命令。您可以用 root 身份登录来输入这些命令,或者以普通账号登录然后用 &man.su.1; 来获得超级用户权限。 &prompt.root; dd if=kern.flp of=/dev/fd0 以 &prompt.user; 开头的例子代表命令应该被普通账号执行。 除非另有说明,C-shell 语法来设置环境变量和其他 shell 命令。 &prompt.user; top 致谢 您所看到的这本书是全球几百人努力的结果。 无论他们只是纠正一些错误或提交完整的章节,所有的贡献都是非常有用的。 一些公司通过提供资金让作者专注于文档开发、提供出版资金等等方式来支持文档开发。 其中,BSDi (后并入Wind River Systems) 资助 FreeBSD 文档计划成员来专职改善这本书直到 2000 年三月第一个印刷版 (ISBN 1-57176-241-8) 的出版。Wind River Systems 同时资助其他作者来对输出结构做很多改进和给文章添加一些附加章节。 这项工作结束于 2001 年 11 月印刷第二版 (ISBN 1-57176-303-1)。在 2003-2004 两年中,FreeBSD Mall, 向为改进这本手册以使其第三版印刷版本能够出版的志愿者支付了报酬。 diff --git a/zh_CN.GB2312/books/handbook/security/chapter.sgml b/zh_CN.GB2312/books/handbook/security/chapter.sgml index d276dbe962..cd29458074 100644 --- a/zh_CN.GB2312/books/handbook/security/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/security/chapter.sgml @@ -1,4419 +1,4436 @@ Matthew Dillon 这一章的许多内容来自 security(7) 联机手册,其作者是 安全 security 概述 这一章将对系统安全的基本概念进行介绍, 除此之外, 还将介绍一些好的习惯, 以及 &os; 下的一些更深入的话题。 这章的许多内容对于一般的系统和 Internet 安全也适用。 如今, Internet 已经不再像以前那样是一个人人都愿意与您作好邻居的 友善 的地方。 让系统更加安全, 将保护您的数据、 智力财产、 时间, 以及其他很多东西不至于被入侵者或心存恶意的人所窃取。 &os; 提供了一系列工具和机制来保证您的系统和网络的完整及安全。 读完这章,您将了解: 基本的 &os; 系统安全概念。 &os; 中众多可用的密码学设施,例如 DESMD5 如何设置一次性口令验证机制。 如何配置 TCP Wrappers 以便与 inetd 配合使用。 如何在 &os; 5.0 以前的版本上设置 KerberosIV 如何在 &os; 上设置 Kerberos5 如何配置 IPsec 并在 &os;/&windows; 机器之间建构 VPN 如何配置并使用 OpenSSH,以及 &os; 的 SSH 执行方式。 系统 ACL 的概念,以及如何使用它们。 如何使用 Portaudit 工具来审核从 Ports Collection 安装的第三方软件包的安全性。 如何从 &os; 的安全公告中获得有用信息并采取相应措施。 对于进程记帐功能的感性认识, 并了解如何在 &os; 中启用它。 在开始阅读这章之前,您需要: 理解基本的 &os; 和 Internet 概念。 其他安全方面的话题, 则贯穿本书的始终。 例如, 强制性访问控制 (MAC) 在 中进行了介绍, 而 Internet 防火墙则在 中进行了讨论。 介绍 安全是系统管理员自始至终的基本要求。 由于所有的 BSD &unix; 多用户系统都提供了与生俱来的安全性, 因此建立和维护额外的安全机制, 确保用户的 诚实 可能也就是最需要系统管理员考虑的艰巨的工作了。 机器的安全性取决于您设置的安全设施, 而许多安全方面的考虑, 则会与人们使用计算机时的便利性相矛盾。 一般来说, &unix; 系统能够胜任数目众多进程并发地处理各类任务, 这其中的许多进程是以服务身份运行的 — 这意味着, 外部实体能够与它们互联并产生会话交互。 如今的桌面系统, 已经能够达到许多昔日的小型机甚至主机的性能, 而随着这些计算机的联网和在更大范围内完成互联, 安全也成为了一个日益严峻的课题。 系统的安全也应能够应付各种形式的攻击, 这也包括那些使系统崩溃, 或阻止其正常运转, 但并不试图窃取 root 帐号 (破译 root) 的攻击形式。 安全问题大体可分为以下几类: 拒绝服务攻击。 窃取其他用户的帐户。 通过可访问服务窃取root帐户。 通过用户帐户窃取root帐户。 建立后门。 DoS 攻击 拒绝服务攻击 (DoS) 安全 DoS 攻击 拒绝服务攻击 (DoS) 拒绝服务攻击 (DoS) 拒绝式服务攻击是侵占机器所需资源的一种行为。 通常, DoS 攻击采用暴力(brute-force)手段通过压倒性的流量来破坏服务器和网络栈, 以使机器崩溃或无法使用。 某些 DoS 攻击则利用在网络栈中的错误, 仅用一个简单的信息包就可以让机器崩溃, 这类情况通常只能通过给内核打补丁来修复。 在一些不利的条件下, 对服务器的攻击能够被修复, 只要适当地修改一下系统的选项来限制系统对服务器的负荷。 顽强的网络攻击是很难对付的。 例如,一个欺骗性信息包的攻击, 无法阻止入侵者切断您的系统与Internet的连接。 它不会使您的机器死掉,但它会把Internet连接占满。 security 窃取用户帐户 窃取用户帐户要比D.o.S.攻击更加普遍。 许多系统管理员仍然在他们的服务器上运行着基本的 telnetdrlogindrshdftpd 服务。 这些服务在默认情况下不会以加密连接来操作。 结果是如果您的系统有中等规模大小的用户群, 在通过远程登录的方式登录到您系统的用户中, 一些人的口令会被人窃取。 仔细的系统管理员会从那些成功登录系统的远程访问日志中寻找可疑的源地址。 通常必须假定,如果一个入侵者已经访问到了一个用户的帐户, 那么它就可能使自己成为 root。 然而, 事实是在一个安全和维护做得很好的系统中, 访问用户的帐户不一定会让入侵者成为 root。 这个差别是很重要的,因为没有成为 root 则入侵者通常是无法隐藏它的轨迹的, 而且, 如果走运的话, 除了让用户的文件乱掉和系统崩溃之外, 它不能做什么别的事情。 窃取用户帐户是很普遍的事情, 因为用户往往不会对系统管理员的警告采取措施。 security 后门 系统管理员必须牢牢记住,可能有许多潜在的方法会使他们机器上的 root 用户受到威胁。入侵者可能知道 root 的口令,而如果在以 root 权限运行的服务器上找到一个缺陷 (bug), 就可以通过网络连接到那台服务器上达到目的;另外, 一旦入侵者已经侵入了一个用户的帐户, 可以在自己的机器上运行一个 suid-root 程序来发现服务器的漏洞, 从而让他侵入到服务器并获取 root。 攻击者找到了入侵一台机器上 root 的途径之后, 他们就不再需要安装后门了。许多 root 漏洞被发现并修正之后, 入侵者会想尽办法去删除日志来消除自己的访问痕迹, 所以他们会安装后门。 后门能给入侵者提供一个简单的方法来重新获取访问系统的 root 权限, 但它也会给聪明的系统管理员一个检测入侵的简便方法。 让入侵者无法安装后门事实上对您的系统安全是有害的, 因为这样并不会修复那些侵入系统的入侵者所发现的新漏洞。 安全的管理方法应当使用像 洋葱皮 一样多层次的方法来实现, 这些措施可以按下面的方式进行分类: 确保 root 和维护人员帐户的安全。 确保 root – 以root用户权限运行的服务器和suid/sgid可执行程序的安全。 确保用户帐户的安全。 确保口令文件的安全。 确保内核中核心组件、直接访问设备和文件系统的安全。 快速检测系统中发生的不适当的变化。 做个偏执狂。 这一章的下一节将比较深入地讲述上面提到的每一个条目。 确保 &os; 的安全 security 确保 &os; 的安全 命令与协议 在这份文档中,我们使用 粗体 来表示应用程序, 并使用 单倍距 字体来表示命令。 这样的排版区分能够有效地区分类似 ssh 这样的概念, 因为它既可以表示命令,又可以表示协议。 接下来的几节中, 将介绍在这一章中 前一节 中所介绍的那些加强 &os; 系统安全性的手段。 确保 <username>root</username> 和维护人员帐户的安全 su 首先,如果您没有确保 root 帐户的安全, 就没必要先劳神确保用户帐户的安全了。绝大多数系统都会指派一个口令给 root 帐户。 我们的第一个假定是,口令 总是 不安全的。 这并不意味着您要把口令删掉。 口令通常对访问机器的控制台来说是必须的。 也就是说, 您应该避免允许在控制台以外的地方使用口令, 甚至包括使用 &man.su.1; 命令的情形。 例如,确信您的 pty 终端在 /etc/ttys 文件中被指定为 insecure (不安全),这将使直接通过 telnetrlogin 登录 root 会不被接受。 如果使用如 sshd 这样的其他登录服务, 也要确认直接登录 root 是关闭的。您可以通过编辑 /etc/ssh/sshd_config 文件来做到这一点,确信 PermitRootLogin 被设置成 NO。 考虑到每一种访问方法 — 如FTP这样的服务, 以免因为它们而导致安全性的损失。 直接登录 root 只有通过系统控制台才被允许。 wheel 当然, 作为一个系统管理员, 您应当获得 root身份, 因此, 我们开了一些后门来允许自己进入。 但这些后门只有在经过了额外的口令确认之后才能使用。 一种让 root 可访问的方法是增加适当的用户帐户到 wheel 组 (在 /etc/group 中)。wheel 组中的用户成员可以使用 su 命令来成为 root。 绝对不应该通过在口令项中进行设置来赋予维护人员天然的 wheel 组成员身份。 维护人员应被放置在 staff 组中,然后通过 /etc/group 文件加入到 wheel 组。事实上,只有那些需要以 root 身份进行操作的用户才需要放进 wheel 组中。 当然,也可以通过 某种其它的验证手段,例如 Kerberos,可以通过 root 帐户中的 .k5login 文件来允许执行 &man.ksu.1; 成为 root ,而不必把它们放进 wheel 组。 这可能是一种更好的解决方案, 因为 wheel 机制仍然可能导致入侵者获得 root ,如果他拿到了口令文件,并能够进入职员的帐户。 尽管有 wheel 比什么都没有要强一些, 但它并不是一种绝对安全的办法。 一种间接地提高员工帐号, 乃至 root 权限安全性的方法, 便是采用其他的登录访问方式, 并使用 星号 替代员工加密的口令。使用 &man.vipw.8; 命令, 可以把每一个加密的口令替换成一个 * 符。 这将更新 /etc/master.passwd 文件,以及 用户名/口令数据库,以禁用口令登录。 如下面的员工帐号 foobar:R9DT/Fa1/LV9U:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh 应被改为: foobar:*:1000:1000::0:0:Foo Bar:/home/foobar:/usr/local/bin/tcsh 这一更改将阻止一般的登录,因为加密的口令永远不会与 * 匹配。一旦这么做之后, 任何员工都必须使用其他的方式来完成登录,例如,使用 &man.kerberos.1; 或者通过 &man.ssh.1; 利用 公钥/密钥对 的方式来完成登录。当使用 Kerberos 这样的工具时,通常必须加强运行 Kerberos 的服务器,以及桌面工作站的安全性。当使用 公钥/密钥对以 ssh 登录时,通常必须加固用户 开始 登录的那台机器的安全 (通常这是他们的工作站)。 在这之上还可以增加一层安全性,即在使用 &man.ssh-keygen.1; 生成它的时候,使用口令来保护它们。 如果能够用 星号 替换掉所有员工的口令, 那么,这也就保证了他们只能通过您设置的安全的方法来登录。 这将迫使所有的员工使用安全的、经过加密的连接来完成他们的会话, 而这将使得入侵者通过监听网络通讯, 从某些不相关的、 不太安全的机器上窃取口令成为不可能。 另一种间接的安全机制则是, 从严格受限的机器向限制更宽松的机器上登录。 例如, 如果您的服务器运行了所有的服务,那么,工作站应该什么都不运行。 为了让工作站尽可能地安全,应该避免运行任何没有必要的服务, 甚至不运行任何服务。 另外, 也应该考虑使用带口令保护功能的屏幕保护程序。 毋庸置疑, 如果攻击者能够物理地接触您的工作站, 那么他就有能力破坏任何安全设施,这确实是我们需要考虑的一个问题,但同样地, 真正能够物理接触您的工作站或服务器并实施攻击的人在现实生活中并不常见, 绝大多数攻击来自于网络, 而攻击者往往无法物理地接触服务器或工作站。 KerberosIV 使用类似 Kerberos 这样的工具,也为我们提供了使用一个工具来禁用某个用户, 或修改他们的口令, 并在所有机器上立即生效的方法。 如果员工的帐号被窃取, 能够在所有的其他机器上生效的口令变更将很有意义。如果口令分散地保存在多个机器上, 一次修改 N 台机器上的口令很可能是一件痛苦的事情。 此外, Kerberos 还能够提供更多的限制,除了 Kerberos 令牌有很好的过期机制之外, 它还能够强制用户在某个特定的期限内修改口令(比如说,每月一次). 确保以root用户权限运行的服务器和suid/sgid可执行程序的安全 ntalk comsat finger sandboxes sshd telnetd rshd rlogind 谨慎的管理员只运行他们需要的服务, 不多, 不少。 要当心第三方的服务程序很可能有更多的问题。 例如, 运行旧版的 imapdpopper 无异于将 root 令牌拱手送给全世界的攻击者。 永远不要运行那些您没有仔细检查过的服务程序, 另外也要知道, 许多服务程序并不需要以 root 的身份运行。 例如, ntalkcomsat, 以及 finger 这些服务, 都能够以一种被称作 沙盒 的特殊用户的身份运行。 除非您已经解决掉了许多麻烦的问题, 否则沙盒就不是完美的, 但洋葱式安全规则仍然成立: 如果有人设法攻破了在沙盒中运行的程序, 那么在做更多坏事之前, 他们还必须想办法攻破沙盒本身的限制。 攻击者需要攻破的层次越多, 他们成功的可能性就越小。 过去, 破解 root 的漏洞几乎在所有以 root 身份运行的服务上都发现过, 包括那些基本的系统服务。 如果您的机器只打算向外界提供 sshd 登录, 而用户不会使用 telnetdrshd 甚至 rlogind 登录, 就应该毫不犹豫地关闭它们! &os; 现在默认在沙盒中运行 ntalkd, comsat, 以及 finger。此外, &man.named.8; 也可以这样运行。 /etc/defaults/rc.conf 中包括了如何如此运行 named 的方法,只是这些内容被注释掉了。 如何升级或安装系统将决定这些沙盒所使用的特殊用户是否被自动安装。 谨慎的系统管理员将根据需要研究并实现沙盒。 sendmail 此外,还有一些服务通常并不在沙盒中运行: sendmail, popper, imapd, ftpd, 以及一些其他的服务。当然,它们有一些替代品,但安装那些服务可能需要做更多额外的工作。 可能必须以 root 身份运行这些程序, 并通过其他机制来检测入侵。 系统中另一个比较大的 root 漏洞 是安装在其中的 suid-root 和 sgid 的可执行文件。绝大多数这类程序, 例如 rlogin, 被存放于 /bin, /sbin, /usr/bin, 或 /usr/sbin 中。 尽管并没有 100% 的安全保证,但系统默认的 suid 和 sgid 可执行文件通常是相对安全的。 当然,偶尔也会发现一些存在于这些可执行文件中的 root 漏洞。1998年,Xlib 中发现了一处 root 漏洞,这使得 xterm (通常是做了suid的) 变得可以入侵。 做得安全些, 总比出现问题再后悔要强。 因此,谨慎的管理员通常会限制 suid 可执行文件, 并保证只有员工帐号能够执行它们,或只开放给特定的用户组,甚至彻底干掉 (chmod 000) 任何 suid 可执行文件, 以至于没有人能够执行它们。没有显示设备的服务器通常不会需要 xterm 可执行文件。 sgid 可执行文件通常同样地危险。 一旦入侵者攻克了sgid-kmem,那么他就能够读取 /dev/kmem 并进而读取经过加密的口令文件, 从而窃取任何包含口令的帐号。另外,攻破了 kmem 的入侵者能够监视通过 pty 传送的按键序列,即使用户使用的是安全的登录方式。 攻破了 tty 组的用户则能够向几乎所有用户的 tty 写入数据。如果用户正在运行一个终端程序,或包含了键盘模拟功能的终端仿真程序, 那么,入侵者能够以那个用户的身份执行任何命令。 确保用户帐户的安全 用户帐号的安全通常是最难保证的。虽然您可以为您的员工设置严苛的登录限制, 并用 星号 替换掉他们的口令,但您可能无法对普通的用户这么做。 如果有足够的决策权,那么在保证用户帐号安全的斗争中或许会处于优势, 但如果不是这样,您能做的只是警惕地监控这些帐号的异动。 让用户使用 ssh 或 Kerberos 可能会有更多的问题, 因为需要更多的管理和技术支持,尽管如此,与使用加密的口令文件相比, 这仍不失为一个好办法。 确保口令文件的安全 尽可能使用 * 替换掉口令是保证口令文件安全唯一的解决方法, 如果能够用 ssh 或 Kerberos 的话。即使只有 root 用户能够读取加密过的口令文件 (/etc/spwd.db), 入侵者仍然可能设法读到它的内容, 即使他暂时还无法写入这个文件。 您的安全脚本应该经常检查并报告口令文件的异动 (参见后面的 检查文件完整性 一节)。 确保内核中内核设备、直接访问设备和文件系统的安全 如果攻击者已经拿到了 root 那么他就有能力作任何事情, 当然, 有一些事情是他们比较喜欢干的。 例如, 绝大多数现代的内核都包括一个内建的听包设备。 在 &os; 中,这个设备被称作 bpf 。攻击者通常会尝试在攻克的系统上运行它。 如果您不需要 bpf 设备提供的功能,那么,就不要把它编入内核。 sysctl 但即使已经关掉了 bpf 设备,您仍然需要担心 /dev/mem/dev/kmem 。 就事论事地说,攻击者仍然能够通过直接访问的方式写入磁盘设备。同样地, 还有一个被称作模块加载器, &man.kldload.8; 的机制,也会包含潜在的危险。 尝试入侵企业网络的入侵者会尝试在正在运行的内核上安装他自己的 bpf 设备,或其他听包设备。为了防止这些问题, 需要抬高内核安全级,至少调整到1。可以通过对 kern.securelevel 执行 sysctl 来完成这个任务。一旦把安全级调整到1, 对于直接访问设备的写入操作将被拒绝,而特殊的 chflags 标记,如 schg ,将被强制执行。一定要在重要的启动执行文件、 目录和脚本文件上设置 schg 标记 — 在安全级生效之前的所有文件。这可能做得有些过火, 并将导致在较高安全级上运行时升级系统变得困难。 此外, 运行于较高安全级上,而没有正确设置 schg 标记的系统仍然是存在弱点的。另一种方法是把 //usr 以只读方式挂接。 此外,请注意过于严苛的安全设置将使得入侵检测同样无法进行。 检查文件完整性: 可执行文件,配置文件和其他文件 当实施严格的限制时,往往会在使用的方便性上付出代价。例如,使用 chflags 来把 schg 标记 应用到 //usr 中的绝大多数文件上可能会起到反作用, 因为尽管它能够保护那些文件,但同样关掉了一个很好的监测机制。 层次化安全的最后一层可能是最重要的 — 检测。 安全的其他部分可能相对来讲意义并不那么大 (或者,更糟糕的事情是, 那些措施会给您安全的假象), 假如您无法检测潜在的入侵事件。 层次化安全最重要的功能是减缓入侵者, 而不是彻底不让他们入侵,这能够让检测起到作用,并更好地捕捉入侵行为。 检测入侵的一种好办法是查找那些被修改、删除或添加的文件。 检测文件修改的最佳方法是与某个 (通常是中央的) 受限访问的系统上的文件进行比对。 在一台严格限制访问的系统上撰写您的安全脚本通常不能够被入侵者察觉, 因此,这非常重要。为了最大限度地发挥这一策略的优势,通常会使用只读的 NFS, 或者设置 ssh 钥匙对以便为其他机器提供访问。除了网络交互之外, NFS可能是一种很难被察觉的方法 — 它允许您监控每一台客户机上的文件系统, 而这种监控几乎是无法察觉的。如果一台严格受限的服务器和客户机是通过交换机连接的, 那么 NFS 将是一种非常好的方式。 不过,如果那台监控服务器和客户机之间通过集线器 (Hub),或经过许多层的路由来连接,则这种方式就很不安全了, 此时,应考虑使用 ssh ,即使这可以在审计记录中查到。 一旦为这个受限的机器赋予了至少读取它应监控的客户系统的权限, 就应该为实际的监控撰写脚本。以 NFS 挂接为例,可以用类似 &man.find.1; 和 &man.md5.1; 这样的命令为基础来完成我们所需的工作。 最好能够每天对被控机的所有执行文件计算一遍 md5,同时,还应以更高的频率测试那些 /etc/usr/local/etc 中的控制文件。一旦发现了不匹配的情形,监控机应立即通知系统管理员。 好的安全脚本也应该检查在系统分区,如 //usr 中是否有新增或删除的可执行文件,以及不适宜的 suid 。 如果打算使用 ssh 来代替 NFS,那么撰写安全脚本将变得困难许多。 本质上,需要在脚本中使用 scp 在客户端复制文件, 另一方面,用于检查的执行文件 (例如 find) 也需要使用 scp 传到客户端,因为 ssh 客户程序很可能已经被攻陷。 总之,在一条不够安全的链路上 ssh 可能是必须的, 但也必须应付它所带来的难题。 安全脚本还应该检查用户以及职员成员的权限设置文件: .rhosts.shosts.ssh/authorized_keys 等等。 … 这些文件可能并非通过 MD5 来进行检查。 如果您的用户磁盘空间很大, 检查这种分区上面的文件可能非常耗时。 这种情况下, 采用标志来禁止使用 suid 可执行文件和设备在这些文件系统上出现将是一个好主意。 您可能会想看看 nodevnosuid 这两个选项 (参见 &man.mount.8;)。 尽管如此, 这些扫描仍然应该至少每周进行一次, 这样做的意义并不是检测有效的攻击, 而是检查攻击企图。 进程记帐 (参见 &man.accton.8;) 是一种相对成本较低的, 可以帮助您在被入侵后评估损失的机制。 对于找出入侵者是如何进入系统的这件事情来说, 它会非常的有所助益,特别是当入侵者什么文件都没有修改的情况下。 最后, 安全脚本应该处理日志文件, 而日志文件本身应该通过尽可能安全的方法生成 — 远程 syslog 可能非常有用。 入侵者会试图掩盖他们的踪迹, 而日志文件对于希望了解入侵发生时间的系统管理员来说则显得尤为重要。 保持日志文件的永久性记录的一种方法是在串口上运行系统控制台, 并持续不断地在一台安全的机器上收集这些信息。 偏执 带点偏执不会带来伤害。作为一种惯例, 系统管理员在不影响使用的便利的前提下可以启用任何安全特性,此外, 在经过深思熟虑之后,也可以增加一些 确实会 让使用变得不那么方便的安全特性。 更重要的是,有安全意识的管理员应该学会混合不同的安全策略 — 如果您逐字逐句地按照这份文档来配置您的机器, 那无异于向那些同样能得到这份文档的攻击者透露了更多的信息。 拒绝服务攻击 拒绝服务 (DoS) 这一节将介绍拒绝服务攻击。 DoS 攻击通常是基于数据包的攻击, 尽管几乎没有任何办法来阻止大量的伪造数据包耗尽网络资源, 但通常可以通过一些手段来限制这类攻击的损害,使它们无法击垮服务器。 限制服务进程 fork. 限制 springboard 攻击 (ICMP 响应攻击, ping 广播,等等)。 内核路由缓存 对于通过复制进程 (fork) 来进行服务的服务器的一种很常见的攻击是想办法耗尽其进程、 文件描述符或者内存, 直到机器彻底死掉。 inetd (参见 &man.inetd.8;) 提供了许多选项来限制这类攻击。 需要注意的是, 尽管能够阻止一台机器彻底垮掉, 但通常无法防止服务本身被击垮。 请仔细阅读 inetd 的联机手册, 特别是它的 以及 这三个选项。 伪造 IP 攻击能够绕过 inetd 选项, 因此, 这些选项需要配合使用。 某些独立的服务器也有类似的限制参数。 例如, Sendmail 就提供了自己的 选项, 它通常比 sendmail 的负载限制选项更为有效, 因为服务器负载的计算有滞后性。 您可以在启动 sendmail 时指定一个 MaxDaemonChildren 参数, 把它设的足够高以便承载您所需要的负荷, 当然, 不要高到足以让运行 sendmails 的机器死掉。 此外, 以队列模式 () 并把服务程序 (sendmail -bd) 和队列执行程序分别执行 (sendmail -q15m) 也是一个好主意。 如果您希望保证队列的实时性, 可以考虑使用更短的间隔, 例如 , 但同时也需要指定一个合理的子进程数, 也就是通过 MaxDaemonChildren 选项以免 那个 sendmail 造成重叠的故障。 Syslogd 可以被直接地攻击,因此, 强烈建议只要可行,就在启动它的时候加上 参数, 其他情况下,则至少应该加上 对于基于连接的服务,例如 TCP Wrapper 的 reverse-identd, 都应该格外的小心, 因为它们都可能直接遭受攻击。 一般情况下, 基于安全考虑, 不应使用 TCP Wrapper 所提供的 reverse-ident 这样的功能。 此外, 将内部服务保护起来, 阻止来自其他主机的访问也十分重要, 这些工作可以通过设置边界路由器来完成。 主要的想法, 是阻止来自您的 LAN 以外的访问, 这有助于避免 root 受到攻击。 尽可能配置排他式的防火墙, 例如, 用防火墙阻止所有的网络流量 除了 端口 A、B、 C、D,以及 M-Z。 通过采用这种方法, 您可以很容易地将低端口的访问阻止在外, 而又不难配置使防火墙放过那些明确需要开放的服务, 例如 named (如果您的机器准备作为域的主要解析服务器), ntalkdsendmail,以及其他可以从 Internet 访问的服务。 如果您尝试以其他方式配置防火墙 — 采用比较宽松的策略, 那么您将很有可能忘记 关掉 一两个服务, 或者在增加了一些服务之后忘记更新防火墙策略。 尽管如此, 仍然可以考虑允许让数据进入编号较高的那一部分端口, 这将保证那些需要这样特性的服务能够正常工作, 而又不影响低端口服务的安全性。 此外, 还应注意到 &os; 允许您来控制动态绑定的端口的范围, 即一系列 net.inet.ip.portrange 变量,通过 sysctl 来完成设置。 (sysctl -a | fgrep portrange)。 这使得您完成较复杂的防火墙策略变得易如反掌。 例如, 您可能希望普通的高段端口的起止范围是 4000 到 5000, 而更高范围则是 49152 到 65535, 随后在防火墙中阻止低于 4000 的所有端口 (当然, 除了那些特地为 Internet 访问而开设的端口)。 另一种常被称作 springboard 的攻击也是非常常见的 DoS 攻击 — 它通过使服务器产生其无法处理的响应来达到目的。 最常见的攻击就是 ICMP ping 广播攻击。 攻击者通过伪造 ping 包, 将其源 IP 设置为希望攻击的机器的 IP。 如果您的边界路由器没有进行禁止 ping 广播地址的设置, 则您的网络将最终陷于响应伪造的 ping 之中, 特别是当攻击者同时使用了多个不同的网络时。 广播攻击能够产生超过 120 兆位的瞬时流量。 另一种常见的针对 ICMP 错误报告系统的 springboard 攻击, 通过建立可以生成 ICMP 出错响应的包, 攻击者能够攻击服务器的网络下行资源, 并导致其上行资源耗尽。 这种类型的攻击也可以通过耗尽 mbuf 来使得使得被攻击的服务器崩溃,特别是当这些服务器无法足够快地完成 ICMP 响应的时候。 较新的内核可以通过调整 sysctl 变量 net.inet.icmp.icmplim 来限制这种攻击。 最后一类主要的 springboard 是针对某些 inetd 的内部服务, 例如 udp echo 服务进行的。 攻击者简单地伪造一个来自服务器 A 的 echo 口的 UDP 包, 然后将这个包发到 B 的 echo 口。 于是, 两台服务器将不停地将包弹给对方。 攻击者能够将两台服务器的这种服务都耗竭, 并且通过这种方式, 只需要很少的包就可以让 LAN 超载。 类似的问题对 chargen 口也是存在的。 好的系统管理员应该关闭这些 inetd 的测试服务。 伪造的包攻击也可以用来使内核的路由缓存过载。 请参考 net.inet.ip.rtexpirertminexpire, 以及 rtmaxcache sysctl 参数。 伪造的包可以用随机的源 IP 攻击, 使得内核在路由表中产生一个临时的缓存项, 它可以通过 netstat -rna | fgrep W3 看到。 这些路由通常需要 1600 秒才会过期。 如果内核发现路由表变得太大, 它会动态地降低 rtexpire 但以 rtminexpire 为限。 这引发了两个问题: 在访问量不大的服务器上, 内核对于突然袭击的反应不够快。 rtminexpire 的值没有低到让内核在此类攻击时活下去的程度。 如果您的服务器通过 T3 或更快的线路接入 Internet, 那么通过 &man.sysctl.8; 来手动地降低 rtexpirertminexpire 就非常必要。 当然,绝不要把它们设置为零 (除非您想让机器崩溃) 将这两个参数设置为 2 通常已经足以抵御这类攻击了。 Kerberos 和 SSH 的访问问题 ssh KerberosIV 如果您打算使用, 那么 Kerberos 和 ssh 都有一些需要解决的问题。 Kerberos V 是一个很棒的验证协议, 但使用了它的 telnetrlogin 应用程序有一些 bug, 使得它们不适合处理二进制流。 而且, 除非使用了 选项, 否则默认情况下 Kerberos 并不加密会话。 ssh 在默认时加密所有的会话内容。 除了默认转发加密密钥, ssh 在所有的其他方面都做得很好。 这意味着如果您持有供您访问系统其他部分密钥的工作站作了很好的安全防护, 而您连到了一台不安全的机器上, 则您的密钥可能被别人获得。 尽管实际的密钥并没有被泄漏, 但由于 ssh 会在您登录的过程中启用一个转发端口, 如果攻击者拿到那台不安全的机器上的 root 那么他将能够利用那个端口来使用您的密钥, 从而访问您能够访问的那些机器。 我们建议您在使用 ssh 时配合 Kerberos 来完成工作人员的登录过程。 ssh 在编译时可以加入 Kerberos 支持。 在减少了潜在地暴露 ssh 密钥的机会的同时, 它还能够通过 Kerberos 来保护口令。 ssh 密钥只有在做过安全防护的机器上执行自动操作时才应使用 (这是 Kerberos 不适合的情形)。 此外,我们还建议您要么在 ssh 配置中关闭密钥转发, 要么在 authorized_keys 中增加 from=IP/DOMAIN 选项, 来限制这些密钥能够登录的来源机器。 Bill Swingle 部分重写、更新来自 DES,MD5,以及Crypt 安全 密码 crypt DES MD5 &unix; 系统上的每个用户都有一个与其帐户关联的口令。 很显然, 密码只需要被这个用户和操作系统知道。 为了保证口令的私密性, 采用了一种称为 单向散列 的方法来处理口令, 简单地说, 很容易从口令推算出散列值, 反之却很难。 其实, 刚才那句话可能并不十分确切: 因为操作系统本身并不 真的 知道您的口令。 它只知道口令 经过加密的形式。 获取口令对应 明文 的唯一办法是采用暴力在口令可能的区间内穷举。 不幸的是,当 &unix; 刚刚出现时,安全地加密口令的唯一方法基于DES, 数据加密标准 ( the Data Encryption Standard )。 于是这给那些非美国居民带来了问题, 因为 DES 的源代码在当时不能被出口到美国以外的地方, &os; 必须找到符合美国法律,但又要与其他那些使用 DES 的 &unix; 版本兼容的办法。 解决方案是把加密函数库分割为两个, 于是美国的用户可以安装并使用 DES 函数库, 而国际用户则使用另外一套库提供的一种可以出口的加密算法。 这就是 &os; 为什么使用 MD5 作为它的默认加密算法的原因。 MD5 据信要比 DES 更安全,因此,安装 DES 更多地是出于兼容目的。 识别您采用的加密算法 现在这个库支持 DES、 MD5 和 Blowfish 散列函数。默认情况下, &os; 使用 MD5 来加密口令。 可以很容易地识别 &os; 使用哪种加密方法。 检查 /etc/master.passwd 文件中的加密密码是一种方法。 用 MD5 散列加密的密码通常要比用 DES 散列得到的长一些, 并且以 $1$ 字符开始。 以 $2a$ 开始的口令是通过 Blowfish 散列函数加密的。 DES 密码字符没有任何可以用于鉴别的特征, 但他们要比 MD5 短, 并且以不包括 $ 在内的 64 个可显示字符来表示, 因此相对比较短的、没有以美元符号开头的字符串很可能是一个 DES 口令。 新口令所使用的密码格式是由 /etc/login.conf 中的 passwd_format 来控制的, 可供选择的算法包括 des, md5blf。 请参考 &man.login.conf.5; 联机帮助以获得更进一步的详情。 一次性口令 一次性口令 安全 一次性口令 默认情况下, &os; 提供了 OPIE (One-time Passwords In Everything) 支持, 它默认使用 MD5 散列。 下面将介绍三种不同的口令。 第一种是您常用的 &unix; 风格或 Kerberos 口令; 我们在后面的章节中将称其为 &unix; 口令。 第二种是使用 OPIE 的 &man.opiekey.1; 程序生成, 并为 &man.opiepasswd.1; 以及登录提示所接受的一次性口令,我们称其为 一次性口令。 最后一类口令是您输入给 opiekey 程序 (有些时候是 opiepasswd 程序) 用以产生一次性口令的秘密口令,我们称其为 秘密口令 或通俗地简称为 口令 秘密口令和您的 &unix; 口令毫无关系, 尽管可以设置为相同的, 但不推荐这么做。 OPIE 秘密口令并不像旧式的 &unix; 口令那样只能限于8位以内在 &os; 中标准的登录口令最长不能超过 128 个字符。。 您想要用多长的口令都可以。 有六、七个词的短句是很常见的选择。 在绝大多数时候, OPIE 系统和 &unix; 口令系统完全相互独立地工作。 除了口令之外, 对于 OPIE 还有两组至关重要的数据。 其一被称作 种子key, 它包括两个字符和五个数字。 另一个被称作 迭代轮数, 这是一个 1 到 100 之间的数字。 OPIE 通过将种子加到秘密口令后面, 并执行迭代轮数那么多次的 MD4/MD5 散列运算来得到结果, 并将结果表示为 6 个短的英文单词。 这 6 个英文单词就是您的一次性口令。 验证系统 (主要是 PAM) 会记录上次使用的一次性口令, 如果用户提供的口令的散列值与上次一致, 则可以通过身份验证。 由于使用了单向的散列函数, 因此即使截获了上次使用的口令, 也没有办法恢复出下次将要使用的口令; 每次成功登录都将导致迭代轮数递减, 这样用户和登录程序将保持同步。 每当迭代轮数减少到 1 时, 都必须重新初始化 OPIE。 接下来将讨论和每个系统有关的三个程序。 opiekey 程序能够接收带迭代计数, 种子和秘密口令, 并生成一个一次性口令, 或一张包含连续的一组一次性口令的表格。 opiepasswd 程序用于初始化 OPIE, 并修改口令、 迭代次数、种子和一次性口令。 和 opieinfo 程序可以用于检查相应的验证数据文件 (/etc/opiekeys) 并显示执行命令的用户当前的迭代轮数和种子。 我们将介绍四种不同的操作。 在安全的连接上通过 opiepasswd 来第一次设置一次性口令, 或修改口令及种子。 第二类操作是在不安全的连接上使用 opiepasswd 辅以在安全连接上执行的 opiekey 来完成同样的工作。 第三类操作是在不安全的连接上使用 opiekey 来登录。 最后一类操作是采用 opiekey 来生成大批的密码, 以便抄下来或打印出来,在没有安全连接的地方使用。 安全连接的初始化 第一次初始化 OPIE 时, 可以使用 opiepasswd 命令: &prompt.user; opiepasswd -c [grimreaper] ~ $ opiepasswd -f -c Adding unfurl: Only use this method from the console; NEVER from remote. If you are using telnet, xterm, or a dial-in, type ^C now or exit with no password. Then run opiepasswd without the -c parameter. Using MD5 to compute responses. Enter new secret pass phrase: Again new secret pass phrase: ID unfurl OTP key is 499 to4268 MOS MALL GOAT ARM AVID COED Enter new secret pass phrase:Enter secret password: 提示之后, 应输入一个密码或口令字。 请留意, 这并不是您用于登录的口令, 它用于生成一次性的登录密钥。 ID 这一行给出了所需的参数: 您的登录名, 迭代轮数, 以及种子。 登录系统时, 它能够记住这些参数并呈现给您, 因此无需记忆它们。 最后一行给出了与您的秘密口令对应的、用于登录的一个一次性口令; 如果您立即重新登录, 则它将是您需要使用的那个口令。 不安全连接初始化 如果您需要通过一个不安全的连接来初始化, 则应首先在安全连接上执行过一次 opiekey; 您可能希望在可信的机器的 shell 提示符下完成。 此外还需要指定一个迭代轮数 (100 也许是一个较好的选择) 也可以选择一个自己的种子, 或让计算机随机生成一个。 在不安全的连接上 (当然是连到您希望初始化的机器上),使用 opiepasswd 命令: &prompt.user; opiepasswd Updating unfurl: You need the response from an OTP generator. Old secret pass phrase: otp-md5 498 to4268 ext Response: GAME GAG WELT OUT DOWN CHAT New secret pass phrase: otp-md5 499 to4269 Response: LINE PAP MILK NELL BUOY TROY ID mark OTP key is 499 gr4269 LINE PAP MILK NELL BUOY TROY 为了接受默认的种子, 按下 Return。 在输入访问口令之前, 到一个有安全连接的机器上, 并给它同样的参数: &prompt.user; opiekey 498 to4268 Using the MD5 algorithm to compute response. Reminder: Don't use opiekey from telnet or dial-in sessions. Enter secret pass phrase: GAME GAG WELT OUT DOWN CHAT 现在回到不安全的连接, 并将生成的一次性口令粘贴到相应的应用程序中。 生成一个一次性密码 一旦初始化过 OPIE, 当您登录时将看到类似这样的提示: &prompt.user; telnet example.com Trying 10.0.0.1... Connected to example.com Escape character is '^]'. FreeBSD/i386 (example.com) (ttypa) login: <username> otp-md5 498 gr4269 ext Password: 另外, OPIE 提示有一个很有用的特性 (这里没有表现出来): 如果您在口令提示处按下 Return(回车) 系统将回显刚键入的口令, 您可以藉此看到自己所键入的内容。 如果试图手工键入一个一次性密码, 这会非常有用。 MS-DOS Windows MacOS 此时您需要生成一个一次性密码来回答这一提示。 这项工作必须在一个可信的系统上执行 opiekey 来完成。 (也可以找到 DOS、 &windows; 以及 &macos; 等操作系统上运行的版本)。 这个程序需要将迭代轮数和种子提供给它。 您可以从登录提示那里复制和粘贴它们。 在可信的系统上: &prompt.user; opiekey 498 to4268 Using the MD5 algorithm to compute response. Reminder: Don't use opiekey from telnet or dial-in sessions. Enter secret pass phrase: GAME GAG WELT OUT DOWN CHAT 现在就可以用刚刚获得的一次性口令登录了。 产生多个一次性口令 有时,会需要到不能访问可信的机器或安全连接的地方。 这种情形下, 可以使用 opiekey 命令来一次生成许多一次性口令。 例如: &prompt.user; opiekey -n 5 30 zz99999 Using the MD5 algorithm to compute response. Reminder: Don't use opiekey from telnet or dial-in sessions. Enter secret pass phrase: <secret password> 26: JOAN BORE FOSS DES NAY QUIT 27: LATE BIAS SLAY FOLK MUCH TRIG 28: SALT TIN ANTI LOON NEAL USE 29: RIO ODIN GO BYE FURY TIC 30: GREW JIVE SAN GIRD BOIL PHI 按顺序请求 5 个口令, 则指定了最后一个迭代轮数应该是多少。 注意这些口令将按与使用顺序相反的顺序来显示。 如果您比较偏执, 可以手工写下这些结果; 一般来说把它粘贴到 lpr 就可以了。 注意,每一行都显示迭代轮数及其对应的一次性的密码; 一些人建议用完一个就划掉一个。 限制使用 &unix; 口令 OPIE 可以对 &unix; 口令的使用进行基于 IP 的登录限制。 对应的文件是 /etc/opieaccess, 这个文件默认情况下就是存在的。 请参阅 &man.opieaccess.5; 以了解关于这个文件进一步的情况, 以及安全方面需要进行的一些考虑。 下面是一个示范的 opieaccess 文件: permit 192.168.0.0 255.255.0.0 这行允许指定 IP 地址的用户 (再次强调这种地址容易被伪造) 在任何时候使用 &unix; 口令登录。 如果 opieaccess 中没有匹配的规则, 则将默认拒绝任何非 OPIE 登录。 Tom Rhodes 作者: TCP Wrappers TCP Wrappers 每一个熟悉 &man.inetd.8; 都应该听说过 TCP Wrappers, 但几乎没有人对它在网络环境中的作用有全面的理解。 几乎每个人都会安装防火墙来处理网络连接, 然而虽然防火墙有非常广泛的用途, 它却不是万能的, 例如它无法处理类似向连接发起者发送一些文本这样的任务。 而 TCP 软件能够完成它以及更多的其他事情。 接下来的几段中将讨论许多 TCP Wrappers 提供的功能, 并且, 还给出了一些配置实例。 TCP Wrappers 软件扩展了 inetd 为受其控制的服务程序实施控制的能力。 通过使用这种方法, 它能够提供日志支持、 返回消息给联入的连接、 使得服务程序只接受内部连接, 等等。 尽管防火墙也能够完成其中的某些功能, 但这不仅增加了一层额外的保护, 也提供了防火墙无法提供的功能。 然而, 由 TCP Wrappers 提供的一些额外的安全功能, 不应被视为好的防火墙的替代品。 TCP Wrappers 应结合防火墙或其他安全加强设施一并使用, 为系统多提供一层安全防护。 由于这些配置是对于 inetd 的扩展, 因此, 读者应首先阅读 配置 inetd 这节。 尽管由 &man.inetd.8; 运行的程序并不是真正的 服务程序, 但传统上也把它们称为服务程序。 下面仍将使用这一术语。 初始配置 在 &os; 中使用 TCP Wrappers 的唯一要求是确保 inetd 在从 rc.conf 中启动时包含了 选项; 这是默认的设置。 当然, 还需要对 /etc/hosts.allow 进行适当的配置, 但 &man.syslogd.8; 在配置不当时会在系统日志中记录相关消息。 与其它的 TCP Wrappers 实现不同, 使用 hosts.deny 在这里被认为是不推荐和过时的做法。 所有的配置选项应放到 /etc/hosts.allow 中。 在最简单的配置中, 服务程序的连接策略是根据 /etc/hosts.allow 允许或阻止。 &os; 中的默认配置是允许一切发到由 inetd 所启动的服务的连接请求。 在基本配置之后将讨论更复杂的情况。 基本配置的形式通常是 服务 : 地址 : 动作。 这里 服务 是从 inetd 启动的服务程序的名字。 而 地址 可以是任何有效的主机名、 一个 IP 或由方括号 ([ ]) 括起来的 IPv6 地址。 动作字段可以使 allow 或 deny, 分别用于允许和禁止相应的访问。 在配置时您需要注意所有的配置都是按照第一个匹配的规则运转的, 这表示配置文件将按照顺序查找匹配规则, 而一旦找到匹配, 则搜索也就停止了。 另外也有许多其他选项, 这些将在后面介绍。 简单的配置行从上面这些描述之中可以很容易得出。 例如, 允许 POP3 连接通过 mail/qpopper 服务, 应把下面的行添加到 hosts.allow # This line is required for POP3 connections: qpopper : ALL : allow 增加这样之后, 需要重新启动 inetd。 可以通过使用 &man.kill.1; 命令来完成这项工作, 或使用 /etc/rc.d/inetdrestart parameter 参数。 高级配置 TCP Wrappers 也有一些高级的配置选项; 它们能够用来对如何处理连接实施更多的控制。 一些时候, 返回一个说明到特定的主机或请求服务的连接可能是更好的办法。 其他情况下, 记录日志或者发送邮件给管理员可能更为适合。 另外, 一些服务可能只希望为本机提供。 这些需求都可以通过使用 通配符, 扩展字符以及外部命令来实现。 接下来的两节将介绍这些。 外部命令 假设由于发生了某种状况, 而导致连接应该被拒绝掉, 而将其原因发送给发起连接的人。 如何完成这样的任务呢? 这样的动作可以通过使用 选项来实现。 当发起了连接请求时, 将调用一个命令或脚本。 在 hosts.allow 文件中已经给出了一个例子: # The rest of the daemons are protected. ALL : ALL \ : severity auth.info \ : twist /bin/echo "You are not welcome to use %d from %h." 这个例子将把消息 You are not allowed to use daemon from hostname. 返回给访问先前没有配置过允许访问的服务客户。 对于希望把消息反馈给连接发起者, 然后立即切断这样的需求来说, 这样的配置非常有用。 请注意所有反馈信息 必须 被引号 " 包围; 这一规则是没有例外的。 如果攻击者向服务程序发送大量的连接请求, 则可能发动一次成功的拒绝服务攻击。 另一种可能是针对这种情况使用 。 类似 也暗含拒绝连接, 并可以用来执行外部命令或服务。 与 不同的是, 不会向连接发起者发送回应。 考虑下面的配置: # We do not allow connections from example.com: ALL : .example.com \ : spawn (/bin/echo %a from %h attempted to access %d >> \ /var/log/connections.log) \ : deny 这将拒绝来自 *.example.com 域的所有连接; 同时还将记录主机名, IP 地址, 以及对方所尝试连接的服务名字到 /var/log/connections.log 文件中。 除了前面已经介绍过的转义字符, 例如 %a 之外, 还有一些其它的转义符。 参考 &man.hosts.access.5; 联机手册可以获得完整的列表。 通配符选项 前面的例子都使用了 ALL。 其它选项能够将功能扩展到更远。 例如, ALL 可以被用来匹配每一个服务、 域,或 IP 地址。 另一些可用的通配符包括 PARANOID, 它可以用来匹配任何来自可能被伪造的 IP 地址的主机。 换言之, paranoid 可以被用来定义来自 IP 与其主机名不符的客户。 下面的例子将给您更多的感性认识: # Block possibly spoofed requests to sendmail: sendmail : PARANOID : deny 在这个例子中, 所有连接 sendmailIP 地址与其主机名不符的主机都将被拒绝。 如果服务器和客户机有一方的 DNS 配置不正确, 使用 PARANOID 可能会严重地削弱服务。 在设置之前, 管理员应该谨慎地考虑。 要了解关于通配符和他们的功能, 请参考 &man.hosts.access.5; 联机手册。 为了使设置能够生效, 应该首先把 hosts.allow 的第一行配置注释掉。 这节的开始部分已经说明了这一点。 Mark Murray 撰写者 Mark Dapoz 初稿 <application>KerberosIV</application> Kerberos 是一个网络附加系统/协议, 它使得用户能够通过一个安全服务器的服务来验证身份。 象远程登录, 远程复制, 系统间的相互文件复制和其他完成高风险任务的服务将被变得相当安全和可控制。 下面将具体介绍如何配置随 &os; 发行的 Kerberos。 不过, 您还是应该阅读相应的联机手册以获得完整的说明。 安装 <application>KerberosIV</application> MIT KerberosIV 安装 Kerberos 是 &os; 的一项可选组件。 安装该软件最简单的办法就是 在使用 sysinstall 安装 &os; 时选择 krb4krb5。 这样将会安装 eBones (KerberosIV) 或 Heimdal (Kerberos5) 的 Kerberos 实现。 采用实现的原因是它们在美国/加拿大 以外的地区开发, 因此这些国家之外的人使用, 而不必受美国的加密代码出口管制的限制。 此外, 您可以从 security/krb5 得到 Kerberos 的 MIT 实现。 创建最初的数据库 这项工作只需要在 Kerberos 服务器上完成。 首先确认没有旧的 Kerberos 数据库存在。 您应该进入到 /etc/kerberosIV 目录中并检查下述文件是否已经存在: &prompt.root; cd /etc/kerberosIV &prompt.root; ls README krb.conf krb.realms 如果您发现了除此之外的其它文件 (例如 principal.*master_key) 已经存在, 请使用 kdb_destroy 命令来销毁旧的数据库, 或者, 如果 Kerberos 没有在运行,简单地删除掉那些多余的文件。 现在必须编辑 krb.confkrb.realms 文件来定义您的 Kerberos 领域。 在本例中, 这个领域将是 EXAMPLE.COM 而其服务器是 grunt.example.com。 我们编辑或创建如下的 krb.conf 文件: &prompt.root; cat krb.conf EXAMPLE.COM EXAMPLE.COM grunt.example.com admin server CS.BERKELEY.EDU okeeffe.berkeley.edu ATHENA.MIT.EDU kerberos.mit.edu ATHENA.MIT.EDU kerberos-1.mit.edu ATHENA.MIT.EDU kerberos-2.mit.edu ATHENA.MIT.EDU kerberos-3.mit.edu LCS.MIT.EDU kerberos.lcs.mit.edu TELECOM.MIT.EDU bitsy.mit.edu ARC.NASA.GOV trident.arc.nasa.gov 在这个例子中, 除此之外的其它领域并不是必需的。 把他们在这里一并展示是为了演示如何让机器了解多个领域的存在。 简单起见, 在实际的配置中可以省略它们。 第一行命名了这个系统工作的领域。 其它行包含了领域/主机的记录。 每行的第一项是一个领域, 其后是在这个领域中充当 密钥分发中心 的主机名。 其后的 admin server 表示该主机同时还提供管理数据库服务。进一步的详细说明请参考 Kerberos 联机手册。 现在应该添加 grunt.example.comEXAMPLE.COM 领域, 同时追加一项以便将出现在 EXAMPLE.COM 领域中 .example.com 域的所有主机也加入进来。 krb.realms 这个文件需要按照下面的方法修改: &prompt.root; cat krb.realms grunt.example.com EXAMPLE.COM .example.com EXAMPLE.COM .berkeley.edu CS.BERKELEY.EDU .MIT.EDU ATHENA.MIT.EDU .mit.edu ATHENA.MIT.EDU 再次强调, 其它领域并不是必需的。 在这里只是要展示如何使用多个领域。 可以删掉它们以简化配置。 第一行将 指定的 系统置于所指名字的领域内。 这一行的其它部分则指明了特定子域内的主机应该默认属于哪个领域。 接下来我们就可以创建数据库了。 只有在 Kerberos 服务器上 (或密钥分发中心上) 才需要它。 可以通过 kdb_init 命令来完成这一步: &prompt.root; kdb_init Realm name [default ATHENA.MIT.EDU ]: EXAMPLE.COM You will be prompted for the database Master Password. It is important that you NOT FORGET this password. Enter Kerberos master key: 现在我们应该保存密钥, 这样本机上运行的其他服务就能够了解这一变化。 用 kstash 命令来完成这一步: &prompt.root; kstash Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! 这一操作将把主口令保存到 /etc/kerberosIV/master_key 让一切运转起来 KerberosIV 初始配置 有两个主要的东西需要被添加到要用 Kerberos 来确保安全的 每一个 系统上。 它们的名字是 kpasswdrcmd。 这些程序允许另外系统改变 Kerberos 的密码, 在不同的系统上可能有不同的名字。 服务程序 kpasswdrcmd 使得其他系统能够修改 Kerberos 口令, 以及执行类似 &man.rcp.1;, &man.rlogin.1; 和 &man.rsh.1; 这样的命令。 我们添加下面这些记录: &prompt.root; kdb_edit Opening database... Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! Previous or default values are in [brackets] , enter return to leave the same, or new value. Principal name: passwd Instance: grunt <Not found>, Create [y] ? y Principal: passwd, Instance: grunt, kdc_key_ver: 1 New Password: <---- enter RANDOM here Verifying password New Password: <---- enter RANDOM here Random password [y] ? y Principal's new key version = 1 Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ? Max ticket lifetime (*5 minutes) [ 255 ] ? Attributes [ 0 ] ? Edit O.K. Principal name: rcmd Instance: grunt <Not found>, Create [y] ? Principal: rcmd, Instance: grunt, kdc_key_ver: 1 New Password: <---- enter RANDOM here Verifying password New Password: <---- enter RANDOM here Random password [y] ? Principal's new key version = 1 Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ? Max ticket lifetime (*5 minutes) [ 255 ] ? Attributes [ 0 ] ? Edit O.K. Principal name: <---- null entry here will cause an exit 创建服务器文件 现在需要分析在每台机器上定义的服务的所有情况。 为了做到这一点, 可以使用 ext_srvtab 命令。 这将创建一个文件, 它需要被 通过安全的途径 复制或移动到每一个 Kerberos 客户端的 /etc/kerberosIV 目录中。 在每一台服务器上都必须存在这个文件, 它对 Kerberos 的运行至关重要。 &prompt.root; ext_srvtab grunt Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! Generating 'grunt-new-srvtab'.... 现在,这个命令只产生一个临时文件,必须被重命名为 srvtab 以便所有的服务可以识别它。 用 &man.mv.1; 命令把它挪到原系统的这个位置: &prompt.root; mv grunt-new-srvtab srvtab 如果文件是针对客户系统的, 而且网络可能会不安全, 则应把 client-new-srvtab 复制到可移动的介质上, 并通过物理上安全的方式拿走。 将其改名为 srvtab 并放到客户机的 /etc/kerberosIV 目录中, 并赋予 mode 600: &prompt.root; mv grumble-new-srvtab srvtab &prompt.root; chmod 600 srvtab 复制数据库 现在添加一些用户记录到数据库。 首先为用户 jane 创建其对应的项。 使用 kdb_edit 命令来完成此项工作: &prompt.root; kdb_edit Opening database... Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! Previous or default values are in [brackets] , enter return to leave the same, or new value. Principal name: jane Instance: <Not found>, Create [y] ? y Principal: jane, Instance: , kdc_key_ver: 1 New Password: <---- enter a secure password here Verifying password New Password: <---- re-enter the password here Principal's new key version = 1 Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ? Max ticket lifetime (*5 minutes) [ 255 ] ? Attributes [ 0 ] ? Edit O.K. Principal name: <---- null entry here will cause an exit 测试全部相关信息 首先必须启动 Kerberos 的服务程序。 这里需要指出, 如果您正确地修改了 /etc/rc.conf 则系统在启动时会自动完成这个工作。 只有在 Kerberos 服务器上才需要这么做。 Kerberos 客户程序将自动地从 /etc/kerberosIV 目录中的文件获取所需要的信息。 &prompt.root; kerberos & Kerberos server starting Sleep forever on error Log file is /var/log/kerberos.log Current Kerberos master key version is 1. Master key entered. BEWARE! Current Kerberos master key version is 1 Local realm: EXAMPLE.COM &prompt.root; kadmind -n & KADM Server KADM0.0A initializing Please do not use 'kill -9' to kill this job, use a regular kill instead Current Kerberos master key version is 1. Master key entered. BEWARE! 接下来应使用 kinit 命令来获取与我们刚刚创建的 ID jane 对应的 ticket: &prompt.user; kinit jane MIT Project Athena (grunt.example.com) Kerberos Initialization for "jane" Password: 尝试使用 klist 列出句柄以了解是否真的拥有它们: &prompt.user; klist Ticket file: /tmp/tkt245 Principal: jane@EXAMPLE.COM Issued Expires Principal Apr 30 11:23:22 Apr 30 19:23:22 krbtgt.EXAMPLE.COM@EXAMPLE.COM 现在可以试试看用 &man.passwd.1; 来修改口令, 以验证 kpasswd 服务程序是否能够从 Kerberos 数据库中获得需要的授权: &prompt.user; passwd realm EXAMPLE.COM Old password for jane: New Password for jane: Verifying password New Password for jane: Password changed. 授予 <command>su</command> 特权 Kerberos 使我们能够给予 每一个 需要使用 root 特权的用户使用他们自己 单独的 &man.su.1; 口令。 现在我们追加一个被授予 &man.su.1; 到 root 权限的 ID。 这件事是由与 root 相关联的一个 principal 实例来控制的。使用 kdb_edit 可以在 Kerberos 数据库中建立一个 jane.root 条目: &prompt.root; kdb_edit Opening database... Enter Kerberos master key: Current Kerberos master key version is 1. Master key entered. BEWARE! Previous or default values are in [brackets] , enter return to leave the same, or new value. Principal name: jane Instance: root <Not found>, Create [y] ? y Principal: jane, Instance: root, kdc_key_ver: 1 New Password: <---- enter a SECURE password here Verifying password New Password: <---- re-enter the password here Principal's new key version = 1 Expiration date (enter yyyy-mm-dd) [ 2000-01-01 ] ? Max ticket lifetime (*5 minutes) [ 255 ] ? 12 <--- Keep this short! Attributes [ 0 ] ? Edit O.K. Principal name: <---- null entry here will cause an exit 现在试试看获得相应的句柄, 以确认它已经正常工作了: &prompt.root; kinit jane.root MIT Project Athena (grunt.example.com) Kerberos Initialization for "jane.root" Password: 接下来我们需要把用户添加到 root.klogin 文件里: &prompt.root; cat /root/.klogin jane.root@EXAMPLE.COM 试试看 &man.su.1;: &prompt.user; su Password: 然后看看我们拥有哪些句柄: &prompt.root; klist Ticket file: /tmp/tkt_root_245 Principal: jane.root@EXAMPLE.COM Issued Expires Principal May 2 20:43:12 May 3 04:43:12 krbtgt.EXAMPLE.COM@EXAMPLE.COM 使用其它命令 在前文给出的例子中, 我们创建了一个称为 jane 的用户, 以及一个 root 实例。 此处的用户名和它的 principal 相同, 这是 Kerberos 默认的; 一个形如 <username>.root<principal>.<instance> 将允许 <username> 使用 &man.su.1; 成为 root, 只要所需的那些条目在 root home 目录中的 .klogin 中存在的话: &prompt.root; cat /root/.klogin jane.root@EXAMPLE.COM 类似地, 如果用户的 home 目录中有这样的设置: &prompt.user; cat ~/.klogin jane@EXAMPLE.COM jack@EXAMPLE.COM 则表明在 EXAMPLE.COM 领域的经过身份验证的 jane 或者 jack (通过 kinit, 详情见前文) 能够使用 jane 的身份或系统 (grunt) 中的文件, 无论通过 &man.rlogin.1;, &man.rsh.1; 或是 &man.rcp.1;。 举例来说, jane 现在通过 Kerberos 登入了其它系统: &prompt.user; kinit MIT Project Athena (grunt.example.com) Password: &prompt.user; rlogin grunt Last login: Mon May 1 21:14:47 from grumble Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995 或者, 当 jack 登录到 jane 在同一台机器上的账号 (jane 按照前面所介绍的那样配置了 .klogin 文件, 而负责 Kerberos 的管理员, 则为 jack 的 principal 配置了一个空的 instance): &prompt.user; kinit &prompt.user; rlogin grunt -l jane MIT Project Athena (grunt.example.com) Password: Last login: Mon May 1 21:16:55 from grumble Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD BUILT-19950429 (GR386) #0: Sat Apr 29 17:50:09 SAT 1995 Tillman Hodgson 撰写者 Mark Murray 原文来自 <application>Kerberos5</application> 在 &os;-5.1 之后的每一个 &os; 版本都只包含 Kerberos5 支持了, 因而, Kerberos5 是它们所包含的唯一的 Kerberos 版本, 其配置在绝大多数方面和 KerberosIV 非常类似。 下述信息只适用于 &os;-5.0 之后版本中的 Kerberos5。 希望使用 KerberosIV 的用户可以安装 security/krb4 port。 Kerberos 是一组附加的网络系统/协议, 用以让用户通过一台安全服务器提供的服务来验证身份。 包括远程登录、远程复制、在系统间安全地复制文件, 以及其它高危险性的操作, 由于其存在而显著地提高了安全型并且更加可控。 Kerberos 可以理解为一种身份验证代理系统。 它也被描述为一种以受信第三方为主导的身份验证系统。 Kerberos 只提供一种功能 — 在网络上安全地完成用户的身份验证。 它并不提供授权功能 (也就是说用户能够做什么操作) 或审计功能 (记录用户作了什么操作)。 一旦客户和服务器都使用了 Kerberos 来证明各自的身份之后, 他们还可以加密全部的通讯以保证业务数据的私密性和完整性。 因此, 强烈建议将 Kerberos 同其它提供授权和审计服务的安全手段联用。 接下来的说明可以用来指导如何安装 &os; 所附带的 Kerberos。 不过, 您仍然需要参考相应的联机手册以获得完整的描述。 为了展示 Kerberos 的安装过程, 我们约定: DNS 域 (zone) 为 example.org。 Kerberos 领域是 EXAMPLE.ORG。 在安装 Kerberos 时请使用实际的域名即使您只是想在内部网上用一用。 这可以避免 DNS 问题并保证了同其它 Kerberos 之间的互操作性。 历史 Kerberos5 历史 Kerberos 最早由 MIT 作为解决网络安全问题的一个方案提出。 Kerberos 协议采用了强加密, 因此客户能够在不安全的网络上向服务器 (以及相反地) 验证自己的身份。 Kerberos 是网络验证协议名字, 同时也是用以表达实现了它的程序的形容词。 (例如 Kerberos telnet)。 目前最新的协议版本是 5,在 RFC 1510 中有所描述。 该协议有许多免费的实现, 这些实现涵盖了许多种不同的操作系统。 最初研制 Kerberos 的麻省理工学院 (MIT) 也仍然在继续开发他们的 Kerberos 软件包。 在 US 它被作为一种加密产品使用, 因而历史上曾经受到 US 出口管制。 MIT Kerberos 可以通过 port (security/krb5) 来安装和使用。 Heimdal Kerberos 是另一种第 5 版实现, 并且明确地在 US 之外的地区开发, 以避免出口管制 (因此在许多非商业的类 &unix; 系统中非常常用。 Heimdal Kerberos 软件包可以通过 port (security/heimdal) 安装, 最新的 &os; 的最小安装也会包含它。 为使尽可能多的读者从中受益, 这份说明以 &os; 附带的 Heimdal 软件包为准。 配置 Heimdal <acronym>KDC</acronym> Kerberos5 密钥分发中心 密钥分发中心 (KDC) 是 Kerberos 提供的集中式验证服务 — 它是签发 Kerberos tickets 的那台计算机。 KDCKerberos 领域中的其它机器看来是 受信的, 因此必须格外注意其安全性。 需要说明 Kerberos 服务器只需要非常少的计算资源, 尽管如此, 基于安全理由仍然推荐使用独占的机器来扮演 KDC 的角色。 要开始配置 KDC, 首先请确认您的 /etc/rc.conf 文件包含了作为一个 KDC 所需的设置 (您可能需要适当地调整路径以适应自己系统的情况): kerberos5_server_enable="YES" kadmind5_server_enable="YES" 接下来需要修改 Kerberos 的配置文件, /etc/krb5.conf [libdefaults] default_realm = EXAMPLE.ORG [realms] EXAMPLE.ORG = { kdc = kerberos.example.org admin_server = kerberos.example.org } [domain_realm] .example.org = EXAMPLE.ORG 请注意这个 /etc/krb5.conf 文件假定您的 KDC 有一个完整的主机名, 即 kerberos.example.org。 如果您的 KDC 主机名与它不同, 则应添加一条 CNAME (别名) 项到 zone 中去。 对于有正确地配置过的 BIND DNS 服务器的大型网络, 上述例子可以精简为: [libdefaults] default_realm = EXAMPLE.ORG 将下面的内容加入到 example.org zone 数据文件中: _kerberos._udp IN SRV 01 00 88 kerberos.example.org. _kerberos._tcp IN SRV 01 00 88 kerberos.example.org. _kpasswd._udp IN SRV 01 00 464 kerberos.example.org. _kerberos-adm._tcp IN SRV 01 00 749 kerberos.example.org. _kerberos IN TXT EXAMPLE.ORG 要让客户机能够找到 Kerberos 服务, 就 必须 首先配置完整或最小配置的 /etc/krb5.conf 并且 正确地配置 DNS 服务器。 接下来需要创建 Kerberos 数据库。 这个数据库包括了使用主密码加密的所有实体的密钥。 您并不需要记住这个密码, 它会保存在一个文件 (/var/heimdal/m-key) 中。 要创建主密钥, 需要执行 kstash 并输入一个口令。 主密钥一旦建立, 您就可以用 kadmin 程序的 -l 参数 (表示 local) 来初始化数据库了。 这个选项让 kadmin 直接地修改数据库文件而不是通过 kadmind 的网络服务。 这解决了在数据库创建之前连接它的鸡生蛋的问题。 进入 kadmin 提示符之后, 用 init 命令来创建领域的初始数据库。 最后, 仍然在 kadmin 中, 使用 add 命令来创建第一个 principal。 暂时使用全部的默认设置, 随后可以在任何时候使用 modify 命令来修改这些设置。 另外, 也可以用 ? 命令来了解可用的选项。 典型的数据库创建过程如下: &prompt.root; kstash Master key: xxxxxxxx Verifying password - Master key: xxxxxxxx &prompt.root; kadmin -l kadmin> init EXAMPLE.ORG Realm max ticket life [unlimited]: kadmin> add tillman Max ticket life [unlimited]: Max renewable life [unlimited]: Attributes []: Password: xxxxxxxx Verifying password - Password: xxxxxxxx 现在是启动 KDC 服务的时候了。 运行 /etc/rc.d/kerberos start 以及 /etc/rc.d/kadmind start 来启动这些服务。 尽管此时还没有任何正在运行的 Kerberos 服务, 但您仍然可以通过获取并列出您刚刚创建的那个 principal (用户) 的 ticket 来验证 KDC 确实在正常工作, 使用 KDC 本身的功能: &prompt.user; k5init tillman tillman@EXAMPLE.ORG's Password: &prompt.user; k5list Credentials cache: FILE:/tmp/krb5cc_500 Principal: tillman@EXAMPLE.ORG Issued Expires Principal Aug 27 15:37:58 Aug 28 01:37:58 krbtgt/EXAMPLE.ORG@EXAMPLE.ORG + 完成所需的操作之后, 可以撤消这一 ticket: + + &prompt.user; k5destroy 为 <application>Kerberos</application> 启用 Heimdal 服务 Kerberos5 启用服务 首先我们需要一份 Kerberos 配置文件 /etc/krb5.conf 的副本。 只需简单地用安全的方式 (使用类似 &man.scp.1; 的网络工具, 或通过软盘) 复制 KDC 上的版本, 并覆盖掉客户机上的对应文件就可以了。 接下来需要一个 /etc/krb5.keytab 文件。 这是提供 Kerberos 服务的服务器和工作站的一个主要区别 — 服务器必须有 keytab 文件。 这个文件包括了服务器的主机密钥, 这使得 KDC 得以验证它们的身份。 此文件必须以安全的方式传到服务器上, 因为如果密钥被公之于众, 则安全也就毁于一旦。 也就是说, 通过明文的通道, 例如 FTP 是非常糟糕的想法。 一般来说, 您会希望使用 kadmin 程序来把 keytab 传到服务器上。 由于也需要使用 kadmin 来为主机建立 principal (KDC 一端的 krb5.keytab), 因此这并不复杂。 注意您必须已经获得了一个 ticket 而且这个 ticket 必须许可使用 kadmind.acl 中的 kadmin 接口。 请参考 Heimdal info 中的 Remote administration(远程管理) 一节 (info heimdal) 以了解如何设计访问控制表。 如果不希望启用远程的 kadmin 操作, 则可以简单地采用安全的方式连接 KDC (通过本机控制台, &man.ssh.1; 或 Kerberos &man.telnet.1;) 并使用 kadmin -l 在本地执行管理操作。 安装了 /etc/krb5.conf 文件之后, 您就可以使用 Kerberos 上的 kadmin 了。 add --random-key 命令可以用于添加主机 principal, 而 ext 命令则允许导出服务器的主机 principal 到它的 keytab 中。 例如: &prompt.root; kadmin kadmin> add --random-key host/myserver.example.org Max ticket life [unlimited]: Max renewable life [unlimited]: Attributes []: kadmin> ext host/myserver.example.org kadmin> exit 注意 ext 命令 (这是 extract 的简写) 默认会把导出的密钥放到 /etc/krb5.keytab 中。 如果您由于没有在 KDC 上运行 kadmind (例如基于安全理由) 因而无法远程地使用 kadmin 您可以直接在 KDC 上添加主机 principal (host/myserver.EXAMPLE.ORG) 随后将其导出到一个临时文件中 (以免覆盖 KDC 上的 /etc/krb5.keytab), 方法是使用下面的命令: &prompt.root; kadmin kadmin> ext --keytab=/tmp/example.keytab host/myserver.example.org kadmin> exit 随后需要把 keytab 复制到服务器上 (例如使用 scp 或软盘)。 一定要指定一个不同于默认的 keytab 名字以免覆盖 KDC 上的 keytab。 到现在您的服务器已经可以同 KDC 通讯了 (因为已经配置了 krb5.conf 文件), 而且它还能够证明自己的身份 (由于配置了 krb5.keytab 文件)。 现在可以启用一些 Kerberos 服务。 在这个例子中, 我们将在 /etc/inetd.conf 中添加下面的行来启用 telnet 服务, 随后用 /etc/rc.d/inetd restart 重启 &man.inetd.8; 服务来使设置生效: telnet stream tcp nowait root /usr/libexec/telnetd telnetd -a user 关键的部分是 -a (表示验证) 类型设置为用户 (user)。 请参考 &man.telnetd.8; 联机手册以了解细节。 使用 Heimdal 来启用客户端 <application>Kerberos</application> Kerberos5 客户端配置 设置客户机是非常简单的。 在正确配置了 Kerberos 的网络中, 只需要将位于 /etc/krb5.conf 的配置文件进行一下设置就可以了。 这一步骤可以简单地通过安全的方式将文件从 KDC 复制到客户机上来完成。 尝试在客户机上执行 kinitklist, 以及 kdestroy 来测试获取、 显示并删除 刚刚为 principal 建立的 ticket 是否能够正常进行, 如果能, 则用其它的 Kerberos 应用程序来连接启用了 Kerberos 的服务。 如果应用程序不能正常工作而获取 ticket 正常, 则通常是服务本身, 而非客户机或 KDC 有问题。 在测试类似 telnet 的应用程序时, 应考虑使用抓包程序 (例如 &man.tcpdump.1;) 来确认您的口令没有以明文方式传输。 尝试使用 telnet-x 参数, 它将加密整个数据流 (类似 ssh)。 核心的 Kerberos 客户端应用 (按照传统命名, 包括了 kinitklistkdestroy, 以及 kpasswd) 已经随 基本的 &os; 安装到了系统上。 请注意 5.0 之前的 &os; 版本将它们改名为 k5initk5listk5destroyk5passwd, 以及 k5stash (尽管这些命令通常只会用到一次)。 许多非核心的 Kerberos 客户应用程序也是默认安装的。 在 Hemidal 的 最小 安装理念下, telnet 是唯一一个采用了 Kerberos 的服务。 Heimdal port 则提供了一些默认不安装的客户应用程序, 例如启用了 Kerberos 版本的 ftprshrcprlogin 以及一些更不常用的程序。 MIT port 也包括了一整套 Kerberos 客户应用程序。 用户配置文件: <filename>.k5login</filename> 和 <filename>.k5users</filename> .k5login .k5users 在某个领域中的用户往往都有自己的 Kerberos principal (例如 tillman@EXAMPLE.ORG) 并映射到本机用户帐户 (例如本机上名为 tillman 的帐户)。 客户端应用程序, 如 telnet 通常并不需要用户名或 principal。 不过, 有时您可能会需要赋予某些没有匹配 Kerberos principal 的人使用本地用户帐户的权限。 例如 tillman@EXAMPLE.ORG 可能需要访问本地的 webdevelopers 用户帐号。 其它 principal 可能也会需要访问这个本地帐号。 用户 home 目录中的 .k5login.k5users 这两个文件可以配合 .hosts.rhosts 来有效地解决这个问题。 例如, 如果 .k5login 中有如下内容: tillman@example.org jdoe@example.org 并放到了本地用户 webdevelopers 的 home 目录中, 则列出的两个 principals 都可以使用那个帐号, 而无须共享口令。 建议您在开始实施之前首先阅读这些命令的联机帮助。 特别地, ksu 的联机手册包括了 .k5users 的相关内容。 <application>Kerberos</application> 提示、技巧和故障排除 Kerberos5 故障排除 当使用 Heimdal 或 MIT Kerberos ports 时, 需要确认 PATH 环境变量把 Kerberos 客户应用列在系统自带的版本之前。 同一领域内的所有计算机的时间设置是否同步? 如果不是的话, 则身份验证可能会失败。 描述了如何使用 NTP 来同步时钟。 MIT 和 Heimdal 能够很好地互操作。 一个例外是 kadmin, 因为这个协议没有被标准化。 如果您改变了主机名, 您还需要修改您的 host/ principal 并更新 keytab。 这一规律也适用于类似 Apache 的 www/mod_auth_kerb 所使用的 www/ principal 这样的特殊 keytab 项。 您的领域中的每一台主机必须在 DNS (或至少在 /etc/hosts 中) 可以解析 (同时包括正向和反向)。 CNAME 能够正常使用, 但必须有正确的对应 A 和 PTR 记录。 此时给出的错误信息可能很让人困惑: Kerberos5 refuses authentication because Read req failed: Key table entry not found 某些作为客户使用您的 KDC 的操作系统可能没有将 ksu 设置为 setuid root 的权限。 这意味着 ksu 将不能够正常工作, 从安全角度说这是一个不错的主意, 但可能令人烦恼。 这类问题并不是 KDC 的错误。 使用 MIT Kerberos 时, 如果希望允许一个 principal 拥有超过默认的十小时有效期的 ticket 则必须使用 kadmin 中的 modify_principal 来修改 principal 本身以及 krbtgt 的 maxlife(最大有效期)。 此后, principal 可以使用 kinit-l 参数来请求一个有更长有效期的 ticket。 如果在 KDC 上运行了听包程序, 并在工作站上执行 kinit, 您可能会注意到 TGT 是在 kinit 一开始执行的时候就发出了的 — 甚至在您输入口令之前! 关于这个现象的解释是 Kerberos 服务器可以无限制地收发 TGT (Ticket Granting Ticket) 给任何未经授权的请求; 但是, 每一个 TGT 都是使用用户的口令派生出来的密钥进行加密的。 因此, 当用户输入口令时它并不会发送给 KDC, 而是直接用于解密 kinit 所拿到的 TGT。 如果解密过程得到了一个包含合法的时间戳的有效 ticket, 则说明用户的 Kerberos 凭据有效。 这些凭据包含了一个会话密钥用以在随后建立 Kerberos 服务器的加密通讯, 传递由服务器自己的私钥加密的实际的 ticket-granting ticket。 这个第二层加密对于用户来说是看不到的, 但它使得 Kerberos 服务器能够验证每一个 TGT 的真实性。 如果需要有效期更长的 ticket (例如一周) 而且您使用 OpenSSH 连接保存您的 ticket 的机器, 请确认 sshd_config 中的 Kerberos 被设置为 no 否则在注销时会自动删除所有的 ticket。 切记主机的 principals 的 ticket 有效期一定要比用户的长。 如果您的用户 principal 的有效期是一周, 而所连接的主机的有效期是九个小时, 则缓存的主机 principal 将先行过期, 结果是 ticket 缓存无法正常工作。 当配置 krb5.dict 文件来防止使用特定的简单口令 (kadmind 的联机手册中简要介绍了它), 请切记只有指定了口令策略的 principals 才会使用它们。 krb5.dict 文件的格式很简单: 每个串占一行。 创建一个到 /usr/share/dict/words 的符号连接会很有用。 与 <acronym>MIT</acronym> port 的区别 MIT 和 Heimdal 主要的区别在于 kadmin 程序使用不同 (尽管等价) 的命令和协议。 如果您的 KDCMIT 的, 则其影响是不能使用 Heimdal 的 kadmin 程序来远程管理 KDC (或相反)。 完成同样工作的命令可能会有些许的不同。 推荐按照 MIT Kerberos 的网站 () 上的说明来操作。 请小心关于路径的问题, MIT port 会默认安装到 /usr/local/, 您因此可能会执行 普通的 系统应用程序而非 MIT, 如果您的 PATH 环境变量把 把系统目录放在前面的话。 如果使用 &os; 提供的 MIT security/krb5 port, 一定要仔细阅读 port 所安装的 /usr/local/share/doc/krb5/README.FreeBSD, 如果您想知道为什么通过 telnetdklogind 登录时会出现一些诡异的现象的话。 最重要地, incorrect permissions on cache file(缓存文件权限不正确) 行为需要使用 login.krb5 来进行验证, 才能够正确地修改转发凭据的属主。 + 除此之外, 还应修改 rc.conf 并加入下列配置: + + kerberos5_server="/usr/local/sbin/krb5kdc" +kadmind5_server="/usr/local/sbin/kadmind" +kerberos5_server_enable="YES" +kadmind5_server_enable="YES" + + 这样做的原因是, + MIT kerberos 会将可执行文件装到 + /usr/local + 之下。 缓解 <application>Kerberos</application> 的限制 Kerberos5 限制和不足 <application>Kerberos</application> 是一种 all-or-nothing 方式 在网络上启用的每个服务都必须进行修改以便让其能够配合 Kerberos 工作 (否则就只能使用其它方法来保护它们不受网络攻击的侵害), 如果不是这样, 则用户的凭据就有可能被窃取并再次使用。 一个例子是对所有的远程 shell (例如通过 rshtelnet) 启用了 Kerberos 但没有将使用明文验证的 POP3 邮件服务器 Kerberos化。 <application>Kerberos</application> 是为单用户工作站设计的 在多用户环境中 Kerberos 的安全性会被削弱。 这是因为它把 ticket 保存到 /tmp 目录中, 而这个目录可以被任何用户读取。 如果有用户与其它人同时共享一台计算机 (也就是 multi-user), 则这个用户的 ticket 就可能被其它用户窃取 (复制)。 可以通过使用 -c 文件名 这样的命令行选项, 或者(推荐的)改变 KRB5CCNAME 环境变量来避免这个问题, 但很少有人这么做。原则上, 将 ticket 保存到用户的 home 目录并简单地设置权限就能够缓解这个问题。 KDC 会成为单点崩溃故障点 根据设计, KDC 必须是安全的, 因为主密码数据库保存在它上面。 决不应该在 KDC上面运行其它服务, 而且还应确保它的物理安全。 由于 Kerberos 使用同一个密钥 (传说中的那个 密钥) 来加密所有的密码, 而将这个文件保存在 KDC, 因此其安全尤为重要 不过, 主密钥的泄露并没有想象中的那么可怕。 主密钥只用来加密 Kerberos 数据库以及产生随机数发生器的种子。 只要 KDC 是安全的, 即使攻击者拿到了主密钥也做不了什么。 另外, 如果 KDC 不可用 (例如由于拒绝服务攻击或网络故障) 则网络服务将由于验证服务无法进行而不能使用, 从而导致更大范围的拒绝服务攻击。 通过部署多个 KDC (一个主服务器, 配合一个或多个从服务器) 并采用经过仔细设计和实现的备用验证方式可以避免这种问题 (PAM 是一个不错的选择)。 <application>Kerberos</application> 的不足 Kerberos 允许用户、主机和服务之间进行相互认证。 但它并没有提供机制来向用户、主机或服务验证 KDC。 这意味着种过木马的程序,例如 kinit 有可能记录用户所有的用户名和密码。 尽管如此, 可以用类似 security/tripwire 这样的文件系统完整性检查工具来避免此类情况的发生。 相关资源和其它资料 Kerberos5 外部资源 The Kerberos FAQ Designing an Authentication System: a Dialog in Four Scenes RFC 1510, The Kerberos Network Authentication Service (V5) MIT Kerberos home page Heimdal Kerberos home page Tom Rhodes 作者 OpenSSL 安全 OpenSSL 许多用户可能并没有注意到 &os; 所附带的 OpenSSL 工具包的功能。 OpenSSL 提供了建立在普通的通讯层基础上的加密传输层; 这些功能为许多网络应用和服务程序所广泛使用。 OpenSSL 的一些常见用法包括加密邮件客户的身份验证过程, 基于 Web 的交易如信用卡等等。 许多 ports 如 www/apache13-ssl, 以及 mail/sylpheed-claws 等等都提供了编译进 OpenSSL 支持的方法。 绝大多数情况下 Ports Collection 会试图使用 security/openssl 除非明确地将 WITH_OPENSSL_BASE make 变量设置为 yes &os; 中附带的 OpenSSL 版本能够支持 安全套接字层 v2/v3 (SSLv2/SSLv3) 和 安全传输层 v1 (TLSv1) 三种网络协议, 并可作为通用的密码学函数库使用。 尽管 OpenSSL 支持 IDEA 算法, 但由于美国专利, 它在默认情况下是不编译的。 如果想使用它, 请查阅相应的授权, 如果认为授权可以接受, 则可以在 make.conf 中设置 MAKE_IDEA 为应用软件提供证书是 OpenSSL 最为常用的功能之一。 证书是一种能够确保公司或个人有效身份不被伪造的凭据。 如果证书没有被众多 权威发证机构, 或 CA 中的某一个确认, 则会产生一个警告。 权威发证机构通常是一家公司, 例如 VeriSign, 它能够通过签署来证明个人或公司证书的有效性。 这个过程是需要付费的, 当然, 这不是使用证书的必要条件; 然而, 这样做会让那些比较偏执的用户感到轻松。 生成证书 OpenSSL 生成证书 为了生成证书, 需要使用下面的命令: &prompt.root; openssl req -new -nodes -out req.pem -keyout cert.pem Generating a 1024 bit RSA private key ................++++++ .......................................++++++ writing new private key to 'cert.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:US State or Province Name (full name) [Some-State]:PA Locality Name (eg, city) []:Pittsburgh Organization Name (eg, company) [Internet Widgits Pty Ltd]:My Company Organizational Unit Name (eg, section) []:Systems Administrator Common Name (eg, YOUR name) []:localhost.example.org Email Address []:trhodes@FreeBSD.org Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:SOME PASSWORD An optional company name []:Another Name 请注意, 在 Common Name 提示后面我们输入的是一个域名。 这个提示要求输入服务器的名字, 这个名字今后将用于完成验证过程; 如果在这里输入域名以外的内容, 那么证书也就失去其意义了。 您还可以指定一些其他的选项, 比如证书的有效期, 以及使用的加密算法等等。 这些选项的完整列表, 可以在 &man.openssl.1; 联机手册中找到。 在您执行前述命令的目录中将生成两个文件。 证书申请, 即 req.pem, 可以发给一家发证机构, 它将验证您输入的凭据的真实性, 并对申请进行签名, 再把证书返还给您。 第二个文件的名字将是 cert.pem, 它包含了证书的私钥, 应被全力保护; 如果它落入别人手中, 则可以被用来伪造您 (或您的服务器)。 如果不需要来自 CA 的签名, 也可以创建自行签名的证书。 首先, 需要生成 RSA 密钥: &prompt.root; openssl dsaparam -rand -genkey -out myRSA.key 1024 接下来, 生成 CA 密钥: &prompt.root; openssl gendsa -des3 -out myca.key myRSA.key 然后用这个密钥来创建证书: &prompt.root; openssl req -new -x509 -days 365 -key myca.key -out new.crt 上述步骤将在当前目录中生成两个新文件: 一个是权威发证机构的签名文件, myca.key; 另一个是证书本身, new.crt。 这些文件应该放到同一个目录中, 一般而言, 推荐放到 /etc, 并且只允许 root 读取。 建议把权限设置为 0700, 这可以通过 chmod 工具来完成。 使用证书的一个例子 那么有了这些文件可以做些什么呢? 一个比较典型的用法是用来加密 Sendmail MTA 的通讯连接。 这可以解决用户通过本地 MTA 发送邮件时使用明文进行身份验证的问题。 这个用法可能并不完美, 因为某些 MUA 会由于没有在本地安装证书而向用户发出警告。 请参考那些软件的说明了解关于安装证书的信息。 下面的设置应添加到本地的 .mc 文件 dnl SSL Options define(`confCACERT_PATH',`/etc/certs')dnl define(`confCACERT',`/etc/certs/new.crt')dnl define(`confSERVER_CERT',`/etc/certs/new.crt')dnl define(`confSERVER_KEY',`/etc/certs/myca.key')dnl define(`confTLS_SRV_OPTIONS', `V')dnl 这里, /etc/certs/ 是准备用来在本地保存证书和密钥的位置。 最后, 需要重新生成本地的 .cf 文件。 这一工作可以简单地通过在 /etc/mail 目录中执行 make install 来完成。 接下来, 可以使用 make restart 来重新启动 Sendmail 服务程序。 如果一切正常的话, 在 /var/log/maillog 中就不会出现错误提示, Sendmail 也应该出现在进程列表中。 做一个简单的测试, 使用 &man.telnet.1; 来连接邮件服务器: &prompt.root; telnet example.com 25 Trying 192.0.34.166... Connected to example.com. Escape character is '^]'. 220 example.com ESMTP Sendmail 8.12.10/8.12.10; Tue, 31 Aug 2004 03:41:22 -0400 (EDT) ehlo example.com 250-example.com Hello example.com [192.0.34.166], pleased to meet you 250-ENHANCEDSTATUSCODES 250-PIPELINING 250-8BITMIME 250-SIZE 250-DSN 250-ETRN 250-AUTH LOGIN PLAIN 250-STARTTLS 250-DELIVERBY 250 HELP quit 221 2.0.0 example.com closing connection Connection closed by foreign host. 如果输出中出现了 STARTTLS 则说明一切正常。 Nik Clayton
nik@FreeBSD.org
撰写者
IPsec IPsec 上的 VPN 使用 FreeBSD 网关在两个被 Internet 分开的网络之间架设 VPN。 Hiten M. Pandya
hmp@FreeBSD.org
撰写者
理解 IPsec 这一节将指导您完成架设 IPsec, 并在一个包含了 FreeBSD 和 µsoft.windows; 2000/XP 机器的网络中使用它来进行安全的通讯的全过程。 为了配置 IPsec, 您应当熟悉如何编译一个定制的内核的一些概念 (参见 )。 IPsec 是一种建立在 Internet 协议 (IP) 层之上的协议。 它能够让两个或更多主机以安全的方式来通讯 (并因此而得名)。 FreeBSD IPsec 网络协议栈 基于 KAME 的实现, 它支持两种协议族, IPv4 和 IPv6。 FreeBSD 包括了采用 硬件加速的 IPsec 协议栈, 也称作 Fast IPsec, 它来自 OpenBSD。 它能够通过 &man.crypto.4; 子系统来利用加密硬件 (只要可能) 优化 IPSec 的性能。 这个子系统是新的, 暂时还不支持 KAME 版本的 IPsec 的全部功能。 此外, 为了启用硬件加速的 IPsec, 必须把下面的选项加入到内核配置中: 内核选项 FAST_IPSEC options FAST_IPSEC # new IPsec (cannot define w/ IPSEC) 需要注意的是, 目前还不能用 Fast IPsec 子系统完全替代 KAME 的 IPsec 实现。 请参见联机手册 &man.fast.ipsec.4; 以了解进一步的详情。 如果希望防火墙能够正确地跟踪到 &man.gif.4; 信道的状态, 您还需要在内核配置中启用 options IPSEC_FILTERGIF #filter ipsec packets from a tunnel IPsec ESP IPsec AH IPsec 包括了两个子协议: Encapsulated Security Payload (ESP), 保护 IP 包数据不被第三方介入, 通过使用对称加密算法 (例如 Blowfish、 3DES)。 Authentication Header (AH), 保护 IP 包头不被第三方介入和伪造, 通过计算校验和以及对 IP 包头的字段进行安全散列来实现。 随后是一个包含了散列值的附加头, 以便能够验证包。 ESPAH 可以根据环境的不同, 分别或者一同使用。 VPN 虚拟专用网 VPN IPsec 既可以用来直接加密主机之间的网络通讯 (也就是 传输模式); 也可以用来在两个子网之间建造 虚拟隧道 用于两个网络之间的安全通讯 (也就是 隧道模式)。 后一种更多的被称为是 虚拟专用网 (VPN)。 &man.ipsec.4; 联机手册提供了关于 FreeBSD 中 IPsec 子系统的详细信息。 要把 IPsec 支持放进内核, 应该在配置文件中加入下面的选项: 内核选项 IPSEC 内核选项 IPSEC_ESP options IPSEC #IP security options IPSEC_ESP #IP security (crypto; define w/ IPSEC) 内核选项 IPSEC_DEBUG 如果需要 IPsec 的调试支持, 还应增加: options IPSEC_DEBUG #debug for IP security
问题 由于对如何建立 VPN 并不存在标准, 因此 VPN 可以采用许多种不同的技术来实现, 每种技术都有其长处和弱点。 这篇文章讲展现一个具体的应用情景, 并为它设计了适合的 VPN。 情景: 两个网络都接入了 Internet, 希望像一个网络那样工作 VPN 创建 现有条件如下: 至少有两个不同的站点 每个站点都使用内部的 IP 两个站点都通过运行 FreeBSD 的网关接入 Internet。 每个网络上的网关至少有一个公网的 IP 地址。 网络的内部地址可以是公网或私有的 IP 地址, 这并不是问题。 如果需要, 还可以在网关上运行 NAT。 两个网络上的 IP 地址 不冲突。 虽然理论上可以通过 VPN 和 NAT 连用来使这种情况能够正常工作, 但那毫无疑问将是管理的噩梦。 如果您发现您正打算连接两个内网使用同一私有 IP 地址范围的网络 (例如它们都使用 192.168.1.x), 则其中的一个必须修改网络地址。 网络的拓扑结构如下: 网络 #1 [ 内部主机 ] 私有网络,192.168.1.2-254 [ Win9x/NT/2K ] [ UNIX ] | | .---[fxp1]---. 私有 IP, 192.168.1.1 | FreeBSD | `---[fxp0]---' 公网 IP, A.B.C.D | | -=-=- Internet -=-=- | | .---[fxp0]---. 公网 IP, W.X.Y.Z | FreeBSD | `---[fxp1]---' 私有 IP, 192.168.2.1 | | 网络 #2 [ Internal Hosts ] [ Win9x/NT/2K ] 私有网络, 192.168.2.2-254 [ UNIX ] 请注意两个公网 IP 地址。 在这篇文章的其余部分我将用这些字母来表示它们。 在文章中看到这些字母的时候, 请把它们换成自己的公网 IP 地址。 另外, 在内部, 两个网关都是使用的 .1 的 IP地址, 而两个网络使用了不同的私有 IP 地址 (相应地, 192.168.1.x192.168.2.x)。 所有私有网络上的机器都被配置为使用 .1 这台机器作为它们的网关。 我们希望, 从网络的观点看, 每一个网络上的机器都应该能够像在直接连接到同一路由器上一样看到对方网络上的机器 -- 尽管可能比路由器略慢一些, 并且有时会有丢包的现象。 这意味着 (举例来说), 主机 192.168.1.20 应该能够运行 ping 192.168.2.34 并且这能够透明地工作。 &windows; 机器应该能够看到其他网络上的机器, 浏览文件共享, 等等, 就像在本地网络上一样。 而且这些事情必须是安全的, 也就是说两个网络之间的通讯必须加密。 在两个网络之间建立 VPN 可以分为几步。 这些步骤包括: 在两个网络之间, 通过 Internet 建立一个 虚拟的 网络连接。 使用类似 &man.ping.8; 这样的工作来验证它是否正常工作。 在两个网络之间应用安全策略以保证它们之间的通讯被透明地加密盒解密。 可以使用 &man.tcpdump.1; 或类似的工具来验证这一点。 在 FreeBSD 网关上配置其他软件, 让 &windows; 机器能够通过 VPN 看到另一个网络中的机器。 步骤 1: 建立并测试 <quote>虚拟的</quote> 网络连接 假设您目前已经登录到了网络 #1 的网关机上 (其公网 IP 地址是 A.B.C.D, 私网 IP 地址是 192.168.1.1), 则您可以执行 ping 192.168.2.1, 这是公网 IP 为 W.X.Y.Z 的私网地址。 需要做什么实现上述功能呢? 作为网关的机器需要知道如何能够到达 192.168.2.1。 换言之, 它需要一条通往 192.168.2.1 的路由。 私网 IP 地址, 例如 192.168.x 这样的地址是不应在 Internet 上面大量出现的。 于此相反, 发送到 192.168.2.1 的数据包将会封装到另外的包中。 这样的包对外展现的应该是来自 A.B.C.D, 并被发到 W.X.Y.Z 去。 这个过程称为 封装 一旦包到达了 W.X.Y.Z 就需要对其 拆封, 并传递给 192.168.2.1 可以把上述过程理解为在两个网络间建立了一个 隧道。 两个 隧道口 是 IP 地址 A.B.C.DW.X.Y.Z, 而隧道必须被告知哪些私有地址可以自由地在其中通过。 隧道被用来在公共的 Internet 上传递私有的 IP 数据。 在 FreeBSD 上, 隧道可以通过一般的网络接口, 或 gif 来建立。 您也许已经猜到了, 每一台网关机的 gif 接口需要配置四个 IP 地址; 两个是公网 IP 地址, 另两个则是私网 IP 地址。 对于 gif 设备的支持必须在两台网关机上编译进 &os; 内核。 可以通过添加下面的设置来达到目的: device gif 到两边的内核配置文件中, 并重新编译、 安装和启动它们。 配置隧道可以分为两步来完成。 首先隧道必须被告知外部的 (或公网的) IP 地址, 可以通过 &man.ifconfig.8; 来完成这步。 私网 IP 地址则必须使用 &man.ifconfig.8; 来配置。 - 在网络 #1 的网关机上可以通过下面的两个命令来配置隧道。 - - ifconfig gif0 A.B.C.D W.X.Y.Z -ifconfig gif0 inet 192.168.1.1 192.168.2.1 netmask 0xffffffff - + 在网络 #1 的网关机上可以通过下面的这些命令来配置隧道。 + + &prompt.root; ifconfig gif0 create +&prompt.root; ifconfig tunnel gif0 A.B.C.D W.X.Y.Z +&prompt.root; ifconfig gif0 inet 192.168.1.1 192.168.2.1 netmask 0xffffffff + - 在另一边也需要做类似的设置, 只是 IP 地址的顺序是反过来的。 + 在另一台网关上也需要执行同样的命令, 但 IP 地址的顺序相反。 - ifconfig gif0 W.X.Y.Z A.B.C.D -ifconfig gif0 inet 192.168.2.1 192.168.1.1 netmask 0xffffffff - + &prompt.root; ifconfig gif0 create +&prompt.root; ifconfig tunnel gif0 W.X.Y.Z A.B.C.D +&prompt.root; ifconfig gif0 inet 192.168.2.1 192.168.1.1 netmask 0xffffffff + 随后执行: ifconfig gif0 可以查看当前的配置情况。 例如, 在网络 #1 的网关上您应该能够看到: &prompt.root; ifconfig gif0 -gif0: flags=8011<UP,POINTTOPOINT,MULTICAST> mtu 1280 -inet 192.168.1.1 --> 192.168.2.1 netmask 0xffffffff -physical address inet A.B.C.D --> W.X.Y.Z +gif0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1280 + tunnel inet A.B.C.D --> W.X.Y.Z + inet 192.168.1.1 --> 192.168.2.1 netmask 0xffffffff 如您所见, 虽然到已经在物理地址 A.B.C.DW.X.Y.Z 之间建立起来, 而允许通过隧道的地址则是 192.168.1.1192.168.2.1 这个范围。 这同时会在两边机器的路由表中加入一项, 可以通过 netstat -rn 来观察。 来自网络 #1的网关机的输出如下。 - + &prompt.root; netstat -rn Routing tables Internet: Destination Gateway Flags Refs Use Netif Expire ... 192.168.2.1 192.168.1.1 UH 0 0 gif0 ... 正如 Flags 的值所显示的那样, 这是一个主机路由, 这意味着每一个网关都知道如何到达另一端的网关, 但它们现在还不知道如何到达对方的网络。 我们接下来立刻解决这个问题。 您很可能在两台机器上都在运行防火墙。 这需要作一些变动, 以便适应 VPN 的需要。 一般来说会希望两个网络相互传递数据包, 或者通过防火墙来隔离两边的危险。 如果您将防火墙配置为允许两边的网络传输通过, 则测试工作会简单不少。 随后您可以随时将限制变得更严格一些。 假如您在网关上使用 &man.ipfw.8; 则下面的命令 ipfw add 1 allow ip from any to any via gif0 将允许两端点的 VPN 数据通过, 而不影响其他防火墙策略。 很显然, 您需要在两个网关上都执行上述命令。 现在已经可以让两台机器相互 ping 了。 在 192.168.1.1 您应该能够正常执行 ping 192.168.2.1 并得到回应。 对于另一台网关来说也是一样。 然而, 到目前为止仍然还无法连上另一网络上的内部主机。 原因是路由 -- 尽管网关机知道如何到达对方那里, 但它们都不知道如何到达对方后面的网络。 要解决这个问题, 就必须在两边都添加一条静态路由。 可以在第一台网关上执行: route add 192.168.2.0 192.168.2.1 netmask 0xffffff00 这相当于是说 为了到达 192.168.2.0 子网的机器, 需要把包发给 192.168.2.1。 您需要在另一个网关上也执行类似的命令, 但使用 192.168.1.x 的地址。 来自一个网络上的 IP 访问现在能够抵达对面的网络了。 在两个网络之间建立 VPN 的过程已经完成了三分之二, 它现在已经是 虚拟的 网络, 然而它还不够专用。 您可以使用 &man.ping.8; 和 &man.tcpdump.1; 来进行测试, 并记录两边收发的数据包 tcpdump dst host 192.168.2.1 接下来登录到本机的另一个会话 ping 192.168.2.1 您将在输出中发现 16:10:24.018080 192.168.1.1 > 192.168.2.1: icmp: echo request 16:10:24.018109 192.168.1.1 > 192.168.2.1: icmp: echo reply 16:10:25.018814 192.168.1.1 > 192.168.2.1: icmp: echo request 16:10:25.018847 192.168.1.1 > 192.168.2.1: icmp: echo reply 16:10:26.028896 192.168.1.1 > 192.168.2.1: icmp: echo request 16:10:26.029112 192.168.1.1 > 192.168.2.1: icmp: echo reply 如您所见, ICMP 消息在收发的过程中都没有加密。 如果使用了 参数来运行 &man.tcpdump.1;, 甚至可以得到包中的更多信息以及其中的数据。 很明显这是不能接受的。 下一节将讨论如何让两个网络之间的连接更安全, 这件事是通过对通讯实施加密来完成的。 小结: 在两边的内核中配置 device gif 编辑网关 #1 上的 /etc/rc.conf 并将下面的行添加进去 (根据需要改 IP )。 - gifconfig_gif0="A.B.C.D W.X.Y.Z" + gif_interfaces="gif0" +gifconfig_gif0="A.B.C.D W.X.Y.Z" ifconfig_gif0="inet 192.168.1.1 192.168.2.1 netmask 0xffffffff" static_routes="vpn" route_vpn="192.168.2.0 192.168.2.1 netmask 0xffffff00" 在两台机器上编辑防火墙脚本 (/etc/rc.firewall, 或类似的名字) 在其中加入 ipfw add 1 allow ip from any to any via gif0 在网络 #2 的网关机上也对 /etc/rc.conf 做同样的修改, 注意把 IP 地址倒过来。 步骤 2: 对连接实施安全加固 为了加密连接通讯将用到 IPsec。 IPsec 提供了一种机制, 使得两台主机协商一个加密密钥, 并使用它加密之间的通讯。 在配置时有两个地方需要考虑。 必须有能够让两台主机协商所采用的加密方式的机制。 一旦双方确认了这机制, 则称他们之间建立了 安全关联 必须采用某种机制来指定哪些通讯需要加密。 很明显地, 通常并不需要所有的发出数据都被加密 -- 一般只需要加密在 VPN 上传输的那些数据。 这类决定哪些数据被加密的规则被称为 安全策略 安全关联和安全策略都是由内核来维护的, 并可以通过用户态的程序来修改。 在能够这样做之前, 首先需要配置内核来让它支持 IPsec 和安全载荷封装 (ESP) 协议。 配置下面的内核选项 内核选项 IPSEC options IPSEC options IPSEC_ESP 然后重新编译、 安装最后重新启动新的内核。 在继续进行设置之前, 您需要在两台网关上都进行同样的设置。 IKE 在建立安全关联时有两种选择。 一种方法是完全手工地在两台主机之间选择加密算法、 密钥等等, 另一种方法是使用实现了 Internet 密钥交换协议 (IKE) 的服务程序来帮您完成这些任务。 我们推荐后者。 不说别的, 它配置起来要容易得多。 IPsec security policies setkey 用 &man.setkey.8; 可以编辑和显示安全策略。 打个比方, setkey 之于内核的安全策略表, 就相当于 &man.route.8; 之于内核中的路由表。 setkey 还可以显示当前的安全关联, 这一点和 netstat -r 类似。 在 FreeBSD 上可供选择的用于管理安全关联的服务程序有很多。 这篇文章将介绍其中的一种, racoon —。 它可以从 &os; 的 Ports collection 中的 security/ipsec-tools 安装。 racoon racoon 软件, 必须在两台网关机上都运行。 需要配置 VPN 另一端的 IP, 以及一个密钥 (这个密钥可以任意选择, 但两个网关上的密钥必须一致)。 两端的服务程序将相互通讯, 并确认它们各自的身份 (使用刚刚配置的密钥) 然后服务程序将生成一个新的密钥, 并用它来加密 VPN 上的数据通讯。 它们定期地改变密钥, 因此即使供给者破解了一个密钥 (虽然这在理论上并不十分可行) 他也得不到什么 -- 破解密钥的时候, 已经产生一组新的密钥了。 racoon 的配置文件是存放在 ${PREFIX}/etc/racoon 目录中的。 在那里应该能够找到一个配置文件, 不需要修改太多的设置。 raccon 配置的另一部分, 也就是需要修改的内容, 是 预先配置的共享密钥 默认的 racoon 配置应该可以在 ${PREFIX}/etc/racoon/psk.txt 这个文件中找到。 需要强调的是, 这个密钥 并非 用于加密 VPN 连接的密钥, 他们只是密钥管理服务程序用以信任对方的一种凭据。 psk.txt 包含了需要打交道的每一个远程站点。 在本例中一共有两个站点, 每一个 psk.txt 都只有一行 (因为每个 VPN 接入点都只和一个端点连接)。 在网关机 #1 上应该是: W.X.Y.Z secret 这包括了远程站点的 公网 IP 地址, 空格, 以及提供秘密的字符串。 很明显不应使用 secret 作为实际的密钥 -- 通常的口令选择策略在这里也适用。 在网关 #2 上对应的配置是 A.B.C.D secret 也就是说, 对面端的公网 IP 地址, 以及同样的密钥。 psk.txt 的权限必须是 0600 (也就是说, 只有 root 能够读写) 否则 racoon 将不能运行。 两边的机器上都必须执行 racoon。 另外, 还需要增加一些防火墙规则来允许 IKE 通讯通过, 它是通过 UDP 在 ISAKMP (Internet 安全关联密钥管理协议) 端口上运行的协议。 再次强调, 这个规则应该在规则集尽可能早的位置出现。 ipfw add 1 allow udp from A.B.C.D to W.X.Y.Z isakmp ipfw add 1 allow udp from W.X.Y.Z to A.B.C.D isakmp 一旦 racoon 开始运行, 就可以开始测试让网关进行相互的 ping 了。 此时连接还没有进行加密, 但 racoon 将在两个主机之间建立安全关联 -- 这可能需要一段时间, 对您来说, 具体的现象则是在 ping 命令开始响应之前会有短暂的延迟。 一旦安全关联建立之后, 就可以使用 &man.setkey.8; 来查看它了。 在两边的网关上执行 setkey -D 就可以看到安全关联的相关信息了。 现在只完成了一半的工作。 另一半是设置安全策略。 想要完成一个有判断力的安全策略, 首先要看我们已经完成的步骤。 接下来的讨论针对连接的两端。 您所发出的每一个 IP 包都包括一个包头, 其内容是和这个包有关的描述性数据。 包头包括了包的来源和目的的 IP 地址。 正如我们所了解的那样, 私有 IP 地址, 例如 192.168.x.y 这样的地址范围, 不应该出现在 Internet 的公网上。 于此相反, 他们必须首先封装到别的包中。 包的来源或目的如果是私有 IP 地址, 则必须替换成公网 IP 地址。 因此如果发出的包类似下面这样: .-------------------. | Src: 192.168.1.1 | | Dst: 192.168.2.1 | | <其他头信息 > | +-------------------+ | <包数据 > | `-------------------' 随后它将被封装进另一个包中, 像下面这样: .--------------------------. | Src: A.B.C.D | | Dst: W.X.Y.Z | | <附加头信息 > | +--------------------------+ | .----------------------. | | | Src: 192.168.1.1 | | | | Dst: 192.168.2.1 | | | | <附加头信息 > | | | +----------------------+ | | | <包数据 > | | | `----------------------' | `--------------------------' 封装过程是在 gif 设备上完成的。 如上图所示, 包现在有了外部的实际 IP 地址, 而原始的包则被封装到里面作为数据。 这个包将通过 Internet 传递。 很明显地, 我们希望 VPN 之间的通讯是加密的。 用于言来描述大致是: 如果包从 A.B.C.D 发出且其目的地是 W.X.Y.Z, 则通过必要的安全关联进行加密。 如果包来自 W.X.Y.Z 且其目的地是 A.B.C.D, 则通过必要的安全关联进行解密。 这已经很接近了, 但还不够正确。 如果这么做的话, 所有来自和发到 W.X.Y.Z 的包, 无论是否属于 VPN 通讯都会被加密。 这可能并不是您所希望的, 因此正确的安全策略应该是 如果包从 A.B.C.D 发出, 且封装了其他的包, 其目的地是 W.X.Y.Z, 则通过必要的安全关联进行加密。 如果包来自 W.X.Y.Z, 且封装了其他的包, 其目的地是 A.B.C.D, 则通过必要的安全关联进行解密。 一个很小, 但却必要的改动。 安全策略也是通过 &man.setkey.8; 设置的。 &man.setkey.8; 提供了一种用于配置策略的语言。 可以直接在 stdin 上输入策略, 或通过 选项来指定一个包含配置命令的文件。 网关 #1 上的配置 (其 IP 地址是 A.B.C.D) 强制将所有到 W.X.Y.Z 的通讯进行加密的配置是: spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P out ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require; 把这些命令放到一个文件 (例如 /etc/ipsec.conf) 然后执行 &prompt.root; setkey -f /etc/ipsec.conf 会告诉 &man.setkey.8; 我们希望把规则加入到安全策略数据库中。 命令的其它部分指定了什么样的包能够匹配这规则。 A.B.C.D/32W.X.Y.Z/32 是用于指定规则能够匹配的网络或主机的 IP 地址和掩码。 本例中, 希望应用到两个主机之间的通讯上。 则告诉内核这规则只应被用于封装其他包的那些数据包。 表示策略是针对发出的包的, 而 则表示需要对数据包进行加密。 第二行指定了如何加密。 是将要使用的协议, 而 则表示包应该进一步封装进一个 IPsec 包里面。 反复使用 A.B.C.DW.X.Y.Z 用来选择所用的安全关联 而最后的 则强制所有匹配这规则的包都被加密。 上面的规则只匹配了发出的包。 接下来需要配置类似的匹配进入包的规则。 spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P in ipsec esp/tunnel/W.X.Y.Z-A.B.C.D/require; 请注意本例中 代替了 并且 IP 地址的顺序也相反。 在另一个网关上 (其公网 IP 地址是 W.X.Y.Z) 也需要类似的规则。 spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P out ipsec esp/tunnel/W.X.Y.Z-A.B.C.D/require; spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P in ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require; 最后是添加允许 ESP 和 IPENCAP 包进出的防火墙规则。 这些规则需要在两边分别设置。 ipfw add 1 allow esp from A.B.C.D to W.X.Y.Z ipfw add 1 allow esp from W.X.Y.Z to A.B.C.D ipfw add 1 allow ipencap from A.B.C.D to W.X.Y.Z ipfw add 1 allow ipencap from W.X.Y.Z to A.B.C.D 由于规则的对称性, 因此可以在两台网关上使用同样的规则。 发出的包如下图所示: .------------------------------. --------------------------. | Src: A.B.C.D | | | Dst: W.X.Y.Z | | | <other header info> | | Encrypted +------------------------------+ | packet. | .--------------------------. | -------------. | contents | | Src: A.B.C.D | | | | are | | Dst: W.X.Y.Z | | | | completely | | <other header info> | | | |- secure | +--------------------------+ | | Encap'd | from third | | .----------------------. | | -. | packet | party | | | Src: 192.168.1.1 | | | | Original |- with real | snooping | | | Dst: 192.168.2.1 | | | | packet, | IP addr | | | | <other header info> | | | |- private | | | | +----------------------+ | | | IP addr | | | | | <packet data> | | | | | | | | `----------------------' | | -' | | | `--------------------------' | -------------' | `------------------------------' --------------------------' 当 VPN 数据被远端接到时, 它将首先被解密 (使用 racoon 协商得到的安全关联)。 然后它们将进入 gif 接口, 并在那里展开第二层, 直到只剩下最里层的包, 并将其转发到内网上。 可以通过与之前同样的 &man.ping.8; 命令来测试安全性。 首先登录到 A.B.C.D 网关上并执行: tcpdump dst host 192.168.2.1 在同一主机上登录另一会话, 执行 ping 192.168.2.1 此时的输出应该是: XXX tcpdump output 如您看到的, &man.tcpdump.1; 给出的将是 ESP 包。 假如您想查看它们的内容可以使用 option 选项, 您将 (显然地) 看到一些乱码, 因为传输过程实施了加密。 祝贺您。 您已经完成了两个远程站点之间的 VPN 的架设工作。 小结 将两边的内核配置加入: options IPSEC options IPSEC_ESP 安装 security/ipsec-tools。 编辑两台网关上的 ${PREFIX}/etc/racoon/psk.txt 并添加远程主机的 IP 和共享的密钥。 文件的权限应该是 0600。 将下面的设置加入两台主机的 /etc/rc.conf 中: ipsec_enable="YES" ipsec_file="/etc/ipsec.conf" 在两个网关上都建立 /etc/ipsec.conf 并添加必要的 spdadd。 在网关 #1 上是: spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P out ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require; spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P in ipsec esp/tunnel/W.X.Y.Z-A.B.C.D/require; 在网关 #2 上则是: spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P out ipsec esp/tunnel/W.X.Y.Z-A.B.C.D/require; spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P in ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require; 添加防火墙规则以允许 IKE, ESP, 和 IPENCAP 通讯能够到达各自的主机: ipfw add 1 allow udp from A.B.C.D to W.X.Y.Z isakmp ipfw add 1 allow udp from W.X.Y.Z to A.B.C.D isakmp ipfw add 1 allow esp from A.B.C.D to W.X.Y.Z ipfw add 1 allow esp from W.X.Y.Z to A.B.C.D ipfw add 1 allow ipencap from A.B.C.D to W.X.Y.Z ipfw add 1 allow ipencap from W.X.Y.Z to A.B.C.D 前面的两步应该足以让 VPN 运转起来了。 两个网络上的机器都应该能通过 IP 来访问对方, 而所有的通讯都被自动地进行加密。
Chern Lee 原著 OpenSSH OpenSSH 安全 OpenSSH OpenSSH 是一组用于安全地访问远程计算机的连接工具。 它可以作为 rloginrsh rcp 以及 telnet 的直接替代品使用。 更进一步, 其他任何 TCP/IP 连接都可以通过 SSH 安全地进行隧道/转发。 OpenSSH 对所有的传输进行加密, 从而有效地阻止了窃听、 连接劫持, 以及其他网络级的攻击。 OpenSSH 由 OpenBSD project 维护, 它基于 SSH v1.2.12 并包含了最新的错误修复和更新。 它同时兼容 SSH 协议的 1 和 2 两个版本。 使用 OpenSSH 的好处 通常,当使用 &man.telnet.1; 或 &man.rlogin.1; 时, 数据是以明码的形式发送的,并没有加密。 在客户机和服务器之间的网络上运行的听包程序可以在会话中偷窃到传输的用户名/密码和数据。 OpenSSH 提供了多种的身份验证和加密方法来防止这种情况的发生。 启用 sshd OpenSSH 启用 sshd 的启用是作为 &os; 安装中 Standard 安装过程中的一步来进行的。 要查看 sshd 是否已被启用, 请检查 rc.conf 文件中的: sshd_enable="YES" 这表示在下次系统启动时加载 OpenSSH 的服务程序 &man.sshd.8;。 此外, 也可以手动使用 &man.rc.8; 脚本 /etc/rc.d/sshd 来启动 OpenSSH /etc/rc.d/sshd start SSH 客户 OpenSSH 客户 &man.ssh.1; 的工作方式和 &man.rlogin.1; 非常类似。 &prompt.root; ssh user@example.com Host key not found from the list of known hosts. Are you sure you want to continue connecting (yes/no)? yes Host 'example.com' added to the list of known hosts. user@example.com's password: ******* 登录过程和使用 rlogintelnet 建立的会话非常类似。 在连接时, SSH 会利用一个密钥指纹系统来验证服务器的真实性。 只有在第一次连接时, 用户会被要求输入 yes。 之后的连接将会验证预先保存下来的密钥指纹。 如果保存的指纹与登录时接收到的不符, 则将会给出警告。 指纹保存在 ~/.ssh/known_hosts 中, 对于 SSH v2 指纹, 则是 ~/.ssh/known_hosts2 默认情况下, 较新版本的 OpenSSH 只接受 SSH v2 连接。 如果能用版本 2 则客户程序会自动使用, 否则它会返回使用版本 1 的模式。 此外, 也可以通过命令行参数 来相应地强制使用版本 1 或 2。 保持客户端的版本 1 能力是为了考虑较早版本的兼容性。 安全复制 OpenSSH 安全复制 scp &man.scp.1; 命令和 &man.rcp.1;; 的用法类似, 它用于将文件复制到远程的机器上, 或复制过来, 区别是它是安全的。 &prompt.root; scp user@example.com:/COPYRIGHT COPYRIGHT user@example.com's password: ******* COPYRIGHT 100% |*****************************| 4735 00:00 &prompt.root; 由于先前的例子中已经保存了指纹, 使用 &man.scp.1; 时会自动地加以验证。 &man.scp.1; 使用的参数同 &man.cp.1; 类似。 第一个参数是一个或一组文件, 然后是复制的目标。 由于文件是通过 SSH 在网上传递的, 因此某些文件的名字需要写成 配置 OpenSSH 配置 针对 OpenSSH 服务程序和客户端的系统级配置文件在 /etc/ssh 目录中。 ssh_config 用于配置客户端的设定, 而 sshd_config 则用于配置服务器端。 另外 (默认是 /usr/sbin/sshd), 以及 这两个 rc.conf 选项提供了更多的配置选择。 ssh-keygen 用于取代口令的一种方法是使用 &man.ssh-keygen.1; 来生成 DSA 或 RSA 密钥对用于验证用户的身份: &prompt.user; ssh-keygen -t dsa Generating public/private dsa key pair. Enter file in which to save the key (/home/user/.ssh/id_dsa): Created directory '/home/user/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/user/.ssh/id_dsa. Your public key has been saved in /home/user/.ssh/id_dsa.pub. The key fingerprint is: bb:48:db:f2:93:57:80:b6:aa:bc:f5:d5:ba:8f:79:17 user@host.example.com &man.ssh-keygen.1; 会生成一个包含公私钥对用于验证身份。 私钥将保存到 ~/.ssh/id_dsa~/.ssh/id_rsa, 而公钥则被存放到 ~/.ssh/id_dsa.pub~/.ssh/id_rsa.pub, 文件名取决于您选择的 DSA 和 RSA 密钥类型。 公钥必须被存放到远程机器上的 ~/.ssh/authorized_keys 才能够使系统正确运转。 类似地, 第 1 版的 RSA 公钥应存放到 ~/.ssh/authorized_keys 这将允许从远程连接时以基于 SSH 密钥的验证来代替口令验证。 如果在 &man.ssh-keygen.1; 中使用了通行字, 则每次使用私钥时都需要输入它。 &man.ssh-agent.1; 能够缓解多次输入长通行字的压力, 并将在接下来的 予以详述。 选项和配置文件可能随 OpenSSH 的版本不同而不同; 为了避免出现问题, 您应参考 &man.ssh-keygen.1; 联机手册。 ssh-agent 和 ssh-add &man.ssh-agent.1; 和 &man.ssh-add.1; 这两个工具, 提供了一种将 SSH 秘钥加载到内存中以便使用, 而不必每次都输入通行字的方法。 &man.ssh-agent.1; 工具能够使用加载到其中的私钥来处理验证过程。 &man.ssh-agent.1; 应被用于启动另一个应用程序。 最基本的用法是, 使用它来启动 shell, 而高级一些的用法则是用它来启动窗口管理器。 要在 shell 中使用 &man.ssh-agent.1;, 首先应把 shell 作为参数来启动它。 随后, 应通过 &man.ssh-add.1; 并输入通行字, 来向它提供身份验证信息。 一旦这些步骤都做完了, 用户就应该能够 &man.ssh.1; 到任何一个安装了对应公钥的机器了。 例如: &prompt.user; ssh-agent csh &prompt.user; ssh-add Enter passphrase for /home/user/.ssh/id_dsa: Identity added: /home/user/.ssh/id_dsa (/home/user/.ssh/id_dsa) &prompt.user; 要在 X11 中使用 &man.ssh-agent.1;, 调用 &man.ssh-agent.1; 的过程应置于 ~/.xinitrc 之中。 这将把 &man.ssh-agent.1; 服务提供给所有在 X11 中运行的程序。 下面是一个 ~/.xinitrc 文件的实例: exec ssh-agent startxfce4 这将启动 &man.ssh-agent.1;, 而后者将在每次 X11 启动时运行 XFCE。 作完这些之后就可以重启 X11 以便使修改生效。 随后您就可以运行 &man.ssh-add.1; 来加载全部 SSH 密钥了。 SSH 隧道 OpenSSH 隧道 OpenSSH 能够创建隧道以便用加密的会话来封装其他协议。 下面的命令告诉 &man.ssh.1; 为 telnet 创建一个隧道: &prompt.user; ssh -2 -N -f -L 5023:localhost:23 user@foo.example.com &prompt.user; 上述 ssh 命令使用了下面这些选项: 强制 ssh 使用第2版的协议 (如果需要和较老的 SSH 一同工作请不要使用这个选项)。 表示不使用命令行, 或者说只使用隧道。 如果省略, ssh 将同时初始化会话。 强制 ssh 在后台执行。 表示产生一条 本地端口:远程主机:远程端口 形式的隧道。 远程 SSH 服务器。 SSH 隧道通过监听 localhost 上面指定端口来完成工作。 它将把本机主机/端口上接收到的连接通过 SSH 连接转发到远程主机/端口。 本例中, 位于 localhost5023 端口 被用于转发 localhost 的连接到远程主机的 23 端口。 由于 23telnet 使用的, 因此它将通过 SSH 隧道完成 telnet 会话。 这可以用来封装任意不安全的 TCP 协议, 例如 SMTP、 POP3、 FTP等等。 使用 SSH 为 SMTP 创建安全隧道 &prompt.user; ssh -2 -N -f -L 5025:localhost:25 user@mailserver.example.com user@mailserver.example.com's password: ***** &prompt.user; telnet localhost 5025 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 mailserver.example.com ESMTP 这可以与 &man.ssh-keygen.1; 以及额外的用户帐号配合来建立一个更透明的 SSH 隧道环境。 密钥可以被用在需要输入口令的地方, 而且可以为不同的用户配置不同的隧道。 实用的 SSH 通道例子 加强 POP3 服务的安全 工作时, 有一个允许外来连接的 SSH 服务器。 同一个办公网络中有一个邮件服务器提供 POP3 服务。 这个网络, 或从您家到办公室的网络可能不, 或不完全可信。 基于这样的原因, 您需要以安全的方式来查看邮件。 解决方法是创建一个到办公室 SSH 服务器的连接, 并通过这个连接来访问 POP3 服务: &prompt.user; ssh -2 -N -f -L 2110:mail.example.com:110 user@ssh-server.example.com user@ssh-server.example.com's password: ****** 当这个通道连上时, 您可以把 POP3 请求发到 localhost 端口 2110。 这个连接将通过通道安全地转发到 mail.example.com 绕过严厉的防火墙 一些大脑长包的网络管理员会使用一些极端的防火墙策略, 不仅过滤进入的连接, 而且也过滤连出的连接。 一些时候您可能只能连接远程机器 22 端口,以及 80 端口用来进行 SSH 和网页浏览。 您可能希望访问一些其它的 (也许与工作无关的) 服务, 例如提供音乐的 Ogg Vorbis 流媒体服务器。 如果 Ogg Vorbis server 在 22 或 80 端口以外的端口播放音乐, 则您将无法访问它。 解决方法是建立一个到您的网络的防火墙之外的网络上的 SSH 服务器, 并通过它提供的通道连接到 Ogg Vorbis 服务器上。 &prompt.user; ssh -2 -N -f -L 8888:music.example.com:8000 user@unfirewalled-system.example.org user@unfirewalled-system.example.org's password: ******* 现在您可以把客户程序指定到 localhost 的 8888 端口, 它将把请求转发给 music.example.com 的 8000 端口, 从而绕过防火墙。 允许用户登录 <varname>AllowUsers</varname> 选项 通常限制哪些用户能够登录, 以及从何处登录会是好主意。 采用 AllowUsers 选项能够方便地达到这一目的。 例如, 想要只允许 root 用户从 192.168.1.32 登录, 就可以在 /etc/ssh/sshd_config 文件中加入下述设置: AllowUsers root@192.168.1.32 要允许用户 admin 从任何地方登录, 则只需列出用户名: AllowUsers admin 可以在同一行指定多个用户, 例如: AllowUsers root@192.168.1.32 admin 列出需要登录机器的用户很重要; 否则他们将被锁在外面。 在完成对 /etc/ssh/sshd_config 的修改之后您必须告诉 &man.sshd.8; 重新加载其配置文件, 方法是执行: &prompt.root; /etc/rc.d/sshd reload 进一步的资料 OpenSSH &man.ssh.1; &man.scp.1; &man.ssh-keygen.1; &man.ssh-agent.1; &man.ssh-add.1; &man.ssh.config.5; &man.sshd.8; &man.sftp-server.8; &man.sshd.config.5; Tom Rhodes 作者 ACL 文件系统访问控制表 与文件系统在其他方面的加强, 如快照等一道, &os; 5.0 及更高版本提供了通过文件系统访问控制表 (ACLs) 实现的安全机制。 访问控制表以高度兼容 (&posix;.1e) 的方式扩展了标准的 &unix; 权限模型。 这一特性使得管理员能够利用其优势设计更为复杂的安全模型。 如果想为 UFS 文件系统启用 ACL 支持, 则需要添加下列选项: options UFS_ACL 并重新编译内核。 如果这个选项没有编译进内核, 则在挂接支持 ACL 的文件系统时将会收到警告。 这个选项在 GENERIC 内核中已经包含了。 ACL 依赖于在文件系统上启用扩展属性。 在新一代的 &unix; file system, UFS2 中内建了这种支持。 UFS1 上配置扩展属性需要比 UFS2 更多的管理开销。 而且, 在 UFS2 上的扩展属性的性能也有极大的提高。 因此, 如果想要使用访问控制表, 推荐使用 UFS2 而不是 UFS1 ACL 可以在挂接时通过选项 来启动, 它可以加入 /etc/fstab。 另外, 也可以通过使用 &man.tunefs.8; 修改超级块中的 ACL 标记来持久性地设置自动的挂接属性。 一般而言, 后一种方法是推荐的做法, 其原因是: 挂接时的 ACL 标记无法被重挂接 (&man.mount.8; ) 改变, 只有完整地 &man.umount.8; 并做一次新的 &man.mount.8; 才能改变它。 这意味着 ACLs 状态在系统启动之后就不可能在 root 文件系统上发生变化了。 另外也没有办法改变正在使用的文件系统的这个状态。 在超级块中的设置将使得文件系统总被以启用 ACLs 的方式挂接, 即使在 fstab 中的对应项目没有作设置, 或设备顺序发生变化时也是如此。 这避免了不慎将文件系统以没有启用 ACLs 的状态挂接, 从而避免没有强制 ACLs 这样的安全问题。 可以修改 ACL 行为, 以允许在没有执行一次全新的 &man.mount.8; 的情况下启用它, 但我们认为不鼓励在不启用 ACL 的时候这么做是有必要的, 因为如果启用了 ACL, 然后关掉它, 然后在没有刷新扩展属性的情况下重新启用它是很容易造成问题的。 一般而言, 一旦启用了文件系统的 ACLs 就不应该再关掉它, 因为此时的文件系统的保护措施可能和用户所期待的样子不再兼容, 而重新启用 ACL 将重新把先前的 ACL 附着到文件上, 而由于它们的权限发生了变化, 就很可能造成无法预期的行为。 在查看目录时, 启用了 ACLs 的文件将在通常的属性后面显示 + (加号)。 例如: drwx------ 2 robert robert 512 Dec 27 11:54 private drwxrwx---+ 2 robert robert 512 Dec 23 10:57 directory1 drwxrwx---+ 2 robert robert 512 Dec 22 10:20 directory2 drwxrwx---+ 2 robert robert 512 Dec 27 11:57 directory3 drwxr-xr-x 2 robert robert 512 Nov 10 11:54 public_html 这里我们看到了 directory1, directory2, 以及 directory3 目录使用了 ACLs。 而 public_html 则没有。 使用 <acronym>ACL</acronym> 文件系统 ACL 可以使用 &man.getfacl.1; 工具来查看。 例如, 如果想查看 testACL 设置, 所用的命令是: &prompt.user; getfacl test #file: #owner:1001 #group:1001 user::rw- group::r-- other::r-- 要修改这个文件上的 ACL 设置, 则需要使用 &man.setfacl.1; 工具。 例如: &prompt.user; setfacl -k test 参数将把所有当前定义的 ACL 从文件或文件系统中删除。 一般来说应该使用 因为它会保持让 ACL 正常工作的那些项不变。 &prompt.user; setfacl -m u:trhodes:rwx,group:web:r--,o::--- test 在前面的命令中, -m 选项被用来修改默认的 ACL 项。由于已经被先前的命令 删除,因此没有预先定义的项,于是默认的选项被恢复,并附加上指定的选项。 请小心地检查,如果您加入了一个不存在的用户或组,那么将会在 stdout 得到一条 Invalid argument 的错误提示。 Tom Rhodes Contributed by Portaudit 监视第三方安全问题 过去几年中, 安全领域在如何处理漏洞的评估方面取得了长足的进步。 几乎每一个操作系统都越来越多地安装和配置了第三方工具, 而系统被入侵的威胁也随之增加。 漏洞的评估是安全的一个关键因素, 尽管 &os; 会发布基本系统的安全公告, 然而为每一个第三方工具都发布安全公告则超出了 &os; Project 的能力。 在这一前提下, 一种减轻第三方漏洞的威胁, 并警告管理员存在已知的安全问题的方法也就应运而生。 名为 Portaudit 的 &os; 附加工具能够帮助您达成这一目的。 security/portaudit port 会下载一个数据库, 这一数据库是由 &os; Security Team 和 ports 开发人员维护的, 其中包含了已知的安全问题。 要开始使用 Portaudit, 需要首先从 Ports Collection 安装它: &prompt.root; cd /usr/ports/security/portaudit && make install clean 在安装过程中, &man.periodic.8; 的配置文件将被修改, 以便让 Portaudit 能够在每天的安全审计过程中运行。 一定要保证发到 root 帐号的每日安全审计邮件确实有人在读。 除此之外不需要进行更多的配置了。 安装完成之后, 管理员可以通过下面的命令来更新数据库, 并查看目前安装的软件包中所存在的已知安全漏洞: &prompt.root; portaudit -Fda 由于每天执行 &man.periodic.8; 时都会自动更新数据库, 因此, 运行这条命令是可选的。 在这里只是作为例子给出。 在任何时候, 如果希望对通过 Ports Collection 安装的第三方软件工具进行审计, 管理员都可以使用下面的命令: &prompt.root; portaudit -a 针对存在漏洞的软件包, Portaudit 将生成类似下面的输出: Affected package: cups-base-1.1.22.0_1 Type of problem: cups-base -- HPGL buffer overflow vulnerability. Reference: <http://www.FreeBSD.org/ports/portaudit/40a3bca2-6809-11d9-a9e7-0001020eed82.html> 1 problem(s) in your installed packages found. You are advised to update or deinstall the affected package(s) immediately. 通过访问上面给出的 URL, 管理员能够了解关于那个漏洞的进一步信息。 这些信息通常包括受到影响的 &os; Port 版本, 以及其他可能包含安全公告的网站。 简而言之, Portaudit 是一个强大的工具, 并能够配合 Portupgrade port 来非常有效地工作。 Tom Rhodes 作者 FreeBSD 安全公告 &os; 安全公告 像其它具有产品级品质的操作系统一样, &os; 会发布 安全公告。 通常这类公告会只有在在相应的发行版本已经正确地打过补丁之后发到安全邮件列表并在勘误中说明。 本节将介绍什么是安全公告, 如何理解它, 以及为系统打补丁的具体步骤。 安全公告看上去是什么样子? &os; 安全公告的样式类似下面的范例, 这一例子来自 &a.security-notifications.name; 邮件列表。 ============================================================================= &os;-SA-XX:XX.UTIL Security Advisory The &os; Project Topic: denial of service due to some problem Category: core Module: sys Announced: 2003-09-23 Credits: Person@EMAIL-ADDRESS Affects: All releases of &os; &os; 4-STABLE prior to the correction date Corrected: 2003-09-23 16:42:59 UTC (RELENG_4, 4.9-PRERELEASE) 2003-09-23 20:08:42 UTC (RELENG_5_1, 5.1-RELEASE-p6) 2003-09-23 20:07:06 UTC (RELENG_5_0, 5.0-RELEASE-p15) 2003-09-23 16:44:58 UTC (RELENG_4_8, 4.8-RELEASE-p8) 2003-09-23 16:47:34 UTC (RELENG_4_7, 4.7-RELEASE-p18) 2003-09-23 16:49:46 UTC (RELENG_4_6, 4.6-RELEASE-p21) 2003-09-23 16:51:24 UTC (RELENG_4_5, 4.5-RELEASE-p33) 2003-09-23 16:52:45 UTC (RELENG_4_4, 4.4-RELEASE-p43) 2003-09-23 16:54:39 UTC (RELENG_4_3, 4.3-RELEASE-p39) CVE Name: CVE-XXXX-XXXX For general information regarding FreeBSD Security Advisories, including descriptions of the fields above, security branches, and the following sections, please visit http://www.FreeBSD.org/security/. I. Background II. Problem Description III. Impact IV. Workaround V. Solution VI. Correction details VII. References Topic(标题) 一栏说明了问题到底是什么。 它基本上是对所发现的安全问题及其所涉及的工具的描述。 Category (分类) 是指系统中受到影响的组件, 这一栏可能是 corecontrib, 或者 ports 之一。 core 分类表示安全弱点影响到了 &os; 操作系统的某个核心组件。 contrib 分类表示弱点存在于某个捐赠给 &os; Project 的软件, 例如 sendmail。 最后是 ports, 它表示该弱点影响了 Ports Collection 中的某个第三方软件。 Module(模块) 一栏给出了组件的具体位置, 例如 sys。 在这个例子中, 可以看到 sys 模块是存在问题的; 因此, 这个漏洞会影响某个在内核中的组件。 Announced(发布时间) 一栏反映了与安全公告有关的数据是什么时候公之于众的。 这说明安全团队已经证实问题确实存在, 而补丁已经写入了 &os; 的代码库。 Credits(作者) 一栏给出了注意到问题存在并报告它的个人或团体。 The Affects(影响范围) 一栏给出了 &os; 的那些版本存在这个漏洞。 对于内核来说, 检视受影响的文件上执行的 ident 输出可以帮助确认文件版本。 对于 ports, 版本号在 /var/db/pkg 里面的 port 的名字后面列出。 如果系统没有与 &os; CVS 代码库同步并每日构建, 它很可能是有问题的。 Corrected(修正时间) 一栏给出了发行版本中修正问题的具体日期、时间和时差。 在公共漏洞数据库 (Common Vulnerabilities Database) 系统中预留的, 用于查看漏洞的标识信息。 Background(技术背景) 一栏提供了受影响的组件的作用。 多数时候这一部分会说明为什么 &os; 中包含了它, 它的作用, 以及它的一些原理。 Problem Description(问题描述) 一栏深入阐述安全漏洞的技术细节。 这部分有时会包括有问题的代码相关的详细情况, 甚至是这个部件如何能够被恶意利用并打开漏洞的细节。 Impact(影响) 一栏描述了问题能够造成的影响类型。 例如, 可能导致拒绝服务攻击, 权限提升, 甚至导致得到超级用户的权限。 Workaround(应急方案) 一栏给出了系统管理员在暂时无法升级系统时可以采取的临时性对策。 这些原因可能包括时间限制, 网络资源的限制, 或其它因素。 不过无论如何, 安全不能够被轻视, 有问题的系统要么应该打补丁, 要么应该实施这种应急方案。 Solution(解决方案) 一栏提供了如何给有问题的系统打补丁的方法。 这是经过逐步测试和验证过的给系统打补丁并让其安全地工作的方法。 =Correction Details(修正细节) 一栏展示了针对 CVS 分支或某个发行版的修正特征。 同时也提供了每个分支上相关文件的版本号。 References(文献) 一栏通常会给出其它信息的来源。 这可能包括 URL, 书籍、 邮件列表以及新闻组。 Tom Rhodes Contributed by 进程记帐 进程记帐 进程记帐是一种管理员可以使用的跟踪系统资源使用情况的手段, 包括它们分配给了哪些用户、 提供系统监视手段, 并且可以精细到用户执行的每一个命令。 当然, 这种做法是兼有利弊的。 它的好处是, 查找入侵时可以迅速把范围缩小到攻击者进入的时刻; 而这样做的缺点, 则是记帐会产生大量的日志, 因而需要很多磁盘空间来存储它们。 这一节将带领管理员一步一步地配置基本的进程记帐。 启用并利用进程记帐 在使用进程记帐之前, 必须先启用它。 要完成这项工作, 需要运行下面的命令: &prompt.root; touch /var/account/acct &prompt.root; accton /var/account/acct &prompt.root; echo 'accounting_enable="YES"' >> /etc/rc.conf 一旦启用之后, 记帐就会开始跟踪 CPU 统计数据、 命令, 等等。 所有的记帐日志不是以可读的方式记录的, 要查看它们, 需要使用 &man.sa.8; 这个工具。 如果没有给出其他参数, 则 sa 将按用户, 以分钟为单位显示他们所使用的时间、 总共的 CPU 和用户时间, 以及平均的 I/O 操作数目, 等等。 要显示关于刚刚发出的命令的相关信息, 则应使用 &man.lastcomm.1; 工具。 lastcomm 可以用来显示在某一 &man.ttys.5; 上的用户信息, 例如: &prompt.root; lastcomm ls trhodes ttyp1 将会显示出所有已知的 trhodes 在 ttyp1 终端上执行 ls 的情况。 更多的可用选项在联机手册 &man.lastcomm.1;、 &man.acct.5; 和 &man.sa.8; 中有所介绍。
diff --git a/zh_CN.GB2312/books/handbook/serialcomms/chapter.sgml b/zh_CN.GB2312/books/handbook/serialcomms/chapter.sgml index 925972ebe8..389d3b4416 100644 --- a/zh_CN.GB2312/books/handbook/serialcomms/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/serialcomms/chapter.sgml @@ -1,2545 +1,2545 @@ 串口通讯 概述 串口通讯 &unix; 一直都是支持串口通讯的。事实上, 早期的 &unix; 系统就是利用串口线来输入和输出数据的。 那时常见的 终端 包括一个每秒10个字符的串口打印机和键盘, 现在这些已经发生了很大的变化。 这章将介绍一些利用 FreeBSD 进行串口通讯的方法。 读完这章,您将了解到: 如何通过终端连接到您的FreeBSD系统。 如何使用modem拨号到远程主机。 如何允许远程用户通过modem登录到您的系统。 如何从串口控制台引导您的系统。 阅读这章之前,您应当了解: 如何配置和安装一个新的内核 ()。 理解 &unix; 的权限和进程 ()。 准备您打算在 FreeBSD 中使用的串口设备 (modem 或多插口卡) 的技术参考手册。 介绍 术语 bits-per-second bps 每秒位— 数据的传输速度 DTE DTE 数据终端设备 — 如您的计算机 DCE DCE 数据通讯设备 — 如您的modem RS-232 RS-232C cables 用于硬件串口通讯的EIA标准 当讨论通讯数据速度的时候,这节不会使用术语 baud。Baud指电气标准传输率,它已经使用了很长时间, 而 bps (bits per second) 才是正确使用的术语 (至少它不会打扰那些爱争吵的家伙)。 线缆和端口 要将 modem 或终端与您的 FreeBSD 系统相连, 您的计算机需要一个串口, 以及用于连接串口设备所需的线缆。 如果您比较熟悉硬件及所需要的电缆, 则可以跳过这节。 线缆 串口线缆有许多不同的种类。 最常见的两种类型是 null-modem 线缆和标准 (直联) RS-232 线缆。 您的硬件说明书中会介绍应使用的线缆种类。 Null-modem线缆 null-modem cable null-modem 电缆会直接传送某些信号, 如 Signal Ground (信号地), 但对其他信号进行交换。 例如, Transmitted Data (数据发送) 引脚是连到另一端 Received Data (数据接收) 引脚的。 也可以自行制作 null-modem 电缆给终端使用 (例如, 为了品质的要求)。 下面的表格展示了 RS-232C 信号, 以及 DB-25 连接器上的引脚。 注意, 标准也要求一根直通引脚 1 到引脚 1 的 保护地 (Protective Ground) 线, 但这通常都被省掉。 某些终端在只有引脚 2、 3 和 7 的时候, 就已经能够正常使用了, 而其他一些, 则需要下面例子中所展示的不同的配置。 DB-25 to DB-25 Null-Modem Cable 信号 引脚 # 引脚 # 信号 SG 7 连接到 7 SG TD 2 连接到 3 RD RD 3 连接到 2 TD RTS 4 连接到 5 CTS CTS 5 连接到 4 RTS DTR 20 连接到 6 DSR DTR 20 连接到 8 DCD DSR 6 连接到 20 DTR DCD 8 连接到 20 DTR
这里还有两种目前比较流行的其他接线方式。 DB-9 到 DB-9 Null-Modem 电缆 信号 引脚 # 引脚 # 信号 RD 2 接到 3 TD TD 3 接到 2 RD DTR 4 接到 6 DSR DTR 4 接到 1 DCD SG 5 接到 5 SG DSR 6 接到 4 DTR DCD 1 接到 4 DTR RTS 7 接到 8 CTS CTS 8 接到 7 RTS
DB-9 到 DB-25 Null-Modem 电缆 信号 引脚 # 引脚 # 信号 RD 2 DB-9 到 DB-25 Null-Modem 电缆 2 TD TD 3 接到 3 RD DTR 4 接到 6 DSR DTR 4 接到 8 DCD SG 5 接到 7 SG DSR 6 接到 20 DTR DCD 1 接到 20 DTR RTS 7 接到 5 CTS CTS 8 接到 4 RTS
当某一段连接器上的一个引脚需要连接到对端的一对引脚时, 通常是将那一对引脚使用一短线连接, 而使用长线接到另一端的那个引脚。 上面的设计似乎更为流行。 在其他变种中 (在 RS-232 Made Easy 这本书中进行了详细介绍) 则是 SG 接 SG, TD 接 RD、 RTS 和 CTS 接 DCD、 DTR 接 DSR, 反之亦然。
标准RS-232C线缆 RS-232C cables 标准的串口电缆会直接传送所有 RS-232C 信号。 也就是说, 一头的 Transmitted Data 引脚, 会直接接到另一头的 Transmitted Data 引脚。 这包括将调制解调器接到您的 FreeBSD 系统上的那种电缆, 同样也适用于某些型号的终端。
端口 串口是FreeBSD主机与终端传输数据的设备。 这节描述了端口的种类和它们在 FreeBSD 上是如何编址的。 端口的种类 有好几种串口。 在采购或制作线缆之前, 您应确认它能够适合您的终端以及 FreeBSD 系统。 绝大多数终端都提供 DB-25 端口。 个人计算机, 也包括运行 FreeBSD 的 PC 机, 通常会有 DB-25 或 DB-9 口。 如果您的 PC 上有多插口串口卡, 则可能有 RJ-12 或 RJ-45 口。 请参见您硬件的文档以了解所用接口的规格。 此外, 您也可以通过观察外观来了解所用的端口。 端口名称Port Names 在FreeBSD中,您可以通过 /dev 目录中的一个记录来访问每个串口。有两种不同的记录: 呼入端口被命名为/dev/ttydN, 这里 N 是端口号,从零开始。 通常,您使用呼入端口作为终端。呼入端口要求数据线使用载波检测 (DCD) 信号来工作。 呼出端口被命名为 /dev/cuadN。 您通常不使用呼出端口作为终端, 只使用modem。 如果串口线或终端不支持载波检测数据传输, 您可以使用呼出端口。 在 &os; 5.X 和更早版本中, 呼出端口的名字是 /dev/cuaaN 如果您已经连接一个终端到第一个串口 (在 &ms-dos; 上是COM1), 则可以使用 /dev/ttyd0 来作为终端。 如果它是在第二个串口 (COM2), 那就是 /dev/ttyd1,等等。
内核配置 FreeBSD默认支持4个串口。 在&ms-dos;下,这些是 COM1COM2COM3, 和 COM4。 FreeBSD 目前支持 dumb 多口串口卡,如 BocaBoard 1008 和 2016, 以及许多 Digiboard 和 Stallion Technologies 制造的智能多接口卡。 不过, 默认的内核只会寻找标准的COM端口。 要看看您的内核是否支持您的串口,只要在内核启动时查看一下启动信息, 或使用 /sbin/dmesg 命令重新检测内核启动信息。 特别的,寻找以sio字符启动的信息。 如果想只察看包含 sio 一词的消息, 可以使用下面的命令: &prompt.root; /sbin/dmesg | grep 'sio' 例如,在一个带有4个串口的系统上,这些是串口特定的内核启动信息: sio0 at 0x3f8-0x3ff irq 4 on isa sio0: type 16550A sio1 at 0x2f8-0x2ff irq 3 on isa sio1: type 16550A sio2 at 0x3e8-0x3ef irq 5 on isa sio2: type 16550A sio3 at 0x2e8-0x2ef irq 9 on isa sio3: type 16550A 如果内核未能认出所有的串口, 可能需要通过修改 /boot/device.hints 文件来进行一些配置。 此外, 也可以注释或完全删除掉您没有的设备。 请参见 &man.sio.4; 联机手册来了解关于串口, 以及多插口卡配置的进一步细节。 如果您正使用一个在不同版本的 FreeBSD 上的文件请务必小心, 因为设备参数和语法发生了变化。 这里端口 IO_COM1 代替了 0x3f8,端口 IO_COM2 代替了 0x2f8,端口 IO_COM3 代替了 0x3e8,端口 IO_COM4 代替了 0x2e8,这些都是各自端口相应的端口地址。 中断4,3,5,9都是经常用的中断。也要注意有些正常的串口可能 无法 在一些ISA总线的PC上共享中断 (多插口板卡有板载的电子设备,允许在板上所有 16550A 的设备共享一个或两个中断请求)。 设备特殊文件 在内核中, 大多数设备都是通过 设备特殊文件 来访问的, 这些文件一般位于 /dev 目录中。 sio 是通过 /dev/ttydN (呼入) 和 /dev/cuadN (呼出) 设备来访问的。 此外, FreeBSD 也提供了初始化设备 (在 &os; 6.X 上是 /dev/ttydN.init 以及 /dev/cuadN.init, 而在 &os; 5.X 上则是 /dev/ttyidN/dev/cuaiaN) 以及锁设备 (在 &os; 6.X 上是 /dev/ttydN.lock/dev/cuadN.lock, 而在 &os; 5.X 上则是 /dev/ttyldN/dev/cualaN)。 初始化设备用于在打开端口时初始化其通讯参数, 例如使用 RTS/CTS 信号进行流控制的调制解调器的 crtscts。 锁设备则用于在端口上提供一个锁标志, 防止用户或程序改变特定的参数; 请参见 &man.termios.4;、 &man.sio.4;, 以及 &man.stty.1; 的联机手册, 以了解关于终端配置、 锁和初始化设备, 以及配置终端参数的详细信息。 串口配置 ttyd cuad ttydN (或 cuadN) 设备是您将要打开的应用程序的一般设备。 当进程打开某个设备时, 它将有一个终端 I/O 设置的默认配置。 您可以在命令行看看这些设置: &prompt.root; stty -a -f /dev/ttyd1 当您修改了这个设备的设置,这个设置会生效,除非设备被关闭。 当它被重新打开时,它将回到默认设置。 要修改默认设置,您可以打开和调整 初始状态 设备的设置。例如, 要为ttyd5 打开 模式,8位通讯和默认的 流控制, 输入: &prompt.root; stty -f /dev/ttyd5.init clocal cs8 ixon ixoff rc files rc.serial 串口设备的系统级初始化, 是由 /etc/rc.d/serial 来控制的。 这个文件会影响串口设备的默认设置。 为了防止应用程序修改某些设置, 应修改 lock state(锁状态) 设备。 例如, 要把 ttyd5 的速率锁定为 57600 bps, 输入: &prompt.root; stty -f /dev/ttyd5.lock 57600 现在,一个打开ttyd5 和设法改变端口速度的应用程序将被固定在57600bit/s。很自然地, 您需要确定初始状态,然后用root帐户锁定状态设备的写入功能。 很显然,您应该只让 root 用户可以初始化或锁定设备的状态。
Sean Kelly Contributed by 终端 终端 当您在计算机控制台或是在一个连接的网络上时, 终端提供了一个方便和低成本的访问 FreeBSD 系统的方法。 这节描述了如何在 FreeBSD 上使用终端。 终端的用法和类型 早期的 &unix; 系统没有控制台。 人们通过将终端连接到计算机的串口来登录和使用程序。 它很像用 modem 和一些终端软件来拨号进入一个远程的系统, 只能执行文本的工作。 今天的 PC 已经可以使用高质量的图形了, 但与今天的其他&unix;操作系统一样,建立一个登录会话的能力仍然存在。 通过使用一个终端连接到一个没有使用的串口, 您就能登录和运行任何文本程序或在 X 视窗系统中运行一个 xterm 窗口程序。 对于商业用户,您可以把任何终端连接到 FreeBSD 系统, 然后把它们放在员工的桌面上。 对于家庭用户,则可以使用一台比较老的 IBM PC 或 Macintosh 运行一个终端连接到一台运行 FreeBSD 的高性能机器上。 对于FreeBSD,有三种终端: 哑终端 充当终端的PC X 终端 下面一小节将描述每一种终端。 哑终端 哑终端需要专门的好几种硬件,让您通过串口线连接到计算机。 它们被叫做 是因为它们只能够用来显示, 发送和接收文本。 您不能在它上面运行任何程序。 有好几百种哑终端,包括Digital Equipment Corporation 的VT-100和Wyse的WY-75。只有几种可以在FreeBSD上工作。 一些高端的终端可以显示图形,但只有某些软件包可以使用这些高级特性。 哑终端被广泛用于那些不需要图形应用的工作中。 充当终端的PC 假如 哑终端 的功能仅限于显示、 发送和接收文本的话, 那么显然任何一台闲置的个人计算机, 都完全能够胜任哑终端的工作。 因此您需要的是合适的线缆, 以及一些在这台计算机上运行的 终端仿真 软件。 这种配置在家庭中应用十分广泛。 例如, 如果您的爱人正忙于在您的 FreeBSD 系统的控制台上工作时, 您就可以将一台功能稍弱的计算机挂在这个 FreeBSD 系统上来同时完成一些文本界面的工作。 在 &os; 的基本系统中至少有两个能用于进行串口连接的工具: &man.cu.1; 和 &man.tip.1;。 如果要从运行 &os; 的计算机上通过串口连接到另一系统, 可以使用: &prompt.root; cu -l 串口设备 此处 串口设备 表示您计算机上某个串口对应的设备名。 在 &os; 6.0 之前的版本中, 这些设备的名字是 /dev/cuaaN, 而在 6.0 和更新一些的版本中, 则是 /dev/cuadN 此处的 N 表示串口的编号。 请注意在 &os; 中设备的编号是从零而非一开始的 (这一点与另一些系统, 如基于 &ms-dos; 的系统不同)。 因此, 在基于 &ms-dos; 系统中的 COM1 在 &os; 中通常叫做 /dev/cuad0 其他一些人可能喜欢使用另一些来自 Ports 套件的程序。 Ports 中提供了几个与 &man.cu.1; 和 &man.tip.1; 类似的工具, 例如 comms/minicom X 终端 X终端是最复杂的终端系统。它们通常需要使用以太网来连接。 它们能显示任何X应用程序。 我们介绍X终端只是为了感兴趣。然而, 这章不会涉及X终端的安装,配置或使用。 配置 这节描述了您在一个终端上启用一个登录会话时, 需要在 FreeBSD 系统上进行的配置。 假设已经配置好了内核来支持串口, 就可以直接开始连接了。 中曾经提到, init 进程依赖于系统启动时所有的处理控制和初始化。 通过 init 来执行的一些任务将先读取 /etc/ttys文件, 然后在可用的终端上启用一个 getty 进程。 getty 进程可用来阅读一个登录名和启动 login程序。 然而,要为您的FreeBSD系统配置终端,您需要以 root 身份执行下面的步骤: 如果它不在那里, 您需要为串口在 /dev 目录下添加一行记录到 /etc/ttys 指定 /usr/libexec/getty 在端口上运行, 然后从 /etc/gettytab 文件指定适当的 getty 类型。 指定默认的终端类型。 设置端口为 on 确定端口是否为 secure 迫使init 重新读取 /etc/ttys文件。 作为可选的步骤,您可以通过在 /etc/gettytab 中建立一个记录,在第2步创建一个定制的 getty 类型来使用。这章不会介绍如何做。 您可以参考 &man.gettytab.5; 和 &man.getty.8; 的联机手册了解更多信息。 添加一个记录到<filename>/etc/ttys</filename> /etc/ttys文件列出了您 FreeBSD系统上允许登录的所有端口。 例如, 第一个虚拟控制台 ttyv0 在这个文件中有一个记录。 您可以使用这个记录登录进控制台。 这个文件也包含其他虚拟控制台的记录,串口,和伪 ttys 终端。 对于一个硬连线的终端, 只要列出串口的 /dev 记录而不需要 /dev 部分 (例如, /dev/ttyv0 可以被列为 ttyv0)。 默认的 FreeBSD 安装包括一个支持最初四个串口 ttyd0ttyd3/etc/ttys 文件。 如果您从那些端口中某一个使用终端,您不需要添加另一个记录。 在 <filename>/etc/ttys</filename> 中增加终端记录 假设我们连接两个终端给系统: 一个 Wyse-50 和一个老的运行 Procomm 终端软件模拟一个 VT-100 终端的286IBM PC。 在 /etc/ttys 文件中的相应的记录是这样的: ttyd1 "/usr/libexec/getty std.38400" wy50 on insecure ttyd5 "/usr/libexec/getty std.19200" vt100 on insecure 第一部分指定了终端指定文件的名称, 它可以在 /dev中找到。 第二部分是在这行执行的命令,通常是 &man.getty.8;。 getty 初始化然后打开一行,设置速度, 用户名的命令和执行登录程序。 getty 程序在它的命令行接收一个参数 (可选), getty 类型。 一个 getty 类型会在终端行描述一个特征, 像波特率和奇偶校验。 getty 程序从 /etc/gettytab 文件读取这些特征。 文件/etc/gettytab 包含了许多老的和新的终端行记录。 在很多例子中,启动文本 std 的记录将用硬连线终端来工作。 这些记录忽略了奇偶性。 这是一个从110到115200 bit/s的 std 记录。 当然,您可以添加您自己的记录到这个文件。 gettytab 的联机手册提供了更多的信息。 当在/etc/ttys中设置 getty 类型的时候, 确信在终端上的通讯设置匹配。 在我们的例子中, Wyse-50 不使用奇偶性, 用38400 bit/s 来连接。286 PC不使用奇偶性,用19200bit/s来连接。 第三部分是通常连接到那个tty行的终端类型。对于拨号端口, unknowndialup 通常被用在这个地方。 对于硬连线的终端,终端类型不会改变, 所以您可以从termcap数据库文件中放一个真正的终端类型。 在我们的例子中, Wyse-50 使用真正的终端类型, 而运行 Procomm 的286 PC将被设置成在VT-100上的模拟。 如果端口被启用,可以指定第四个部分。在第二部分, 把它放在这儿将执行初始化进程来启动程序 getty。如果您在这部分拖延, 将没有getty,在端口上因此就没有登录。 最后部分被用来指定端口是否安全。 标记一个安全的端口意味着您信任它允许用 root 帐户从那个端口登录。 不安全的端口不允许 root登录。 在一个不安全的端口上, 用户必须用无特权的帐户登录, 然后使用 su 或一个相似的机制来获得超级用户的权限。 重新读取<filename>/etc/ttys</filename>来强制<command>init</command> /etc/ttys文件做一个必要的修改后,您必须发送一个 SIGHUP 信号给初始化进程来迫使它重新读取配置文件,例如: &prompt.root; kill -HUP 1 init 总是系统运行时的第一个进程,因此它总是PID 1。 如果能够正确设置,所有的线缆都是适当的,终端将可以启用了, 然后一个 getty 进程将在每个终端运行, 您将在您的终端上看到登录命令行。 您的连接可能出现的问题 即使您小心翼翼地注意细节,您仍然可能会在设置终端时出错。 这有一个有关问题和解决办法的列表: 没有登录命令出现: 确定终端被嵌入和打开了。如果把一台个人计算机充当一个终端, 确信终端模拟软件运行在正确的串口上。 确信线缆被稳固地连接在终端和 FreeBSD 计算机上。 确信用了正确的电缆。 确定终端和 FreeBSD 的传输速度和奇偶设置已经一致了。 如果您有一个图像显示终端,确信对比度已经调节好了。 如果它是一个可打印的终端,确信纸张和墨水已经就绪了。 确定一个 getty 进程正在运行和服务终端。 例如, 可以用ps 命令得到运行 getty 程序的列表,键入: &prompt.root; ps -axww|grep getty 您将看到一个终端的记录。例如,下面的显示表明一个getty 正在第二个串口 ttyd1 运行, 正在 /etc/gettytab 中使用 std.38400 的记录: 22189 d1 Is+ 0:00.03 /usr/libexec/getty std.38400 ttyd1 如果没有 getty 进程运行, 确信您已经在/etc/ttys中启用了端口。 在修改完/etc/ttys文件后,记得运行 kill -HUP 1 如果 getty 进程确实在运行, 但终端上仍然没有显示出登录提示, 或者虽然显示了单缺不允许您输入, 您的终端或电缆可能不支持硬件握手。 请尝试将 /etc/ttys 中的 std.38400 改为 3wire.38400 并一定能够记得在改完 /etc/ttys 之后 kill -HUP 1)。 3wire 记录和 std 类似, 但忽略硬件握手。 您可能需要在使用 3wire 时减少波特率或启用软件流控制以避免缓冲区溢出。 出现一个 <quote>垃圾</quote> 而不是一个登录命令行 确信终端和 FreeBSD 使用相同的 bit/s 传输率和奇偶校验设置。 检查一下 getty 进程确信当前使用正确的 getty 类型。 如果没有, 编辑/etc/ttys然后运行kill -HUP 1 当键入密码时,字符两个两个出现 将终端 (或终端模拟软件) 从 半双工本地回显 换成 全双工 Guy Helmer Contributed by Sean Kelly Additions by 拨入服务 拨入服务 为拨入服务配置FreeBSD系统与连接到终端是非常相似的,除非您正在使用 modem来拨号而不是终端。 外置vs.内置modem 外置modem看起来很容易拨号。 因为,外置 modem 可以通过储存在非易失性的RAM中的参数来配置, 它们通常提供指示器来显示重要的RS-232信号的状态。 不停闪光的信号灯能给用户留下比较深刻的印象, 而且指示器也可以用来查看modem是否正常地工作。 内置modem通常缺乏非易失性的RAM, 所以对它们的配置可能会限制在通过 DIP 开关来设置。 如果您的内置modem有指示灯,您也很难看得到。 Modem和线缆 modem 如果您使用一个外置的 modem,那您将需要适当的电缆线。 一个标准的串口线应当足够长以至普通的信号能够连接上: 信号名称 缩写 全名 RD 收到数据 (Received Data) TD 传出数据 (Transmitted Data) DTR 数据终端就绪 (Data Terminal Ready) DSR 数据集就绪 (Data Set Ready) DCD 数据载波检测 (Data Carrier Detect) (RS-232 的收到线路信号检测器) SG 信号地 (Signal Ground) RTS 要求发送数据 (Request to Send) CTS 允许对方发送数据 (Clear to Send)
FreeBSD 对速度超过 2400 bps 的情形需要通过 RTSCTS 信号来完成流控制, 通过 CD 信号来检测呼叫响应和挂机, 并通过 DTR 信号来在会话结束时对调制解调器进行复位。 某些电缆在连接时没有提供全部需要的信号, 这会给您带来问题, 例如在挂断时登录会话不消失, 这就有可能是电缆的问题。 与其它类 &unix; 操作系统类似, FreeBSD 使用硬件信号来检测呼叫响应, 以及在挂断时挂断并复位调制解调器。 FreeBSD 避免发送命令给调制解调器, 或监视其状态。 如果您熟悉通过调制解调器来连接基于 PC 的 BBS 系统, 这可能看起来有点难用。
串口的考虑 FreeBSD支持基于 NS8250, NS16450, NS16550 和 NS16550A 的EIA RS-232C通讯接口。 8250和16450设备有单字符缓冲。 16550设备提供了一个 16 个字符的缓冲, 可以提高更多的系统性能。 因为单字符缓冲设备比 16 个字符的缓冲需要更多的系统资源来工作, 所以基于16550A的接口卡可能更好。 如果系统没有活动的串口, 或有较大的负载, 16 字符缓冲的卡对于低错误率的通讯来说更好。 快速预览 getty 对于终端, init 会在每个配置串口上为每个拨入连接产生一个 getty 进程。 例如, 如果一个 modem 被附带在 /dev/ttyd0 中,用命令ps ax可以显示下面这些: 4850 ?? I 0:00.09 /usr/libexec/getty V19200 ttyd0 当用户拨上modem, 并使用它进行连接时, CD 线就会被 modem 认出。 内核注意到载波信号已经被检测到, 需要完成 getty 端口的打开。 getty 发送一个登录:在指定的初始线速度上的命令行。 Getty 会检查合法的字符是否被接收, 在典型的配置中, 如果发现 垃圾getty 就会设法调节线速度,直到它接收到合理的字符。 /usr/bin/login 用户在键入他/她的登录名称后, getty执行/usr/bin/login, 这会要求用户输入密码来完成登录, 然后启动用户的shell。 配置文件 如果希望允许拨入您的 FreeBSD 系统, 在 /etc 目录中有三个系统配置文件需要您关注。 其一是 /etc/gettytab, 其中包含用于 /usr/libexec/getty 服务的配置信息。 其二是 /etc/ttys, 它的作用是告诉 /sbin/init 哪些 tty 设备上应该运行 getty。 最后, 关于端口的初始化命令, 应放到 /etc/rc.d/serial 脚本中。 关于在 &unix; 上配置拨入调制解调器有两种主要的流派。 一种是将本地计算机到调制解调器的 RS-232 接口配置为固定速率。 这样做的好处是, 远程用户总能立即见到系统的登录提示符, 而其缺点则是, 系统并不知道用户真实的数据速率是多少, 因而, 类似 Emacs 这样的程序, 也就无法调整它们绘制屏幕的方式, 以便为慢速连接改善响应时间。 另一种流派将调制解调器的 RS-232 接口速率配置为随远程用户的连接速率变化。 例如, 对 V.32bis (14.4 Kbps) 连接, 调制解调器会让自己的 RS-232 接口以 19.2 Kbps 的速率运行, 而 2400 bps 连接, 则会使调制解调器的 RS-232 接口以 2400 bps 的速率运行。 由于 getty 并不能识别具体的调制解调器的连接速率反馈信息, 因此, getty 会以初始速度给出一个 login: 提示, 并检查用户的响应字符。 如果用户看到乱码, 则他们应知道此时应按下 Enter 键, 直到看到可以辨认的提示符为止。 如果数据速率不匹配, 则 getty 会将用户输入的任何信息均视为 乱码, 并尝试以下一种速率来再次给出 login: 提示符。 这一过程可能需要令人作呕地重复下去, 不过一般而言, 用户只要敲一两下键盘就能看到正确的提示符了。 显然, 这种登录过程看起来不如前面所介绍的 锁定速率 方法那样简单明了, 但使用低速连接的用户, 却可以在运行全屏幕程序时得到更好的交互响应。 这一节将尽可能公平地介绍关于配置的信息, 但更着力于介绍调制解调器速率随连接速率变化的配置方法。 <filename>/etc/gettytab</filename> /etc/gettytab /etc/gettytab是一个用来配置 getty 信息的 termcap 风格的文件。 请看看 gettytab 的联机手册了解完整的文件格式和功能列表。 锁定速度的配置 如果您把您的modem的数据通讯率锁定在一个特殊的速度上, 您不需要对 /etc/gettytab 文件作任何变化。 匹配速度的配置 您将需要在 /etc/gettytab 中设置一个记录来告诉 getty 您希望在 modem 上使用的速度。 如果您的 modem 的速率是 2400 bit/s, 则可以使用现有的 D2400 的记录。 # # Fast dialup terminals, 2400/1200/300 rotary (can start either way) # D2400|d2400|Fast-Dial-2400:\ :nx=D1200:tc=2400-baud: 3|D1200|Fast-Dial-1200:\ :nx=D300:tc=1200-baud: 5|D300|Fast-Dial-300:\ :nx=D2400:tc=300-baud: 如果您有一个更高速度的 modem, 必须在 /etc/gettytab 中添加一个记录。 下面是一个让您可以以最高 19.2 Kbit/s 的用在 14.4 Kbit/s的modem上的接口记录: # # Additions for a V.32bis Modem # um|V300|High Speed Modem at 300,8-bit:\ :nx=V19200:tc=std.300: un|V1200|High Speed Modem at 1200,8-bit:\ :nx=V300:tc=std.1200: uo|V2400|High Speed Modem at 2400,8-bit:\ :nx=V1200:tc=std.2400: up|V9600|High Speed Modem at 9600,8-bit:\ :nx=V2400:tc=std.9600: uq|V19200|High Speed Modem at 19200,8-bit:\ :nx=V9600:tc=std.19200: 这样做的结果是 8-数据位, 没有奇偶校验的连接。 上面使用19.2 Kbit/s的连接速度的例子,也可以使用 9600 bit/s (for V.32), 2400 bit/s, 1200 bit/s,300 bit/s, 直到 19.2 Kbit/s。 通讯率的调节使用 nx= (next table) 来实现。 每条线使用一个 tc= (table continuation) 的记录来加速对于一个特殊传输率的标准设置。 如果您有28.8 Kbit/s的modem,或您想使用它的 14.4Kbit/s 模式, 就需要使用一个更高的超过 19.2 Kbit/s 的通讯速度的 modem。 这是一个启动 57.6 Kbit/s 的 gettytab 记录的例子: # # Additions for a V.32bis or V.34 Modem # Starting at 57.6 Kbps # vm|VH300|Very High Speed Modem at 300,8-bit:\ :nx=VH57600:tc=std.300: vn|VH1200|Very High Speed Modem at 1200,8-bit:\ :nx=VH300:tc=std.1200: vo|VH2400|Very High Speed Modem at 2400,8-bit:\ :nx=VH1200:tc=std.2400: vp|VH9600|Very High Speed Modem at 9600,8-bit:\ :nx=VH2400:tc=std.9600: vq|VH57600|Very High Speed Modem at 57600,8-bit:\ :nx=VH9600:tc=std.57600: 如果您的 CPU 速度较低, 或系统的负荷很重, 而且没有 16550A 的串口,您可能会在57.6 Kbit/s 上得到 sio silo错误。 <filename>/etc/ttys</filename> /etc/ttys /etc/ttys文件的配置在 中介绍过。 配置 modem 是相似的, 但我们必须指定一个不同的终端类型。 锁定速度和匹配速度配置的通用格式是: ttyd0 "/usr/libexec/getty xxx" dialup on 上面的第一条是这个记录的设备特定文件 — ttyd0 表示 /dev/ttyd0 是这个 getty 将被监视的文件。 第二条 "/usr/libexec/getty xxx" 是将运行在设备上的进程 init。 第三条,dialup,是默认的终端类型。 第四个参数, on, 指出了线路是可操作的 init。 也可能会有第五个参数, secure, 但它将只被用作拥有物理安全的终端 (如系统终端)。 默认的终端类型可能依赖于本地参考。 拨号是传统的默认终端类型, 以至用户可以定制它们的登录脚本来注意终端什么时候拨号, 和自动调节它们的终端类型。 然而, 作者发现它很容易在它的站点上指定 vt102 作为默认的终端类型, 因为用户刚才在它们的远程系统上使用的是VT102模拟器。 您对/etc/ttys作修改之后,您可以发送 init 进程给一个 HUP 信号来重读文件。您可以使用下面的命令来发送信号: &prompt.root; kill -HUP 1 如果这是您的第一次设置系统, 您可能要在发信号 init 之前等一下, 等到您的 modem 正确地配置并连接好。 锁定速度的配置 对于一个锁定速度的配置,您的 ttys 记录必须有一个为 getty 提供固定速度的记录。 对于一个速度被锁定在 19.2kbit/s 的 modem, ttys 记录是这样的: ttyd0 "/usr/libexec/getty std.19200" dialup on 如果您的 modem 被锁定在一个不同的数据速度, 为 std.speed 使用适当的速度来代替 std.19200。 确信您使用了一个在 /etc/gettytab 中列出的正确的类型。 匹配速度的设置 在一个匹配速度的设置中,您的 ttys 录需要参考在 /etc/gettytab 适当的起始 auto-baud 记录。 例如, 如果您为一个以 19.2 Kbit/s 开始的可匹配速度的 modem 添加上面建议的记录, 您的 ttys 记录可能是这样的: ttyd0 "/usr/libexec/getty V19200" dialup on <filename>/etc/rc.d/serial</filename> rc files rc.serial 高速调制解调器, 如使用 V.32、 V.32bis, 以及 V.34 的那些, 需要使用硬件 (RTS/CTS) 流控制。 您可以在 /etc/rc.d/serial 中增加 stty 命令来在 FreeBSD 内核中, 为调制解调器设置硬件流控制标志。 例如, 在 1 号串口 (COM2) 拨入和拨出设备上配置 termios 标志 crtscts, 可以通过在 /etc/rc.d/serial 增加下面的设置来实现: # Serial port initial configuration stty -f /dev/ttyd1.init crtscts stty -f /dev/cuad1.init crtscts Modem 设置 如果您有一个 modem, 它的参数能被存储在非易失性的 RAM 中, 您将必须使用一个终端程序来设置参数。 使用同样的通讯速度来连接 modem 作为初始速度 getty 将使用和配置 modem 的非易失性RAM来适应这些要求: 连接时宣告 CD 操作时宣告 DTR; DTR 消失时挂断线路并复位调制解调器 CTS 传输数据流控制 禁用 XON/XOFF 流控制 RTS 接收数据流控制 宁静模式 (无返回码) 无命令回显 请阅读您 modem 的文档找到您需要用什么命令和 DIP 接口设置。 例如,要在一个 USRobotics Sportster 14400 的外置 modem 上设置上面的参数,可以用下面这些命令: ATZ AT&C1&D2&H1&I0&R2&W 您也可能想要在 modem 上寻找机会调节这个设置, 例如它是否使用 V.42bis 和 MNP5 压缩。 外置 modem 也有一些用来设置的 DIP 开关, 也许您可以使用这些设置作为一个例子: Switch 1: UP — DTR Normal Switch 2: N/A (Verbal Result Codes/Numeric Result Codes) Switch 3: UP — Suppress Result Codes Switch 4: DOWN — No echo, offline commands Switch 5: UP — Auto Answer Switch 6: UP — Carrier Detect Normal Switch 7: UP — Load NVRAM Defaults Switch 8: N/A (Smart Mode/Dumb Mode) 在拨号 modem 上的结果代码应该被 禁用/抑制, 以避免当 getty 在 modem 处于命令模式并回显输入时错误地给出 login: 提示时可能造成的问题。 这样可能导致 getty 与 modem 之间产生更长的不必要交互。 锁定速度的配置 对于锁定速度的配置, 您需要配置 modem 来获得一个不依赖于通讯率的稳定的 modem到计算机 的传输率。 在一个 USR Sportster 14400 外置 modem 上, 这些命令将锁定 modem到计算机 的传输率: ATZ AT&B1&W 匹配速度的配置 对于一个变速的配置, 您需要配置 modem 调节它的串口传输率匹配接收的传输率。 在一个 USR Sportster 14400 的外置 modem 上, 这些命令将锁定 modem 的错误修正传输率适合命令要求的速度, 但允许串口速度适应没有纠错的连接: ATZ AT&B2&W 检查modem的配置 大多数高速的modem提供了用来查看当前操作参数的命令。 在USR Sportster 14400外置modem上, 命令 ATI5 显示了存储在非易失性RAM中的设置。 要看看正确的 modem 操作参数, 可以使用命令 ATZ 然后是 ATI4 如果您有一个不同牌子的 modem, 检查 modem 的使用手册看看如何双重检查您的 modem 的配置参数。 问题解答 这儿是几个检查拨号modem的步骤。 检查FreeBSD系统 把您的modem连接到FreeBSD系统, 启动系统, 然后, 如果您的 modem 有一个指示灯, 当登录时看看 modem 的 DTR 指示灯是否亮: 会在系统控制台出现命令行——如果它亮, 意味着 FreeBSD 已经在适当的通讯端口启动了一个 getty 进程, 等待 modem 接收一个呼叫。 如果DTR指示灯不亮, 通过控制台登录到 FreeBSD系统,然后执行一个 ps ax 命令来看 FreeBSD 是否正在正确的端口运行 getty进程。 您将在进程显示中看到像这样的一行: 114 ?? I 0:00.10 /usr/libexec/getty V19200 ttyd0 115 ?? I 0:00.10 /usr/libexec/getty V19200 ttyd1 如果您看到是这样的: 114 d0 I 0:00.10 /usr/libexec/getty V19200 ttyd0 modem 不接收呼叫, 这意味着 getty 已经在通讯端口打开了。 这可以指出线缆有问题或 modem 错误配置, 因为 getty 无法打开通讯端口。 如果您没有看到任何 getty 进程等待打开想要的 ttydN 端口, 在 /etc/ttys 中双击您的记录看看那儿是否有错误。 另外,检查日志文件 /var/log/messages 看看是否有一些来自 initgetty 的问题日志。 如果有任何信息, 仔细检查配置文件 /etc/ttys/etc/gettytab,还有相应的设备文件 /dev/ttydN, 是否有错误,丢失记录,或丢失了设备指定文件。 尝试接入Try Dialing In 设法拨入系统。 确信使用8位, 没有奇偶检验, 在远程系统上的1阻止位。 如果您不能立刻得到一个命令行, 试试每隔一秒按一下 Enter。 如果您仍没有看到一个登录: 设法发送一个 BREAK。 如果您正使用一个高速的 modem 来拨号, 请在锁定拨号 modem 的接口速度后再试试。 如果您不能得到一个登录:prompt,再检查一下 /etc/gettytab,重复检查: /etc/ttys 中指定的初始可用的名称与 /etc/gettytab 的一个可用的相匹配。 每个 nx= 记录与另一个 gettytab 可用名称匹配。 每个 tc= 记录与另一个 gettytab可用名称相匹配。 如果您拨号但 FreeBSD 系统上的 modem 没有回应, 确信 modem 能回应电话。 如果 modem 看起来配置正确了, 通过检查 modem 的指示灯来确认 DTR 线连接正确。 如果您做了好几次,它仍然无法工作,打断一会,等会再试试。 如果还不能工作, 也许您应该发一封电子邮件给 &a.questions; 寻求帮助。
拨出设备 dial-out service 下面将让您的主机通过 modem 连接到另一台计算机上。 这只要适当地建立一个终端作为远程主机就可以。 这可以用来登录进一个BBS。 如果您用 PPP 有问题, 那这种连接可以用来从 Internet 上下载一个文件。 如果您必须 FTP 一些东西, 而 PPP 断了, 使用终端会话来 FTP 它们。 然后使用 zmodem 来把它们传输到您的机器上。 我的Stock Hayes Modem不被支持,我该怎么办? 事实上, 联机手册对于这个的描述已经过时了。 一个通用的 Hayes拨号已经内建其中。 只要在您的 /etc/remote 文件中使用 at=hayes Hayes 驱动不够 聪明 只能认出一些比较新的 modem 的高级特性 — 如 BUSYNO DIALTONE, 或 CONNECT 115200 的信息将被搞乱。 当您使用的时候, 您必须把这些信息关掉。(通过 ATX0&W)。 另外,拨号的延迟是 60 秒。 您的 modem 可能使用另外的时间或提示认为有其他的通讯问题。 试试 ATS7=45&W 注意: 实际上 tip 不支持所有的 Hayes modems。 解决方法是编辑 /usr/src/usr.bin/tip/tip 目录中的 tipconf.h 文件。很明显, 您需要它的源代码才能这样做。 把行#define HAYES 0 改为 #define HAYES 1。 然后 makemake install就可以了。 我如何输入这些 AT 命令? /etc/remote /etc/remote 文件中增加一个 direct 项。 举例而言, 如果您的调制解调器挂在第一个串口, 即 /dev/cuad0 上, 则应添加下面这行: cuad0:dv=/dev/cuad0:br#19200:pa=none 此处应使用您的 modem 所支持的最高 br bps 速率。 接下来, 输入 tip cuad0 就可以连到 modem 上了。 此外, 也可以 root 身份执行 cu 命令: &prompt.root; cu -lline -sspeed line 是串口 (例如 /dev/cuad0) 而 speed 则是速率 (如 57600)。 当您输入完 AT 之后, 按 ~. 即可退出。 现在pn <literal>@</literal>标记不能工作? 在电话号码中的 @ 标记告诉计算机在 /etc/phones 文件中查找一个电话号码。 但 @ 标记也是一个在像 /etc/remote 这样的可用文件中的特殊字符。 用一个反斜线符号退出: pn=\@ 我如何在命令行拨电话号码? 在您的 /etc/remote 文件中通常放着一个叫做 generic 的记录。 例如: tip115200|Dial any phone number at 115200 bps:\ :dv=/dev/cuad0:br#115200:at=hayes:pa=none:du: tip57600|Dial any phone number at 57600 bps:\ :dv=/dev/cuad0:br#57600:at=hayes:pa=none:du: 然后, 可以执行: &prompt.root; tip -115200 5551234 如果您更喜欢cu而不是tip,使用一个通用的cu记录: cu115200|Use cu to dial any number at 115200bps:\ :dv=/dev/cuad1:br#57600:at=hayes:pa=none:du: 然后键入: &prompt.root; cu 5551234 -s 115200 这么做时是否每次都需要重新输入 bps 速率? 添加一项 tip1200cu1200, 并将 bps 速率换成更合适的值。 tip 的默认值是1200  bps, 也就是为什么会有 tip1200 这条记录的原因。 虽然您并不需要使用 1200 bps。 我通过一个终端服务器访问了很多主机。 除非每次都要等到您连接到主机然后键入 CONNECT <host>, 否则使用 tipcm 功能。 例如, 在 /etc/remote 中的这些记录: pain|pain.deep13.com|Forrester's machine:\ :cm=CONNECT pain\n:tc=deep13: muffin|muffin.deep13.com|Frank's machine:\ :cm=CONNECT muffin\n:tc=deep13: deep13:Gizmonics Institute terminal server:\ :dv=/dev/cuad2:br#38400:at=hayes:du:pa=none:pn=5551234: 将让您键入 tip paintip muffin 连接到主机pain或muffin, 和 tip deep13 连接到终端服务器。 <command>tip</command>能为每个站点试用多个线路吗? 经常有一个问题, 一个大学有几个modem线路, 几千个学生设法使用它们。 /etc/remote 中为您的大学添加一个记录, 然后为 pn 功能使用 @ 标记: big-university:\ :pn=\@:tc=dialout dialout:\ :dv=/dev/cuad3:br#9600:at=courier:du:pa=none: 接着, 在 /etc/phones 中列出大学的电话号码: big-university 5551111 big-university 5551112 big-university 5551113 big-university 5551114 tip 将按顺序试用每一个,然后就停止。 如果想继续测试, 隔一段时间再运行 tip 为什么我必须键入 <keycombo action="simul"> <keycap>Ctrl</keycap> <keycap>P</keycap> </keycombo> 两次才能发出 <keycombo action="simul"> <keycap>Ctrl</keycap> <keycap>P</keycap> </keycombo> 一次? CtrlP是默认的强制字符,被用来告诉tip下一个字符是文字的数据。您可以用~s给任何其他的字符设置强制字符,这意思是设置一个变量 在新的一行键入 ~sforce=single-charsingle-char 是任何简单的字符。 如果您遗漏了 single-char, 那强制字符就是空字符, 这可以键入 Ctrl2 CtrlSpace 来完成。 更好的 single-char Shift Ctrl 6 , 这只用在一些终端服务器上。 通过在您的 $HOME/.tiprc 文件中指定下面这行, 就可以得到您想要的任何强制字符: force=<single-char> 突然我键入的每一样东西都变成了大写?? 您一定是键入了 Ctrl A , 即 tipraise character, 会临时地指定成坏掉的 caps-lock键。 使用上面的 ~s 来合理地设置各种 raisechar。 事实上, 如果您不想使用这些特性的话,您可以用同样的方法设置强制字符。 这儿有一个很好的示例 .tiprc 文件, 对 Emacs用户来说,需要经常按 Ctrl2 CtrlA force=^^ raisechar=^^ The ^^ is ShiftCtrl6 . 如何用 <command>tip</command> 做文件传输? 如果您正在与另一台 &unix; 系统对话, 您可以用 ~p(put) 和 ~t (take) 发送和接收文件。 这些命令可以在远程系统上运行 catecho 来接收和发送文件。 语法是这样的: ~p local-file remote-file ~t remote-file local-file 由于没有错误校验, 所以您需要使用其他协议, 如 zmodem。 我如何用<command>tip</command>运行zmodem? 要接收这些文件,可以在远程终端启动发送程序。然后,键入 ~C rz 在本地开始接收它们。 要发送文件, 可以在远程终端启动接收程序。 然后, 键入 ~C sz files 把它们发送到远程系统。 Kazutaka YOKOTA Contributed by Bill Paul Based on a document by 设置串口控制台 serial console 介绍 FreeBSD可以通过一个串口只使用一个哑 (dumb) 终端就可以启动一个系统。 这样一种配置只有两种人能使用: 希望在机器上安装 FreeBSD 的系统管理员, 他没有键盘或显示器, 还有就是要调试内核或设备驱动程序的开发人员。 就象 描述的, FreeBSD 采用一个三步的启动过程。 最先两步储存在 FreeBSD 启动磁盘的启动 slice 的启动代码块中。 引导块然后就被加载, 接着运行第三步启动引导器 (/boot/loader)。 为了设置串口控制台, 您必须配置启动代码块, 启动引导器代码和内核。 串口控制台的配置, 简明版 这一节假定您使用默认的配置, 只希望迅速地获得关于配置串口控制台的概览。 使用串口电缆连接 COM1 和控制终端。 要在串口控制台上显示所有的引导信息, 需要以超级用户的身份执行下面的命令: &prompt.root; echo 'console="comconsole"' >> /boot/loader.conf 编辑 /etc/ttys 并把 ttyd0off 改为 ondialup 改为 vt100。 否则通过串口控制台上将不会提示输入口令, 从而导致潜在的安全漏洞。 - 重新启动并观察是否生效。 + 重新启动并观察是否生效。 如果需要不同的配置, 更进一步的配置讨论可以在 找到。 串口控制台的设置 准备一根串口线缆。 null-modem cable 您需要使用一个 null-modem 的线缆或标准的串口线和一个 null-modem 适配器。 请参考 中有关串口线的讨论。 拔掉键盘。 绝大多数的PC在开机检测的时候会检测到键盘, 如果没有检测到键盘, 则会出现错误。 一些机器会提示缺少键盘, 就不会继续引导系统。 如果您的计算机出现错误, 但仍能继续启动, 您可以不必理它。 如果您的计算机没有键盘拒绝启动, 那您需要配置 BIOS 来避免它。 请参考您的主板的使用说明了解更多细节。 在 BIOS 中将键盘设为 Not installed (未安装)。 现在您仍然无法使用键盘。 这样做只是告诉 BIOS 在启动时不要探测键盘。 您的 BIOS 不应抱怨键盘不存在。 即使这一标志设置为 Not installed 时, 只要把键盘插上, 它就仍可使用。 如果系统有 PS/2 鼠标, 如果幸运的话, 您也可以象键盘一样把它拔下来, 这是因为 PS/2 鼠标与键盘的一些硬件是共享的, 您的鼠标插上去, 系统会认为键盘仍在那儿。 插一个哑 (dumb) 终端到COM1:(sio0)。 如果您没有哑终端, 可以使用一个比较老的带有一个 modem 程序的PC/XT机器, 或在其他 &unix; 机器上的串口。 如果您没有 COM1: (sio0), 去找一个。 这时, 您就不能只能选择 COM1:来启动系统。 如果您已经在另一台设备上使用 COM1, 您必须临时删除那个设备, 然后安装一个新的系统引导块和内核。 确信您的内核配置文件已经为 COM1: (sio0) 设置了适当的标记: 有关的标记是: 0x10 启用控制台支持。 如果没有设置它, 则其他的控制台标记都会被忽略。 现在, 绝大多数的设置都有控制台的支持。 这个标记的第一个就是首选的。 这个单独选项是不能确保串口适用于控制台的, 设置下面的标记或加上下面描述的 选项, 和这个放在一起。 0x20 无论是否使用了下面将要讨论的 选项, 都强制这个单元作为控制台 (除非使用了更高优先级的控制台)。 标志 0x20 必须与 一起使用。 0x40 预留这个单元 (配合 0x10) 并让它不能用于普通的使用。 您不应在希望作为控制台的串口单元上设置这个标志。 这一标志是为内核远程调试准备的。 参见 开发者手册 以了解关于远程调试更进一步的情况。 例如: device sio0 at isa? port IO_COM1 flags 0x10 irq 4 看看 &man.sio.4; 的联机手册了解更多信息。 如果标记没有被设置, 您必须运行UserConfig或重新编译内核。 在启动磁盘的 a 分区的根目录创建 boot.config 文件。 这个文件将指导引导块代码如何启动系统。 为了激活串口控制台, 您必须有一个或多个下面的选项——如果您要多个选项, 在同一行必须都包含它们: 切换内部和串口控制台。 您使用这个来交换控制台设备。 例如, 如果您从内部控制台启动, 您可以使用 来直接使用启动引导器和内核来使用串口作为它的控制台设备。 另外, 如果您从串口启动, 您可以使用 来告诉启动引导器和内核使用显示设备作为控制台。 切换单一和双重控制台配置。 在单一配置中, 控制台将是本机的控制台 (显示设备) 或串口。 在双重控制台配置中, 显示设备和串口将同时成为控制台, 无论 的选项的情形。 然而, 双控制台配置只在引导块运行的过程中起作用。 一旦启动引导器获得控制, 由 选项指定的控制台将成为唯一的控制台。 在启动时,探测键盘。如果键盘找不到, 选项会自动设置。 由于当前版本引导块的空间限制, 选项只能探测扩展的键盘。 少于101键的键盘将无法被探测到。 如果您碰到这个情况, 您必须避免使用 选项。 目前还没有绕过这个问题的办法。 使用 选项来自动选择控制台, 或使用 选项来激活控制台。 您也可以使用boot联机文档中所描述的其他选项。 除了 选项, 所有选项将被传给启动引导器 (/boot/loader)。 启动引导器将通过检查 选项的状态来决定是显示设备成为控制台, 还是串口成为控制台。 这表示如果您指定 选项, 但在 /boot.config 中没有 选项, 您在启动代码块时使用串口作为控制台。 启动引导器将使用内部显示设备作为控制台。 启动机器 当您启动您的FreeBSD时,引导块将把 /boot.config 的内容发给控制台。例如: /boot.config: -P Keyboard: no 如果您把 放在 /boot.config 中并指出键盘存在或不存在, 那将只出现第二行。 这些信息会被定位到串口或内部控制台, 或两者同时, 这完全取决于 /boot.config 中的选项。 选项 送出消息的设备 none 内部控制台 串口控制台 串口控制台和内部控制台 串口控制台和内部控制台 , 有键盘 内部控制台 , 无键盘 串口控制台 出现上面信息后,在引导块加载启动引导器和更多信息被映到屏幕之前将有一个小小的停顿。 在通常情况下, 您不需要打断启动进程, 但为了确信设置是否正确, 您也可以这样做。 在控制台上按 Enter 以外的任意键就能打断启动进程。 引导块将进入命令行模式。 您将看到: >> FreeBSD/i386 BOOT Default: 0:ad(0,a)/boot/loader boot: 检验上面出现的信息, 可能是串口, 或内部控制台, 或两个同时, 完全取决于您在 /boot.config 中的选项。 如果信息出现在正确的控制台, 按 Enter 继续启动进程。 如果您要使用串口控制台, 但您没有看到命令行, 那可能设置有问题。 这时, 输入 然后按 Enter/Return 来告诉引导块 (然后是启动引导器和内核) 选择串口作为控制台。 一旦系统起来了, 就可以回去检查一下是什么出了问题。 启动引导器加载完后, 您将进入启动进程的第三步, 您仍然可以在启动引导器通过设定您喜欢的环境来切换内部控制台和串口控制台。 参考 摘要 这是几个在这章要讨论的几个设置和选择的控制台的摘要。 例1: 您为 <devicename>sio0</devicename> 设置标记 0x10 device sio0 at isa? port IO_COM1 flags 0x10 irq 4 在 /boot.config 中的选项 引导块执行时所用的控制台 引导加载器执行时所用的控制台 内核所用的控制台 内部 内部 内部 串口 串口 串口 串口和内部 内部 内部 串口和内部 串口 串口 , 有键盘 内部 内部 内部 , 没有键盘 串口和内部 串口 串口 例2:您为sio0设置标记为0x30 device sio0 at isa? port IO_COM1 flags 0x30 irq 4 在 /boot.config 中的选项 引导块执行时所用的控制台 引导加载器执行时所用的控制台 内核所用的控制台 内部 内部 串口 串口 串口 串口 串口和内部 内部 串口 串口和内部 串口 串口 , 有键盘 内部 内部 串口 , 没有键盘 串口和内部 串口 串口 串口控制台的提示 设置更高的串口速度 在默认配置中, 串口的设置是: 速率 9600 波特、 8 数据位、 无奇偶校验位、 1 停止位。 如果您希望修改默认的控制台速率, 可以采用下列几种方法之一: BOOT_COMCONSOLE_SPEED 配置为希望的速率, 并重新编译引导块。 请参见 以了解如何联编和安装新的引导块。 如果串口控制台已配置为使用 以外的其它方式引导, 或者内核使用的速率与引导块不同, 则必需在内核配置文件中加入下述设置, 并重新联编新内核: options CONSPEED=19200 使用内核引导选项 . 这个命令行选项可以加到 /boot.config 中。 请参见联机手册 &man.boot.8; 以获得如何在 /boot.config 中增加选项, 以及其它的可用选项。 在您的 /boot/loader.conf 文件中启用 comconsole_speed 选项。 使用这个选项时,您还需要在 /boot/loader.conf 中配置 consoleboot_serial, 以及 boot_multicons。 下面是一个利用 comconsole_speed 改变串口控制台速率的例子: boot_multicons="YES" boot_serial="YES" comconsole_speed="115200" console="comconsole,vidconsole" &os; 在 6.1-RELEASE 之前的版本并不支持 以及 /boot/loader.confcomconsole_speed 选项, 如果您使用的是较早的 &os; 版本, 就只能重新编译引导块了。 使用 <devicename>sio0</devicename> 以外的串口 作为控制台 使用串口而不是 sio0 作为控制台需要做一些重编译。 如果您无论如何都要使用另一个串口, 重新编译引导块, 启动引导器和内核。 取得内核源代码 (参考 )。 编辑 /etc/make.conf 文件, 然后设置 BOOT_COMCONSOLE_PORT作为您要使用 (0x3f80x2f8、 0x3E8 或 0x2E8) 端口的地址。 只有 sio0sio3 (COM1COM4) 都可以使用; 但多口串口卡将不会工作。 不需要任何中断设置。 创建一个定制的内核配置文件, 在您要使用的串口添加合适的标记。 例如, 如果要将 sio1 (COM2) 作为控制台: device sio1 at isa? port IO_COM2 flags 0x10 irq 3 device sio1 at isa? port port IO_COM2 flags 0x30 irq 3 其他端口的控制台标记也不要设。 重新编译和安装引导块: &prompt.root; cd /sys/boot &prompt.root; make clean &prompt.root; make &prompt.root; make install 重建和安装内核。 用 &man.bsdlabel.8; 将引导块写到启动盘上,然后从新内核启动。 通过串口线进入DDB调试器 options BREAK_TO_DEBUGGER options DDB 在串口控制台上得到一个登录命令行 您可能希望通过串口线进入登录提示, 现在您可以看到启动信息, 通过串口控制台键入内核调试信息。可以这样做。 用一个编辑器打开 /etc/ttys 文件, 然后找到下面的行: ttyd0 "/usr/libexec/getty std.9600" unknown off secure ttyd1 "/usr/libexec/getty std.9600" unknown off secure ttyd2 "/usr/libexec/getty std.9600" unknown off secure ttyd3 "/usr/libexec/getty std.9600" unknown off secure ttyd0ttyd3 相当于 COM1COM4。 可以打开或关闭某个端口。 如果您已经改变了串口的速度, 还必须改掉标准的 9600 与当前的例如 19200 相匹配。 您也可以改变终端的类型从不知名的到您串口终端的真实类型。 编辑完这个文件, 您必须 kill -HUP 1 来使这个修改生效。 从启动引导器修改控制台 前面一节描述了如何通过调整引导块来设定串口控制台。 这节将讲到在启动引导器中通过键入一些命令和环境变量来指定控制台。 由于启动引导器会被启动进程的第三步所调用, 引导块以后, 在启动引导器中的设置将忽略在引导块中的设置。 配置串口控制台 您可以很容易地指定启动引导器和内核来使用串口控制台, 只需要在 /boot/loader.rc中写入下面这行: set console="comconsole" 无论前一节中的引导块如何配置, 这个设置都会生效。 您最好把上面一行放在文件的第一行, 以便尽早地在启动时看到串口控制台的启动信息。 同样地,您可以指定内部控制台为: set console="vidconsole" 如果您不设置启动引导环境变量控制台, 启动引导器和内核将使用在引导块时用 选项指定的控制台。 在 3.2 以及更新的版本中,您可以在 /boot/loader.conf.local/boot/loader.conf 中, 而不是在 /boot/loader.rc 指定控制台。 用这种方法, 您的 /boot/loader.rc 文件将是这样的: include /boot/loader.4th start 然后, 创建 /boot/loader.conf.local 并加入下面的行。 console=comconsole console=vidconsole 看看 &man.loader.conf.5; 的联机手册了解更多信息。 目前, 引导块尚不提供与引导加载器的 选项等价的选项, 另外, 它也不能根据是否有键盘存在自动决定选择使用内部控制台还是串口控制台。 使用串口而不是<devicename>sio0</devicename>作为控制台 要使用一个串口而不是 sio0 作为串口控制台 需要重新编译启动引导器。下面的步骤跟 描述的相似。 警告 这篇文章本意是想告诉人们如何设定没有显示设备或键盘的专用服务器。 不幸的是, 绝大多数系统没有键盘可以让您启动, 而没有显示设备就不让您启动。 使用 AMI BIOS 的机器可以通过在 CMOS 中将 graphics adapter 项设为 Not installed 来在启动时不要求显示适配器。 然而, 许多机器并不支持这个选项, 如果您的系统没有显示硬件就拒绝启动。 对于这些机器, 即使您没有显示器, 也必须在机器上插上显示适配器。 建议您试试采用 AMI BIOS 的机器。
diff --git a/zh_CN.GB2312/books/handbook/x11/chapter.sgml b/zh_CN.GB2312/books/handbook/x11/chapter.sgml index d2bc3ae454..39900accd0 100644 --- a/zh_CN.GB2312/books/handbook/x11/chapter.sgml +++ b/zh_CN.GB2312/books/handbook/x11/chapter.sgml @@ -1,1586 +1,1482 @@ Ken Tom Updated for X.Org's X11 server by Marc Fonvieille X Window 系统 概述 FreeBSD 使用 X11 来为用户提供功能强大的图形用户界面。 X11 是一种开放源代码的 X Window 系统实现, 它包括 &xorg;&xfree86;。 &os; 在包括 &os; 5.2.1-RELEASE 在内的版本之前, 都默认安装 &xfree86;, 一种由 &xfree86; Project, Inc. 发布的 X11 服务。 从 &os; 5.3-RELEASE 开始, 默认并且为官方支持的 X11 变成了 &xorg;, 它是由 X.Org - 基金会开发的 X11 服务。 + 基金会开发的 X11 服务, 采用与 &os; 类似的授权。 此外, + 也有一些用于 &os; 的商业 X 服务器。 这章将介绍 X11 的安装和配置, 并着重强调 - &xorg; + &xorg;。 如欲了解关于 &xfree86; + 的详细信息 (在较早的 &os; 版本中, + &xfree86; 是默认的 X11 + 软件包), 则可以访问存档的旧版 &os; 使用手册, 其网址为 欲了解 X11 所支持的显示卡等硬件, 请访问 &xorg;&xfree86; 的网站。 + url="http://www.x.org/">&xorg; 网站。 在阅读完这一章后,您将会了解: X 视窗系统的不同组件,它们是如何协同工作的。 如何安装和配置 X11。 如何安装和使用不同的窗口管理器。 如何在 X11 中使用 &truetype; 字体。 如何为您的系统设置图形登录 (XDM)。 在阅读这一章之前,您应该: 知道如何安装额外的第三方应用程序()。 - - - 这一章介绍了 &xorg; 和 - &xfree86; 两种 X11 服务的安装和配置。 - 绝大多数时候, 配置文件、 命令句法是完全一样的。 当存在差异时, - &xorg; 和 - &xfree86; 的写法都会有所体现。 - 理解 X 对于那些熟悉其他图形环境,比如 µsoft.windows; 或者 &macos; 的用户来说,第一次使用 X 可能会感觉很惊讶。 尽管您不需要了解各种 X 组件的所有细节和它们是如何互相影响的; 然而, 了解一些基本的知识可以让您很好地利用 X 的强大功能。 为什么要使用 X? X 不是第一个为 &unix; 而开发的视窗系统, 但它是最流行的。 X 的原始开发团队在开发 X 之前就已经在另外一个视窗系统上工作了。 那个系统的名字叫做 W (就是 Window)。X 只是罗马字母中 W 后面 的一个。 X 可以被叫做 X, X Window 系统, X11, 等等。把 X11 称做 X Windows 可能会冒犯某些人; 查看 &man.X.7; 可以了解更多的信息。 X 客户机/服务器模型 X 一开始就是针对网络而设计的,所以 采用了 client-server 模型。在 X 模型中, X server 运行在有键盘,显示器,鼠标的计算机上。 服务器用来管理显示信息,处理来自键盘和鼠标的输入等。 每一个 X 应用程序 (比如 XTerm, 或者 &netscape;) 就是一个 client。 一个 client 给服务器发送信息,如 Please draw a window at these coordinates, 然后服务器就返回处理信息,如 The user just clicked on the OK button 如果您在只有一台计算机的家里或小型办公环境中使用 FreeBSD,您就 需要在同一台计算机上运行 X server和 X client。然而,如果您有很多运行 FreeBSD 的机器,您可以在您的桌面计算机上运行 X server,而在比较高档 的服务器上运行 X 应用程序。在这样的环境中,X server 和 X client 之间的 通信就可以通过网络来进行。 这迷惑了一些人,因为 X 的术语和他们料想的有些不同。 他们以为 X server 是运行在功能强大的大型机上的,而 X client 是运行在他们桌面上的计算机上的。 记住,X server 是有键盘和显示器的那台计算机,而 X client 是那些显示窗口的程序。 并不需要 client 和 server 都运行在同一种操作系统上,或甚至运行在 同一种类型的计算机上。在 µsoft.windows; 或者 Apple 公司的 &macos; 上运行 一个 X server 也是可以的,在它们上面也有很多免费的和商业化的应用程序。 - - 从 &os; 5.3-RELEASE 开始, 随 &os; 一同安装的 X 服务改成了 - &xorg;, - 它的授权同 FreeBSD 的授权类似, 可以免费使用。 - 此外, 也有一些针对 FreeBSD 的商业 X 服务器。 窗口管理器 X 的设计哲学很像 &unix; 的设计哲学, tools, not policy。这就意味着 X 不会试图去规定任务应该如何 去完成,而是,只给用户提供一些工具,至于决定如何使用这些工具是用户自己的 事情。 这套哲学扩展了 X,它不会规定窗口在屏幕上应该是什么样子,要如何移动鼠标, 什么键应该用来切换窗体 (比如, Alt Tab 按键,在 µsoft.windows; 环境中的作用), 每个窗口的工具条应该 看起来像什么,他们是否应该有关闭按钮等等。 实际上,X 行使了一种叫做 窗口管理器的应用程序的职责。有很多这样的程序可用: AfterStep, Blackbox, ctwm, Enlightenment, fvwm, Sawfish, twm, Window Maker,等等。每一个窗口管理器 都提供了不同的界面和观感;其中一些还支持 虚拟桌面;有一些允许您可以定制一些键来管理您的桌面; 一些有开始 按钮,或者其他类似的设计;一些是 可定制主题的(themeable), 通过安装新的主题, 可以完全改变外观。 这些以及很多其他的窗口管理器, 都可以在 Ports Collection 的 x11-wm 分类目录里找到。 另外,KDEGNOME 桌面环境都有他们自己的窗口管理器 与桌面集成。 每个窗口管理器也有不同的配置机制;有些需要手工来写配置文件, 而另外一些则可以使用 GUI 工具来完成大部分的配置任务,至少 (Sawfish) 有一个用 Lisp 语言来写的配置 文件。 焦点策略 窗口管理器的另一个特性是鼠标的 focus policy。 每个窗口系统都需要有一个选择窗口的方法来接受键盘的输入信息,以及当前 哪个窗口处于可用状态。 您通常比较熟悉的是一个叫做 click-to-focus 的焦点策略。 这是 µsoft.windows; 使用的典型焦点策略,也就是您在一个窗口上点击 一下鼠标,这个窗口就处于当前可用的状态。 X 不支持一些特殊的焦点策略。确切地说,窗口管理器控制着在什么时候哪个窗口 拥有焦点。不同的窗口管理器支持不同的焦点方案。它们都支持点击即获得焦点, 而且它们中的大多数都支持好几种方案。 最流行的焦点策略: focus-follows-mouse 鼠标指示器下面的窗口就是获得焦点的窗口。这可以不是位于其他所有 窗口顶部的窗口。您可以通过将鼠标移到另一个窗口就可以来改变焦点,您 不需要在它上面点击。 sloppy-focus 这种方式是对 focus-follows-mouse 策略的一个小小扩展。对于 focus-follows-mouse, 如果您把鼠标移到了根窗口(或桌面背景)上, 则所有的其它窗口都会失去焦点, 而相关的全部键盘输入也会丢失。 如果选择了 sloppy-focus, 则只有当指针进入新窗口时, 窗口焦点才会发生变化, 而当退出当前窗口时是不会变化的。 click-to-focus 当前窗口由鼠标点击来选择。窗口被突出显示 , 出现在所有其他窗口的前面。即使指针被移向了另一个窗口,所有的键盘输入 仍会被这个窗口接收。 许多窗口管理器支持其他的策略,与这些相比又有些变化。您可以看具体 窗口管理器的文档。 窗口部件 提供工具而非策略的 X 方法使得在每个应用程序屏幕上看到的窗口部件得到了 大大的扩展。 Widget 只是针对用户接口中所有列举项目的一个术语,它 可以用某种方法来点击或操作;如按钮,复选框,单选按钮,图标,列表框等等。 µsoft.windows; 把这些叫做控件 µsoft.windows; 和苹果公司的 &macos; 都有一个严格的窗口部件策略。 应用程序开发者被建议确保他们的应用程序共享一个普通的所见即所得的用户界面。 对于 X,它并不要求一个特殊的图形风格或一套相结合的窗口部件集。 这样的结果是您不能期望 X 应用程序只拥有一个普通的所见即所得的界面。 有很多的流行的窗口部件集设置,包括来自于 MIT 的 Athena, &motif; (模仿 µsoft.windows; 的窗口风格, 所有部件都具有斜边和3种灰色度), OpenLook, 和其他一些窗口部件集。 如今, 绝大多数比较新的 X 应用程序将使用一组新式的窗口设计, 包括 KDE 所使用的 Qt, 以及 GNOME 所使用的 GTK+。 在这样一种窗口系统下,&unix; 桌面的一些所见即所得特性作了一些收敛, 以使初学者感到更容易一些。 安装 X11 - &xorg; 或 - &xfree86; 都可以在 &os; 上安装。 - 从 &os; 5.3-RELEASE 开始, - &xorg; 成为了 &os; + &xorg; 是 &os; 上的默认 X11 实现。 &xorg; 是由 X.Org 基金会发行的开放源代码 X Window 系统实现中的 X 服务。 &xorg; 基于 &xfree86 4.4RC2 和 X11R6.6 的代码。 - X.Org 基金会在 2004 年 4 月发行了 X11R6.7, 并在 2005 年 2 月发布了 - X11R6.8.2, 后者是可以从目前的 &os; Ports Collection 中获得的版本。 + 从 &os; Ports 套件可以安装 &xorg; + 的 &xorg.version; 版本。 如果需要从 Ports Collection 编译和安装 &xorg; &prompt.root; cd /usr/ports/x11/xorg &prompt.root; make install clean 要完整地编译 &xorg; 则需要至少 4 GB 的剩余磁盘空间。 - 如果想从 Ports Collection 中编译和安装 &xfree86; - - &prompt.root; cd /usr/ports/x11/XFree86-4 -&prompt.root; make install clean - 另外 X11 也可以直接从 package 来安装。 我们提供了可以与 &man.pkg.add.1; 工具配合使用的 X11 安装包。 如果从远程下载并安装时, &man.pkg.add.1; 请不要指定版本号。 &man.pkg.add.1; 会自动地下载最新版本的安装包。 想要从 package 安装 &xorg;, 简单地输入下面的命令: &prompt.root; pkg_add -r xorg - &xfree86; 4.X 也可以用类似的办法安装: - - &prompt.root; pkg_add -r XFree86 - 上面的例子介绍了如何安装完整的 X11 软件包, 包括服务器端,客户端,字体等等。 此外, 也有一些单独的 X11 的 ports 和 packages. 这一章余下的部分将会讲解如何配置 X11, 以及如何设置一个高效的桌面环境。 - - - 从 <application>&xfree86;</application> 转移到 - <application>&xorg;</application> - - 任何 port 都一样,您应该检查 - /usr/ports/UPDATING 文件看看有哪些改变。 - 这个文件中包含了把您的系统从 - &xfree86; 转换到 - &xorg; 的说明。 - - 在尝试任何转换之前请使用 CVSup - 来更新您的 ports tree。在转换您的 X11 安装前您还需要安装 sysutils/portupgrade - - /etc/make.conf 中您需要添加变量 - X_WINDOW_SYSTEM=xorg。 - 这样做确保您的系统知道正在使用哪种 X11。 - 旧的 XFREE86_VERSION 变量已经过时并被 - X_WINDOW_SYSTEM 变量所取代。 - - 然后,使用下面的命令: - - &prompt.root; pkg_delete -f /var/db/pkg/imake-4* /var/db/pkg/XFree86-* -&prompt.root; cd /usr/ports/x11/xorg -&prompt.root; make install clean -&prompt.root; pkgdb -F - - &man.pkgdb.1; 命令是 - portupgrade 软件的一部分, - 会更新各种软件包的依赖关系。 - - - 要联编完整的 &xorg;, - 请确保至少有 4 GB 的剩余磁盘空间。 - - Christopher Shumway Contributed by 配置 X11 - &xfree86; 4.X - &xfree86; &xorg; X11 开始之前 在配置 X11 之前, 您需要了解所安装的系统的下列信息: 显示器规格 显示卡的芯片类型 显示卡的显存容量 水平刷新率 垂直刷新率 显示器的规格被 X11 用来决定显示的分辨率和刷新率。 这些规格通常可以从显示器所带的文档中, 以及制造商的网站找到。 需要知道两个数字范围: 垂直刷新率和水平刷新率。 显示卡的芯片类型将决定 X11 使用什么模块来驱动图形硬件。 绝大多数的硬件都能被自动检测, 但是了解它在自动检测出错的时候还是很有用处的。 显示卡的显存大小决定了系统支持的分辨率和颜色深度。 了解这些限制非常重要。 - 配置 X11 配置 X11 需要几步。 第一步是以超级用户的身份建立初始的配置文件: &prompt.root; Xorg -configure - 在使用 &xfree86; - 的情况下键入: - - &prompt.root; XFree86 -configure - 这会在 /root 中生成一个叫做 xorg.conf.new 的配置文件 (无论您使用 &man.su.1; 或直接登录, 都会改变默认的 $HOME 目录变量)。 - 对于 &xfree86; 来说, - 配置文件的名字是 XF86Config.new。 X11 程序将尝试探测系统中的图形硬件,并将探测到的硬件信息写入配置文件, 以便加载正确的驱动程序。 下一步是测试现存的配置文件, 以确认 &xorg; 能够同系统上的图形设备正常工作。 要完成这个任务,只需: &prompt.root; Xorg -config xorg.conf.new - &xfree86; 用户应: - - &prompt.root; XFree86 -xf86config XF86Config.new - - 如果用户看到一个黑灰的格子和一个 X 形的鼠标指针,那么配置就是成功 - 的。要退出测试,只要同时键入 + 如果用户看到一个黑灰的格子和一个 X 形的鼠标指针,那么配置就是成功的。 + 要退出测试, 只要同时按下 Ctrl Alt Backspace 如果鼠标工作不正常, 则需要先配置它。 参见 &os; 安装一张中的 X11 调优 - 接下来是调整 xorg.conf.new (或 XF86Config.new, 如果运行 &xfree86; 的话) + 接下来是调整 xorg.conf.new 配置文件并作测试。 用文本编辑器如 &man.emacs.1; 或 &man.ee.1; 打开这个文件。 要做的第一件事是为当前系统的显示器设置刷新率。 这些值包括垂直和水平的同步频率。 把它们加到 xorg.conf.new"Monitor" 小节中: Section "Monitor" Identifier "Monitor0" VendorName "Monitor Vendor" ModelName "Monitor Model" HorizSync 30-107 VertRefresh 48-120 EndSection HorizSyncVertRefresh 在配置文件中可能没有。 如果是这样的话, 就需要添加它们, 并在 HorizSync 以及 VertRefresh 后面设置合适的数值。 在上面的例子中, 给出了相应的显示其的参数。 X 能够利用显示器所支持的 DPMS (能源之星) 功能。 &man.xset.1; 程序可以控制超时时间, 并强制待机、挂起或关机。 如果希望启用显示器的 DPMS 功能, 则需要把下面的设置添加到 monitor 节中: Option "DPMS" xorg.conf - - XF86Config - - 关闭 xorg.conf.new (或 XF86Config.new) + 关闭 xorg.conf.new 之前还应该选择默认的分辨率和色深。 这是在 "Screen" 小节中定义的: Section "Screen" Identifier "Screen0" Device "Card0" Monitor "Monitor0" DefaultDepth 24 SubSection "Display" Viewport 0 0 Depth 24 Modes "1024x768" EndSubSection EndSection DefaultDepth 关键字描述了要运行的默认色深。 - 这可以通过 &man.Xorg.1; (或 &man.XFree86.1;) 的 + 这可以通过 &man.Xorg.1; 的 命令行开关来替代配置文件中的设置。 Modes 关键字描述了给定颜色深度下屏幕的分辨率。 需要说明的是, 目标系统的图形硬件只支持由 VESA 定义的标准模式。 前面的例子中, 默认色深是使用 24位色。 在采用这个色深时, 允许的分辨率是 1024x768。 最后就是将配置文件存盘, 并使用前面介绍的测试模式测试一下。 在发现并解决问题的过程中可以帮助您的工具之一就是 X11 的日志文件,包含了与 X11 服务器相关的每个设备的信息。 &xorg; 日志的文件名是 - /var/log/Xorg.0.log 这样的格式 - (&xfree86; 日志文件名是 - XFree86.0.log 这样的格式)。日志的准确的名字 - 可以从 Xorg.0.log 到 + /var/log/Xorg.0.log 这样的格式。 + 实际的日志文件名可能是 Xorg.0.logXorg.8.log 等等。 如果一切准备停当, 就可以把配置文件放到公共的目录中了。 - 您可以在 &man.Xorg.1; (或 &man.XFree86.1;) 里面找到具体位置。 + 您可以在 &man.Xorg.1; 里面找到具体位置。 这个位置通常是 /etc/X11/xorg.conf 或 - /usr/X11R6/etc/X11/xorg.conf (对于 - &xfree86; 它应该是 - /etc/X11/XF86Config 或 - /usr/X11R6/etc/X11/XF86Config)。 + /usr/X11R6/etc/X11/xorg.conf &prompt.root; cp xorg.conf.new /etc/X11/xorg.conf - For &xfree86;: - - &prompt.root; cp XF86Config.new /etc/X11/XF86Config - - 现在已经完成了 X11 的配置全过程。 为了使用 &man.startx.1; 来启动 - &xfree86; 4.X 需要安装 - x11/wrapper port。 - &xorg; 已经包含了 wrapper 代码, - 因此并不需要安装 wrapper port。 - X11 服务器也可以用 + 现在已经完成了 X11 的配置全过程。 &xorg; + 可以通过 &man.startx.1; 工具来启动。 + 除此之外, X11 服务器也可以用 &man.xdm.1; 来启动。 - 有一个图形配置工具, - &man.xorgcfg.1; (对于 &xfree86; 来说, 是 &man.xf86cfg.1;), - 随 X11 软件包一同安装。 它可以通过选择合适的驱动和设置交互式地定义配置。 + 有一个图形配置工具 + &man.xorgcfg.1;, 会随 X11 软件包一同安装。 + 它可以通过选择合适的驱动和设置交互式地定义配置。 这个程序可以从控制台通过命令 xorgcfg -textmode 来直接启动。 - 与了解详情, 请参考 &man.xorgcfg.1; 和 &man.xf86cfg.1; 的联机手册。 + 欲了解详情, 请参考 &man.xorgcfg.1; 的联机手册。 另外还有一个叫做 &man.xorgconfig.1; 的文本界面配置工具 - (对于 &xfree86; 是 &man.xf86config.1;), - 这是一个控制台工具因此对用户显得不太友好, + 这是一个控制台工具, 对用户而言不太友好, 不过当其他工具无法工作时, 它仍然可能可以使用。 高级配置主题 配置 &intel; i810 显示芯片组 Intel i810 显示芯片 配置Intel i810芯片组的显示卡需要有针对 X11 的能够用来驱动显示卡的 agpgart AGP程序接口。 请参见 &man.agp.4; 驱动程序的联机手册了解更多细节。 这也适用于其他的图形卡硬件配置。 注意如果系统没有将 &man.agp.4; 驱动程序编译进内核,尝试用 &man.kldload.8; 加载模块是无效的。 这个驱动程序必须编译进内核或者使用 /boot/loader.conf 在启动时加载进入内核。 - - 如果您正在使用 &xfree86; 4.1.0 (或者以后的 - 版本) 并且出现了像 fbPictureInit 这样未解决的符号提示, - 试着在 X11 配置文件里的 - Driver "i810" 一行后面加入下面这行: - Option "NoDDC" 添加宽屏平板显示器 widescreen flatpanel configuration 这一节假定您了解一些关于高级配置的知识。 如果使用前面的标准配置工具不能产生可用的配置, 则在日志文件中提供的信息应该足以修正配置使其正确工作。 如果需要的话, 您应使用一个文本编辑器来完成这项工作。 目前的宽屏 (WSXGA、 WSXGA+、 WUXGA、 WXGA、 WXGA+, 等等) 支持 16:10 和 10:9 或一些支持可能有问题的显示比例。 常见的一些 16:10 比例的分辨率包括: 2560x1600 1920x1200 1680x1050 1440x900 1280x800 未来, 将可以很容易地把这些分辨率作为 Section "Screen" 中的 Mode, 类似下面这样: Section "Screen" Identifier "Screen0" Device "Card0" Monitor "Monitor0" DefaultDepth 24 SubSection "Display" Viewport 0 0 Depth 24 Modes "1680x1050" EndSubSection EndSection &xorg; 能够自动地通过 I2C/DDC 信息来自动获取宽屏显示器的分辨率信息, 并处理显示器支持的频率和分辨率。 如果驱动程序没有对应的 ModeLines, 就需要给 &xorg; 一些提示了。 使用 /var/log/Xorg.0.log 能够提取足够的信息, 就可以写一个可用的 ModeLine 了。 这类信息如下所示: (II) MGA(0): Supported additional Video Mode: (II) MGA(0): clock: 146.2 MHz Image Size: 433 x 271 mm (II) MGA(0): h_active: 1680 h_sync: 1784 h_sync_end 1960 h_blank_end 2240 h_border: 0 (II) MGA(0): v_active: 1050 v_sync: 1053 v_sync_end 1059 v_blanking: 1089 v_border: 0 (II) MGA(0): Ranges: V min: 48 V max: 85 Hz, H min: 30 H max: 94 kHz, PixClock max 170 MHz 这些信息称做 EDID 信息。 从中建立 ModeLine 只是把这些数据重新排列顺序而已: ModeLine <name> <clock> <4 horiz. timings> <4 vert. timings> 如此, 本例中的 Section "Monitor" 中的 ModeLine 应类似下面的形式: Section "Monitor" Identifier "Monitor1" VendorName "Bigname" ModelName "BestModel" ModeLine "1680x1050" 146.2 1680 1784 1960 2240 1050 1053 1059 1089 Option "DPMS" EndSection 经过简单的编辑步骤之后, X 就可以在您的宽屏显示器上启动了。 Murray Stokely 供稿 在 X11 中使用字体 Type1 字体 X11 使用的默认字体不是很理想。 大型的字体显得参差不齐,看起来很不专业, 并且, 在 &netscape; 中, 小字体简直无法看清。 有好几种免费、 高质量的字体可以很方便地用在 X11 中。 例如,URW字体集合 (x11-fonts/urwfonts) 就包括了高质量的 标准 type1 字体 (Times Roman, HelveticaPalatino 和其他一些)。 在 Freefont 集合中 (x11-fonts/freefonts) 也包括更多的字体, 但它们中的绝大部分使用在图形软件中,如 Gimp,在屏幕字体中使用并不完美。另外, 只要花很少的功夫,可以将 &xfree86; 配置成能使用 &truetype; 字体:请参见后面的 &truetype; 字体一节。 要安装上面的Type1字体,您只需要运行下面的命令: &prompt.root; cd /usr/ports/x11-fonts/urwfonts &prompt.root; make install clean freefont 或其他的字库和上面所说的大体类似。 为了让 X 服务器能够检测到这些字体, 需要在 - X 服务器的配置文件 /etc/X11/ - (&xorg;xorg.conf 而 - &xfree86; 则是 XF86Config) + X 服务器的配置文件 (/etc/X11/xorg.conf) 中增加下面的配置: FontPath "/usr/X11R6/lib/X11/fonts/URW/" 或者,也可以在命令行运行: &prompt.user; xset fp+ /usr/X11R6/lib/X11/fonts/URW &prompt.user; xset fp rehash 这样会起作用,但是当 X 会话结束后就会丢失, 除非它被添加到启动文件 (~/.xinitrc 中, 针对一个寻常的 startx 会话,或者当您通过一个类似 XDM 的图形登录管理器登录时添加到 ~/.xsession 中)。 第三种方法是使用新的 /usr/X11R6/etc/fonts/local.conf 文件: 查看 anti-aliasing 章节。 &truetype; 字体 - TrueType Fonts - fonts + TrueType 字体 + fonts (字体) TrueType - &xfree86; 4.X 和 - &xorg; 都已经内建了对 + &xorg; 已经内建了对 &truetype; 字体的支持。有两个不同的模块能够启用这个功能。 在这个例子中使用 freetype 这个模块,因为它与其他的字体描绘后端 是兼容的。要启用 freetype 模块,只需要将下面这行添加到 - /etc/X11/XF86Config 文件的 + /etc/X11/xorg.conf 文件的 "Module" 部分。 Load "freetype" - 对于 &xfree86; 3.3.X,需要额外的 - &truetype; 字体服务器。 - Xfstt 通常被用于这个目的。 - 要安装 Xfstt, - 只要简单的安装 port - x11-servers/Xfstt. - 现在,为 &truetype; 字体创建一个目录 (比如, /usr/X11R6/lib/X11/fonts/TrueType) 然后把所有的 &truetype; 字体复制到这个目录。记住您不能直接从 &macintosh; 计算机中提取 &truetype; 字体; 能被 X11 使用的必须是 &unix;/&ms-dos;/&windows; 格式的。 一旦您已经将这些文件复制到了这个目录, 就可以用 ttmkfdir 来创建 fonts.dir 文件, 以便让X字体引擎知道您已经安装了这些新文件。 ttmkfdir 可以在 FreeBSD Ports Collection x11-fonts/ttmkfdir 中找到。 &prompt.root; cd /usr/X11R6/lib/X11/fonts/TrueType &prompt.root; ttmkfdir > fonts.dir 现在把 &truetype; 字体目录添加到字体路径中。 这和上面 Type1 字体的步骤是一样的, 那就是,使用 &prompt.user; xset fp+ /usr/X11R6/lib/X11/fonts/TrueType &prompt.user; xset fp rehash 或者把 FontPath 这行加到 - xorg.conf (或 XF86Config) 文件中。 + xorg.conf 文件中。 就是这样。现在 &netscape;, Gimp, &staroffice; 和其他所有的 X 应用程序 应该可以认出安装的 &truetype; 字体。一些很小的字体(如在 Web 页面上高分辨率显示的文本) 和一些很大的字体(在 &staroffice; 下) 现在看起来已经很好了。 Joe Marcus Clarke Updated by Anti-Aliased 字体 anti-aliased fonts fonts anti-aliased X11 从 &xfree86; 4.0.2 开始支持字体的反走样。 但是, 字体配置在 &xfree86; 4.3.0 之前是非常繁琐的。 从 &xfree86; 4.3.0 开始, 对于所有支持 Xft 的应用程序, 所有放到 X11 /usr/X11R6/lib/X11/fonts/~/.fonts/ 中的字体都自动地被加入反走样支持。 并不是所有的应用程序都支持 Xft, 但已经有相当多的程序提供 Xft 支持了。 支持 Xft 的应用程序包括 Qt 2.3 以及更高版本 (用以开发 KDE 桌面的工具包)、 GTK+ 2.0 和更高版本 (用于开发 GNOME 桌面的工具包), 以及 Mozilla 1.2 和更高版本。 要控制哪些字体是 anti-aliased,或者配置 anti-aliased 特性, 创建(或者编辑,如果文件已经存在的话)文件 /usr/X11R6/etc/fonts/local.conf。Xft 字体系统的几个 高级特性都可以使用这个文件来调节; 这一部分只描述几种最简单的情况。要了解更多的细节,请查看 &man.fonts-conf.5;. XML 这个文件一定是 XML 格式的。注意确保所有的标签都完全的关闭掉。 这个文件以一个很普通的 XML 头开始, 后跟一个 DOCTYPE 定义, 接下来是 <fontconfig> 标签: <?xml version="1.0"?> <!DOCTYPE fontconfig SYSTEM "fonts.dtd"> <fontconfig> 像前面所做的那样,在 /usr/X11R6/lib/X11/fonts/~/.fonts/ 目录下的所有字体已经可以被支持 Xft 的 应用程序使用了。如果您想添加这两个目录以外的其他路径, 简单的添加下面这行到 /usr/X11R6/etc/fonts/local.conf文件中: <dir>/path/to/my/fonts</dir> 添加了新的字体,尤其是添加了新的字体目录后, 您应该运行下面的命令重建字体缓存: &prompt.root; fc-cache -f Anti-aliasing 会让字体边缘有些模糊,这样增加了非常小的文本的可读性, 并从大文本字体中删除 锯齿。 但如果使用普通的文本, 则可能引起眼疲劳。 要禁止 14磅 以下字体的反走样, 需要增加如下配置: <match target="font"> <test name="size" compare="less"> <double>14</double> </test> <edit name="antialias" mode="assign"> <bool>false</bool> </edit> </match> <match target="font"> <test name="pixelsize" compare="less" qual="any"> <double>14</double> </test> <edit mode="assign" name="antialias"> <bool>false</bool> </edit> </match> fonts spacing 用 anti-aliasing 来间隔一些等宽字体也是不适当的。 这似乎是 KDE 的一个问题。 要修复这个问题需要确保每个字体之间的间距保持在100。 加入下面这些行: <match target="pattern" name="family"> <test qual="any" name="family"> <string>fixed</string> </test> <edit name="family" mode="assign"> <string>mono</string> </edit> </match> <match target="pattern" name="family"> <test qual="any" name="family"> <string>console</string> </test> <edit name="family" mode="assign"> <string>mono</string> </edit> </match> (这里把其他普通的修复的字体作为 "mono"),然后加入: <match target="pattern" name="family"> <test qual="any" name="family"> <string>mono</string> </test> <edit name="spacing" mode="assign"> <int>100</int> </edit> </match> 某些字体,比如 Helvetica,当 anti-aliased 的时候可能存在问题。 通常的表现为字体本身似乎被垂直的切成两半。 糟糕的时候,还可能导致应用程序比如 Mozilla 崩溃。 为了避免这样的现象,考虑添加下面几行到 local.conf文件里面: <match target="pattern" name="family"> <test qual="any" name="family"> <string>Helvetica</string> </test> <edit name="family" mode="assign"> <string>sans-serif</string> </edit> </match> 一旦您完成对 local.conf 文件的编辑,确保您使用了 </fontconfig> 标签来结束文件。 不这样做将会导致您的更改被忽略。 X11 默认的字库当使用反走样时会比较难看。 更好的字库可以在 x11-fonts/bitstream-vera port 中找到。 这个 port 会创建一个 /usr/X11R6/etc/fonts/local.conf 文件, 如果这个文件不存在的话。 反之, port 将创建 /usr/X11R6/etc/fonts/local.conf-vera 文件。 将其内容合并到 /usr/X11R6/etc/fonts/local.conf 中, 则 Bitstream 字体将自动地代替默认的 X11 Serif, Sans Serif, 以及单倍距字体。 最后,用户可以通过他们个人的 .fonts.conf 文件来添加自己的设定。 要完成此项工作, 用户只需简单地创建 ~/.fonts.conf 并添加相关配置。 此文件也必须是 XML 格式的。 LCD screen Fonts LCD screen 最后:对于LCD屏幕, 可能希望使用子像素的取样。 简单而言, 这是通过分别控制 (水平方向分开的) 红、绿、蓝 像素, 来改善水平分辨率; 这样做的效果一般会非常明显。 要启用它, 只需在 local.conf 文件的某个地方加入: <match target="font"> <test qual="all" name="rgba"> <const>unknown</const> </test> <edit name="rgba" mode="assign"> <const>rgb</const> </edit> </match> 随您显示器的种类不同, 可能需要把 rgb 改为 bgrvrgbvbgr: 试验一下看看那个更好。 Mozilla disabling anti-aliased fonts (禁用反锯齿字体) 在下次启动 X server 时, 反锯齿 (anti-aliasing) 功能就启用了。 不过, 应用程序必须了解如何使用它, 才能因此而受益。 目前 Qt 工具包已经对其提供了全面支持, 因此整个 KDE 环境都能使用反锯齿字体。 GTK+ 和 GNOME 也可以通过 Font capplet 来使用反锯齿功能 (进一步细节请参见 )。 默认情况下, Mozilla 1.2 及更高版本有能力自动使用反锯齿。 要禁用这一特性, 则需要使用指定 -DWITHOUT_XFT 并重新联编 Mozilla Seth Kingsley Contributed by X 显示管理器 概要 X Display Manager X 显示管理器(XDM) 是一个X视窗系统用于进行登录会话管理的可选项。 这个可以应用于多种情况下,包括小 X Terminals, 桌面,大网络显示服务器。既然 X 视窗系统不受网络和协议的限制, 那对于通过网络连接起来的运行 X 客户端和服务器端的不同机器, 就会有很多的可配置项。 XDM 提供了一个选择要连接到哪个显示服务器的图形接口, 只要键入如登录用户名和密码这样的验证信息。 您也可以把 XDM 想象成与 &man.getty.8 工具一样(see for details)。为用户提供了同样功能。它可以完成系统的登录任务, 然后为用户运行一个会话管理器 (通常是一个 X 视窗管理器)。接下来 XDM 就等待这个程序退出,发出信号用户已经登录完成,应当退出屏幕。 这时, XDM 就可以为下一个登录用户显示登录和可选择屏幕。 使用 XDM XDM 精灵程序在 /usr/X11R6/bin/xdm 中。您可以在任何时候 用 root 来运行这个程序, 在本地机器上,它将启动管理X的画面。如果要 XDM 每次机器一启动就开始运行, 一个简单的办法是在 /etc/ttys 中加入一个记录。 有关这个文件的更多的格式和使用方法,可以看看 。在默认的 /etc/ttys 文件中用于运行 XDM 守护程序的一行是这样的: ttyv8 "/usr/X11R6/bin/xdm -nodaemon" xterm off secure 默认情况下,这个记录是关闭的,要启用它, 您需要把第5部分的 off 改为 on 然后按照 的指导 重新启动 &man.init.8;。第一部分,这个程序将管理的终端名称是 ttyv8。这意味着 XDM 将运行在第9个虚拟终端上。 配置 XDM XDM 的配置目录是在 /usr/X11R6/lib/X11/xdm中。在这个目录中, 您会看到几个用来改变 XDM 行为和外观的文件。您会找到这些文件: 文件 描述 Xaccess 客户端授权规则。 Xresources 默认的X资源值。 Xservers 远程和本地显示管理列表。 Xsession 用于登录的默认的会话脚本。 Xsetup_* 登录之前用于加载应用程序的脚本。 xdm-config 运行在这台机器上的所有显示的全局配置。 xdm-errors 服务器程序产生的错误。 xdm-pid 当前运行的 XDM 的进程 ID。 XDM 运行时, 在这个目录中有几个脚本和程序可以用来设置桌面。 这些文件中的每一个的用法都将被简要地描述。 这些文件的更详细的语法和用法在 &man.xdm.1; 中将有详细描述。 默认的配置是一个矩形的登录窗口,上面有机器的名称, Login:Password:。如果您想设计您自己个性化的 XDM 屏幕,这是一个很好的起点。 Xaccess 用以连接由 XDM 所控制的显示设备的协议, 叫做 X 显示管理器连接协议 (XDMCP)。 这个文件是一组用以控制来自远程计算机的 XDMCP 连接的规则。 除非您修改 xdm-config 使其接受远程连接, 否则其内容将被忽略。 默认情况下, 它不允许来自任何客户端的连接。 Xresources 这是一个默认的用来显示选项和登录屏幕的应用程序文件。这 就是您能够定制登录程序的外观的地方。这个格式与 X11 文档中描述的默认应用 程序文件是一样的。 Xservers 这是一个选择者应当提供的作为可选的远程显示列表。 Xsession 这是一个用户登录后针对 XDM 的默认会话脚本。通常,在 ~/.xsession 中每个用户将有一个可定制的会话脚本。 Xsetup_* 在显示选择者或登录接口之前,这些将被自动运行。 这是一个每个显示都要用到的脚本,叫做 Xsetup_, 后面会跟一个本地显示的数字(比如 Xsetup_0)。典型的,这些脚本将在后台 (如 xconsole)运行一个或两个程序。 xdm-config 此文件以应用程序默认值的形式, 提供了在安装时所使用的普适的显示设置。 xdm-errors 这个文件包含了 XDM 正设法运行的的 X 服务器 的输出。 如果 XDM 正设法运行的显示由于某种原因被挂起, 那这是一个寻找错误信息的好地方。 这些信息会在每一个会话的基础上被写到用户的 ~/.xsession-errors 文件中。 运行一个网络显示服务器 对于其他客户端来说,为了连接到显示服务器,您将必须编辑访问控制规则, 然后启用连接侦听。默认的这些被设置成比较保守的值。 要让XDM能侦听连接,先要在 xdm-config 文件中注释掉一行: ! SECURITY: do not listen for XDMCP or Chooser requests ! Comment out this line if you want to manage X terminals with xdm DisplayManager.requestPort: 0 然后重新启动XDM。 记住默认应用程序文件的注释以! 字母开始,不是#。 您需要设置严格的访问控制。看看在 Xaccess文件中的实例记录,可以参考 &man.xdm.1; 的联机手册。 替换 XDM 有几个替换默认 XDM程序的方案。 其中之一是 上一节已经描述过的kdm (与 KDE捆绑在一起)。 kdm 提供了许多视觉上的改进和局部的修饰, 同样能让用户在启动时能选择他们喜欢的窗口管理器。 Valentino Vaschetto Contributed by 桌面环境 这节描述了 FreeBSD 上用于 X 的不同桌面环境。 桌面环境 可能仅仅是一个简单的窗口管理器, 也可能是一个像 KDE 或者 GNOME这样的完整桌面应用程序套件。 GNOME 有关 GNOME GNOME GNOME 是一个用户界面友好的桌面环境, 能够使用户很容易地使用和配置他们的计算机。 GNOME 包括一个面板(用来启动应用程序和显示状态), 一个桌面(存放数据和应用程序的地方), 一套标准的桌面工具和应用程序, 和一套与其他人相互协同工作的协议集。 其他操作系统的用户在使用 GNOME提供的强大的图形驱动环境时会觉得很好。 更多的关于 FreeBSD 上 GNOME 的信息 可以在 FreeBSD GNOME Project 的网站上找到。 此外, 这个网站也提供了相当详尽的关于安装、 配置和管理 GNOME 的常见问题解答 (FAQ)。 安装 GNOME 安装 GNOME的最简单的方法是 第 2 章描述的在FreeBSD安装过程中通过 Desktop Configuration菜单来进行。 它们也可以很容易地从一个package或Ports Collection安装: 要从网络安装GNOME, 只要键入: &prompt.root; pkg_add -r gnome2 从源代码编译GNOME,可以使用 ports树: &prompt.root; cd /usr/ports/x11/gnome2 &prompt.root; make install clean 一旦装好了 GNOME, 就必须告诉 X server 启动 GNOME 而不是默认的窗口管理器。 最简单的启动 GNOME 的方法是使用 GDM, GNOME 显示管理器。 随 GNOME 桌面一同安装的 GDM (但默认是禁用的), 可以通过在 /etc/rc.conf 中加入 gdm_enable="YES" 来启用。 这样在重新启动的时候, GNOME 就会在登录时自动启动 — 除此之外不需要进一步设置了。 GNOME 也可以通过适当地配置名为 .xinitrc 的文件来启动。 如果已经有了自定义的 .xinitrc, 将启动当前窗口管理器的那一行改为启动 /usr/X11R6/bin/gnome-session 就可以了。 如果还没有, 那么只需简单地: &prompt.user; echo "/usr/X11R6/bin/gnome-session" > ~/.xinitrc 接下来输入 startxGNOME 桌面环境就启动了。 如果之前使用了一些旧式的显示管理器, 例如 XDM, 则这样做是没用的。 此时应建立一个可执行的 .xsession 文件, 其中包含同样的命令。 要完成这项工作, 需要用 /usr/X11R6/bin/gnome-session 取代现有的窗口管理器: &prompt.user; echo "#!/bin/sh" > ~/.xsession &prompt.user; echo "/usr/X11R6/bin/gnome-session" >> ~/.xsession &prompt.user; chmod +x ~/.xsession 还有一种做法, 是配置显示管理器, 以便在登录时提示您选择窗口管理器; 在 KDE 细节 环节中介绍了关于如何为 kdmKDE 的显示管理器)进行这样的配置。 在GNOME上使用Anti-aliased字体 GNOME anti-aliased fonts X11 通过RENDER扩展来支持 anti-aliasing。 GTK+ 2.0 以及更高的版本(被 GNOME使用的工具包)可以使用这个功能。 配置 anti-aliasing 在 描述。所以,使用最近的软件, anti-aliasing 可以应用在 GNOME桌面环境中。只需要依次选择 应用程序 桌面首选项 字体,然后选上 最佳形状最佳对比度,或者 像素圆滑(LCD)。对于 GTK+ 应用程序,它们不是 GNOME 桌面的一部分,在启动程序前需要设置 环境变量GDK_USE_XFT的值为 1 KDE KDE 有关 KDE KDE 是一个容易使用的现代桌面环境。 KDE 有很多很好的特性: 一个美丽的现代的桌面。 一个集合了完美网络环境的桌面。 一个集成的帮助系统,能够方便、高效地帮助您使用 KDE 桌面和它的应用程序。 所有的KDE应用程序具有一致的所见即所得界面。 标准的菜单和工具栏,键盘布局,颜色配置等。 国际化:KDE 可以使用超过40种语言。 集中的一致化的桌面驱动配置。 许多有用的 KDE应用程序。 KDE 附带了一个名为 Konqueror 的 web 浏览器, 它是其他运行于 &unix; 系统上的 web 浏览器的一个强大的竞争对手。 要了解关于 KDE 的更多详情, 可以访问 KDE 网站。 与 FreeBSD 相关的 KDE 信息和资源, 可以在 FreeBSD-KDE 团队 的网站找到。 安装 KDE GNOME 或其他桌面环境一样,安装 KDE 的最容易的方法是通过 第 2 章所描绘的 FreeBSD 安装过程的 Desktop Configuration 菜单来安装。 另外,它也可以很容易地从packages或Ports Collection安装: 要从网络安装 KDE 只需要: &prompt.root; pkg_add -r kde &man.pkg.add.1; 就会自动的下载最新版本的应用程序。 要从源代码编译 KDE, 可以使用 ports 树: &prompt.root; cd /usr/ports/x11/kde3 &prompt.root; make install clean KDE 安装完成后, X server必须被告知启动这个应用程序以代替默认的窗口管理器。 这可以通过编辑 .xinitrc 文件来完成: &prompt.user; echo "exec startkde" > ~/.xinitrc 现在,无论您什么时候用 startx进入 X 视窗系统, KDE 就将成为您的桌面环境。 如果使用一个像 XDM这样的显示管理器, 那配置文件可能有点不同。需要编辑一个 .xsession 文件,有关 kdm 的用法会在这章的后面介绍。 有关 KDE 的更多细节 现在 KDE 已经被安装在系统中了。 通过帮助页面或点击多个菜单可以发现很多东西。 &windows; 或 &mac; 用户会有回到家的感觉。 有关 KDE 的最好的参考资料是 它的在线文档。KDE 拥有它自己的 web 浏览器 Konqueror, 还有很多其他的应用程序和丰富文档。 这节的余下部分将讨论一些很难用走马观花的方法来学习的技术项目。 KDE 显示管理器 KDE display manager 如果在同一系统上有多个用户, 则管理员通常会希望使用图形化的登录界面。 前面已经提到, 使用 XDM 可以完成这项工作。 不过, KDE 本身也提供了另一个选择, 即 kdm, 它的外观更富吸引力, 而且提供了更多的登录选项。 值得一提的是, 用户还能通过菜单很容易地选择希望使用的桌面环境 (KDEGNOME 或其它)。 要启用 kdm, 需要修改 /etc/ttys 中的 ttyv8 项。 将其改为类似下面的样子: ttyv8 "/usr/local/bin/kdm -nodaemon" xterm on secure XFce 有关XFce XFce是以被GNOME 使用的 GTK+ 工具包为基础的桌面环境, 但是更加轻巧,适合于那些需要一个易于使用和配置并且简单而高效的桌面的人。 看起来,它非常像使用在商业&unix;系统上的 CDE环境。 XFce的主要特性有下面这些: 一个简单,易于使用的桌面。 完全通过鼠标的拖动和按键来控制等。 CDE 相似的主面板,菜单,applets和应用launchers。 集成的窗口管理器,文件管理器,声音管理器, GNOME应用模块,和其他一些。 可配置界面的主题。(因为它使用GTK+) 快速,轻便,高效:对于比较老的/旧的机器或带有很少内存的机器仍然很理想。 更多有关XFce 的信息可以参考XFce 网站 安装XFce 有一个二进制的XFce 软件包存在(在写作的时候)。要安装的话,执行下面的命令: &prompt.root; pkg_add -r xfce4 另外,要从源代码建立,使用Ports Collection: &prompt.root; cd /usr/ports/x11-wm/xfce4 &prompt.root; make install clean 现在,要告诉X服务器在下次X启动时执行 XFce。 只要执行下面的命令: &prompt.user; echo "/usr/X11R6/bin/startxfce4" > ~/.xinitrc 接下来就是启动 X, XFce将成为您的桌面。 与以前一样,如果使用像 XDM 这样的显示管理器,需要创建一个 .xsession文件,就像有关 GNOME 的那节描述的, 使用/usr/X11R6/bin/startxfce4 命令,或者,配置显示管理器允许在启动时选择一个桌面, 就像有关kdm的那节描述的。