第三十四章 高级网络34.1. 简介34.2. 网关和路由34.2.1. 路由基础34.2.2. 配置具有静态路由的路由器34.2.3. 排错34.2.4. 多播注意事项34.3. 虚拟机34.4. 无线高级身份验证34.4.1. 带EAP-TLS的WPA34.4.2. 带EAP-TTLS的WPA34.4.3. 带EAP-PEAP的WPA34.5. 无线Ad-hoc模式34.5.1. FreeBSD主机访问点34.5.1.1. 基本设置34.5.1.2. 无身份验证或加密的基于主机的接入点34.5.1.3. WPA2基于主机的接入点34.5.1.3.1. WPA2-PSK34.6. USB 网络共享34.7. 蓝牙34.7.1. 正在加载蓝牙支持34.7.2. 查找其他蓝牙设备34.7.3. 设备配对34.7.4. 使用PPP配置文件的网络访问34.7.5. 蓝牙协议34.7.5.1. 逻辑链路控制和适配协议(L2CAP)34.7.5.2. 射频通信(RFCOMM)34.7.5.3. 服务发现协议(SDP)34.7.5.4. OBEX物体推送(OPUSH)34.7.6. 排错34.8. 桥接34.8.1. 启用桥接34.8.2. 启用生成树34.8.3. 桥接接口参数34.8.4. SNMP监控34.9. 链路聚合和故障转移34.9.1. 配置示例34.9.1.1. 使用Cisco®交换机的LACP聚合34.9.1.2. 故障切换模式34.9.1.3. 以太网和无线接口之间的故障切换模式34.10. 带PXE的无盘操作34.10.1. 设置PXE环境34.10.2. 配置DHCP服务器34.10.3. 调试PXE问题34.11. 通用地址冗余协议(CARP)34.11.1. 使用CARP34.12. VLANs
本章涵盖了许多高级网络主题。
阅读本章以了解:
• 网关和路线的基础知识。 • 如何设置USB网络共享。 • 如何设置IEEE®802.11和蓝牙®设备。 • 如何让FreeBSD充当桥梁。 • 如何设置网络PXE启动。 • 如何在FreeBSD中启用和利用通用地址冗余协议(Common Address Redundancy Protocol,CARP)的功能。 • 如何在FreeBSD上配置多个VLAN。 • 如何配置蓝牙耳机。
在阅读本章之前: • 了解 /etc/rc 脚本的基础知识。 • 熟悉基本的网络术语。 • 了解FreeBSD上的基本网络配置(7. FreeBSD网络)。 • 知道如何配置和安装新的FreeBSD内核(10. 配置FreeBSD内核)。 • 知道如何安装其他第三方软件(4. 安装应用程序:软件包和端口)。
Routing(路由)是允许系统找到到另一个系统的网络路径的机制。路由是一对定义好的地址,代表“destination(目的地)”和“gateway(网关)”。路由指示在尝试到达指定目的地时,通过指定的网关发送数据包。有三种类型的目标:单个主机、子网和“默认”。如果没有其他路线适用,则使用“默认路线”。还有三种类型的网关:独立主机、接口(也称为链路)和以太网硬件(MAC)地址。已知路由存储在路由表中。
本节概述了路由基础知识。然后,它演示了如何将FreeBSD系统配置为路由器,并提供了一些故障排除技巧。
要查看FreeBSD系统的路由表,请使用 netstat(1) :
x% netstat -rRouting tablesInternet:Destination Gateway Flags Refs Use Netif Expiredefault outside-gw UGS 37 418 em0localhost localhost UH 0 181 lo0test0 0:e0:b5:36:cf:4f UHLW 5 63288 re0 7710.20.30.255 link#1 UHLW 1 2421example.com link#1 UC 0 0host1 0:e0:a8:37:8:1e UHLW 3 4601 lo0host2 0:e0:a8:37:8:1e UHLW 0 5 lo0 =>host2.example.com link#1 UC 0 0224 link#1 UC 0 0此示例中的条目如下:
default
此表中的第一条路由指定了默认路由。当本地系统需要连接到远程主机时,它会检查路由表以确定是否存在已知路径。如果远程主机与表中的条目匹配,系统会检查它是否可以使用该条目中指定的接口进行连接。
如果目的地与条目不匹配,或者如果所有已知路径都失败,系统将使用该条目作为默认路由。对于局域网上的主机,默认路由中的 Gateway 字段设置为与互联网直接连接的系统。读取此条目时,请验证 Flags 列是否指示网关可用(UG)。
本身作为通往外界的网关的机器的默认路由将是互联网服务提供商(ISP)的网关机器。
localhost
第二条路由是 localhost 路由。Netif 列中为 localhost 指定的接口是 lo0 ,也称为环回设备。这表示此目的地的所有流量都应该是内部的,而不是通过网络发送。
MAC address
以 0:e0: 开头的地址是MAC地址。FreeBSD将自动识别本地以太网上的任何主机(示例中为 test0 ),并通过以太网接口re0为该主机添加路由。这种路由有一个超时,可以在 Expire 列中看到,如果主机在特定时间内没有响应,则使用该超时。发生这种情况时,将自动删除到此主机的路由。这些主机使用路由信息协议(Routing Information Protocol,RIP)进行标识,RIP根据最短路径确定计算到本地主机的路由。
subnet
FreeBSD会自动为本地子网添加子网路由。在这个例子中,10.20.30.255 是子网 10.20.30 的广播地址,example.com 是与该子网关联的域名。指定 link#1 指的是机器中的第一个以太网卡。
本地网络主机和本地子网的路由由名为 routed(8) 的守护进程自动配置。如果它没有运行,则只有管理员静态定义的路由才会存在。
host
host1 行通过其以太网地址指代主机。由于它是发送主机,FreeBSD知道使用环回接口(lo0)而不是以太网接口。
两行 host2 表示使用 ifconfig(8) 创建的别名。 ⇒ lo0接口后的符号表示,除了环回地址外,还设置了别名。此类路由仅显示在支持别名的主机上,本地网络上的所有其他主机都将具有此类路由的 link#1 线路。
224
最后一行(目的地子网 224 )处理多播。
在 Flags 列中可以看到每条路线的各种属性。常见的路由表标志总结了其中一些标志及其含义:
| Flag | 目的 |
|---|---|
| U | 路线处于活动状态(up)。 |
| H | 路由目标是单个主机。 |
| G | 将此目的地的任何内容发送到此网关,网关将从那里确定将其发送到哪里。 |
| S | 此路由是静态(statically)配置的。 |
| C | 基于此路由克隆新路由,供计算机连接。此类路由通常用于本地网络。 |
| W | 该路由是基于局域网(克隆)路由自动配置的。 |
| L | 路由涉及以太网(链路)硬件的引用。 |
在FreeBSD系统上,可以通过指定默认网关的IP地址在 /etc/rc.conf 中定义默认路由:
xxxxxxxxxxdefaultrouter="10.20.30.1"也可以使用 route 手动添加路由:
xxxxxxxxxx# route add default 10.20.30.1请注意,手动添加的路由在重新启动后将无法存活。有关手动操作网络路由表的更多信息,请参阅 route(8) 。
如果FreeBSD系统是双路系统,则可以将其配置为网络的默认网关或路由器。双宿主系统是指驻留在至少两个不同网络上的主机。通常,每个网络都连接到一个单独的网络接口,但IP别名可用于将多个地址绑定到一个物理接口,每个地址位于不同的子网上。
为了使系统在接口之间转发数据包,FreeBSD必须配置为路由器。互联网标准和良好的工程实践阻止FreeBSD项目默认启用此功能,但可以通过在 /etc/rc.conf 中添加以下行将其配置为在启动时启动:
xxxxxxxxxxgateway_enable="YES" # Set to YES if this host will be a gateway要立即启用路由,请将 sysctl(8) 变量 net.inet.ip.forwarding 设置为 1 。若要停止路由,请将此变量重置为 0 。
路由器的路由表需要额外的路由,以便它知道如何到达其他网络。可以使用静态路由手动添加路由,也可以使用路由协议自动学习路由。静态路由适用于小型网络,本节介绍如何为小型网络添加静态路由条目。
xxxxxxxxxx对于大型网络,静态路由很快变得不可扩展。FreeBSD附带了标准的BSD路由守护进程routed(8) ,它提供了路由协议RIP、版本1和2以及IRDP。可以使用net/quagga包或端口安装对BGP和OSPF路由协议的支持。考虑以下网络:

