您的个人区域网络是否让您感到 BlueZ 困扰?
蓝牙技术已经出现一段时间了(最初由爱立信在 1994 年构思,作为 RS-232 的替代品),我们中的许多人一直在享受无线连接鼠标、键盘、耳机、手机、打印机、PDA 和其他设备在短距离内的便利。
在 Linux 系统下,这些便利由两种蓝牙实现之一提供:BlueZ 和 Affix。前者已成为大多数流行发行版接受的标准,也是我在此处讨论的实现。
在 BlueZ 4 版本之前的版本中,各种蓝牙服务(称为配置文件)在单独的守护进程中实现,每个守护进程都有自己的配置。PAN 配置文件提供个人区域网络服务,在 pand 守护进程中实现;拨号网络在 dund 守护进程中实现;服务发现在 sdpd 守护进程中实现,依此类推。在 BlueZ v.4 中,所有这些都被整合到一个名为 bluetoothd 的服务器进程中。这一变化导致用户产生了一定的困惑,因此本文的目的是通过研究 PAN 配置文件在 BlueZ v.4 中的工作方式,尝试在一定程度上澄清情况。
PAN 配置文件提供了三种连接蓝牙设备的方式,使其成为能够在 TCP/IP 上承载通用协议和服务的网络。这种网络被称为微微网,因为它们最多只能连接七个节点,并且受到蓝牙传输短距离(最远十米)的限制。这些配置包括 PANU、群组自组织网络 (GN) 和网络接入点 (NAP) 配置。PANU<--->PANU 网络类似于两台计算机之间通过以太网交叉电缆连接的无线模拟。PANU<--->GN 网络的工作方式就像 Wi-Fi 自组织设置,其中一个节点充当主节点,在一个隔离的专用网络中连接最多六个客户端节点;而 PANU<--->NAP 提供网络基础设施连接,方式与 802.11 Wi-Fi 接入点为 Wi-Fi 客户端提供连接的方式相同。NAP 可以像 GN 主节点一样为六个客户端节点提供服务,同时还将它们连接到现有的网络基础设施。NAP 服务是这三种连接模式中最有用的,并且包含了其他两种模式。因此,如果您能够让 NAP 工作,那么通过省略 NAP 设置中的某些步骤,相对容易实现其他配置。
蓝牙守护进程加载所有必需的内核模块(lsmod 命令应显示 bluetooth、rfcomm、btusb、llc、sco、bridge、bnep、stp 和 l2cap 正在运行),并创建一个名为 pan0 的桥接主机接口。bnep 协议通过蓝牙 l2cap 连接提供以太网服务,并且为每个连接的远程设备按需创建一个单独的 bnep 接口(bnep0、bnep1...bnepN)。bnep 接口自动桥接到 pan0 接口,pan0 接口充当它们的 IP 代理。因此,只有 pan0 接口需要 IP 配置。一旦您将远程蓝牙设备与 Linux 盒子配对,并发现 BlueZ NAP 服务并连接/验证到该服务,剩下的就是为连接的设备和所需的基础设施网络连接提供 IP 配置。这部分内容让许多热衷于 BlueZ 的人感到困惑。在这里,我将考虑两种解决方案:桥接设置和路由设置。
在许多方面,桥接解决方案是两种方案中更简单的一种。它涉及的步骤更少,并且意味着您的 NAP 和远程蓝牙设备将成为您现有 IP 网络/子网的一部分。但是,如果您没有现有的专用网络/子网,因为您的 Linux 盒子直接连接到您的 ISP(例如,通过以太网电缆连接到 ADSL 路由器),或者您的 Linux 盒子通过 802.11 Wi-Fi 连接连接到您现有的专用网络/子网,那么路由解决方案是唯一的选择。您需要一个专用 IP 子网,从中为您的远程 BT 设备分配地址,但是您无法通过 wlan0 (802.11 Wi-Fi) 接口桥接到此子网,因为无线设备的第 2 层对于内核桥接设施不可用。如果没有桥接,您将需要一个单独的 IP 网络/子网、路由和路由信息,但幸运的是,这并不难安排。
假设您已安装 BlueZ 4。如果未安装,请使用您的发行版的安装软件进行安装。您将需要 BlueZ 和 BlueZ-libs 软件包的 4 版本。BlueZ 内核模块已集成到 2.4 和 2.6 内核中。gnome-bluetooth 软件包还提供了一个有用的工具,即 BT 面板小程序,允许从桌面进行控制,从而允许您配对设备和设置服务发现。KDE 提供了类似的工具,kbluetooth。以正常方式启动蓝牙守护进程,并从 shell 执行 bluetooth-applet。在 bluetooth-applet 中启用服务发现,并将远程 BT 设备引入范围。现在您应该能够从远程设备发现 BlueZ-NAP 服务。如果您不使用 GNOME 或 KDE 桌面,则可以通过 hciconfig 和 hcitool 实用程序进行设备配对和服务发现,这些实用程序是 BlueZ 软件包的一部分。
如果您正在遵循此解决方案,我将假设您有一个 ISP 分配的、可路由的 IP 地址,用于提供您的互联网连接(图 1)。您的本地专用网络(例如 192.168.0.0/24)使用路由器提供的网络地址转换 (NAT) 通过您的 ISP 连接访问互联网,并且您希望 BT 连接的 Linux 盒子通过 eth0 接口连接到以太网交换机,从而连接到专用网络。如果所有这些都属实,那么您离桥接 NAP 解决方案只有三个步骤了
使您的 eth0 接口成为 pan0 网桥的一部分。
为 pan0 接口配置 IP。
为远程 BT 设备提供 IP 配置。
您可以使用 brctl 命令来实现第一步
brctl show (display any extant bridges - should show pan0) brctl add pan0 eth0 (add the eth0 interface to the pan0 bridge) brctl showmacs pan0 (show which interfaces are bridged)
您可以使用 ifconfig 暂时实现步骤 1
ifconfig pan0 192.168.0.123 netmask 255.255.255.0 ↪broadcast 192.168.0.255 up
使用您的发行版的网络管理工具创建永久配置,并选择适合您自己的专用网络拓扑的 IP 值。
步骤三最简洁的解决方案是运行一个小型 DHCP 服务。如果您已经为自己的专用网络运行 DHCP,您只需确保配置涵盖您可能连接的任何远程 BT 设备以及已连接的客户端。pan0 接口也可以通过这种方式获取其 IP 配置。如果您尚未运行 DHCP,那么现在可能是开始运行的好时机!设置一个简单的服务并不困难,并且可以减少一般的、例行的手动配置量。
以下是一个简单的 dhcpd.conf 文件,足以服务于我们的 PAN
# small DHCP config for bluetooth PAN ddns-update-style none; authoritative; subnet 192.168.0.0 netmask 255.255.255.0 { range 192.168.0.10 192.168.0.100; option domain-name-servers 192.168.0.1; option domain-name "bluetooth.net"; option routers 192.168.0.1; option broadcast-address 192.168.0.255; default-lease-time 600; max-lease-time 7200; host btmobile { hardware ethernet 74:e7:71:ac:d0:34; fixed-address 192.168.0.9; } }
Thesubnet声明应与您的本地专用网络拓扑结构相对应。Therange声明指定一个可以动态分配的 IP 地址池。Theoptions指定 DNS 服务器(这可能是您的 ISP 的名称服务器)、默认网关(NAT 路由器)和其他常见的 IP 参数。Thehost声明允许您为已知(通过 MAC 地址)设备分配固定的 IP 地址。将此文件放在您的 DHCP 服务器期望找到它的位置,并通过适合您的发行版的方法启动服务器。
毋庸置疑,您的远程 BT 设备和 pan0 接口应配置为通过 DHCP 获取其 IP 配置。一旦所有这些都就位,您的 NAP 应该在您将 BT 设备连接/验证到 Linux 盒子后几秒钟内激活。
对于路由解决方案,您需要为您的 PAN 创建一个单独的网络/子网,并在该网络/子网与现有的专用网络/ISP 连接的机器之间路由数据包。在此配置中,pan0 将成为默认网关设备,并为 PAN 提供 DHCP 服务。因此,pan0 将需要静态 IP 配置,并且其 DHCP 服务将与任何其他 DHCP 服务分离,并专用于 PAN。为了清晰起见,让我们为此目的使用 10.0.0.0/24 专用 IP 网络范围。这一次,有四个步骤可以使您的路由 PAN 启动并运行
使用静态 IP 信息配置 pan0。
为 PAN 配置和运行 DHCP。
打开 IP 转发以在 pan0 和 wlan0/eth0 之间路由数据包。
在 wlan0/eth0 接口上启用 NAT。
然后
ifconfig pan0 10.0.0.1 netmask 255.255.255.0 ↪broadcast 10.0.0.255 up
使用您的系统工具进行永久设置。
以下是路由 PAN 的小型 DHCP 配置
# small dhcp config for bluetooth PAN ddns-update-style none; authoritative; subnet 10.0.0.0 netmask 255.255.255.0 { range 10.0.0.10 10.0.0.100; option domain-name-servers 192.168.0.1; option domain-name "bluetooth.net"; option routers 10.0.0.1; option broadcast-address 10.0.0.255; default-lease-time 600; max-lease-time 7200; host btmobile { hardware ethernet 78:e7:d1:ab:d5:6f; fixed-address 10.0.0.5; } }
根据需要更改 DNS 信息。
pan0 应在启动 DHCP 服务之前配置并运行。下一步涉及启用 IP 转发,以便数据包在 pan0 和您现有的接口(wlan0/eth0)之间路由。
在较旧的系统中,可以通过将值“1”回显到相应的系统文件中来启用 IP 转发
echo 1 > /proc/sys/net/ipv4/ip_forward
在较新的系统中,可以通过编辑 /etc/sysctl.conf 来实现此目的
# Controls IP packet forwarding net.ipv4.ip_forward = 1
该设置也可能在您的发行版的防火墙配置 GUI 工具中可用。如果这些方法在您的系统上均不起作用,请查阅您的发行版的文档。
最后,您需要告诉内核 netfilter 软件通过 wlan0/eth0 接口“伪装”(NAT)PAN 数据包。您可以使用您的发行版的防火墙配置 GUI 工具来执行此操作(IP 转发设置也可能在此处可用)。如果不是,可以使用 iptables 命令来实现
iptables -A POSTROUTING -t nat -o wlan0 -j MASQUERADE
替换eth0为wlan0如果您使用路由选项,因为您的 Linux 盒子直接连接到您的 ISP,并且您的 eth0 接口具有 ISP 分配的、可路由的 IP 地址(图 2)。
如果到目前为止一切顺利,您的 NAP 服务应该在您连接/验证您的远程 BT 设备后几秒钟内激活。例如,您应该能够从您的 Linux 盒子 ping 该设备。如果 IP 尚未运行,您可以使用l2ping <MAC 地址>来 ping 远程设备。
BlueZ v.4 似乎没有为 PAN 操作的 GN 和 PANU 模式提供单独的配置,但这无关紧要,因为如上所述,这些模式已被 NAP 模式包含。如果您只想将远程 BT 设备连接到您的 Linux 盒子,并且不需要访问本地网络或互联网,您可以简单地从桥接解决方案中省略步骤 1,并采用路由解决方案中的 DHCP 配置,或者手动为 pan0 和您的 BT 设备设置 IP 参数。
实际上,蓝牙应该实现链路本地自动配置协议草案(在其他地方也称为 Avahi、Bonjour、Rendezvouz 和 APIPA),因此您可以尝试使用它进行 IP 配置,而不是运行 DHCP 服务。但是,我在 BlueZ v.4 下使用此方法时没有成功,因此我将其留作那些具有实验性质的人的潜在解决方案。如果有人在我失败的地方取得成功,我将很高兴听到此功能在 BlueZ 软件包中仍然存在并且运行良好。
对于那些想要保留配置和运行蓝牙设施的旧方法的人,开发团队以软件包的形式提供了旧版实现,该软件包包含 BlueZ 3.x 中提供的单独守护进程。此软件包称为 Bluez-compat,应该可以满足您当中抵制改变的人。Michael Schmidt(请参阅资源)制作了一份有用的操作指南文档,涵盖了旧版格式。
我总是非常不愿意批评免费和开源软件的开发人员。人们太容易忘记或认为理所当然的是,像 BlueZ 这样的项目投入了大量专注的工作,并且会因为小错误和缺少的功能而抱怨和发牢骚。总的来说,我对这些出色的人们只有敬佩之情。但是,如果我可以温和而谦逊地提出一点,那就是 BlueZ 的文档似乎非常匮乏。事实上,这正是促使我首先撰写这篇文章的原因(例如,/etc/bluetooth/main.conf 文件没有手册页)。无论如何,让我们希望这只是发展卓越记录中暂时的故障。
资源
Michael Schmidt 撰写的“如何使用 BlueZ 的集成 PAN 支持设置常见的 PAN 场景”:bluez.sourceforge.net/contrib/HOWTO-PAN
个人区域网络配置文件,版本 1.0:www.bluetooth.com/SiteCollectionDocuments/PAN_SPEC_V11.pdf
Chuck Elliot 博士是谢菲尔德哈勒姆大学网络与信息系统安全首席讲师,也是红帽认证工程师。