diff options
Diffstat (limited to 'documentation/content/zh-cn/books/handbook/advanced-networking/_index.adoc')
-rw-r--r-- | documentation/content/zh-cn/books/handbook/advanced-networking/_index.adoc | 220 |
1 files changed, 110 insertions, 110 deletions
diff --git a/documentation/content/zh-cn/books/handbook/advanced-networking/_index.adoc b/documentation/content/zh-cn/books/handbook/advanced-networking/_index.adoc index 3b35e7cc97..6ac14ab388 100644 --- a/documentation/content/zh-cn/books/handbook/advanced-networking/_index.adoc +++ b/documentation/content/zh-cn/books/handbook/advanced-networking/_index.adoc @@ -79,7 +79,7 @@ toc::[] 为了说明路由选择的各个部分, 首先来看看下面的例子。 这是 `netstat` 命令的输出: -[source,bash] +[source,shell] .... % netstat -r Routing tables @@ -202,7 +202,7 @@ defaultrouter="10.20.30.1" 也可以直接在命令行使用 man:route[8] 命令: -[source,bash] +[source,shell] .... # route add default 10.20.30.1 .... @@ -247,7 +247,7 @@ image::static-routes.png[] 如果我们查看一下``RouterA``的路由表, 我们就会看到如下一些内容: -[source,bash] +[source,shell] .... % netstat -nr Routing tables @@ -262,7 +262,7 @@ default 10.0.0.1 UGS 0 49378 xl0 使用当前的路由表,`RouterA` 是不能到达我们的内网――Internal Net 2 的。它没有到 `192.168.2.0/24` 的路由。 一种可以接受的方法是手工增加这条路由。以下的命令会把 Internal Net 2 网络加入到 `RouterA` 的路由表中,使用``192.168.1.2`` 做为下一个跳跃: -[source,bash] +[source,shell] .... # route add -net 192.168.2.0/24 192.168.1.2 .... @@ -282,7 +282,7 @@ route_internalnet2="-net 192.168.2.0/24 192.168.1.2" 配置变量 `static_routes` 是一串以空格隔开的字符串。每一串表示一个路由名字。 在上面的例子中我们中有一个串在 `static_routes` 里。这个字符串中 _internalnet2_。 然后我们新增一个配置变量 `route_internalnet2`, 这里我们把所有传给 man:route[8]命令的参数拿了过来。 在上面的实例中的我使用的命令是: -[source,bash] +[source,shell] .... # route add -net 192.168.2.0/24 192.168.1.2 .... @@ -433,7 +433,7 @@ device wlan_scan_sta # 802.11 STA mode scanning 在系统启动之后, 您会在引导时给出的信息中, 找到类似下面这样的关于无线设备的信息: -[source,bash] +[source,shell] .... ath0: <Atheros 5212> mem 0x88000000-0x8800ffff irq 11 at device 0.0 on cardbus1 ath0: [ITHREAD] @@ -450,7 +450,7 @@ ath0: AR2413 mac 7.9 RF2413 phy 4.5 您可以通过使用 `ifconfig` 命令来扫描网络。 由于系统需要在操作过程中切换不同的无线频率并探测可用的无线访问点, 这种请求可能需要数分钟才能完成。 只有超级用户才能启动这种扫描: -[source,bash] +[source,shell] .... # ifconfig wlan0 create wlandev ath0 # ifconfig wlan0 up scan @@ -468,7 +468,7 @@ freebsdap 00:11:95:c3:0d:ac 1 54M -83:96 100 EPS WPA ==== 在 FreeBSD 7.X 中, 会直接适配器设备, 例如 [.filename]#ath0#, 而不是 [.filename]#wlan0# 设备。 因此您需要把前面的命令行改为: -[source,bash] +[source,shell] .... # ifconfig ath0 up scan .... @@ -502,7 +502,7 @@ freebsdap 00:11:95:c3:0d:ac 1 54M -83:96 100 EPS WPA 要显示目前已知的网络, 可以使用下面的命令: -[source,bash] +[source,shell] .... # ifconfig wlan0 list scan .... @@ -591,14 +591,14 @@ ifconfig_wlan0="DHCP" 现在您已经完成了启用无线网络接口的全部准备工作了, 下面的操作将启用它: -[source,bash] +[source,shell] .... # /etc/rc.d/netif start .... 一旦网络接口开始运行, 就可以使用 `ifconfig` 来查看网络接口 [.filename]#ath0# 的状态了: -[source,bash] +[source,shell] .... # ifconfig wlan0 wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 @@ -664,7 +664,7 @@ ifconfig_wlan0="WPA DHCP" 下面启用无线网络接口: -[source,bash] +[source,shell] .... # /etc/rc.d/netif start Starting wpa_supplicant. @@ -688,7 +688,7 @@ wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 除此之外, 您也可以手动地使用 <<network-wireless-wpa-wpa-psk,above>> 中那份 [.filename]#/etc/wpa_supplicant.conf# 来配置, 方法是执行: -[source,bash] +[source,shell] .... # wpa_supplicant -i wlan0 -c /etc/wpa_supplicant.conf Trying to associate with 00:11:95:c3:0d:ac (SSID='freebsdap' freq=2412 MHz) @@ -699,7 +699,7 @@ CTRL-EVENT-CONNECTED - Connection to 00:11:95:c3:0d:ac completed (auth) [id=0 id 接下来的操作, 是运行 `dhclient` 命令来从 DHCP 服务器获取 IP: -[source,bash] +[source,shell] .... # dhclient wlan0 DHCPREQUEST on wlan0 to 255.255.255.255 port 67 @@ -725,7 +725,7 @@ wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 如果不打算使用 DHCP 或者 DHCP 不可用, 您可以在 `wpa_supplicant` 为通讯站完成了身份认证之后, 指定静态 IP 地址: -[source,bash] +[source,shell] .... # ifconfig wlan0 inet 192.168.0.100 netmask 255.255.255.0 # ifconfig wlan0 @@ -743,7 +743,7 @@ wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 如果没有使用 DHCP, 还需要手工配置默认网关, 以及域名服务器: -[source,bash] +[source,shell] .... # route add default your_default_router # echo "nameserver your_DNS_server" >> /etc/resolv.conf @@ -803,7 +803,7 @@ ifconfig_wlan0="WPA DHCP" 下一步是使用 [.filename]#rc.d# 机制来启用网络接口: -[source,bash] +[source,shell] .... # /etc/rc.d/netif start Starting wpa_supplicant. @@ -866,7 +866,7 @@ ifconfig_wlan0="WPA DHCP" 下一步是启用网络接口: -[source,bash] +[source,shell] .... # /etc/rc.d/netif start Starting wpa_supplicant. @@ -938,7 +938,7 @@ ifconfig_wlan0="WPA DHCP" 下一步是启用网络接口: -[source,bash] +[source,shell] .... # /etc/rc.d/netif start Starting wpa_supplicant. @@ -966,7 +966,7 @@ WEP (有线等效协议) 是最初 802.11 标准的一部分。 其中没有提 WEP 可以通过 `ifconfig` 配置: -[source,bash] +[source,shell] .... # ifconfig wlan0 create wlandev ath0 # ifconfig wlan0 inet 192.168.1.100 netmask 255.255.255.0 \ @@ -997,7 +997,7 @@ network={ 接着: -[source,bash] +[source,shell] .... # wpa_supplicant -i wlan0 -c /etc/wpa_supplicant.conf Trying to associate with 00:13:46:49:41:76 (SSID='dlinkap' freq=2437 MHz) @@ -1010,7 +1010,7 @@ IBSS 模式, 也称为 ad-hoc 模式, 是为点对点连接设计的。 例 在计算机 `A` 上: -[source,bash] +[source,shell] .... # ifconfig wlan0 create wlandev ath0 wlanmode adhoc # ifconfig wlan0 inet 192.168.0.1 netmask 255.255.255.0 ssid freebsdap @@ -1029,7 +1029,7 @@ IBSS 模式, 也称为 ad-hoc 模式, 是为点对点连接设计的。 例 此时, 在 `B` 上应该能够检测到 `A` 的存在了: -[source,bash] +[source,shell] .... # ifconfig wlan0 create wlandev ath0 wlanmode adhoc # ifconfig wlan0 up scan @@ -1039,7 +1039,7 @@ IBSS 模式, 也称为 ad-hoc 模式, 是为点对点连接设计的。 例 在输出中的 `I` 再次确认了 `A` 机是以 ad-hoc 模式运行的。 我们只需给 `B` 配置一不同的 IP 地址: -[source,bash] +[source,shell] .... # ifconfig wlan0 inet 192.168.0.2 netmask 255.255.255.0 ssid freebsdap # ifconfig wlan0 @@ -1072,7 +1072,7 @@ FreeBSD 可以作为一个(无线)访问接入点(AP), 这样可以不 一旦装载了无线网络的支持, 你就可以检查一下看看你的无线设备是否支持基于主机的无线访问接入模式 (通常也被称为 hostap 模式): -[source,bash] +[source,shell] .... # ifconfig wlan0 create wlandev ath0 # ifconfig wlan0 list caps @@ -1084,14 +1084,14 @@ cryptocaps=1f<WEP,TKIP,AES,AES_CCM,TKIPMIC> 只有创建网络伪设备时能够配置无线设备是否以 hostap 模式运行, 如果之前已经存在了相应的设备, 则需要首先将其销毁: -[source,bash] +[source,shell] .... # ifconfig wlan0 destroy .... 接着, 在配置其它参数前, 以正确的选项重新生成设备: -[source,bash] +[source,shell] .... # ifconfig wlan0 create wlandev ath0 wlanmode hostap # ifconfig wlan0 inet 192.168.0.1 netmask 255.255.255.0 ssid freebsdap mode 11g channel 1 @@ -1099,7 +1099,7 @@ cryptocaps=1f<WEP,TKIP,AES,AES_CCM,TKIPMIC> 再次使用 `ifconfig` 检查 [.filename]#wlan0# 网络接口的状态: -[source,bash] +[source,shell] .... # ifconfig wlan0 wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 @@ -1129,7 +1129,7 @@ ifconfig_wlan0="inet 192.168.0.1 netmask 255.255.255.0 ssid freebsdap mode 11g c 一旦 AP 被配置成了我们前面所展示的那样, 就可以在另外一台无线机器上初始化一次扫描来找到这个 AP: -[source,bash] +[source,shell] .... # ifconfig wlan0 create wlandev ath0 # ifconfig wlan0 up scan @@ -1139,7 +1139,7 @@ freebsdap 00:11:95:c3:0d:ac 1 54M -66:-96 100 ES WME 在客户机上能看到已经连接上了(无线)访问接入点: -[source,bash] +[source,shell] .... # ifconfig wlan0 inet 192.168.0.2 netmask 255.255.255.0 ssid freebsdap # ifconfig wlan0 @@ -1208,12 +1208,12 @@ wpa_pairwise=CCMP TKIP <.> 接下来的一步就是运行 hostapd: -[source,bash] +[source,shell] .... # /etc/rc.d/hostapd forcestart .... -[source,bash] +[source,shell] .... # ifconfig wlan0 wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 2290 @@ -1234,7 +1234,7 @@ wpa_pairwise=CCMP TKIP <.> 在设置了正确的 SSID 和 IP 地址后,无线设备就可以进入 hostap 模式了: -[source,bash] +[source,shell] .... # ifconfig wlan0 create wlandev ath0 wlanmode hostap # ifconfig wlan0 inet 192.168.0.1 netmask 255.255.255.0 \ @@ -1246,7 +1246,7 @@ wpa_pairwise=CCMP TKIP <.> 再使用一次 `ifconfig` 命令查看 [.filename]#wlan0# 接口的状态: -[source,bash] +[source,shell] .... # ifconfig wlan0 wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 @@ -1261,7 +1261,7 @@ wpa_pairwise=CCMP TKIP <.> 现在可以从另外一台无线机器上初始化一次扫描来找到这个 AP 了: -[source,bash] +[source,shell] .... # ifconfig wlan0 create wlandev ath0 # ifconfig wlan0 up scan @@ -1290,7 +1290,7 @@ freebsdap 00:11:95:c3:0d:ac 1 54M 22:1 100 EPS `wpa_supplicant` 提供了许多调试支持; 尝试手工运行它, 在启动时指定 `-dd` 选项, 并察看输出结果。 * 除此之外还有许多其它的底层调试工具。 您可以使用 [.filename]#/usr/src/tools/tools/net80211# 中的 `wlandebug` 命令来启用 802.11 协议支持层的调试功能。 例如: + -[source,bash] +[source,shell] .... # wlandebug -i ath0 +scan+auth+debug+assoc net.wlan.0.debug: 0 => 0xc80000<assoc,auth,scan> @@ -1315,7 +1315,7 @@ Bluetooth (蓝牙) 是一项无线技术, 用于建立带宽为 2.4GHZ,波 默认的 Bluetooth 设备驱动程序已存在于内核模块里。 接入设备前,您需要将驱动程序加载入内核: -[source,bash] +[source,shell] .... # kldload ng_ubt .... @@ -1329,7 +1329,7 @@ ng_ubt_load="YES" 插入USB dongle。控制台(console)(或syslog中)会出现类似如下的信息: -[source,bash] +[source,shell] .... ubt0: vendor 0x0a12 product 0x0001, rev 1.10/5.25, addr 2 ubt0: Interface 0 endpoints: interrupt=0x81, bulk-in=0x82, bulk-out=0x2 @@ -1339,7 +1339,7 @@ ubt0: Interface 1 (alt.config 5) endpoints: isoc-in=0x83, isoc-out=0x3, 脚本 [.filename]#/etc/rc.d/bluetooth# 是用来启动和停止 Bluetooth stack (蓝牙栈)的。 最好在拔出设备前停止 stack(stack),当然也不是非做不可。 启动 stack (栈) 时,会得到如下的输出: -[source,bash] +[source,shell] .... # /etc/rc.d/bluetooth start ubt0 BD_ADDR: 00:02:72:00:d4:1a @@ -1363,7 +1363,7 @@ Number of SCO packets: 8 最常见的任务是发现在 RF proximity 中的蓝牙 (Bluetooth) 设备。这个就叫做 _质询(inquiry)_。质询及 HCI 相关的操作可以由 man:hccontrol[8] 工具来完成。 以下的例子展示如何找出范围内的蓝牙设备。 在几秒钟内您应该得到一张设备列表。 注意远程主机只有被置于 _discoverable(可发现)_ 模式才能答应质询。 -[source,bash] +[source,shell] .... % hccontrol -n ubt0hci inquiry Inquiry result, num_responses=1 @@ -1379,7 +1379,7 @@ Inquiry complete. Status: No error [00] `BD_ADDR` 是蓝牙设备的特定地址, 类似于网卡的 MAC 地址。需要用此地址与某个设备进一步地通信。 可以为 BD_ADDR 分配由人可读的名字 (human readable name)。 文件 [.filename]#/etc/bluetooth/hosts# 包含已知蓝牙主机的信息。 下面的例子展示如何获得分配给远程设备的可读名。 -[source,bash] +[source,shell] .... % hccontrol -n ubt0hci remote_name_request 00:80:37:29:19:a4 BD_ADDR: 00:80:37:29:19:a4 @@ -1390,7 +1390,7 @@ Name: Pav's T39 蓝牙系统提供点对点连接 (只有两个蓝牙设备参与) 和点对多点连接。在点对多点连接中,连接由多个蓝牙设备共享。 以下的例子展示如何取得本地设备的活动基带 (baseband) 连接列表。 -[source,bash] +[source,shell] .... % hccontrol -n ubt0hci read_connection_list Remote BD_ADDR Handle Type Mode Role Encrypt Pending Queue State @@ -1399,7 +1399,7 @@ Remote BD_ADDR Handle Type Mode Role Encrypt Pending Queue State _connection handle(连接柄)_ 在需要终止基带连接时有用。注意:一般不需要手动完成。 栈 (stack) 会自动终止不活动的基带连接。 -[source,bash] +[source,shell] .... # hccontrol -n ubt0hci disconnect 41 Connection handle: 41 @@ -1418,7 +1418,7 @@ L2CAP 基于 _通道(channel)_ 的概念。 通道 (Channel) 是位于基带 (ba 一个有用的命令是 man:l2ping[8], 它可以用来 ping 其它设备。 一些蓝牙实现可能不会返回所有发送给它们的数据, 所以下例中的 `0 bytes` 是正常的。 -[source,bash] +[source,shell] .... # 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 @@ -1429,7 +1429,7 @@ L2CAP 基于 _通道(channel)_ 的概念。 通道 (Channel) 是位于基带 (ba man:l2control[8] 工具用于在 L2CAP 上进行多种操作。 以下这个例子展示如何取得本地设备的逻辑连接 (通道) 和基带连接的列表: -[source,bash] +[source,shell] .... % l2control -a 00:02:72:00:d4:1a read_channel_list L2CAP channels: @@ -1443,7 +1443,7 @@ Remote BD_ADDR Handle Flags Pending State 另一个诊断工具是 man:btsockstat[1]。 它完成与 man:netstat[1] 类似的操作, 只是用了蓝牙网络相关的数据结构。 以下这个例子显示与 man:l2control[8] 相同的逻辑连接。 -[source,bash] +[source,shell] .... % btsockstat Active L2CAP sockets @@ -1514,7 +1514,7 @@ SDP 包括 SDP 服务器和 SDP 客户端之间的通信。 服务器维护一 蓝牙 SDP 服务端 man:sdpd[8] 和命令行客户端 man:sdpcontrol[8] 都包括在了标准的 FreeBSD 安装里。 下面的例子展示如何进行 SDP 浏览查询。 -[source,bash] +[source,shell] .... % sdpcontrol -a 00:01:03:fc:6e:ec browse Record Handle: 00000000 @@ -1543,7 +1543,7 @@ Bluetooth Profile Descriptor List: 等等。注意每个服务有一个属性 (比如 RFCOMM 通道)列表。 根据服务您可能需要为一些属性做个注释。 有些"蓝牙实现 (Bluetooth implementation)"不支持服务浏览, 可能会返回一个空列表。这种情况,可以搜索指定的服务。 下面的例子展示如何搜索 OBEX Object Push (OPUSH) 服务: -[source,bash] +[source,shell] .... % sdpcontrol -a 00:01:03:fc:6e:ec search OPUSH .... @@ -1557,7 +1557,7 @@ sdpd_enable="YES" 然后用下面的命令来启动 sdpd 服务: -[source,bash] +[source,shell] .... # /etc/rc.d/sdpd start .... @@ -1566,7 +1566,7 @@ sdpd_enable="YES" 使用本地 SDP 进程注册的服务列表,可以通过本地控制通道发出 SDP 浏览查询获得: -[source,bash] +[source,shell] .... # sdpcontrol -l browse .... @@ -1588,14 +1588,14 @@ sdpd_enable="YES" 在下面的例子中,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 通道。 -[source,bash] +[source,shell] .... # rfcomm_pppd -a 00:80:37:29:19:a4 -c -C dun -l rfcomm-dialup .... 为了提供 PPP(LAN) 网络接入服务,必须运行 man:sdpd[8] 服务。一个新的 LAN 客户端条目必须在 [.filename]#/etc/ppp/ppp.conf# 文件中建立。 想要实例请参考 man:rfcomm_pppd[8]。 最后,在有效地通道号上开始 RFCOMM PPP 服务。 RFCOMM PPP 服务会使用本地 SDP 进程自动注册蓝牙 LAN 服务。下面的例子展示如何启动 RFCOMM PPP 服务。 -[source,bash] +[source,shell] .... # rfcomm_pppd -s -C 7 -l rfcomm-server .... @@ -1608,7 +1608,7 @@ OBEX 服务器和客户端由第三方软件包 obexapp实现,它可以从 pac OBEX 客户端用于向 OBEX 服务器推入或接出对象。 一个对像可以是(举个例子)商业卡片或约会。 OBEX 客户能通过 SDP 从远程设备取得 RFCOMM 通道号。这可以通过指定服务名代替 RFCOMM 通道号来完成。支持的服务名是有:IrMC、FTRN 和 OPUSH。 也可以用数字来指定 RFCOMM 通道号。下面是一个 OBEX 会话的例子,一个设备信息对像从手机中被拉出, 一个新的对像被推入手机的目录。 -[source,bash] +[source,shell] .... % obexapp -a 00:80:37:29:19:a4 -C IrMC obex> get telecom/devinfo.txt devinfo-t39.txt @@ -1621,7 +1621,7 @@ Success, response: OK, Success (0x20) 为了提供 OBEX 推入服务,man:sdpd[8] 必须处于运行状态。必须创建一个根目录用于存放所有进入的对象。 根文件夹的默认路径是 [.filename]#/var/spool/obex#。 最后,在有效的 RFCOMM 通道号上开始 OBEX 服务。OBEX 服务会使用 SDP 进程自动注册 OBEX 对象推送 (OBEX Object Push) 服务。 下面的例子展示如何启动 OBEX 服务。 -[source,bash] +[source,shell] .... # obexapp -s -C 10 .... @@ -1632,7 +1632,7 @@ Success, response: OK, Success (0x20) 工具 man:rfcomm_sppd[1] 来实现串口层。 "Pseudo tty" 用来作为虚拟的串口。 下面的例子展示如何连接远程设备的串口服务。 注意您不必指定 RFCOMM 通道――man:rfcomm_sppd[1] 能够通过 SDP 从远端设备那里获得。 如果您想代替它的话,可以在命令行里指定 RFCOMM 通道来实现: -[source,bash] +[source,shell] .... # rfcomm_sppd -a 00:07:E0:00:0B:CA -t /dev/ttyp6 rfcomm_sppd[94692]: Starting on /dev/ttyp6... @@ -1640,7 +1640,7 @@ rfcomm_sppd[94692]: Starting on /dev/ttyp6... 一旦连接上,"pseudo tty"就可以充当串口了: -[source,bash] +[source,shell] .... # cu -l ttyp6 .... @@ -1651,7 +1651,7 @@ rfcomm_sppd[94692]: Starting on /dev/ttyp6... 一些较老的蓝牙设备并不支持角色转换 (role switching)。默认情况下,FreeBSD 接受一个新的连接时, 它会尝试进行角色转换并成为主控端 (master)。 不支持角色转换的设备将无法连接。 注意角色转换是在新连接建立时运行的, 因此如果远程设备不支持角色转换,就不可能向它发出请求。 一个 HCI 选项用来在本地端禁用角色转换。 -[source,bash] +[source,shell] .... # hccontrol -n ubt0hci write_node_role_switch 0 .... @@ -1713,7 +1713,7 @@ rfcomm_sppd[94692]: Starting on /dev/ttyp6... 网桥是通过接口复制来创建的。 您可以使用 man:ifconfig[8] 来创建网桥接口, 如果内核不包括网桥驱动, 则它会自动将其载入。 -[source,bash] +[source,shell] .... # ifconfig bridge create bridge0 @@ -1729,7 +1729,7 @@ bridge0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500 将成员网络接口加入网桥。 为了让网桥能够为所有网桥成员接口转发包, 网桥接口和所有成员接口都需要处于启用状态: -[source,bash] +[source,shell] .... # ifconfig bridge0 addm fxp0 addm fxp1 up # ifconfig fxp0 up @@ -1748,7 +1748,7 @@ ifconfig_fxp1="up" 如果网桥主机需要 IP 地址, 则应将其绑在网桥设备本身, 而不是某个成员设备上。 这可以通过静态设置或 DHCP 来完成: -[source,bash] +[source,shell] .... # ifconfig bridge0 inet 192.168.0.1/24 .... @@ -1767,7 +1767,7 @@ ifconfig_fxp1="up" 使用 `stp` 命令可以在成员接口上启用生成树。 对包含 [.filename]#fxp0# 和 [.filename]#fxp1# 的网桥, 可以用下列命令启用 STP: -[source,bash] +[source,shell] .... # ifconfig bridge0 stp fxp0 stp fxp1 bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 @@ -1787,7 +1787,7 @@ bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 另一个网桥也启用了生成树: -[source,bash] +[source,shell] .... bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 ether 96:3d:4b:f1:79:7a @@ -1812,7 +1812,7 @@ bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 如果希望将四个网络接口上的输入转成一个流: -[source,bash] +[source,shell] .... # ifconfig bridge0 addm fxp0 addm fxp1 addm fxp2 addm fxp3 monitor up # tcpdump -i bridge0 @@ -1824,7 +1824,7 @@ bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 如果希望将所有帧发到名为 [.filename]#fxp4# 的接口上: -[source,bash] +[source,shell] .... # ifconfig bridge0 span fxp4 .... @@ -1839,7 +1839,7 @@ bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 另一种用法是将网桥与 VLAN 功能连用, 这样客户网络会被隔离在一边, 而不会浪费 IP 地址空间。 考虑 `CustomerA` 在 `vlan100` 上, 而 `CustomerB` 则在 `vlan101` 上。 网桥地址为 `192.168.0.1`, 同时作为 internet 路由器使用。 -[source,bash] +[source,shell] .... # ifconfig bridge0 addm vlan100 sticky vlan100 addm vlan101 sticky vlan101 # ifconfig bridge0 inet 192.168.0.1/24 @@ -1849,7 +1849,7 @@ bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 在 VLAN 之间的通讯可以通过专用接口 (或防火墙) 来阻断: -[source,bash] +[source,shell] .... # ifconfig bridge0 private vlan100 private vlan101 .... @@ -1862,7 +1862,7 @@ bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 下面的例子是设置 `CustomerA` 在 `vlan100` 上可连接的以太网设备最大值为 10。 -[source,bash] +[source,shell] .... # ifconfig bridge0 ifmaxaddr vlan100 10 .... @@ -1883,7 +1883,7 @@ mibs +BRIDGE-MIB:RSTP-MIB:BEGEMOT-MIB:BEGEMOT-BRIDGE-MIB 通过 IETF BRIDGE-MIB(RFC4188) 监测一个单独的网桥 -[source,bash] +[source,shell] .... % snmpwalk -v 2c -c public bridge1.example.com mib-2.dot1dBridge BRIDGE-MIB::dot1dBaseBridgeAddress.0 = STRING: 66:fb:9b:6e:5c:44 @@ -1907,7 +1907,7 @@ RSTP-MIB::dot1dStpVersion.0 = INTEGER: rstp(2) 监测多个网桥接口可以使用 private BEGEMOT-BRIDGE-MIB: -[source,bash] +[source,shell] .... % snmpwalk -v 2c -c public bridge1.example.com enterprises.fokus.begemot.begemotBridge @@ -1928,7 +1928,7 @@ BEGEMOT-BRIDGE-MIB::begemotBridgeStpDesignatedRoot."bridge2" = Hex-STRING: 80 00 通过 `mib-2.dot1dBridge` 子树改变正在被监测的网桥接口: -[source,bash] +[source,shell] .... % snmpset -v 2c -c private bridge1.example.com BEGEMOT-BRIDGE-MIB::begemotBridgeDefaultBridgeIf.0 s bridge2 @@ -1972,7 +1972,7 @@ Round-robin (轮转):: 在 Cisco(R) 交换机上将 _FastEthernet0/1_ 和 _FastEthernet0/2_ 这两个网口添加到 channel-group _1_: -[source,bash] +[source,shell] .... interface FastEthernet0/1 channel-group 1 mode active @@ -1985,7 +1985,7 @@ interface FastEthernet0/2 使用 _fxp0_ 和 _fxp1_ 创建 man:lagg[4] 接口, 启用这个接口并配置 IP 地址 _10.0.0.3/24_: -[source,bash] +[source,shell] .... # ifconfig fxp0 up # ifconfig fxp1 up @@ -1995,14 +1995,14 @@ interface FastEthernet0/2 用下面的命令查看接口状态: -[source,bash] +[source,shell] .... # ifconfig lagg0 .... 标记为 _ACTIVE_ 的接口是激活据合组的部分, 这表示它们已经完成了与远程交换机的协商, 同时, 流量将通过这些接口来收发。 在 man:ifconfig[8] 的详细输出中会给出 LAG 的标识。 -[source,bash] +[source,shell] .... lagg0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=8<VLAN_MTU> @@ -2016,7 +2016,7 @@ lagg0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 如果需要查看交换机上的端口状态, 则应使用 `show lacp neighbor` 命令: -[source,bash] +[source,shell] .... switch# show lacp neighbor Flags: S - Device is requesting Slow LACPDUs @@ -2053,7 +2053,7 @@ ifconfig_lagg0="laggproto lacp laggport fxp0 laggport fxp1 10.0.0.3/24" ==== 故障转移模式中, 当首选链路发生问题时, 会自动切换到备用端口。 首先启用成员接口, 接着是配置 man:lagg[4] 接口, 其中, 使用 _fxp0_ 作为首选接口, _fxp1_ 作为备用接口, 并在整个接口上配置 IP 地址 _10.0.0.15/24_: -[source,bash] +[source,shell] .... # ifconfig fxp0 up # ifconfig fxp1 up @@ -2063,7 +2063,7 @@ ifconfig_lagg0="laggproto lacp laggport fxp0 laggport fxp1 10.0.0.3/24" 创建成功之后, 接口状态会是类似下面这样, 主要的区别是 MAC 地址和设备名: -[source,bash] +[source,shell] .... # ifconfig lagg0 lagg0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 @@ -2101,7 +2101,7 @@ ifconfig_lagg0="laggproto failover laggport fxp0 laggport fxp1 10.0.0.15/24" 在这个配置中, 我们将优先使用有线网络接口 _bge0_ 作为主网络接口, 而将无线网络接口 _wlan0_ 作为备用网络接口。 这里的 _wlan0_ 使用的物理设备是 _iwn0_, 我们需要将它的 MAC 地址修改为与有线网络接口一致。 为了达到这个目的首先要得到有线网络接口上的 MAC 地址: -[source,bash] +[source,shell] .... # ifconfig bge0 bge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 @@ -2115,21 +2115,21 @@ bge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 您可能需要将 _bge0_ 改为您系统上实际使用的接口, 并从输出结果中的 `ether` 这行找出有线网络的 MAC 地址。 接着是修改物理的无线网络接口, _iwn0_: -[source,bash] +[source,shell] .... # ifconfig iwn0 ether 00:21:70:da:ae:37 .... 启用无线网络接口, 但不在其上配置 IP 地址: -[source,bash] +[source,shell] .... # ifconfig wlan0 create wlandev iwn0 ssid my_router up .... 启用 _bge0_ 接口。 创建 man:lagg[4] 接口, 其中 _bge0_ 作为主网络接口, 而以 _wlan0_ 作为备选接口: -[source,bash] +[source,shell] .... # ifconfig bge0 up # ifconfig lagg0 create @@ -2138,7 +2138,7 @@ bge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 新创建的接口的状态如下, 您系统上的 MAC 地址和设备名等可能会有所不同: -[source,bash] +[source,shell] .... # ifconfig lagg0 lagg0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 @@ -2153,7 +2153,7 @@ lagg0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 接着用 DHCP 客户端来获取 IP 地址: -[source,bash] +[source,shell] .... # dhclient lagg0 .... @@ -2316,7 +2316,7 @@ http://etherboot.sourceforge.net[Etherboot 的网站] 包含有link:http://ether 想要使用启动软盘,先插入一张软盘到安装有 Etherboot 的机器的驱动器里, 然后把当前路径改到 [.filename]#src# 目录――在 Etherboot 树下, 接着输入: -[source,bash] +[source,shell] .... # gmake bin32/devicetype.fd0 @@ -2353,7 +2353,7 @@ tftp dgram udp wait root /usr/libexec/tftpd tftpd -l -s /tftpboot + . 让 inetd 重读其配置文件。 要正确执行这个命令, 在 [.filename]#/etc/rc.conf# 文件中必须加入 `inetd_enable="YES"`: + -[source,bash] +[source,shell] .... # /etc/rc.d/inetd restart .... @@ -2381,7 +2381,7 @@ nfs_server_enable="YES" + . 让 mountd 重读它的配置文件。如果您真的需要启用第一步的 [.filename]#/etc/rc.conf# 里 NFS, 您可能就要重启系统了。 + -[source,bash] +[source,shell] .... # /etc/rc.d/mountd restart .... @@ -2449,7 +2449,7 @@ cd /usr/src/etc; make distribution 内核并不支持在引导时启用 NFS 交换区。 交换区必须通过启动脚本启用, 其过程是挂接一个可写的文件系统, 并在其上创建并启用交换文件。 要建立尺寸合适的交换文件, 可以这样做: -[source,bash] +[source,shell] .... # dd if=/dev/zero of=/path/to/swapfile bs=1k count=1 oseek=100000 .... @@ -2489,7 +2489,7 @@ Intel(R) 预启动执行环境 (PXE) 能让操作系统从网络启动。 + 选择一个可被用户 NFS 挂载并安装有 FreeBSD 的目录。 比如可以使用像 [.filename]#/b/tftpboot/FreeBSD/install# 这样的一个目录。 + -[source,bash] +[source,shell] .... # export NFSROOTDIR=/b/tftpboot/FreeBSD/install # mkdir -p ${NFSROOTDIR} @@ -2505,7 +2505,7 @@ Intel(R) 预启动执行环境 (PXE) 能让操作系统从网络启动。 + . 重起 NFS 服务: + -[source,bash] +[source,shell] .... # /etc/rc.d/nfsd restart .... @@ -2520,14 +2520,14 @@ tftp dgram udp wait root /usr/libexec/tftpd tftpd -l -s /b/tftpboot + . 重启 inetd: + -[source,bash] +[source,shell] .... # /etc/rc.d/inetd restart .... + . crossref:cutting-edge[makeworld,重新编译 FreeBSD 内核和用户态]: + -[source,bash] +[source,shell] .... # cd /usr/src # make buildworld @@ -2536,7 +2536,7 @@ tftp dgram udp wait root /usr/libexec/tftpd tftpd -l -s /b/tftpboot + . 把 FreeBSD 安装到 NFS 挂载目录: + -[source,bash] +[source,shell] .... # make installworld DESTDIR=${NFSROOTDIR} # make installkernel DESTDIR=${NFSROOTDIR} @@ -2545,7 +2545,7 @@ tftp dgram udp wait root /usr/libexec/tftpd tftpd -l -s /b/tftpboot + . 测试 TFTP 服务是否能下载将从 PXE 获取的引导加载器: + -[source,bash] +[source,shell] .... # tftp localhost tftp> get FreeBSD/install/boot/pxeboot @@ -2564,7 +2564,7 @@ myhost.example.com:/b/tftpboot/FreeBSD/install / nfs ro 用你的 NFS 服务器主机名或者 IP 地址替换 _myhost.example.com_。 在此例中, 根文件系统是以"``只读``"的方式挂载用来防止 NFS 客户端可能意外删除根文件系统上的文件。 . 设置 man:chroot[8] 环境中的 root 密码。 + -[source,bash] +[source,shell] .... # chroot ${NFSROOTDIR} # passwd @@ -2574,7 +2574,7 @@ myhost.example.com:/b/tftpboot/FreeBSD/install / nfs ro . 允许 ssh root 登录从 PXE 启动的客户机, 编辑 [.filename]#${NFSROOTDIR}/etc/ssh/sshd_config# 并开启 `PermitRootLogin` 选项。 关于此选项的说明请参阅 man:sshd_config[5]。 . 对 ${NFSROOTDIR} 的 man:chroot[8] 环境做些其他的定制。 这可以是像使用 man:pkg_add[1] 安装二进制包, 使用 man:vipw[8] 修改密码, 或者编辑 man:amd.conf[8] 映射自动挂载等。例如: + -[source,bash] +[source,shell] .... # chroot ${NFSROOTDIR} # pkg_add -r bash @@ -2585,7 +2585,7 @@ myhost.example.com:/b/tftpboot/FreeBSD/install / nfs ro 如果你从一个 NFS 根卷启动, [.filename]#/etc/rc# 如果检测到是从 NFS 启动便会运行 [.filename]#/etc/rc.initdiskless# 脚本。 请阅读此脚本中的注释部分以便了解到底发生了什么。 我们需要把 [.filename]#/etc# 和 [.filename]#/var# 做成内存文件系统的原因是这些目录需要能被写入, 但 NFS 根文件系统是只读的。 -[source,bash] +[source,shell] .... # chroot ${NFSROOTDIR} # mkdir -p conf/base @@ -2638,7 +2638,7 @@ subnet 192.168.0.0 netmask 255.255.255.0 { . 使用 package:net/wireshark[] port 查看 DHCP 和 TFTP 的网络流量来调试各种问题。 . 确保 [.filename]#pxeboot# 能从 TFTP 获取。 在你的 TFTP 服务器上检查 [.filename]#/var/log/xferlog# 日志确保 [.filename]#pxeboot# 被从正确的位置获取。 可以这样测试上面例子 [.filename]#dhcpd.conf# 中所设置的: + -[source,bash] +[source,shell] .... # tftp 192.168.0.1 tftp> get FreeBSD/install/boot/pxeboot @@ -2648,7 +2648,7 @@ Received 264951 bytes in 0.1 seconds 请阅读 man:tftpd[8] 和 man:tftp[1]。 其中的 `BUGS` 列出了 TFTP 的一些限制。 . 确保根文件系统能够从 NFS 挂载。 可以这样测试上面例子 [.filename]#dhcpd.conf# 中所设置的: + -[source,bash] +[source,shell] .... # mount -t nfs 192.168.0.1:/b/tftpboot/FreeBSD/install /mnt .... @@ -3094,7 +3094,7 @@ DATA4 BUSY 首先,您需要一根 laplink 线。然后, 确认两台计算机的内核都有对 man:lpt[4] 驱动程序的支持: -[source,bash] +[source,shell] .... # grep lp /var/run/dmesg.boot lpt0: Printer on ppbus0 @@ -3111,7 +3111,7 @@ hint.ppc.0.irq="7" 然后检查内核配置文件中是否有一行 `device plip` 或加载了 [.filename]#plip.ko# 内核模块。 这两种情况下, 在使用 man:ifconfig[8] 命令时都会显示并口对应的网络接口, 类似这样: -[source,bash] +[source,shell] .... # ifconfig plip0 plip0: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> mtu 1500 @@ -3129,14 +3129,14 @@ IP Address 10.0.0.1 10.0.0.2 配置 `host1` 上的网络接口,照此做: -[source,bash] +[source,shell] .... # ifconfig plip0 10.0.0.1 10.0.0.2 .... 配置 `host2` 上的网络接口,照此做: -[source,bash] +[source,shell] .... # ifconfig plip0 10.0.0.2 10.0.0.1 .... @@ -3154,7 +3154,7 @@ IP Address 10.0.0.1 10.0.0.2 要确认连接是否工作,可以到每一台机子上,然后 ping 另外一台。例如,在 `host1` 上: -[source,bash] +[source,shell] .... # ifconfig plip0 plip0: flags=8851<UP,POINTOPOINT,RUNNING,SIMPLEX,MULTICAST> mtu 1500 @@ -3281,7 +3281,7 @@ IPv4 广播地址 (通常为 `xxx.xxx.xxx.255`) 由 IPv6 的 multicast 地址来 到现在,读者应该能理解下面的内容了: -[source,bash] +[source,shell] .... # ifconfig .... @@ -3479,7 +3479,7 @@ Classical IP over ATM (CLIP) 是一种最简单的使用带 IP 的 ATM 的方法 在每一个连接端 VPI 和 VCI 的值都可能会不同, 只是为了简单起见,我们假定它们是一样的。 下一步我们需要配置每一个主机上的 ATM 接口: -[source,bash] +[source,shell] .... hostA# ifconfig hatm0 192.168.173.1 up hostB# ifconfig hatm0 192.168.173.2 up @@ -3489,7 +3489,7 @@ hostD# ifconfig hatm0 192.168.173.4 up 假定所有主机上的 ATM 接口都是 [.filename]#hatm0#。 现在 PVC 需要配置到 `hostA` 上 (我们假定它们都已经配置在了 ATM 交换机上,至于怎么做的, 您就需要参考一下该交换机的手册了)。 -[source,bash] +[source,shell] .... hostA# atmconfig natm add 192.168.173.2 hatm0 0 100 llc/snap ubr hostA# atmconfig natm add 192.168.173.3 hatm0 0 101 llc/snap ubr @@ -3510,7 +3510,7 @@ hostD# atmconfig natm add 192.168.173.3 hatm0 0 105 llc/snap ubr 当然,除 UBR 外其它的通信协定也可让 ATM 适配器支持这些。 此种情况下,通信协定的名字要跟人通信参数后边。工具 man:atmconfig[8] 的帮助可以这样得到: -[source,bash] +[source,shell] .... # atmconfig help natm add .... @@ -3531,7 +3531,7 @@ route_hostD="192.168.173.4 hatm0 0 102 llc/snap ubr" 所有 CLIP 路由的当前状态可以使用如下命令获得: -[source,bash] +[source,shell] .... hostA# atmconfig natm show .... @@ -3581,7 +3581,7 @@ if_carp_load="YES" CARP 设备可以通过 `ifconfig` 命令来创建。 -[source,bash] +[source,shell] .... # ifconfig carp0 create .... @@ -3634,7 +3634,7 @@ ifconfig_carp1="vhid 2 advskew 100 pass testpass 192.168.1.51/24" ==== 默认的 FreeBSD 内核 _可能_ 启用了主机间抢占。 如果是这样的话, `provider.example.org` 可能在正式的内容服务器恢复时不释放 IP 地址。 此时, 管理员必须手工强制 IP 回到原来内容服务器。 具体做法是在 `provider.example.org` 上使用下面的命令: -[source,bash] +[source,shell] .... # ifconfig carp0 down ifconfig carp0 up .... |