aboutsummaryrefslogtreecommitdiff
path: root/zh_CN.GB2312/books/handbook/advanced-networking
diff options
context:
space:
mode:
authorFukang Chen <loader@FreeBSD.org>2007-08-09 15:40:40 +0000
committerFukang Chen <loader@FreeBSD.org>2007-08-09 15:40:40 +0000
commit9ff15e34ef9aeacbcf009cd1003b218ab2c324fa (patch)
treeac88e44d52170a777deb2e429e45dbb47e7d9660 /zh_CN.GB2312/books/handbook/advanced-networking
parent4b9675c0a4771694619f680fad0e5220aba12134 (diff)
Notes
Diffstat (limited to 'zh_CN.GB2312/books/handbook/advanced-networking')
-rw-r--r--zh_CN.GB2312/books/handbook/advanced-networking/chapter.sgml568
1 files changed, 381 insertions, 187 deletions
diff --git a/zh_CN.GB2312/books/handbook/advanced-networking/chapter.sgml b/zh_CN.GB2312/books/handbook/advanced-networking/chapter.sgml
index e10fb18342..de06fa594b 100644
--- a/zh_CN.GB2312/books/handbook/advanced-networking/chapter.sgml
+++ b/zh_CN.GB2312/books/handbook/advanced-networking/chapter.sgml
@@ -2,7 +2,7 @@
The FreeBSD Documentation Project
The FreeBSD Chinese Documentation Project
- Original revision: 1.389
+ Original revision: 1.398
$FreeBSD$
-->
@@ -48,6 +48,11 @@
<listitem>
<para>如何配置 ATM。</para>
</listitem>
+
+ <listitem>
+ <para>如何利用 CARP, &os; 支持的
+ Common Access Redundancy Protocol (共用地址冗余协议)</para>
+ </listitem>
</itemizedlist>
<para>在读这章之前, 您应:</para>
@@ -2182,25 +2187,11 @@ rfcomm_sppd[94692]: Starting on /dev/ttyp6...</screen>
<sect1 id="network-bridging">
<sect1info>
<authorgroup>
- <author>
- <firstname>Steve</firstname>
- <surname>Peterson</surname>
- <contrib>作者:</contrib>
- </author>
- </authorgroup>
- <authorgroup>
- <author>
- <firstname>张</firstname>
- <surname>雪平</surname>
- <contrib>中文翻译:</contrib>
- <affiliation>
- <address><email>zxpmyth@yahoo.com.cn</email></address>
- </affiliation>
- </author>
- <author>
- <firstname>袁</firstname>
- <surname>苏义</surname>
- </author>
+ <author>
+ <firstname>Andrew</firstname>
+ <surname>Thompson</surname>
+ <contrib>原作 </contrib>
+ </author>
</authorgroup>
</sect1info>
<title>桥接</title>
@@ -2213,13 +2204,13 @@ rfcomm_sppd[94692]: Starting on /dev/ttyp6...</screen>
<indexterm>
<primary>桥接</primary>
</indexterm>
- <para>有时候需要将一个物理网络分成两个独立的网段,
- 而无需创建新的 IP 子网和连接两个网段的路由器。
- 以这种方式连接两个网络的设备称为<quote>网桥 (bridge)</quote>。
- 有两个网络接口的 FreeBSD 系统可以作为网桥。</para>
+ <para>有时, 会有需要将一个物理网络分成两个独立的网段,
+ 而不是创建新的 IP 子网, 并将其通过路由器相连。
+ 以这种方式连接两个网络的设备称为 <quote>网桥 (bridge)</quote>。
+ 有两个网络接口的 FreeBSD 系统可以作为网桥来使用。</para>
<para>网桥通过学习每个网络接口上的 MAC 层地址 (以太网地址) 工作。
- 只当数据包的源地址和目标地址处于不同网络时网桥才进行转发。</para>
+ 只当数据包的源地址和目标地址处于不同的网络时, 网桥才进行转发。</para>
<para>在很多方面,网桥就像一个带有很少端口的以太网交换机。</para>
</sect2>
@@ -2227,25 +2218,16 @@ rfcomm_sppd[94692]: Starting on /dev/ttyp6...</screen>
<sect2>
<title>适合桥接的情况</title>
- <para>目前,有两种常见的情况下使用网桥。</para>
+ <para>适合使用网桥的, 有许多种不同的情况。</para>
<sect3>
- <title>网段上存在高流量</title>
-
- <para>一种情况是您的物理网段流量过载,
- 但是您不希望划分子网以路由器连接两个子网。</para>
-
- <para>让我们考虑一个关于报社的例子,
- 它的编辑部和产品部处于同一子网中。
- 所有的编辑用户都使用服务器 <hostid>A</hostid>
- 的文件服务,而产品部使用服务器 <hostid>B</hostid>。
- 一个以太网将所有的用户连接在一起,
- 高的流量负载使得网络速度变慢。</para>
-
- <para>如果编辑部的用户能被分隔到一个网段中,
- 产品部用户被分隔到另一个网段中那么这两个网段可以通过网桥连接起来。
- 只当数据包目标为网桥<quote>其它</quote>端接口时,
- 它才会被传到其它的网络上——这样就减少了各个网络的拥塞。</para>
+ <title>使多个网络相互联通</title>
+
+ <para>网桥的基本操作是将两个或多个网段连接在一起。
+ 由于各式各样的原因, 人们会希望使用一台真正的计算机,
+ 而不是网络设备来充任网桥的角色, 常见的原因包括线缆的限制、
+ 需要进行防火墙, 或为虚拟机网络接口连接虚拟网络。
+ 网桥也可以将无线网卡以 hostap 模式接入有线网络。</para>
</sect3>
<sect3>
@@ -2253,12 +2235,12 @@ rfcomm_sppd[94692]: Starting on /dev/ttyp6...</screen>
<indexterm><primary>防火墙</primary></indexterm>
<indexterm><primary>NAT</primary></indexterm>
- <para>第二种常见的情况是需要防火墙的地方没有进行网络地址转换(NAT)。</para>
+ <para>使用防火墙的常见情形是无需进行路由或网络地址转换的情况 (NAT)。</para>
- <para>一个例子是一个小公司,它通过 DSL 或 ISDN 连接到 ISP。
- 它拥有 13 个 ISP 分配的全局 IP 地址和 10 台 PC。
- 在这种情况下,由于划分子网的问题,
- 使用基于路由的防火墙存在一定难度。</para>
+ <para>举例来说, 一家通过 DSL 或 ISDN 连接到 ISP 的小公司,
+ 拥有 13 个 ISP 分配的全局 IP 地址和 10 台 PC。
+ 在这种情况下, 由于划分子网的问题,
+ 采用路由来实现防火墙会比较困难。</para>
<indexterm>
<primary>路由器</primary>
@@ -2269,122 +2251,274 @@ rfcomm_sppd[94692]: Starting on /dev/ttyp6...</screen>
<indexterm>
<primary>ISDN</primary>
</indexterm>
- <para>一个基于网桥的防火墙可以成接在 DSL/ISDN
- 路由器的后面而免去了所有的 IP 号问题。</para>
+ <para>基于网桥的防火墙可以串接在 DSL/ISDN
+ 路由器的后面, 而无需考虑 IP 编制的问题。</para>
</sect3>
- </sect2>
-
- <sect2>
- <title>配置网桥</title>
<sect3>
- <title>选择网络接口卡</title>
-
- <para>一个网桥至少需要两块网卡才能运行。
- 不幸的是,并不是所有的网卡都能被用于桥接。阅读 &man.bridge.4;
- 了解所支持网卡的细节。</para>
+ <title>网络监视</title>
- <para>在继续之前要先安装并测试这两块网卡。</para>
+ <para>网桥可以用于连接两个不同的网段, 并用于监视往返的以太网帧。
+ 这可以通过在网桥接口上使用 &man.bpf.4;/&man.tcpdump.1;,
+ 或通过将全部以太网帧复制到另一个网络接口 (span 口) 来实现。</para>
</sect3>
<sect3>
- <title>改变内核配置</title>
- <indexterm>
- <primary>内核选项</primary>
- <secondary>BRIDGE</secondary>
- </indexterm>
+ <title>2层 VPN</title>
- <para>为了激活内核对桥接的支持,增加以下语句:</para>
-
- <programlisting>options BRIDGE</programlisting>
-
- <para>到您的内核配置文件里,然后重建内核。</para>
+ <para>通过 IP 连接的网桥, 可以利用 EtherIP 隧道或基于 &man.tap.4;
+ 的解决方案, 如 OpenVPN 可以将两个以太网连接到一起。</para>
</sect3>
<sect3>
- <title>防火墙支持</title>
- <indexterm><primary>防火墙</primary></indexterm>
- <para>如果您打算把网桥作为防火墙来使用,
- 则还需要加入 <literal>IPFIREWALL</literal> 的设置。
- 请参考 <xref linkend="firewalls">
- 以了解关于将网桥配置为防火墙的其它信息。</para>
+ <title>2层 冗余</title>
- <para>如果需要允许非 IP 数据包 (例如 ARP) 穿过网桥,
- 有三种方法可供选择。 第一种是在内核配置中加入下列选项,
- 并重新联编:<para>
+ <para>网络可以通过多条链路连接在一起, 并使用生成树协议 (Spanning Tree Protocol)
+ 来阻止多余的通路。 为使以太网能够正确工作, 两个设备之间应该只有一条激活通路,
+ 而生成树能够检测环路, 并将多余的链路置为阻断状态。 当激活通路断开时,
+ 协议能够计算另外一棵树, 并重新激活阻断的通路,
+ 以恢复到网络各点的连通性。</para>
+ </sect3>
+ </sect2>
- <programlisting>option IPFIREWALL_DEFAULT_TO_ACCEPT</programlisting>
+ <sect2>
+ <title>内核配置</title>
- <para>第二种方法, 是在
- <filename>rc.conf</filename> 文件中将防火墙类型设置为 <quote><literal>open</literal></quote>:</para>
+ <para>这一节主要介绍 &man.if.bridge.4; 网桥实现。
+ 除此之外, 还有一个基于 netgraph 的网桥实现, 如欲了解进一步细节,
+ 请参见联机手册 &man.ng.bridge.4;。</para>
- <programlisting>firewall_type="open"</programlisting>
+ <para>网桥驱动是一个内核模块, 并会随使用 &man.ifconfig.8;
+ 创建网桥接口时自动加载。 您也可以将 <literal>device if_bridge</literal>
+ 加入到内核配置文件中, 以便将其静态联编进内核。</para>
- <para>注意, 这些选项会让防火墙看起来像透明的一样;
- 默认情况下, 所有包或连接都会被允许。
- 如果选择这样做的话, 可能会需要对防火墙规则进行大幅调整。</para>
+ <para>包过滤可以通过使用了 &man.pfil.9; 框架的任意一种防火墙软件包来完成。
+ 这些防火墙可以以模块形式加载, 也可以静态联编进内核。</para>
- <para>第三种方法是应用下述 &man.ipfw.8;
- 规则:</para>
+ <para>通过配合
+ &man.altq.4; 和 &man.dummynet.4;, 网桥也可以用于流量控制。</para>
+ </sect2>
- <screen>&prompt.root; <userinput>ipfw add allow mac-type arp layer2</userinput></screen>
+ <sect2>
+ <title>启用网桥</title>
+
+ <para>网桥是通过接口复制来创建的。
+ 您可以使用 &man.ifconfig.8; 来创建网桥接口, 如果内核不包括网桥驱动,
+ 则它会自动将其载入。</para>
+
+ <screen>&prompt.root; <userinput>ifconfig bridge create</userinput>
+bridge0
+&prompt.root; <userinput>ifconfig bridge0</userinput>
+bridge0: flags=8802&lt;BROADCAST,SIMPLEX,MULTICAST&gt; metric 0 mtu 1500
+ ether 96:3d:4b:f1:79:7a
+ id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15
+ maxage 20 holdcnt 6 proto rstp maxaddr 100 timeout 1200
+ root id 00:00:00:00:00:00 priority 0 ifcost 0 port 0</screen>
+
+ <para>如此就建立了一个网桥接口, 并为其随机分配了以太网地址。
+ <literal>maxaddr</literal> 和 <literal>timeout</literal>
+ 参数能够控制网桥在转发表中保存多少个 MAC 地址,
+ 以及表项中主机的过期时间。 其他参数控制生成树的运转方式。</para>
+
+ <para>将成员网络接口假如网桥。 为了让网桥能够为所有网桥成员接口转发包,
+ 网桥接口和所有成员接口都需要处于启用状态:</para>
+
+ <screen>&prompt.root; <userinput>ifconfig bridge0 addm fxp0 addm fxp1 up</userinput>
+&prompt.root; <userinput>ifconfig fxp0 up</userinput>
+&prompt.root; <userinput>ifconfig fxp1 up</userinput></screen>
+
+ <para>网桥现在会在
+ <devicename>fxp0</devicename> 和
+ <devicename>fxp1</devicename> 之间转发以太网帧。
+ 等效的 <filename>/etc/rc.conf</filename> 配置如下,
+ 如此配置将在系统启动时创建同样的网桥。</para>
+
+ <programlisting>cloned_interfaces="bridge0"
+ifconfig_bridge0="addm fxp0 addm fxp1 up"
+ifconfig_fxp0="up"
+ifconfig_fxp1="up"</programlisting>
+
+ <para>如果网桥主机需要 IP 地址, 则应将其绑在网桥设备本身,
+ 而不是某个成员设备上。 这可以通过静态设置或 DHCP 来完成:</para>
+
+ <screen>&prompt.root; <userinput>ifconfig bridge0 inet 192.168.0.1/24</userinput></screen>
+
+ <para>除此之外, 也可以为网桥接口指定 IPv6 地址。</para>
+ </sect2>
- <para>或将其加入在用的防火墙规则集。 这个规则实际上是允许 &man.arp.8; 包通过,
- 因此最好把它放在规则集前面, 以便能够尽早地应用此规则, 而避免由此带来的性能影响。</para>
- </sect3>
+ <sect2>
+ <title>防火墙</title>
+ <indexterm><primary>firewall (防火墙)</primary></indexterm>
- <sect3>
- <title>数据传输支持</title>
+ <para>当启用包过滤时, 通过网桥的包可以分别在进入的网络接口、
+ 网桥接口和发出的网络接口上进行过滤。 这些阶段均可禁用。
+ 当包的流向很重要时, 最好在成员接口而非网桥接口上配置防火墙。</para>
- <para>如果您希望将网桥作为一个数据传输器,
- 您需要向内核文件中加入 <literal>DUMMYNET</literal>
- 选项。阅读 &man.dummynet.4; 以做进一步了解。</para>
- </sect3>
+ <para>网桥上可以进行许多配置以决定非 IP 及 ARP 包能否通过,
+ 以及通过 IPFW 实现二层防火墙。 请参见
+ &man.if.bridge.4; 联机手册以了解进一步的细节。</para>
</sect2>
<sect2>
- <title>激活网桥</title>
+ <title>生成树</title>
+
+ <para>网桥驱动实现了快速生成树协议 (RSTP 或 802.1w),
+ 并与较早的生成树协议 (STP) 兼容。 生成树可以用来在网络拓扑中检测并消除环路。 RSTP
+ 提供了比传统 STP 更快的生成树覆盖速度, 这种协议会在相邻的交换机之间交换信息,
+ 以迅速进入转发状态, 而不会产生环路。</para>
- <para>增加下行:</para>
+ <para>下表展示了支持的运行模式:</para>
- <programlisting>net.link.ether.bridge.enable=1</programlisting>
+ <informaltable frame="none" pgwide="1">
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry>OS 版本</entry>
+ <entry>STP 模式</entry>
+ <entry>默认模式</entry>
+ </row>
+ </thead>
- <para>到 <filename>/etc/sysctl.conf</filename> 里,
- 以便在运行时激活网桥,然后加下行:</para>
+ <tbody>
+ <row>
+ <entry>&os; 5.4&mdash;&os; 6.2</entry>
+ <entry>STP</entry>
+ <entry>STP</entry>
+ </row>
- <programlisting>net.link.ether.bridge.config=<replaceable>if1</replaceable>,<replaceable>if2</replaceable></programlisting>
+ <row>
+ <entry>&os; 6.3+</entry>
+ <entry>RSTP 或 STP</entry>
+ <entry>STP</entry>
+ </row>
- <para>以便在指定的接口上激活网桥
- (使用您的两个网络接口的名字替换 <replaceable>if1</replaceable>
- 和 <replaceable>if2</replaceable> )。如果您希望用 &man.ipfw.8;
- 来过滤桥接的数据包,您还应该加入:</para>
+ <row>
+ <entry>&os; 7.0+</entry>
+ <entry>RSTP 或 STP</entry>
+ <entry>RSTP</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
- <programlisting>net.link.ether.bridge.ipfw=1</programlisting>
+ <para>使用 <literal>stp</literal> 命令可以在成员接口上启用生成树。 对包含
+ <devicename>fxp0</devicename> 和
+ <devicename>fxp1</devicename> 的网桥,
+ 可以用下列命令启用 STP:</para>
+
+ <screen>&prompt.root; <userinput>ifconfig bridge0 stp fxp0 stp fxp1</userinput>
+bridge0: flags=8843&lt;UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST&gt; metric 0 mtu 1500
+ ether d6:cf:d5:a0:94:6d
+ id 00:01:02:4b:d4:50 priority 32768 hellotime 2 fwddelay 15
+ maxage 20 holdcnt 6 proto rstp maxaddr 100 timeout 1200
+ root id 00:01:02:4b:d4:50 priority 32768 ifcost 0 port 0
+ member: fxp0 flags=1c7&lt;LEARNING,DISCOVER,STP,AUTOEDGE,PTP,AUTOPTP&gt;
+ port 3 priority 128 path cost 200000 proto rstp
+ role designated state forwarding
+ member: fxp1 flags=1c7&lt;LEARNING,DISCOVER,STP,AUTOEDGE,PTP,AUTOPTP&gt;
+ port 4 priority 128 path cost 200000 proto rstp
+ role designated state forwarding</screen>
+
+ <para>网桥的生成树 ID 为
+ <literal>00:01:02:4b:d4:50</literal> 而优先级为
+ <literal>32768</literal>。 其中 <literal>root id</literal>
+ 与生成树相同, 表示这是作为生成树根的网桥。</para>
+
+ <para>另一个网桥也启用了生成树:</para>
+
+ <screen>bridge0: flags=8843&lt;UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST&gt; metric 0 mtu 1500
+ ether 96:3d:4b:f1:79:7a
+ id 00:13:d4:9a:06:7a priority 32768 hellotime 2 fwddelay 15
+ maxage 20 holdcnt 6 proto rstp maxaddr 100 timeout 1200
+ root id 00:01:02:4b:d4:50 priority 32768 ifcost 400000 port 4
+ member: fxp0 flags=1c7&lt;LEARNING,DISCOVER,STP,AUTOEDGE,PTP,AUTOPTP&gt;
+ port 4 priority 128 path cost 200000 proto rstp
+ role root state forwarding
+ member: fxp1 flags=1c7&lt;LEARNING,DISCOVER,STP,AUTOEDGE,PTP,AUTOPTP&gt;
+ port 5 priority 128 path cost 200000 proto rstp
+ role designated state forwarding</screen>
+
+ <para>这里的 <literal>root id 00:01:02:4b:d4:50 priority 32768
+ ifcost 400000 port 4</literal> 表示根网桥是前面的
+ <literal>00:01:02:4b:d4:50</literal>,
+ 而从此网桥出发的通路代价为 <literal>400000</literal>,
+ 此通路到根网桥是通过 <literal>port 4</literal> 即
+ <devicename>fxp0</devicename> 连接的。</para>
+ </sect2>
- <para>这样一行。</para>
+ <sect2>
+ <title>网桥的高级用法</title>
- <para>对于 &os;&nbsp;5.2-RELEASE 和更早的版本, 则应使用下面的配置:</para>
+ <sect3>
+ <title>重建流量流</title>
- <programlisting>net.link.ether.bridge=1
-net.link.ether.bridge_cfg=<replaceable>if1</replaceable>,<replaceable>if2</replaceable>
-net.link.ether.bridge_ipfw=1</programlisting>
+ <para>网桥支持监视模式, 在 &man.bpf.4; 处理之后会将包丢弃,
+ 而不是继续处理或转发。 这可以用于将两个或多个接口上的输入转化为一个
+ &man.bpf.4; 流。 在将两个独立的接口上的传输的 RX/TX 信号重整为一个时,
+ 这会非常有用。</para>
- </sect2>
+ <para>如果希望将四个网络接口上的输入转成一个流:</para>
- <sect2>
- <title>其它信息</title>
+ <screen>&prompt.root; <userinput>ifconfig bridge0 addm fxp0 addm fxp1 addm fxp2 addm fxp3 monitor up</userinput>
+&prompt.root; <userinput>tcpdump -i bridge0</userinput></screen>
+ </sect3>
- <para>如果您希望可以从网络上 &man.ssh.1; 进入网桥,
- 给一个网卡分配 IP 地址就可以了。
- 原则上给两张卡分配一个地址是很不好的。</para>
+ <sect3>
+ <title>镜像口 (Span port)</title>
+
+ <para>网桥收到的每个以太网帧都可以发到镜像口上。
+ 网桥上的镜像口数量没有限制, 如果一个接口已经被配置为镜像口,
+ 则它就不能再作为网桥的成员口来使用。
+ 这种用法主要是为与网桥镜像口相连的监听机配合使用。</para>
- <para>如果网络中有多个网桥,
- 任何两个工作站之间的路径不能多于一条。
- 技术上说,它的意思是不支持生成连接树管理。</para>
+ <para>如果希望将所有帧发到名为
+ <devicename>fxp4</devicename> 的接口上:</para>
- <para>网桥会增加 &man.ping.8; 的延迟时间,
- 尤其是不同网段之间的传输。</para>
+ <screen>&prompt.root; <userinput>ifconfig bridge0 span fxp4</userinput></screen>
+ </sect3>
+
+ <sect3>
+ <title>专用接口 (Private interface)</title>
+ <para>专用接口不会转发流量到除专用接口之外的其他端口。
+ 这些流量会无条件地阻断, 因此包括 ARP 在内的以太网帧均不会被转发。
+ 如果需要选择性地阻断流量, 则应使用防火墙。</para>
+ </sect3>
+
+ <sect3>
+ <title>自学习接口 (Sticky Interfaces)</title>
+
+ <para>如果网桥的成员接口标记为自学习, 则动态学习的地址项一旦进入转发快取缓存,
+ 即被认为是静态项。 自学习项不会从快取缓存中过期或替换掉,
+ 即使地址在另一接口上出现也是如此。 这使得不必事先发布转发表,
+ 也能根据学习结果得到静态项的有点, 但在这些网段被网桥看到的客户机,
+ 就不能漫游至另一网段了。</para>
+
+ <para>另一种用法是将网桥与 VLAN 功能连用,
+ 这样客户网络会被隔离在一边, 而不会浪费 IP 地址空间。 考虑 <hostid
+ role="Hostname">CustomerA</hostid> 在
+ <literal>vlan100</literal> 上, 而 <hostid
+ role="hostname">CustomerB</hostid> 则在
+ <literal>vlan101</literal> 上。 网桥地址为
+ <hostid role="ipaddr">192.168.0.1</hostid>, 同时作为
+ internet 路由器使用。</para>
+
+ <screen>&prompt.root; <userinput>ifconfig bridge0 addm vlan100 sticky vlan100 addm vlan101 sticky vlan101</userinput>
+&prompt.root; <userinput>ifconfig bridge0 inet 192.168.0.1/24</userinput></screen>
+
+ <para>两台客户机均将 <hostid
+ role="ipaddr">192.168.0.1</hostid> 作为默认网关,
+ 由于网桥快取缓存是自学习的, 因而它们无法伪造
+ MAC 地址来截取其他客户机的网络流量。</para>
+
+ <para>在 VLAN 之间的通讯可以通过专用接口 (或防火墙) 来阻断:</para>
+
+ <screen>&prompt.root; <userinput>ifconfig bridge0 private vlan100 private vlan101</userinput></screen>
+
+ <para>这样这些客户机就完全相互隔离了。
+ 可以使用整个的 <hostid role="netmask">/24</hostid> 地址空间,
+ 而无需划分子网。</para>
+ </sect3>
</sect2>
</sect1>
@@ -3844,10 +3978,7 @@ round-trip min/avg/max/stddev = 2.530/2.643/2.774/0.103 ms</screen>
<listitem>
<para><ulink url="http://www.kame.net">KAME.net</ulink></para>
</listitem>
-
- <listitem>
- <para><ulink url="http://www.6bone.net">6bone.net</ulink></para>
- </listitem></itemizedlist>
+ </itemizedlist>
<sect2>
<title>关于 IPv6 地址的背景知识</title>
@@ -3994,10 +4125,7 @@ round-trip min/avg/max/stddev = 2.530/2.643/2.774/0.103 ms</screen>
<para>目前,有四种方式可以连接到其它 IPv6 主机和网络:</para>
- <itemizedlist><listitem>
- <para>加入试验性的 6bone(骨干)</para>
- </listitem>
-
+ <itemizedlist>
<listitem>
<para>从您的上一级提供商那里获得 IPv6 网络。与您的互联网提供商讨论以求指导。</para>
</listitem>
@@ -4008,59 +4136,9 @@ round-trip min/avg/max/stddev = 2.530/2.643/2.774/0.103 ms</screen>
</listitem>
<listitem>
- <para>如果您是括号连接 (dial-up connection),请使用
- <filename role="package">net/freenet6</filename> port。</para>
- </listitem></itemizedlist>
-
- <para>这里我们就讨论如何连接到 6bone,因为它目前看来是最流行的一种方式。</para>
-
- <para>首先看一下 <ulink url="http://www.6bone.net/">6bone</ulink>
- 网站,并找出离您最近的 6bone 连接。给某位值得信赖的人写信过去,
- 如果运气好,您就会得到关于如何设置您的连接的指导。通常这包括了设置
- GRE (gif) 通道。</para>
-
- <para>这里有一个典型的关于设置 &man.gif.4; 通道的例子。</para>
-
- <screen>&prompt.root; <userinput>ifconfig gif0 create</userinput>
-&prompt.root; <userinput>ifconfig gif0</userinput>
-gif0: flags=8010&lt;POINTOPOINT,MULTICAST&gt; mtu 1280
-&prompt.root; <userinput>ifconfig gif0 tunnel <replaceable>MY_IPv4_ADDR MY_IPv4_REMOTE_TUNNEL_ENDPOINT_ADDR</replaceable></userinput>
-&prompt.root; <userinput>ifconfig gif0 inet6 alias <replaceable>MY_ASSIGNED_IPv6_TUNNEL_ENDPOINT_ADDR MY_IPv6_REMOTE_TUNNEL_ENDPOINT_ADDR</replaceable></userinput></screen>
-
- <para>把大写字母换成您从上一级 6bone 节点收到的信息。</para>
-
- <para>这样就建立了通道。通过 &man.ping6.8;
- <hostid role="ip6addr">ff02::1%gif0</hostid>,
- 检查通道是否工作。您应该会收到两个 ping 回应。</para>
-
- <note><para>或许您会对地址 <hostid role="ip6addr">ff02:1%gif0</hostid>
- 感兴趣,它是一个 multicast 地址。<literal>%gif0</literal> 表明在网络接口
- <devicename>gif0</devicename> 上的 multicast 地址已经用上了。因为我们
- <command>ping</command> 一个 multicast 地址的时候,
- 通道的另一端也应该会回应。</para></note>
-
- <para>到现在,设置一个到 6bone 上级连接的路由应该是相当简单了。</para>
-
- <screen>&prompt.root; <userinput>route add -inet6 default -interface gif0</userinput>
-&prompt.root; <userinput>ping6 -n <replaceable>MY_UPLINK</replaceable></userinput></screen>
-
- <screen>&prompt.root; <userinput>traceroute6 www.jp.FreeBSD.org</userinput>
-(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</screen>
-
- <para>这个输出可能随机器而不同。到现在,您应该可以到达 IPv6
- 站点<ulink url="http://www.kame.net">www.kame.net</ulink>,
- 并看到那只正跳舞的乌龟 &mdash; 如果您有一个支持 IPv6 的浏览器,如
- <filename role="package">www/mozilla</filename>、
- <application>Konqueror</application> (<filename
- role="package">x11/kdebase3</filename>的一部分) 或
- <filename role="package">www/epiphany</filename>。</para>
-
+ <para>如果您使用的是拨号连接, 则可以使用 <filename role="package">net/freenet6</filename> port。</para>
+ </listitem>
+ </itemizedlist>
</sect2>
<sect2>
@@ -4107,8 +4185,7 @@ gif0: flags=8010&lt;POINTOPOINT,MULTICAST&gt; mtu 1280
<sect3>
<title>IPv6 路由器/网关配置</title>
- <para>这将帮助您从隧道提供商, 例如
- <ulink url="http://www.6bone.net/">6bone</ulink> 那里取得必要的资料,
+ <para>这将帮助您从隧道提供商那里取得必要的资料,
并将这些资料转化为在重启时能够保持住的设置。 要在启动时恢复您的隧道,
需要在 <filename>/etc/rc.conf</filename> 中增加:</para>
@@ -4358,6 +4435,123 @@ route_hostD="192.168.173.4 hatm0 0 102 llc/snap ubr"</programlisting>
</sect2>
</sect1>
+ <sect1 id="carp">
+ <sect1info>
+ <authorgroup>
+ <author>
+ <firstname>Tom</firstname>
+ <surname>Rhodes</surname>
+ <contrib>原作 </contrib>
+ </author>
+ </authorgroup>
+ </sect1info>
+ <title>Common Access Redundancy Protocol (CARP, 共用地址冗余协议)</title>
+
+ <indexterm><primary>CARP</primary></indexterm>
+ <indexterm><primary>Common Access Redundancy Protocol, 共用地址冗余协议</primary></indexterm>
+
+ <para>Common Access Redundancy Protocol, 或简称
+ <acronym>CARP</acronym> 能够使多台主机共享同一
+ <acronym>IP</acronym> 地址。 在某些配置中, 这样做可以提高可用性,
+ 或实现负载均衡。 下面的例子中, 这些主机也可以同时使用其他的不同的
+ <acronym>IP</acronym> 地址。</para>
+
+ <para>要启用 <acronym>CARP</acronym> 支持, 必须在 &os;
+ 内核配置中增加下列选项, 并重新联编内核:</para>
+
+ <programlisting>device carp</programlisting>
+
+ <para>这样就可以使用 <acronym>CARP</acronym> 功能了,
+ 一些具体的参数, 可以通过一系列 <command>sysctl</command>
+ <acronym>OID</acronym> 来调整。 设备可以通过 <command>ifconfig</command> 命令来加载:</para>
+
+ <screen>&prompt.root; <userinput>ifconfig carp0 create</userinput></screen>
+
+ <para>在真实环境中, 这些接口需要一个称作 <acronym>VHID</acronym> 的标识编号。 这个
+ <acronym>VHID</acronym> 或 Virtual Host Identification (虚拟主机标识)
+ 用于在网络上区分主机。</para>
+
+ <sect2>
+ <title>使用 CARP 来改善服务的可用性 (CARP)</title>
+
+ <para>如前面提到的那样, <acronym>CARP</acronym> 的作用之一是改善服务的可用性。
+ 这个例子中, 将为三台主机提供故障转移服务, 这三台服务器各自有独立的 <acronym>IP</acronym>
+ 地址, 并提供完全一样的 web 内容。 三台机器以 <acronym>DNS</acronym>
+ 轮询的方式提供服务。 用于故障转移的机器有两个
+ <acronym>CARP</acronym> 接口,
+ 分别配置另外两台服务器的 <acronym>IP</acronym> 地址。
+ 当有服务器发生故障时, 这台机器会自动得到故障机的
+ <acronym>IP</acronym> 地址。 这样以来,
+ 用户就完全感觉不到发生了故障。 故障转移的服务器提供的内容和服务,
+ 应与其为之提供热备份的服务器一致。</para>
+
+ <para>两台机器的配置, 除了主机名和 <acronym>VHID</acronym> 之外应完全一致。
+ 在我们的例子中, 这两台机器的主机名分别是
+ <hostid>hosta.example.org</hostid> 和
+ <hostid>hostb.example.org</hostid>。 首先,
+ 需要将 <acronym>CARP</acronym> 配置加入到 <filename>rc.conf</filename>。 对于
+ <hostid>hosta.example.org</hostid> 而言,
+ <filename>rc.conf</filename> 文件中应包含下列配置:</para>
+
+ <programlisting>hostname="hosta.example.org"
+ifconfig_fxp0="inet 192.168.1.3 netmask 255.255.255.0"
+cloned_interfaces="carp0"
+ifconfig_carp0="vhid 1 pass testpast 192.168.1.50/24"</programlisting>
+
+ <para>在 <hostid>hostb.example.org</hostid> 上,
+ 对应的 <filename>rc.conf</filename> 配置则是:</para>
+
+ <programlisting>hostname="hostb.example.org"
+ifconfig_fxp0="inet 192.168.1.4 netmask 255.255.255.0"
+cloned_interfaces="carp0"
+ifconfig_carp0="vhid 2 pass testpass 192.168.1.51/24"</programlisting>
+
+ <note>
+ <para>在两台机器上由 <command>ifconfig</command> 的
+ <option>pass</option> 选项指定的密码必须是一致的,
+ 这一点非常重要。 <devicename>carp</devicename> 设备只会监听和接受来自持有正确密码的机器的公告。
+ 此外, 不同虚拟主机的 <acronym>VHID</acronym> 必须不同。</para>
+ </note>
+
+ <para>第三台机器,
+ <hostid>provider.example.org</hostid> 需要进行配置,
+ 以便在另外两台机器出现问题时接管。 这台机器需要两个 <devicename>carp</devicename>
+ 设备, 分别处理两个机器。 对应的 <filename>rc.conf</filename>
+ 配置类似下面这样:</para>
+
+ <programlisting>hostname="provider.example.org"
+ifconfig_fxp0="inet 192.168.1.5 netmask 255.255.255.0"
+cloned_interfaces="carp0 carp1"
+ifconfig_carp0="vhid 1 advskew 100 pass testpass 192.168.1.50/24"
+ifconfig_carp1="vhid 2 advskew 100 pass testpass 192.168.1.51/24"</programlisting>
+
+ <para>配置两个 <devicename>carp</devicename> 设备,
+ 能够让 <hostid>provider.example.org</hostid> 在两台机器中的任何一个停止响应时,
+ 立即接管其 <acronym>IP</acronym> 地址。</para>
+
+ <note>
+ <para>默认的 &os; 内核 <emphasis>可能</emphasis> 启用了主机间抢占。
+ 如果是这样的话,
+ <hostid>provider.example.org</hostid> 可能在正式的内容服务器恢复时不释放
+ <acronym>IP</acronym> 地址。 此时, 管理员可以
+ <quote>提醒</quote> 一下接口。 具体做法是在
+ <hostid>provider.example.org</hostid> 上使用下面的命令:</para>
+
+ <screen>&prompt.root; <userinput>ifconfig carp0 down && ifconfig carp0 up</userinput></screen>
+
+ <para>这个操作需要在与出现问题的主机对应的那个 <devicename>carp</devicename>
+ 接口上进行。</para>
+ </note>
+
+ <para>现在您已经完成了 <acronym>CARP</acronym> 的配置, 并可以开始测试了。
+ 测试过程中, 可以随时重启或切断两台机器的网络。</para>
+
+ <para>如欲了解更多细节, 请参见 &man.carp.4;
+ 联机手册。</para>
+ </sect2>
+ </sect1>
+</chapter>
+
<!--
Local Variables:
mode: sgml