在这种情况下,RouterA 是一台FreeBSD机器,充当互联网其他部分的路由器。它的默认路由设置为 10.0.0.1 ,这允许它与外界连接。RouterB 已配置为使用 192.168.1.1 作为其默认网关。
在添加任何静态路由之前,RouterA 上的路由表如下:
xxxxxxxxxx% netstat -nrRouting tablesInternet:Destination Gateway Flags Refs Use Netif Expiredefault 10.0.0.1 UGS 0 49378 xl0127.0.0.1 127.0.0.1 UH 0 6 lo010.0.0.0/24 link#1 UC 0 0 xl0192.168.1.0/24 link#2 UC 0 0 xl1使用当前路由表,RouterA 没有到 192.168.2.0/24 网络的路由。以下命令使用 192.168.1.2 作为下一跳将 Internal Net 2 网络添加到 RouterA 的路由表中:
xxxxxxxxxx# route add -net 192.168.2.0/24 192.168.1.2现在,RouterA 可以访问 192.168.2.0/24 网络上的任何主机。但是,如果FreeBSD系统重新启动,路由信息将不会持久。如果静态路由需要持久化,请将其添加到 /etc/rc.conf :
xxxxxxxxxx# Add Internal Net 2 as a persistent static routestatic_routes="internalnet2"route_internalnet2="-net 192.168.2.0/24 192.168.1.2"static_routes 配置变量是一个由空格分隔的字符串列表,其中每个字符串都引用一个路由名称。变量 route_intralnet2 包含该路由名称的静态路由。
在 static_routes 中使用多个字符串会创建多个静态路由。下面显示了为 192.168.0.0/24 和 192.168.1.0/24 网络添加静态路由的示例:
xxxxxxxxxxstatic_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"当为网络分配地址空间时,服务提供商会配置其路由表,以便将网络的所有流量发送到站点的链接。但是外部站点如何知道将数据包发送到网络的ISP?
有一个系统可以跟踪所有分配的地址空间,并定义它们与互联网骨干网或承载全国和世界各地互联网流量的主干线的连接点。每台骨干机都有一组主表的副本,这些表将特定网络的流量引导到特定的骨干运营商,并从那里沿着服务提供商链向下,直到到达特定网络。
服务提供商的任务是向骨干站点通告它们是连接点,因此是站点的向内路径。这被称为路由传播。
有时,路由传播会出现问题,一些站点无法连接。也许试图找出路由故障位置的最有用的命令是 traceroute 。当 ping 失败时,它很有用。
使用 traceroute 时,请包含要连接的远程主机的地址。输出将显示尝试路径上的网关主机,最终到达目标主机,或因缺乏连接而终止。有关更多信息,请参阅 traceroute(8) 。
FreeBSD原生支持多播应用程序和多播路由。多播应用程序不需要任何特殊配置即可在FreeBSD上运行。支持多播路由需要将以下选项编译到自定义内核中:
xxxxxxxxxxoptions MROUTING多播路由守护进程mrouted可以使用 net/mrouted 包或端口安装。此守护进程实现DVMRP多播路由协议,并通过编辑 /usr/local/etc/mrouted.conf 进行配置,以设置隧道和DVMRP。mrouted 的安装还会安装 map-mbone 和 mrinfo ,以及它们相关的手册页。请参考这些配置示例。
xxxxxxxxxx在许多多播安装中,DVMRP在很大程度上已被PIM协议所取代。更多信息请参考pim(4)。FreeBSD的一个常见用途是虚拟站点托管,其中一台服务器在网络上显示为多台服务器。这是通过将多个网络地址分配给单个接口来实现的。
给定的网络接口有一个“real”地址,可以有任意数量的“alias”地址。这些别名通常是通过在 /etc/rc.conf 中放置别名条目来添加的,如本例所示:
xxxxxxxxxx# sysrc ifconfig_fxp0_alias0="inet xxx.xxx.xxx.xxx netmask xxx.xxx.xxx.xxx"别名条目必须以 alias0 开头,并使用序列号,如 alias0 、alias1 等。配置过程将在第一个缺失的数字处停止。
别名网络掩码的计算很重要。对于给定的接口,必须有一个地址正确表示网络的网络掩码。属于此网络的任何其他地址必须具有全1的网络掩码,表示为 255.255.255.255 或 0xffffff 。
例如,考虑 fxp0 接口连接到两个网络的情况:10.1.1.0 网络掩码为 255.255.255.0 , 202.0.75.16 网络掩码为 255.255.255.240 。该系统将配置为出现在 10.1.1.1 至 10.1.1.5 和 202.0.75.17 至 202.0.75.20 的范围内。只有给定网络范围内的第一个地址应该具有真实的网络掩码。其余所有(10.1.1.2 至 10.1.1.5 和 202.0.75.18 至 202.0.75.20 )必须配置 255.255.255.255 的网络掩码。
以下 /etc/rc.conf 条目为此场景正确配置了适配器:
xxxxxxxxxx# sysrc ifconfig_fxp0="inet 10.1.1.1 netmask 255.255.255.0"# sysrc ifconfig_fxp0_alias0="inet 10.1.1.2 netmask 255.255.255.255"# sysrc ifconfig_fxp0_alias1="inet 10.1.1.3 netmask 255.255.255.255"# sysrc ifconfig_fxp0_alias2="inet 10.1.1.4 netmask 255.255.255.255"# sysrc ifconfig_fxp0_alias3="inet 10.1.1.5 netmask 255.255.255.255"# sysrc ifconfig_fxp0_alias4="inet 202.0.75.17 netmask 255.255.255.240"# sysrc ifconfig_fxp0_alias5="inet 202.0.75.18 netmask 255.255.255.255"# sysrc ifconfig_fxp0_alias6="inet 202.0.75.19 netmask 255.255.255.255"# sysrc ifconfig_fxp0_alias7="inet 202.0.75.20 netmask 255.255.255.255"一种更简单的表达方式是用空格分隔的IP地址范围列表。第一个地址将被赋予所指示的子网掩码,其他地址的子网面具为 255.255.255.255 。
xxxxxxxxxx# sysrc ifconfig_fxp0_aliases="inet 10.1.1.1-5/24 inet 202.0.75.17-20/28"FreeBSD支持连接到无线网络的不同方式。本节介绍如何对无线网络执行高级身份验证。
要连接到无线网络并进行基本身份验证,请参阅【7. 网络】一章中的【7.4.4. 连接和身份验证到无线网络】一节。
使用WPA的第二种方法是使用802.1X后端身份验证服务器。在这种情况下,WPA被称为WPA Enterprise,以区别于不太安全的WPA Personal。WPA Enterprise中的身份验证基于可扩展身份验证协议(Extensible Authentication Protocol,EAP)。
EAP没有加密方法。相反,EAP被嵌入到加密隧道中。EAP认证方法有很多,但EAP-TLS、EAP-TTLS和EAP-PEAP是最常见的。
具有传输层安全性的EAP(EAP with Transport Layer Security,EAP-TLS)是一种得到良好支持的无线认证协议,因为它是第一个获得Wi-Fi联盟认证的EAP方法。EAP-TLS需要三个证书才能运行:安装在所有计算机上的证书颁发机构(CA)的证书、身份验证服务器的服务器证书和每个无线客户端的一个客户端证书。在这种EAP方法中,身份验证服务器和无线客户端都通过出示各自的证书来相互验证,然后验证这些证书是否由组织的CA签名。
如前所述,配置是通过 /etc/wpa_supplicant.conf 完成的:
xxxxxxxxxxnetwork={ 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。
④ 此字段指示连接的EAP方法。
⑤ identity 字段包含EAP的标识字符串。
⑥ ca_cert 字段表示CA证书文件的路径名。需要此文件来验证服务器证书。
⑦ client_cert 行给出了客户端证书文件的路径名。此证书对网络的每个无线客户端都是唯一的。
⑧ private_key 字段是客户端证书私钥文件的路径名。
⑨ private_key_passwd 字段包含私钥的密码。
然后,在 /etc/rc.conf 中添加以下行:
xxxxxxxxxxwlans_ath0="wlan0"ifconfig_wlan0="WPA DHCP"下一步是启动网卡:
xxxxxxxxxx# service netif startStarting wpa_supplicant.DHCPREQUEST on wlan0 to 255.255.255.255 port 67 interval 7DHCPREQUEST on wlan0 to 255.255.255.255 port 67 interval 15DHCPACK from 192.168.0.20bound to 192.168.0.254 -- renewal in 300 seconds.wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 ether 00:11:95:d5:43:62 inet 192.168.0.254 netmask 0xffffff00 broadcast 192.168.0.255 media: IEEE 802.11 Wireless Ethernet DS/11Mbps mode 11g status: associated ssid freebsdap channel 1 (2412 Mhz 11g) bssid 00:11:95:c3:0d:ac country US ecm authmode WPA2/802.11i privacy ON deftxkey UNDEF AES-CCM 3:128-bit txpower 21.5 bmiss 7 scanvalid 450 bgscan bgscanintvl 300 bgscanidle 250 roam:rssi 7 roam:rate 5 protmode CTS wme burst roaming MANUAL也可以使用 wpa_supplicant(8) 和 ifconfig(8) 手动打开接口。
使用EAP-TLS,身份验证服务器和客户端都需要证书。使用EAP-TTLS时,客户端证书是可选的。此方法类似于web服务器,即使访问者没有客户端证书,它也会创建安全的SSL隧道。EAP-TTLS使用加密的TLS隧道来安全传输身份验证数据。
可以将所需的配置添加到 /etc/wpa_supplicant.conf 中:
xxxxxxxxxxnetwork={ 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。“内部身份验证”阶段通常被称为“phase2”。
接下来,在 /etc/rc.conf 中添加以下行:
xxxxxxxxxxwlans_ath0="wlan0"ifconfig_wlan0="WPA DHCP"下一步是打开网卡:
xxxxxxxxxx# service netif startStarting wpa_supplicant.DHCPREQUEST on wlan0 to 255.255.255.255 port 67 interval 7DHCPREQUEST on wlan0 to 255.255.255.255 port 67 interval 15DHCPREQUEST on wlan0 to 255.255.255.255 port 67 interval 21DHCPACK from 192.168.0.20bound to 192.168.0.254 -- renewal in 300 seconds.wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 ether 00:11:95:d5:43:62 inet 192.168.0.254 netmask 0xffffff00 broadcast 192.168.0.255 media: IEEE 802.11 Wireless Ethernet DS/11Mbps mode 11g status: associated ssid freebsdap channel 1 (2412 Mhz 11g) bssid 00:11:95:c3:0d:ac country US ecm authmode WPA2/802.11i privacy ON deftxkey UNDEF AES-CCM 3:128-bit txpower 21.5 bmiss 7 scanvalid 450 bgscan bgscanintvl 300 bgscanidle 250 roam:rssi 7 roam:rate 5 protmode CTS wme burst roaming MANUALxxxxxxxxxxPEAPv0/EAP-MSCHAPv2是最常见的PEAP方法。在本章中,术语PEAP用于指代该方法。受保护的EAP(Protected EAP,PEAP)被设计为EAP-TTLS的替代品,是继EAP-TLS之后使用最多的EAP标准。在混合操作系统的网络中,PEAP应该是EAP-TLS之后最受支持的标准。
PEAP类似于EAP-TTLS,因为它通过在客户端和身份验证服务器之间创建加密的TLS隧道来使用服务器端证书对客户端进行身份验证,从而保护随后的身份验证信息交换。PEAP身份验证与EAP-TTLS不同,因为它以明文形式广播用户名,并且只有密码在加密的TLS隧道中发送。EAP-TTLS将使用TLS隧道作为用户名和密码。
在 /etc/wpa_supplicant.conf 中添加以下行以配置EAP-PEAP相关设置:
xxxxxxxxxxnetwork={ 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隧道)的参数。根据使用的身份验证服务器,指定一个特定的标签进行身份验证。大多数时候,标签将是“client EAP encryption”,这是通过使用 peaplabel=0 设置的。更多信息可以在 wpa_supplicant.conf(5) 中找到。
⑥ 此字段指定加密TLS隧道中使用的身份验证协议。在PEAP的情况下,它是 auth=MSCHAPV2 。
将以下内容添加到 /etc/rc.conf :
xxxxxxxxxxwlans_ath0="wlan0"ifconfig_wlan0="WPA DHCP"然后,打开网卡:
xxxxxxxxxx# service netif startStarting wpa_supplicant.DHCPREQUEST on wlan0 to 255.255.255.255 port 67 interval 7DHCPREQUEST on wlan0 to 255.255.255.255 port 67 interval 15DHCPREQUEST on wlan0 to 255.255.255.255 port 67 interval 21DHCPACK from 192.168.0.20bound to 192.168.0.254 -- renewal in 300 seconds.wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 ether 00:11:95:d5:43:62 inet 192.168.0.254 netmask 0xffffff00 broadcast 192.168.0.255 media: IEEE 802.11 Wireless Ethernet DS/11Mbps mode 11g status: associated ssid freebsdap channel 1 (2412 Mhz 11g) bssid 00:11:95:c3:0d:ac country US ecm authmode WPA2/802.11i privacy ON deftxkey UNDEF AES-CCM 3:128-bit txpower 21.5 bmiss 7 scanvalid 450 bgscan bgscanintvl 300 bgscanidle 250 roam:rssi 7 roam:rate 5 protmode CTS wme burst roaming MANUALIBSS模式,也称为ad-hoc模式,专为点对点连接而设计。例如,要在机器 A 和 B 之间建立ad-hoc网络,请选择两个IP地址和一个SSID。
在A上:
xxxxxxxxxx# ifconfig wlan0 create wlandev ath0 wlanmode adhoc# ifconfig wlan0 inet 192.168.0.1 netmask 255.255.255.0 ssid freebsdap# ifconfig wlan0 wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 ether 00:11:95:c3:0d:ac inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255 media: IEEE 802.11 Wireless Ethernet autoselect mode 11g <adhoc> status: running ssid freebsdap channel 2 (2417 Mhz 11g) bssid 02:11:95:c3:0d:ac country US ecm authmode OPEN privacy OFF txpower 21.5 scanvalid 60 protmode CTS wme burstadhoc 参数表示接口正在IBSS模式下运行。
B 现在应该能够检测到 A :
xxxxxxxxxx# ifconfig wlan0 create wlandev ath0 wlanmode adhoc# ifconfig wlan0 up scan SSID/MESH ID BSSID CHAN RATE S:N INT CAPS freebsdap 02:11:95:c3:0d:ac 2 54M -64:-96 100 IS WME输出中的 I 确认 A 处于ad-hoc模式。现在,用不同的IP地址配置 B :
xxxxxxxxxx# ifconfig wlan0 inet 192.168.0.2 netmask 255.255.255.0 ssid freebsdap# ifconfig wlan0 wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 ether 00:11:95:d5:43:62 inet 192.168.0.2 netmask 0xffffff00 broadcast 192.168.0.255 media: IEEE 802.11 Wireless Ethernet autoselect mode 11g <adhoc> status: running ssid freebsdap channel 2 (2417 Mhz 11g) bssid 02:11:95:c3:0d:ac country US ecm authmode OPEN privacy OFF txpower 21.5 scanvalid 60 protmode CTS wme burstA 和 B 现在都准备好交换信息了。
FreeBSD可以充当接入点(Access Point,AP),无需购买硬件AP或运行ad-hoc网络。当FreeBSD机器充当互联网等其他网络的网关时,这可能特别有用。
在将FreeBSD机器配置为AP之前,内核必须配置为对无线网卡的适当网络支持以及所使用的安全协议。有关更多详细信息,请参阅基本设置。
xxxxxxxxxxWindows®驱动程序的NDIS驱动程序包装器当前不支持AP操作。只有原生FreeBSD无线驱动程序支持AP模式。加载无线网络支持后,检查无线设备是否支持基于主机的接入点模式,也称为hostap模式:
xxxxxxxxxx# ifconfig wlan0 create wlandev ath0# ifconfig wlan0 list capsdrivercaps=6f85edc1<STA,FF,TURBOP,IBSS,HOSTAP,AHDEMO,TXPMGT,SHSLOT,SHPREAMBLE,MONITOR,MBSS,WPA1,WPA2,BURST,WME,WDS,BGSCAN,TXFRAG>cryptocaps=1f<WEP,TKIP,AES,AES_CCM,TKIPMIC>此输出显示卡的功能。HOSTAP 字确认此无线网卡可以充当AP。还列出了各种支持的密码:WEP、TKIP和AES。此信息指示可以在AP上使用哪些安全协议。
无线设备只能在创建网络伪设备期间进入hostap模式,因此必须先销毁之前创建的设备:
xxxxxxxxxx# ifconfig wlan0 destroy然后在设置其他参数之前,使用正确的选项重新生成:
xxxxxxxxxx# 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再次使用 ifconfig(8) 查看wlan0接口的状态:
xxxxxxxxxx# ifconfig wlan0 wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 ether 00:11:95:c3:0d:ac inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255 media: IEEE 802.11 Wireless Ethernet autoselect mode 11g <hostap> status: running ssid freebsdap channel 1 (2412 Mhz 11g) bssid 00:11:95:c3:0d:ac country US ecm authmode OPEN privacy OFF txpower 21.5 scanvalid 60 protmode CTS wme burst dtimperiod 1 -dfshostap 参数表示接口正在基于主机的接入点模式下运行。
通过在 /etc/rc.conf 中添加以下行,可以在启动时自动完成接口配置:
xxxxxxxxxxwlans_ath0="wlan0"create_args_wlan0="wlanmode hostap"ifconfig_wlan0="inet 192.168.0.1 netmask 255.255.255.0 ssid freebsdap mode 11g channel 1"虽然不建议在没有任何身份验证或加密的情况下运行AP,但这是检查AP是否正常工作的一种简单方法。此配置对于调试客户端问题也很重要。
一旦配置了AP,从另一台无线机器发起扫描以找到AP:
xxxxxxxxxx# ifconfig wlan0 create wlandev ath0# ifconfig wlan0 up scanSSID/MESH ID BSSID CHAN RATE S:N INT CAPSfreebsdap 00:11:95:c3:0d:ac 1 54M -66:-96 100 ES WME客户端机器找到了AP并可以与之关联:
xxxxxxxxxx# ifconfig wlan0 inet 192.168.0.2 netmask 255.255.255.0 ssid freebsdap# ifconfig wlan0 wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 ether 00:11:95:d5:43:62 inet 192.168.0.2 netmask 0xffffff00 broadcast 192.168.0.255 media: IEEE 802.11 Wireless Ethernet OFDM/54Mbps mode 11g status: associated ssid freebsdap channel 1 (2412 Mhz 11g) bssid 00:11:95:c3:0d:ac country US ecm authmode OPEN privacy OFF txpower 21.5 bmiss 7 scanvalid 60 bgscan bgscanintvl 300 bgscanidle 250 roam:rssi 7 roam:rate 5 protmode CTS wme burst本节重点介绍使用WPA2安全协议设置FreeBSD访问点。有关WPA和基于WPA的无线客户端配置的更多详细信息,请参阅带有EAP-TLS的WPA。
hostapd(8) 守护进程用于处理启用WPA2的AP上的客户端身份验证和密钥管理。
在充当AP的FreeBSD机器上执行以下配置操作。一旦AP正常工作,hostapd(8) 可以在引导时通过 /etc/rc.conf 中的以下行自动启动:
xxxxxxxxxxhostapd_enable="YES"在尝试配置 hostapd(8) 之前,请先配置“基本设置”中介绍的基本设置。
WPA2-PSK适用于无法或不希望使用后端身份验证服务器的小型网络。
配置在 /etc/hostapd.conf 中完成:
xxxxxxxxxxinterface=wlan0 ①debug=1 ②ctrl_interface=/var/run/hostapd ③ctrl_interface_group=wheel ④ssid=freebsdap ⑤wpa=2 ⑥wpa_passphrase=freebsdmall ⑦wpa_key_mgmt=WPA-PSK ⑧wpa_pairwise=CCMP ⑨ ① 用于接入点的无线接口。
② 执行 hostapd(8) 时使用的详细程度。值 1 表示最小级别。
③ hostapd(8) 用于存储域套接字文件以与外部程序(如 hostapd_cli(8) )通信的目录的路径名。此示例中使用默认值。
④ 该组允许访问控制界面文件。
⑤ 将出现在无线扫描中的无线网络名称或SSID。
⑥ 启用WPA并指定所需的WPA身份验证协议。值 2 配置WPA2的AP,建议使用。仅在需要过时的WPA时设置为 1 。
⑦ WPA身份验证的ASCII密码。
⑧ 要使用的密钥管理协议。此示例设置WPA-PSK。
⑨ 接入点接受的加密算法。在这个例子中,只接受CCMP(AES)密码。CCMP是TKIP的替代品,在可能的情况下是首选。仅当存在无法使用CCMP的站点时,才应允许使用TKIP。
下一步是启动 hostapd(8) :
xxxxxxxxxx# service hostapd forcestartxxxxxxxxxx# ifconfig wlan0wlan0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500 ether 04:f0:21:16:8e:10 inet6 fe80::6f0:21ff:fe16:8e10%wlan0 prefixlen 64 scopeid 0x9 nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL> media: IEEE 802.11 Wireless Ethernet autoselect mode 11na <hostap> status: running ssid No5ignal channel 36 (5180 MHz 11a ht/40+) bssid 04:f0:21:16:8e:10 country US ecm authmode WPA2/802.11i privacy MIXED deftxkey 2 AES-CCM 2:128-bit AES-CCM 3:128-bit txpower 17 mcastrate 6 mgmtrate 6 scanvalid 60 ampdulimit 64k ampdudensity 8 shortgi wme burst dtimperiod 1 -dfs groups: wlanAP运行后,客户端可以与之关联。有关更多详细信息,请参阅基本设置。可以使用 ifconfig wlan0 list sta 查看与AP关联的站点。
许多手机都提供通过USB共享数据连接的选项(通常称为“tethering,网络共享”)。此功能使用RNDIS、CDC或自定义Apple®iPhone®/iPad®协议之一。
• Android™设备通常使用 urndis(4) 驱动程序。
• Apple®设备使用 ipheth(4) 驱动程序。
• 较旧的设备通常会使用 cdce(4) 驱动程序。
在连接设备之前,请将相应的驱动程序加载到内核中:
xxxxxxxxxx# kldload if_urndis# kldload if_cdce# kldload if_ipheth一旦设备连接,ue0 将像普通网络设备一样可用。确保设备上启用了“USB网络共享”选项。
要使此更改永久化并在启动时将驱动程序作为模块加载,请在 /boot/loader.conf 中放置以下相应行:
xxxxxxxxxxif_urndis_load="YES"if_cdce_load="YES"if_ipheth_load="YES"蓝牙是一种无线技术,用于创建在2.4GHz非授权频段运行的个人网络,范围为10米。网络通常由移动电话、手持设备和笔记本电脑等便携式设备组成。与Wi-Fi无线技术不同,蓝牙提供更高级别的服务配置文件,如类似FTP的文件服务器、文件推送、语音传输、串行线路模拟等。
本节介绍在FreeBSD系统上使用USB蓝牙适配器。然后,它描述了各种蓝牙协议和实用程序。
FreeBSD中的蓝牙栈是使用 netgraph(4) 框架实现的。ng_ubt(4) 支持各种各样的蓝牙USB加密狗。基于Broadcom BCM2033的蓝牙设备由 ubtbcmfw(4) 和 ng_ubt(4) 驱动程序支持。 ng_bt3c(4) 驱动程序支持3Com蓝牙PC卡3CRWB60-A。ng_h4(4) 和 hcserial(8) 支持基于串行和UART的蓝牙设备。
在连接设备之前,确定它使用上述驱动程序中的哪一个,然后加载驱动程序。例如,如果设备使用 ng_ubt(4) 驱动程序:
xxxxxxxxxx# kldload ng_ubt如果蓝牙设备将在系统启动期间连接到系统,则可以通过将驱动程序添加到 /boot/loader.conf 来配置系统,以便在启动时加载模块:
xxxxxxxxxxng_ubt_load="YES"加载驱动程序后,插入USB加密狗。如果驱动程序加载成功,控制台和 /var/log/messages 中应显示类似以下内容的输出:
xxxxxxxxxxubt0: vendor 0x0a12 product 0x0001, rev 1.10/5.25, addr 2ubt0: Interface 0 endpoints: interrupt=0x81, bulk-in=0x82, bulk-out=0x2ubt0: Interface 1 (alt.config 5) endpoints: isoc-in=0x83, isoc-out=0x3, wMaxPacketSize=49, nframes=6, buffer size=294要启动和停止蓝牙堆栈,请使用其启动脚本。在拔下设备之前,最好停止堆栈。启动蓝牙堆栈可能需要启动 hcsecd(8) 。启动堆栈时,输出应类似于以下内容:
xxxxxxxxxx# service bluetooth start ubt0BD_ADDR: 00:02:72:00:d4:1aFeatures: 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 bytesNumber of ACL packets: 8Max. SCO packet size: 64 bytesNumber of SCO packets: 8主机控制器接口(Host Controller Interface,HCI)提供了一种访问蓝牙基带功能的统一方法。在FreeBSD中,为每个蓝牙设备创建一个netgraph HCI节点。有关更多详细信息,请参阅 ng_hci(4) 。
最常见的任务之一是在射频范围内发现蓝牙设备。此操作称为查询。使用 hccontrol(8) 完成查询和其他HCI相关操作。下面的示例显示了如何找出哪些蓝牙设备在范围内。设备列表应在几秒钟后显示。请注意,只有当远程设备设置为可发现(discoverable)模式时,它才会回答询问。
xxxxxxxxxx% hccontrol -n ubt0hci inquiryInquiry result, num_responses=1Inquiry 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: 0x78efInquiry complete. Status: No error [00]BD_ADDR 是蓝牙设备的唯一地址,类似于网卡的MAC地址。该地址是与设备进一步通信所必需的,并且可以为 BD_ADDR 分配一个人类可读的名称。有关已知蓝牙主机的信息包含在 /etc/bluetooth/hosts 中。以下示例显示了如何获取分配给远程设备的人类可读名称:
xxxxxxxxxx% hccontrol -n ubt0hci remote_name_request 00:80:37:29:19:a4BD_ADDR: 00:80:37:29:19:a4Name: Pav's T39如果在远程蓝牙设备上执行查询,它将发现计算机为“your.host.name(ubt0)”。分配给本地设备的名称可以随时更改。
远程设备可以在 /etc/bluetooth/hosts 中分配别名。有关 /etc/bluetooth/hosts 文件的更多信息,请参阅 bluetooth.hosts(5) 。
蓝牙系统在两个蓝牙单元之间提供点对点连接,或在多个蓝牙设备之间共享的点对多点连接。以下示例显示了如何创建与远程设备的连接:
xxxxxxxxxx% hccontrol -n ubt0hci create_connection BT_ADDRcreate_connection 接受 BT_ADDR 以及 /etc/bluetooth/hosts 中的主机别名。
以下示例显示了如何获取本地设备的活动基带连接列表:
xxxxxxxxxx% hccontrol -n ubt0hci read_connection_listRemote BD_ADDR Handle Type Mode Role Encrypt Pending Queue State00:80:37:29:19:a4 41 ACL 0 MAST NONE 0 0 OPEN当需要终止基带连接时, connection handle 很有用,尽管通常不需要手动完成。堆栈将自动终止不活动的基带连接。
xxxxxxxxxx# hccontrol -n ubt0hci disconnect 41Connection handle: 41Reason: Connection terminated by local host [0x16]键入 hccontrol help 以获取可用HCI命令的完整列表。大多数HCI命令不需要超级用户权限。
默认情况下,蓝牙通信未经过身份验证,任何设备都可以与任何其他设备通话。蓝牙设备(如蜂窝电话)可以选择要求身份验证以提供特定服务。蓝牙身份验证通常使用PIN码完成,PIN码是一个长度不超过16个字符的ASCII字符串。用户需要在两台设备上输入相同的PIN码。用户输入PIN码后,两台设备都将生成链接密钥。之后,链接密钥可以存储在设备中或持久存储器中。下次,两台设备都将使用之前生成的链接密钥。此过程称为配对。请注意,如果任一设备丢失了链接密钥,则必须重复配对。
hcsecd(8) 守护进程负责处理蓝牙身份验证请求。默认配置文件为 /etc/bluetooth/hcsecd.conf 。PIN码设置为 1234 的手机示例部分如下:
xxxxxxxxxxdevice { bdaddr 00:80:37:29:19:a4; name "Pav's T39"; key nokey; pin "1234";}PIN码的唯一限制是长度。某些设备,如蓝牙耳机,可能内置了固定的PIN码。-d 开关强制 hcsecd(8) 保持在前台,因此很容易看到发生了什么。将远程设备设置为接收配对,并启动与远程设备的蓝牙连接。远程设备应指示已接受配对并请求PIN码。输入 hcsecd.conf 中列出的相同PIN码。现在计算机和远程设备已配对。或者,可以在远程设备上启动配对。
可以将以下行添加到 /etc/rc.conf 中,以配置 hcsecd(8) 在系统启动时自动启动:
xxxxxxxxxxhcsecd_enable="YES"以下是 hcsecd(8) 守护进程输出的示例:
xxxxxxxxxxhcsecd[16484]: Got Link_Key_Request event from 'ubt0hci', remote bdaddr0:80:37:29:19:a4hcsecd[16484]: Found matching entry, remote bdaddr 0:80:37:29:19:a4, name 'Pav's T39', link key doesn't existhcsecd[16484]: Sending Link_Key_Negative_Reply to 'ubt0hci' for remote bdaddr 0:80:37:29:19:a4hcsecd[16484]: Got PIN_Code_Request event from 'ubt0hci', remote bdaddr0:80:37:29:19:a4hcsecd[16484]: Found matching entry, remote bdaddr 0:80:37:29:19:a4, name 'Pav's T39', PIN code existshcsecd[16484]: Sending PIN_Code_Reply to 'ubt0hci' for remote bdaddr 0:80:37:29:19:a4拨号网络(Dial-Up Networking,DUN)配置文件可用于将手机配置为无线调制解调器,以连接到拨号互联网接入服务器。它还可以用于配置计算机以接收来自手机的数据呼叫。
具有PPP配置文件的网络接入可用于为单个蓝牙设备或多个蓝牙设备提供LAN接入。它还可以通过串行电缆仿真使用PPP网络提供PC到PC的连接。
在FreeBSD中,这些配置文件是用 ppp(8) 和 rfcomm_pppd(8) 包装器实现的,它将蓝牙连接转换为ppp可以使用的东西。在使用配置文件之前,必须在 /etc/ppp/ppp.conf 中创建一个新的PPP标签。有关示例,请参阅 rfcomm_pppd(8) 。
在这个例子中, rfcomm_pppd(8) 用于在DUNRFCOMM通道上打开与 BD_ADDR 为 00:80:37:29:19:a4 的远程设备的连接:
xxxxxxxxxx# rfcomm_pppd -a 00:80:37:29:19:a4 -c -C dun -l rfcomm-dialup实际信道号将使用SDP协议从远程设备获得。可以手动指定RFCOMM通道,在这种情况下, rfcomm_pppd(8) 将不会执行SDP查询。使用 sdpcontrol(8) 找出远程设备上的RFCOMM通道。
为了使用PPPLAN服务提供网络访问, sdpd(8) 必须正在运行,并且必须在 /etc/ppp/ppp.conf 中为LAN客户端创建一个新条目。有关示例,请参阅 rfcomm_pppd(8) 。最后,在有效的RFCOMM通道号上启动RFCOMMPPP服务器。RFCOMMPPP服务器将自动向本地SDP守护进程注册蓝牙LAN服务。下面的示例显示了如何启动RFCOMMPPP服务器。
xxxxxxxxxx# rfcomm_pppd -s -C 7 -l rfcomm-server本节概述了各种蓝牙协议、其功能和相关实用程序。
逻辑链路控制和适配协议(Logical Link Control and Adaptation Protocol,L2CAP)为上层协议提供面向连接和无连接的数据服务。L2CAP允许更高级别的协议和应用程序发送和接收长度高达64千字节的L2CAP数据包。
L2CAP基于信道(channel)的概念。信道是基带连接之上的逻辑连接,其中每个信道以多对一的方式绑定到单个协议。多个通道可以绑定到同一协议,但一个通道不能绑定到多个协议。在信道上接收到的每个L2CAP数据包都被定向到适当的更高层协议。多个信道可以共享同一基带连接。
在FreeBSD中,为每个蓝牙设备创建一个netgraph L2CAP节点。该节点通常连接到下游蓝牙HCI节点和上游蓝牙套接字节点。L2CAP节点的默认名称是“devicel2cap”。有关更多详细信息,请参阅 ng_l2cap(4) 。
一个有用的命令是 l2ping(8) ,它可以用来ping其他设备。某些蓝牙实现可能不会返回发送给它们的所有数据,因此以下示例中的 0 bytes 是正常的。
xxxxxxxxxx# l2ping -a 00:80:37:29:19:a40 bytes from 0:80:37:29:19:a4 seq_no=0 time=48.633 ms result=00 bytes from 0:80:37:29:19:a4 seq_no=1 time=37.551 ms result=00 bytes from 0:80:37:29:19:a4 seq_no=2 time=28.324 ms result=00 bytes from 0:80:37:29:19:a4 seq_no=3 time=46.150 ms result=0l2control(8) 实用程序用于在L2CAP节点上执行各种操作。此示例显示了如何获取本地设备的逻辑连接(信道)列表和基带连接列表:
xxxxxxxxxx% l2control -a 00:02:72:00:d4:1a read_channel_listL2CAP channels:Remote BD_ADDR SCID/ DCID PSM IMTU/ OMTU State00:07:e0:00:0b:ca 66/ 64 3 132/ 672 OPEN% l2control -a 00:02:72:00:d4:1a read_connection_listL2CAP connections:Remote BD_ADDR Handle Flags Pending State00:07:e0:00:0b:ca 41 O 0 OPEN另一个诊断工具是 btsockstat(1) 。它类似于 netstat(1) ,但用于蓝牙网络相关的数据结构。下面的示例显示了与上述 l2control(8) 相同的逻辑连接。
xxxxxxxxxx% btsockstatActive L2CAP socketsPCB Recv-Q Send-Q Local address/PSM Foreign address CID Statec2afe900 0 0 00:02:72:00:d4:1a/3 00:07:e0:00:0b:ca 66 OPENActive RFCOMM sessionsL2PCB PCB Flag MTU Out-Q DLCs Statec2afe900 c2b53380 1 127 0 Yes OPENActive RFCOMM socketsPCB Recv-Q Send-Q Local address Foreign address Chan DLCI Statec2e8bc80 0 250 00:02:72:00:d4:1a 00:07:e0:00:0b:ca 3 6 OPENRFCOMM(Radio Frequency Communication)协议通过L2CAP协议提供串行端口的仿真。RFCOMM是一种简单的传输协议,具有用于模拟9个RS-232(EIATIA-232-E)串行端口电路的附加规定。它支持两个蓝牙设备之间多达60个同时连接(RFCOMM信道)。
就RFCOMM而言,完整的通信路径涉及在通信端点上运行的两个应用程序,它们之间有一个通信段。RFCOMM旨在涵盖使用其所在设备的串行端口的应用程序。通信段是从一个设备到另一个设备的直接连接蓝牙链路。
RFCOMM只关心直接连接情况下设备之间的连接,或者网络情况下设备和调制解调器之间的连接。RFCOMM可以支持其他配置,例如一侧通过蓝牙无线技术通信,另一侧提供有线接口的模块。
在FreeBSD中,RFCOMM是在蓝牙套接字层实现的。
服务发现协议(Service Discovery Protocol,SDP)为客户端应用程序提供了发现服务器应用程序提供的服务的存在以及这些服务的属性的手段。服务的属性包括所提供服务的类型或类别以及利用该服务所需的机制或协议信息。
SDP涉及SDP服务器和SDP客户端之间的通信。服务器维护一个服务记录列表,该列表描述了与服务器相关联的服务的特征。每个服务记录都包含有关单个服务的信息。客户端可以通过发出SDP请求从SDP服务器维护的服务记录中检索信息。如果客户端或与客户端关联的应用程序决定使用服务,则必须打开与服务提供商的单独连接才能使用该服务。SDP提供了一种发现服务及其属性的机制,但它没有提供利用这些服务的机制。
通常,SDP客户端根据服务的某些所需特征搜索服务。然而,有时需要在没有任何关于服务的先验信息的情况下,发现SDP服务器的服务记录描述了哪些类型的服务。寻找任何提供的服务的过程称为浏览。
蓝牙SDP服务器 sdpd(8) 和命令行客户端 sdpcontrol(8) 包含在标准FreeBSD安装中。以下示例显示了如何执行SDP浏览查询。
xxxxxxxxxx% sdpcontrol -a 00:01:03:fc:6e:ec browseRecord Handle: 00000000Service 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: 0x00000001Service Class ID List: Browse Group Descriptor (0x1001) Record Handle: 0x00000002Service Class ID List: LAN Access Using PPP (0x1102)Protocol Descriptor List: L2CAP (0x0100) RFCOMM (0x0003) Protocol specific parameter #1: u/int8/bool 1Bluetooth Profile Descriptor List: LAN Access Using PPP (0x1102) ver. 1.0请注意,每个服务都有一个属性列表,例如RFCOMM通道。根据服务的不同,用户可能需要记录一些属性。某些蓝牙实现不支持服务浏览,可能会返回空列表。在这种情况下,可以搜索特定服务。下面的示例显示了如何搜索OBEX对象推送(OBEX Object Push,OPUSH)服务:
xxxxxxxxxx% sdpcontrol -a 00:01:03:fc:6e:ec search OPUSH在FreeBSD上向蓝牙客户端提供服务是通过 sdpd(8) 服务器完成的。可以将以下行添加到 /etc/rc.conf 中:
xxxxxxxxxxsdpd_enable="YES"然后,可以使用以下命令启动 sdpd(8) 守护进程:
xxxxxxxxxx# service sdpd start想要向远程客户端提供蓝牙服务的本地服务器应用程序将向本地SDP守护进程注册该服务。这种应用程序的一个例子是 rfcomm_pppd(8) 。一旦启动,它将向本地SDP守护进程注册蓝牙LAN服务。
通过本地控制信道发出SDP浏览查询,可以获得向本地SDP服务器注册的服务列表:
xxxxxxxxxx# sdpcontrol -l browse串行端口配置文件(Serial Port Profile,SPP)允许蓝牙设备执行串行电缆仿真。此配置文件允许传统应用程序通过虚拟串行端口抽象使用蓝牙作为电缆替代品。
在FreeBSD中,rfcomm_sppd(1) 实现了SPP,伪tty用作虚拟串行端口抽象。下面的示例显示了如何连接到远程设备的串行端口服务。RFCOMM通道不必指定,因为 frcomm_sppd(1) 可以通过SDP从远程设备获取它。要覆盖此内容,请在命令行上指定RFCOMM通道。
xxxxxxxxxx# rfcomm_sppd -a 00:07:E0:00:0B:CA -trfcomm_sppd[94692]: Starting on /dev/pts/6.../dev/pts/6连接后,伪tty可以用作串行端口:
xxxxxxxxxx# cu -l /dev/pts/6伪tty打印在stdout上,可以通过包装器脚本读取:
xxxxxxxxxxPTS=`rfcomm_sppd -a 00:07:E0:00:0B:CA -t`cu -l $PTS默认情况下,当FreeBSD接受新连接时,它会尝试执行角色切换并成为主节点。一些不支持角色切换的旧蓝牙设备将无法连接。由于角色切换是在建立新连接时执行的,因此无法询问远程设备是否支持角色切换。但是,有一个HCI选项可以禁用本地端的角色切换:
xxxxxxxxxx# hccontrol -n ubt0hci write_node_role_switch 0要显示蓝牙数据包,请使用第三方软件包hcidump,该软件包可以使用 comms/hcidump 软件包或端口安装。此实用程序类似于 tcpdump(1) ,可用于在终端上显示蓝牙数据包包含的内容,并将蓝牙数据包转储到文件中。
有时,将网络(如以太网段)划分为网段是有用的,而不必创建IP子网并使用路由器将网段连接在一起。以这种方式将两个网络连接在一起的设备称为“网桥,bridge”。
网桥通过学习其每个网络接口上设备的MAC地址来工作。仅当源和目标MAC地址位于不同网络上时,它才会在网络之间转发流量。在许多方面,网桥就像一个端口很少的以太网交换机。具有多个网络接口的FreeBSD系统可以配置为充当网桥。
桥接在以下情况下可能很有用:
连接网络
网桥的基本操作是连接两个或多个网段。使用基于主机的网桥而不是网络设备的原因有很多,例如布线限制或防火墙。网桥还可以将以hostap模式运行的无线接口连接到有线网络,并充当接入点。
过滤/流量整形防火墙
当需要防火墙功能而无需路由或网络地址转换(NAT)时,可以使用网桥。
一个例子是一家通过DSL或ISDN连接到ISP的小公司。ISP有13个公共IP地址,网络上有10台计算机。在这种情况下,由于子网问题,使用基于路由器的防火墙很困难。可以配置基于网桥的防火墙,而不会出现任何IP寻址问题。
网络点击
网桥可以连接两个网段,以便使用网桥接口上的 bpf(4) 和 tcpdump(1) 检查在它们之间传递的所有以太网帧,或者通过在称为span端口的附加接口上发送所有帧的副本。
第二层VPN
通过将网络桥接到EtherIP隧道或基于 tap(4) 的解决方案(如OpenVPN),可以通过IP链路连接两个以太网。
第二层冗余
网络可以通过多条链路连接在一起,并使用生成树协议(Spanning Tree Protocol,STP)来阻止冗余路径。
本节介绍如何使用 if_bridge(4) 将FreeBSD系统配置为网桥。网络图桥接驱动程序也是可用的,在 ng_bridge(4) 中进行了描述。
xxxxxxxxxx包过滤可以与任何挂接到pfil(9)框架的防火墙包一起使用。网桥可以用作altq(4)或dummynet(4)的流量整形器。在FreeBSD中,if_bridge(4) 是一个内核模块,在创建桥接接口时由 ifconfig(8) 自动加载。通过将 device if_bridge 添加到自定义内核配置文件中,也可以将桥支持编译到自定义内核中。
该桥是使用接口克隆创建的。要创建网桥界面,请执行以下操作:
xxxxxxxxxx# ifconfig bridge createbridge0# ifconfig bridge0bridge0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> 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创建网桥接口时,会自动为其分配一个随机生成的以太网地址。maxaddr 和 timeout 参数控制网桥将在其转发表中保留多少个MAC地址,以及在最后一次看到每个条目后删除它之前的多少秒。其他参数控制STP的操作方式。
接下来,指定要添加哪些网络接口作为网桥的成员。为了让网桥转发数据包,所有成员接口和网桥都需要启动:
xxxxxxxxxx# ifconfig bridge0 addm fxp0 addm fxp1 up# ifconfig fxp0 up# ifconfig fxp1 up网桥现在可以在 fxp0 和 fxp1 之间转发以太网帧。在 /etc/rc.conf 中添加以下行,以便在启动时创建网桥:
xxxxxxxxxxcloned_interfaces="bridge0"ifconfig_bridge0="addm fxp0 addm fxp1 up"ifconfig_fxp0="up"ifconfig_fxp1="up"如果网桥主机需要IP地址,请在网桥接口上设置,而不是在成员接口上设置。地址可以静态设置或通过DHCP设置。此示例设置静态IP地址:
xxxxxxxxxx# ifconfig bridge0 inet 192.168.0.1/24还可以为网桥接口分配IPv6地址。要使更改永久化,请将地址信息添加到 /etc/rc.conf 。
xxxxxxxxxx当启用数据包过滤时,桥接的数据包将通过网桥接口上发起接口的入站过滤器和相应接口的出站过滤器。任何一个阶段都可以被禁用。当数据包流的方向很重要时,最好在成员接口而不是网桥本身上设置防火墙。该网桥有几个可配置的设置,用于传递非IP和IP数据包,以及使用ipfw(8)进行第2层防火墙。更多信息请参见if_bridge(4)。为了使以太网正常运行,两个设备之间只能存在一条活动路径。STP协议检测环路并将冗余链路置于阻塞状态。如果其中一个活动链路发生故障,STP会计算一个不同的树,并启用其中一个被阻塞的路径来恢复与网络中所有点的连接。
快速生成树协议(RSTP或802.1w)提供了与传统STP的向后兼容性。RSTP提供更快的收敛,并与相邻交换机交换信息,以快速转换到转发模式,而不会产生环路。FreeBSD支持RSTP和STP作为操作模式,RSTP是默认模式。
可以使用 ifconfig(8) 在成员接口上启用STP。对于当前接口为 fxp0 和 fxp1 的网桥,请使用以下命令启用STP:
xxxxxxxxxx# ifconfig bridge0 stp fxp0 stp fxp1bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> 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<LEARNING,DISCOVER,STP,AUTOEDGE,PTP,AUTOPTP> port 3 priority 128 path cost 200000 proto rstp role designated state forwarding member: fxp1 flags=1c7<LEARNING,DISCOVER,STP,AUTOEDGE,PTP,AUTOPTP> port 4 priority 128 path cost 200000 proto rstp role designated state forwarding此桥的生成树ID为 00:01:02:4b:d4:50 ,优先级为 32768 。由于 root id 相同,因此表示这是树的根桥。
网络上的另一个网桥也启用了STP:
xxxxxxxxxxbridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> 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<LEARNING,DISCOVER,STP,AUTOEDGE,PTP,AUTOPTP> port 4 priority 128 path cost 200000 proto rstp role root state forwarding member: fxp1 flags=1c7<LEARNING,DISCOVER,STP,AUTOEDGE,PTP,AUTOPTP> port 5 priority 128 path cost 200000 proto rstp role designated state forwarding行 root id 00:01:02:4b:d4:50 priority 32768 ifost 400000 port 4 显示根网桥为 00:01:02:4b:d4:50 ,从该网桥的路径成本为 400000 。通往根网桥的路径是通过 port 4 ,即fxp0。
几个 ifconfig 参数对于桥接接口是唯一的。本节总结了这些参数的一些常见用法。 ifconfig(8) 中描述了可用参数的完整列表。
private
专用接口不会将任何流量转发到也被指定为专用接口的任何其他端口。流量被无条件阻止,因此不会转发以太网帧,包括ARP数据包。如果需要选择性地阻止流量,则应使用防火墙。
span
跨度端口传输网桥接收到的每个以太网帧的副本。网桥上配置的跨端口数量不受限制,但如果一个接口被指定为跨端口,它就不能同时用作常规网桥端口。这对于被动监听连接到网桥跨端口之一的另一台主机上的网桥网络最有用。例如,要从名为fxp4的接口发送所有帧的副本:
xxxxxxxxxx# ifconfig bridge0 span fxp4sticky
如果网桥成员接口被标记为粘性,则动态学习的地址条目将被视为转发缓存中的静态条目。即使地址出现在不同的界面上,粘性条目也不会从缓存中过期或被替换。这提供了静态地址条目的好处,而不需要预先填充转发表。在网桥的特定段上学习的客户端无法漫游到另一个段。
使用粘性地址的一个例子是将网桥与VLAN相结合,以便在不浪费IP地址空间的情况下隔离客户网络。假设 CustomerA 位于v lan100 上,CustomerB 位于 vlan101 上,网桥的地址为 192.168.0.1 :
xxxxxxxxxx# ifconfig bridge0 addm vlan100 sticky vlan100 addm vlan101 sticky vlan101# ifconfig bridge0 inet 192.168.0.1/24在这个例子中,两个客户端都将 192.168.0.1 视为默认网关。由于网桥缓存具有粘性,因此一台主机无法欺骗另一台客户的MAC地址来拦截他们的流量。
VLAN之间的任何通信都可以使用防火墙或专用接口进行阻止,如本例所示:
xxxxxxxxxx# ifconfig bridge0 private vlan100 private vlan101客户之间完全隔离,可以在不进行子网划分的情况下分配完整的/24地址范围。
可以限制接口后面的唯一源MAC地址的数量。一旦达到限制,具有未知源地址的数据包将被丢弃,直到现有的主机缓存条目过期或被删除。
以下示例将 vlan100 上 CustomerA 的以太网设备的最大数量设置为10:
xxxxxxxxxx# ifconfig bridge0 ifmaxaddr vlan100 10网桥接口还支持监视模式,在这种模式下,数据包在 bpf(4) 处理后被丢弃,不再被处理或转发。这可用于将两个或多个接口的输入多路复用到单个 bpf(4) 流中。这对于重建通过两个单独接口传输RX/TX信号的网络抽头的流量非常有用。例如,要将来自四个网络接口的输入作为一个流读取:
xxxxxxxxxx# ifconfig bridge0 addm fxp0 addm fxp1 addm fxp2 addm fxp3 monitor up# tcpdump -i bridge0桥接接口和STP参数可以通过FreeBSD基础系统中包含的 bsnmpd(1) 进行监控。导出的网桥MIB符合IETF标准,因此可以使用任何SNMP客户端或监控包来检索数据。
要在网桥上启用监视,请通过删除开头的 # 符号在 /etc/snmpd.config 中取消注释此行:
xxxxxxxxxxbegemotSnmpdModulePath."bridge" = "/usr/lib/snmp_bridge.so"可能需要在此文件中修改其他配置设置,如社区名称和访问列表。有关更多信息,请参阅 bsnmpd(1) 和 snmp_bridge(3) 。保存这些编辑后,将此行添加到 /etc/rc.conf :
xxxxxxxxxxbsnmpd_enable="YES"然后,启动 bsnmpd(1) :
xxxxxxxxxx# service bsnmpd start以下示例使用Net-SNMP软件(net-mgmt/net-snmp)从客户端系统查询网桥。也可以使用 net-mgmt/bsnmptools 端口。从运行Net-SNMP的SNMP客户端,将以下行添加到 $HOME/.snmp/snmp.conf 中,以导入网桥MIB定义:
xxxxxxxxxxmibdirs +/usr/share/snmp/mibsmibs +BRIDGE-MIB:RSTP-MIB:BEGEMOT-MIB:BEGEMOT-BRIDGE-MIB要使用IETF BRIDGE-MIB(RFC4188)监视单个网桥,请执行以下操作:
xxxxxxxxxx% snmpwalk -v 2c -c public bridge1.example.com mib-2.dot1dBridgeBRIDGE-MIB::dot1dBaseBridgeAddress.0 = STRING: 66:fb:9b:6e:5c:44BRIDGE-MIB::dot1dBaseNumPorts.0 = INTEGER: 1 portsBRIDGE-MIB::dot1dStpTimeSinceTopologyChange.0 = Timeticks: (189959) 0:31:39.59 centisecondsBRIDGE-MIB::dot1dStpTopChanges.0 = Counter32: 2BRIDGE-MIB::dot1dStpDesignatedRoot.0 = Hex-STRING: 80 00 00 01 02 4B D4 50...BRIDGE-MIB::dot1dStpPortState.3 = INTEGER: forwarding(5)BRIDGE-MIB::dot1dStpPortEnable.3 = INTEGER: enabled(1)BRIDGE-MIB::dot1dStpPortPathCost.3 = INTEGER: 200000BRIDGE-MIB::dot1dStpPortDesignatedRoot.3 = Hex-STRING: 80 00 00 01 02 4B D4 50BRIDGE-MIB::dot1dStpPortDesignatedCost.3 = INTEGER: 0BRIDGE-MIB::dot1dStpPortDesignatedBridge.3 = Hex-STRING: 80 00 00 01 02 4B D4 50BRIDGE-MIB::dot1dStpPortDesignatedPort.3 = Hex-STRING: 03 80BRIDGE-MIB::dot1dStpPortForwardTransitions.3 = Counter32: 1RSTP-MIB::dot1dStpVersion.0 = INTEGER: rstp(2)dot1dStpTopChanges.0 值为 2 ,表示STP网桥拓扑已更改两次。拓扑更改意味着网络中的一个或多个链路已更改或发生故障,并且已计算出新的树。发生这种情况时, dot1dStpTimeSinceTopologyChange.0 值将显示出来。
要监视多个网桥接口,可以使用专用BEGEMOT-bridge-MIB:
xxxxxxxxxx% snmpwalk -v 2c -c public bridge1.example.comenterprises.fokus.begemot.begemotBridgeBEGEMOT-BRIDGE-MIB::begemotBridgeBaseName."bridge0" = STRING: bridge0BEGEMOT-BRIDGE-MIB::begemotBridgeBaseName."bridge2" = STRING: bridge2BEGEMOT-BRIDGE-MIB::begemotBridgeBaseAddress."bridge0" = STRING: e:ce:3b:5a:9e:13BEGEMOT-BRIDGE-MIB::begemotBridgeBaseAddress."bridge2" = STRING: 12:5e:4d:74:d:fcBEGEMOT-BRIDGE-MIB::begemotBridgeBaseNumPorts."bridge0" = INTEGER: 1BEGEMOT-BRIDGE-MIB::begemotBridgeBaseNumPorts."bridge2" = INTEGER: 1...BEGEMOT-BRIDGE-MIB::begemotBridgeStpTimeSinceTopologyChange."bridge0" = Timeticks: (116927) 0:19:29.27 centi-secondsBEGEMOT-BRIDGE-MIB::begemotBridgeStpTimeSinceTopologyChange."bridge2" = Timeticks: (82773) 0:13:47.73 centi-secondsBEGEMOT-BRIDGE-MIB::begemotBridgeStpTopChanges."bridge0" = Counter32: 1BEGEMOT-BRIDGE-MIB::begemotBridgeStpTopChanges."bridge2" = Counter32: 1BEGEMOT-BRIDGE-MIB::begemotBridgeStpDesignatedRoot."bridge0" = Hex-STRING: 80 00 00 40 95 30 5E 31BEGEMOT-BRIDGE-MIB::begemotBridgeStpDesignatedRoot."bridge2" = Hex-STRING: 80 00 00 50 8B B8 C6 A9要更改通过 mib-2.dot1dBridge 子树监视的网桥接口,请执行以下操作:
xxxxxxxxxx% snmpset -v 2c -c private bridge1.example.comBEGEMOT-BRIDGE-MIB::begemotBridgeDefaultBridgeIf.0 s bridge2FreeBSD提供了 lagg(4) 接口,可用于将多个网络接口聚合到一个虚拟接口中,以提供故障转移和链路聚合。只要至少有一个聚合网络接口建立了链接,故障转移就允许流量继续流动。链路聚合在支持LACP的交换机上效果最佳,因为该协议在响应单个链路故障的同时双向分配流量。
滞后接口支持的聚合协议决定了哪些端口用于传出流量,以及特定端口是否接受传入流量。 lagg(4) 支持以下协议:
failover
此模式仅通过主端口发送和接收流量。如果主端口不可用,则使用下一个活动端口。添加到虚拟接口的第一个接口是主端口,随后添加的所有接口都用作故障转移设备。如果发生故障转移到非主端口,则原始端口在再次可用后将成为主端口。
loadbalance
这提供了一种静态设置,不会与对等体协商聚合或交换帧来监视链路。如果交换机支持LACP,则应改用LACP。
lacp
IEEE®802.3ad链路聚合控制协议(Link Aggregation Control Protocol,LACP)将一组可聚合链路与对等方协商到一个或多个链路聚合组(Link Aggregated Groups,LAGs)中。每个LAG由相同速度的端口组成,设置为全双工操作,流量在LAG中总速度最大的端口之间平衡。通常,只有一个LAG包含所有端口。如果物理连接发生变化,LACP将迅速收敛到新的配置。
LACP根据散列的协议头信息在活动端口之间平衡传出流量,并接受来自任何活动端口的传入流量。散列包括以太网源和目标地址,如果可用,还包括VLAN标签以及IPv4或IPv6源和目的地址。
roundrobin
此模式使用轮询调度程序通过所有活动端口分配传出流量,并接受来自任何活动端口的传入流量。由于此模式违反了以太网帧顺序,因此应谨慎使用。
broadcast
此模式将传出流量发送到在滞后接口上配置的所有端口,并在任何端口上接收帧。
本节演示如何配置Cisco®交换机和FreeBSD系统以实现LACP负载平衡。然后,它展示了如何在故障转移模式下配置两个以太网接口,以及如何在以太网和无线接口之间配置故障转移模式。
此示例将FreeBSD机器上的两个 fxp(4) 以太网接口连接到Cisco®交换机上的前两个以太网端口,作为单个负载平衡和容错链路。可以添加更多接口以提高吞吐量和容错能力。替换示例中显示的Cisco®端口、以太网设备、通道组号和IP地址的名称,以匹配本地配置。
帧排序在以太网链路上是强制性的,两个站之间的任何流量总是通过同一物理链路流动,将最大速度限制在一个接口的速度。传输算法试图使用尽可能多的信息来区分不同的流量,并平衡可用接口上的流量。
在Cisco®交换机上,将 FastEthernet0/1 和 FastEthernet0/2 接口添加到通道组 1 :
xxxxxxxxxxinterface FastEthernet0/1 channel-group 1 mode active channel-protocol lacp!interface FastEthernet0/2 channel-group 1 mode active channel-protocol lacp在FreeBSD系统上,使用物理接口 fxp0 和 fxp1 创建 lagg(4) 接口,并将接口的IP地址设置为 10.0.0.3/24 :
xxxxxxxxxx# ifconfig fxp0 up# ifconfig fxp1 up# ifconfig lagg0 create# ifconfig lagg0 up laggproto lacp laggport fxp0 laggport fxp1 10.0.0.3/24接下来,验证虚拟接口的状态:
xxxxxxxxxx# ifconfig lagg0lagg0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=8<VLAN_MTU> ether 00:05:5d:71:8d:b8 inet 10.0.0.3 netmask 0xffffff00 broadcast 10.0.0.255 media: Ethernet autoselect status: active laggproto lacp laggport: fxp1 flags=1c<ACTIVE,COLLECTING,DISTRIBUTING> laggport: fxp0 flags=1c<ACTIVE,COLLECTING,DISTRIBUTING>标记为 ACTIVE 的端口是与远程交换机协商的LAG的一部分。流量将通过这些活动端口进行传输和接收。在上述命令中添加 -v 以查看LAG标识符。
要查看Cisco®交换机上的端口状态:
xxxxxxxxxxswitch# show lacp neighborFlags: S - Device is requesting Slow LACPDUs F - Device is requesting Fast LACPDUs A - Device is in Active mode P - Device is in Passive mode Channel group 1 neighborsPartner's information: LACP port Oper Port PortPort Flags Priority Dev ID Age Key Number StateFa0/1 SA 32768 0005.5d71.8db8 29s 0x146 0x3 0x3DFa0/2 SA 32768 0005.5d71.8db8 29s 0x146 0x4 0x3D有关更多详细信息,请键入 show lacp neighbor detail 。
要在重新启动时保留此配置,请在FreeBSD系统上的 /etc/rc.conf 中添加以下条目:
xxxxxxxxxxifconfig_fxp0="up"ifconfig_fxp1="up"cloned_interfaces="lagg0"ifconfig_lagg0="laggproto lacp laggport fxp0 laggport fxp1 10.0.0.3/24"如果主接口上的链路丢失,故障转移模式可用于切换到辅助接口。要配置故障转移,请确保底层物理接口已启动,然后创建 lagg(4) 接口。在这个例子中, fxp0 是主接口, fxp1 是辅助接口,虚拟接口被分配了 10.0.0.15/24 的IP地址:
xxxxxxxxxx# ifconfig fxp0 up# ifconfig fxp1 up# ifconfig lagg0 create# ifconfig lagg0 up laggproto failover laggport fxp0 laggport fxp1 10.0.0.15/24虚拟网卡应该看起来像这样:
xxxxxxxxxx# ifconfig lagg0lagg0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=8<VLAN_MTU> ether 00:05:5d:71:8d:b8 inet 10.0.0.15 netmask 0xffffff00 broadcast 10.0.0.255 media: Ethernet autoselect status: active laggproto failover laggport: fxp1 flags=0<> laggport: fxp0 flags=5<MASTER,ACTIVE>流量将在 fxp0 上传输和接收。如果链接在 fxp0 上丢失, fxp1 将成为活动链接。如果链接在主界面上恢复,它将再次成为活动链接。
要在重新启动后保留此配置,请在 /etc/rc.conf 中添加以下条目:
xxxxxxxxxxifconfig_fxp0="up"ifconfig_fxp1="up"cloned_interfaces="lagg0"ifconfig_lagg0="laggproto failover laggport fxp0 laggport fxp1 10.0.0.15/24"对于笔记本电脑用户,通常希望将无线设备配置为仅在以太网连接不可用时使用的辅助设备。使用 lagger(4) ,可以配置故障转移,出于性能和安全原因,该故障转移更倾向于以太网连接,同时保持通过无线连接传输数据的能力。
这是通过用无线接口的MAC地址覆盖以太网接口的MAC来实现的。
xxxxxxxxxx理论上,以太网或无线MAC地址都可以更改以匹配另一个。然而,一些流行的无线接口缺乏对覆盖MAC地址的支持。因此,我们建议为此重写以太网MAC地址。如果无线接口的驱动程序未加载到GENERIC或自定义内核中,并且计算机运行的是FreeBSD 12.1,请通过向该文件添加driver_load=“YES”并重新启动来加载/boot/loader.conf中的相应.ko。另一种更好的方法是在/etc/rc.conf中加载驱动程序,将其添加到该文件中的kld_list中(有关详细信息,请参阅rc.conf(5)),然后重新启动。这是必要的,因为否则在设置 lagg(4) 接口时,驱动程序尚未加载。在这个例子中,以太网接口 re0 是主接口,无线接口 wlan0 是故障转移。wlan0 接口是从 ath0 物理无线接口创建的,以太网接口将配置无线接口的MAC地址。首先,打开无线接口(用本地2个字母的国家代码替换FR),但不要设置IP地址。替换 wlan0 以匹配系统的无线接口名称:
xxxxxxxxxx# ifconfig wlan0 create wlandev ath0 country FR ssid my_router up确定无线接口的MAC地址,如下所示:
xxxxxxxxxx# ifconfig wlan0wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 ether b8:ee:65:5b:32:59 groups: wlan ssid Bbox-A3BD2403 channel 6 (2437 MHz 11g ht/20) bssid 00:37:b7:56:4b:60 regdomain ETSI country FR indoor ecm authmode WPA2/802.11i privacy ON deftxkey UNDEF AES-CCM 2:128-bit txpower 30 bmiss 7 scanvalid 60 protmode CTS ampdulimit 64k ampdudensity 8 shortgi -stbctx stbcrx -ldpc wme burst roaming MANUAL media: IEEE 802.11 Wireless Ethernet MCS mode 11ng status: associated nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>ether 行将包含指定接口的MAC地址。现在,更改以太网接口的MAC地址以匹配:
xxxxxxxxxx# ifconfig re0 ether b8:ee:65:5b:32:59确保 re0 接口已启动,然后创建以 re0 为主控、故障转移到 wlan0 的 lager(4) 接口:
xxxxxxxxxx# ifconfig re0 up# ifconfig lagg0 create# ifconfig lagg0 up laggproto failover laggport re0 laggport wlan0虚拟界面应该看起来像这样:
xxxxxxxxxx# ifconfig lagg0lagg0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=8<VLAN_MTU> ether b8:ee:65:5b:32:59 laggproto failover lagghash l2,l3,l4 laggport: re0 flags=5<MASTER,ACTIVE> laggport: wlan0 flags=0<> groups: lagg media: Ethernet autoselect status: active然后,启动DHCP客户端以获取IP地址:
xxxxxxxxxx# dhclient lagg0要在重新启动后保留此配置,请在 /etc/rc.conf 中添加以下条目:
xxxxxxxxxxifconfig_re0="ether b8:ee:65:5b:32:59"wlans_ath0="wlan0"ifconfig_wlan0="WPA"create_args_wlan0="country FR"cloned_interfaces="lagg0"ifconfig_lagg0="up laggproto failover laggport re0 laggport wlan0 DHCP"Intel®预引导执行环境(Preboot eXecution Environment,PXE)允许操作系统通过网络引导。例如,FreeBSD系统可以通过网络引导,并使用从NFS服务器安装的文件系统在没有本地磁盘的情况下运行。PXE支持通常在BIOS中可用。要在机器启动时使用PXE,请在BIOS设置中选择 Boot from network 选项,或在系统初始化期间键入功能键。
为了提供操作系统通过网络启动所需的文件,PXE设置还需要正确配置的DHCP、TFTP和NFS服务器,其中:
当计算机PXE启动时,它通过DHCP接收有关从何处获取初始引导加载程序文件的信息。主机收到此信息后,它通过TFTP下载引导加载程序,然后执行引导加载程序。在FreeBSD中,引导加载程序文件是 /boot/pxeboot 。在 /boot/pxeboot 执行后,FreeBSD内核被加载,其余的FreeBSD引导序列继续进行,如【15. FreeBSD引导过程】中所述。
xxxxxxxxxx对于基于UEFI PXE的引导,要使用的实际引导加载程序文件是/boot/loader.efi。请参阅下面的【34.10.3. 调试PXE问题】一节,了解如何使用/boot/loader.efi。本节介绍如何在FreeBSD系统上配置这些服务,以便其他系统可以PXE引导到FreeBSD。有关更多信息,请参阅 diskless(8) 。
xxxxxxxxxx如上所述,提供这些服务的系统是不安全的。它应该位于网络的受保护区域,并且不受其他主机的信任。本节中显示的步骤配置内置NFS和TFTP服务器。下一节将演示如何安装和配置DHCP服务器。在这个例子中,包含PXE用户使用的文件的目录是 /b/tftpboot/FreeBSD/install 。重要的是,此目录存在,并且在 /etc/inetd.conf 和 /usr/local/etc/dhcpd.conf 中设置相同的目录名。
xxxxxxxxxx下面的命令示例假设使用sh(1) shell。csh(1)和tcsh(1)用户将需要启动sh(1)。创建包含要NFS挂载的FreeBSD安装的根目录:
xxxxxxxxxx# export NFSROOTDIR=/b/tftpboot/FreeBSD/install# mkdir -p ${NFSROOTDIR}通过将此行添加到 /etc/rc.conf 来启用NFS服务器:
xxxxxxxxxxnfs_server_enable="YES"通过在 /etc/exports 中添加以下内容,通过NFS导出无盘根目录:
xxxxxxxxxx/b -ro -alldirs -maproot=root启动NFS服务器:
xxxxxxxxxx# service nfsd start通过在 /etc/rc.conf 中添加以下行来启用 inetd(8) :
xxxxxxxxxxinetd_enable="YES"在 /etc/inetd.conf 中取消注释以下行,确保其不以 # 符号开头:
xxxxxxxxxxtftp dgram udp wait root /usr/libexec/tftpd tftpd blocksize 1468 -l -s /b/tftpbootxxxxxxxxxx指定的tftp块大小(例如1468字节)将替换默认大小512字节。某些PXE版本需要TCP版本的TFTP。在这种情况下,取消注释包含流tcp的第二行tftp。启动 inetd(8) :
xxxxxxxxxx# service inetd start通过解压缩官方档案或重建FreeBSD内核和用户区,将基本系统安装到 ${NFSROOTDIR} 中(有关更详细的说明,请参阅【26.6. 从源代码更新FreeBSD】,但在运行 make installkernel 和 make installworld 命令时,不要忘了添加 DESTDIR=${NFSROOTDIR} 。
测试TFTP服务器是否正常工作,是否可以下载将通过PXE获得的引导加载程序:
xxxxxxxxxx# tftp localhosttftp> get FreeBSD/install/boot/pxebootReceived 264951 bytes in 0.1 seconds编辑 ${NFSROOTDIR}/etc/fstab 并创建一个条目以通过NFS挂载根文件系统:
xxxxxxxxxx# Device Mountpoint FSType Options Dump Passmyhost.example.com:/b/tftpboot/FreeBSD/install / nfs ro 0 0将 myhost.example.com 替换为NFS服务器的主机名或IP地址。在此示例中,根文件系统以只读方式挂载,以防止NFS客户端删除根文件系统的内容。
在PXE环境中为正在PXE启动的客户端计算机设置根密码:
xxxxxxxxxx# chroot ${NFSROOTDIR}# passwd如果需要,通过编辑 ${NFSROOTDIR}/etc/ssh/sshd_config 并启用 PermitRootLogin ,为正在PXE启动的客户端计算机启用 ssh(1) 根登录。此选项记录在 sshd_config(5) 中。
在 ${NFSROOTDIR} 中执行PXE环境的任何其他所需自定义。这些定制可能包括安装软件包或使用 vipw(8) 编辑密码文件。
从NFS根卷启动时, /etc/rc 检测到NFS启动并运行 /etc/rc.initdiskless 。在这种情况下, /etc/var 需要是内存支持的文件系统,这样这些目录是可写的,但NFS根目录是只读的:
xxxxxxxxxx# chroot ${NFSROOTDIR}# mkdir -p conf/base# tar -c -v -f conf/base/etc.cpio.gz --format cpio --gzip etc# tar -c -v -f conf/base/var.cpio.gz --format cpio --gzip var当系统启动时,将创建并挂载 /etc/var 的内存文件系统,并将 cpio.gz 文件的内容复制到其中。默认情况下,这些文件系统的最大容量为5兆字节。如果档案不适合,这通常是安装二进制包时 /var/var 的情况,请通过将所需的512字节扇区数(例如,5兆字节是10240个扇区)分别放在 /etc/var 文件系统的 ${NFSROOTDIR}/conf/base/etc/md_size 和 ${NFSREOTDIR}/conf-base/var/md_size 文件中来请求更大的大小。
DHCP服务器不需要与TFTP和NFS服务器是同一台机器,但它需要在网络中可访问。
DHCP不是FreeBSD基础系统的一部分,但可以使用 net/isc-dhcp44-server 端口或软件包安装。
安装后,编辑配置文件 /usr/local/etc/dhcpd.conf 。配置下一个服务器、文件名和根路径设置,如本例所示:
xxxxxxxxxxsubnet 192.168.0.0 netmask 255.255.255.0 { range 192.168.0.2 192.168.0.3 ; option subnet-mask 255.255.255.0 ; option routers 192.168.0.1 ; option broadcast-address 192.168.0.255 ; option domain-name-servers 192.168.35.35, 192.168.35.36 ; option domain-name "example.com"; # IP address of TFTP server next-server 192.168.0.1 ; # path of boot loader obtained via tftp filename "FreeBSD/install/boot/pxeboot" ; # pxeboot boot loader will try to NFS mount this directory for root FS option root-path "192.168.0.1:/b/tftpboot/FreeBSD/install/" ;}next-server 指令用于指定TFTP服务器的IP地址。
filename 指令定义了/boot/pxeboot的路径。使用相对文件名,这意味着/b/tftpboot不包含在路径中。
root-path 选项定义了NFS根文件系统的路径。
保存编辑后,在启动时通过在 /etc/rc.conf 中添加以下行来启用DHCP:
xxxxxxxxxxdhcpd_enable="YES"然后启动DHCP服务:
xxxxxxxxxx# service isc-dhcpd start配置并启动所有服务后,PXE客户端应该能够通过网络自动加载FreeBSD。如果特定客户端无法连接,当该客户端机器启动时,进入BIOS配置菜单并确认其设置为从网络启动。
本节介绍了一些故障排除技巧,用于在没有客户端能够PXE启动的情况下隔离配置问题的根源。
使用 net/wireshark 包或端口调试PXE启动过程中涉及的网络流量,如下图所示。

filename ,即 pxeboot(8) ,然后加载内核。当内核执行时,根路径指定的根文件系统通过NFS挂载。在TFTP服务器上,读取 /var/log/xferlog 以确保从正确位置检索到pxeboot。要测试此示例配置:
xxxxxxxxxx# tftp 192.168.0.1tftp> get FreeBSD/install/boot/pxebootReceived 264951 bytes in 0.1 secondstftpd(8) 和 tftp(1) 中的BUGS部分记录了TFTP的一些局限性。
确保可以通过NFS挂载根文件系统。要测试此示例配置:
xxxxxxxxxx# mount -t nfs 192.168.0.1:/b/tftpboot/FreeBSD/install /mnt对于基于UEFI PXE的引导,请将 boot/pxeboot 文件替换为 boot/loader.efi 文件:
xxxxxxxxxx# chroot ${NFSROOTDIR}# mv boot/pxeboot boot/pxeboot.original# cp boot/loader.efi boot/pxeboot公共地址冗余协议(Common Address Redundancy Protocol,CARP)允许多个主机共享相同的IP地址和虚拟主机ID(Virtual Host ID,VHID),以便为一个或多个服务提供高可用性(high availability)。这意味着一个或多个主机可能会发生故障,其他主机将透明地接管,这样用户就不会看到服务故障。
除了共享IP地址外,每个主机都有自己的IP地址用于管理和配置。共享IP地址的所有机器都具有相同的VHID。每个虚拟IP地址的VHID在网络接口的广播域中必须是唯一的。
FreeBSD内置了使用CARP的高可用性,尽管配置它的步骤因FreeBSD版本而异。本节为FreeBSD 10之前和之后的版本提供了相同的示例配置。
此示例使用三台主机配置故障转移支持,所有主机都具有唯一的IP地址,但提供相同的web内容。它有两个不同的主机名为 hosta.example.org 和 hostb.example.org ,并有一个名为 hostc.example.org 的共享备份。
这些机器使用轮转DNS配置进行负载平衡。除了主机名和管理IP地址之外,主计算机和备份计算机的配置完全相同。这些服务器必须具有相同的配置并运行相同的服务。发生故障转移时,只有备份服务器可以访问相同的内容,才能正确应答对共享IP地址上的服务的请求。备份机器有两个额外的CARP接口,每个主内容服务器的IP地址对应一个。当发生故障时,备份服务器将获取故障主机的IP地址。
通过在 /boot/loader.conf 中为CARP.ko内核模块添加一个条目来启用CARP的引导时支持:
xxxxxxxxxxcarp_load="YES"要立即加载模块而不重新启动,请执行以下操作:
xxxxxxxxxx# kldload carp对于喜欢使用自定义内核的用户,请在自定义内核配置文件中包含以下行,并按照【10. 配置FreeBSD内核】中的描述编译内核:
xxxxxxxxxxdevice carp主机名、管理IP地址和子网掩码、共享IP地址和VHID都是通过在 /etc/rc.conf 中添加条目来设置的。此示例适用于 hosta.example.org :
xxxxxxxxxxhostname="hosta.example.org"ifconfig_em0="inet 192.168.1.3 netmask 255.255.255.0"ifconfig_em0_alias0="inet vhid 1 pass testpass alias 192.168.1.50/32"下一组条目是 hostb.example.org 。由于它代表第二个主节点,因此它使用了不同的共享IP地址和VHID。但是,使用 pass 指定的密码必须相同,因为CARP只会监听和接受来自具有正确密码的机器的广告。
xxxxxxxxxxhostname="hostb.example.org"ifconfig_em0="inet 192.168.1.4 netmask 255.255.255.0"ifconfig_em0_alias0="inet vhid 2 pass testpass alias 192.168.1.51/32"第三台机器 hostc.example.org 被配置为处理来自任一主机的故障转移。此机器配置了两个CARPVHID,一个用于处理每个主主机的虚拟IP地址。设置CARP播发偏斜 advskew 是为了确保备份主机比主服务器晚播发,因为 advskew 控制着有多个备份服务器时的优先级顺序。
xxxxxxxxxxhostname="hostc.example.org"ifconfig_em0="inet 192.168.1.5 netmask 255.255.255.0"ifconfig_em0_alias0="inet vhid 1 advskew 100 pass testpass alias 192.168.1.50/32"ifconfig_em0_alias1="inet vhid 2 advskew 100 pass testpass alias 192.168.1.51/32"配置两个CARPVHID意味着 hostc.example.org 将注意到是否有任何一个主服务器不可用。如果主服务器未能在备份服务器之前进行通告,备份服务器将获取共享IP地址,直到主服务器再次可用。
xxxxxxxxxx如果原始主服务器再次可用,hostc.example.org将不会自动将虚拟IP地址释放回它。为了实现这一点,必须启用抢占。默认情况下,该功能处于禁用状态,通过sysctl(8)变量net.inet.carp.prempt进行控制。管理员可以强制备份服务器将IP地址返回给主机: # ifconfig em0 vhid 1 state backup配置完成后,重新启动网络或重新启动每个系统。现在已启用高可用性。
CARP功能可以通过 cap(4) 手册页中记录的几个 sysctl(8) 变量进行控制。使用 devd(8) 可以从CARP事件触发其他操作。
VLAN是一种将网络虚拟划分为许多不同子网络的方法,也称为分段。每个网段都有自己的广播域,并与其他VLAN隔离。
在FreeBSD上,网卡驱动程序必须支持VLAN。要查看哪些驱动程序支持vlan,请参阅 vlan(4) 手册页。
配置VLAN时,必须知道几条信息。首先,哪个网络接口?第二,什么是VLAN标签?
要在运行时配置VLAN,NIC为 em0 ,VLAN标签为 5 ,命令如下:
xxxxxxxxxx# ifconfig em0.5 create vlan 5 vlandev em0 inet 192.168.20.20/24xxxxxxxxxx请查看接口名称如何包含NIC驱动程序名称和VLAN标签,并用句点分隔?当机器上存在许多VLAN时,这是一种使维护VLAN配置变得容易的最佳做法。xxxxxxxxxx定义VLAN时,请确保父网络接口也已配置和启用。上述示例的最低配置为: # ifconfig em0 up要在启动时配置VLAN,必须更新 /etc/rc.conf 。要复制上述配置,需要添加以下内容:
xxxxxxxxxxvlans_em0="5"ifconfig_em0_5="inet 192.168.20.20/24"可以添加其他VLAN,只需将标签添加到 vlans_em0 字段,并在该VLAN标签的接口上添加配置网络的额外线路。
xxxxxxxxxx在/etc/rc.conf中定义VLAN时,请确保父网络接口也已配置和启用。上述示例的最低配置为: ifconfig_em0="up"为接口分配一个符号名称是有用的,这样当相关硬件发生变化时,只需要更新几个配置变量。例如,安全摄像头需要在 em0 上的VLAN 1上运行。稍后,如果将 em0 卡替换为使用 ixgb(4) 驱动程序的卡,则所有对 em0.1 的引用都不必更改为 ixgb0.1 。
要配置VLAN 5 ,请在NIC em0 上分配接口名称摄像头,并为接口分配一个带有 24 位前缀的 192.168.20.20 IP地址,使用以下命令:
xxxxxxxxxx# ifconfig em0.5 create vlan 5 vlandev em0 name cameras inet 192.168.20.20/24对于名为 video 的接口,请使用以下命令:
xxxxxxxxxx# ifconfig video.5 create vlan 5 vlandev video name cameras inet 192.168.20.20/24要在启动时应用更改,请在 /etc/rc.conf 中添加以下行:
xxxxxxxxxxvlans_video="cameras"create_args_cameras="vlan 5"ifconfig_cameras="inet 192.168.20.20/24"