macOS Catalina(10.15.5)用蓝牙PAN共享Wi-Fi上网

今天有需要共享上网进行抓包分析报文的情况。

研究了一下`MacBook Pro`(`macOS Catalina(10.15.5)`)如何通过`蓝牙PAN`(`Bluetooth PAN`)来共享笔记本连接的`Wi-Fi`网络出来,让手机通过共享出来的蓝牙热点来上网的方法。

由于`蓝牙PAN`(`Bluetooth PAN`)本质属于局域网转发,起到一个简单网关的作用。因此我们需要设置蓝牙设备的`IP`地址跟需要共享的`Wi-Fi`网卡相同。

具体操作如下:

1. 记录需要共享的`Wi-Fi`网络的`IP`、网关

2. 配置蓝牙设备网络的`IP`、网关

3. 配置开启蓝牙共享

4. 手机完成蓝牙配对之后,开启 `互联网访问`功能

如果上述配置之后,还是不能上网,则尝试进行`WireShark`抓包,主要观察`DHCP`协议部分,如下图:

从上图可以看到,某个服务响应了来自小米手机的`DHCP`请求,并且回复了一个`192.168.2.3`的地址给手机。显然这个地址是没办法让手机上网的。

我们查询响应这个网络报文的应用信息:

$ sudo lsof -i:67
COMMAND PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
launchd   1 root   47u  IPv4 0x8f74f5510ced982b      0t0  UDP *:bootps
launchd   1 root   49u  IPv4 0x8f74f5510ced982b      0t0  UDP *:bootps

可以看到一个名为`bootps`的应用在67端口上进行了侦听,并且响应了这个请求。

这个是网络共享创建的默认的`DHCP`服务器(参考下面的"_creator"字段),配置文件信息如下:

$ cat /private/etc/bootpd.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Subnets</key>
	<array>
		<dict>
			<key>_creator</key>
			<string>com.apple.NetworkSharing</string>
			<key>allocate</key>
			<true/>
			<key>dhcp_domain_name_server</key>
			<array>
				<string>192.168.2.1</string>
			</array>
			<key>dhcp_router</key>
			<string>192.168.2.1</string>
			<key>interface</key>
			<string>bridge100</string>
			<key>lease_max</key>
			<integer>86400</integer>
			<key>lease_min</key>
			<integer>86400</integer>
			<key>name</key>
			<string>192.168.2/24</string>
			<key>net_address</key>
			<string>192.168.2.0</string>
			<key>net_mask</key>
			<string>255.255.255.0</string>
			<key>net_range</key>
			<array>
				<string>192.168.2.2</string>
				<string>192.168.2.254</string>
			</array>
		</dict>
	</array>
	<key>bootp_enabled</key>
	<false/>
	<key>detect_other_dhcp_server</key>
	<array>
		<string>bridge100</string>
	</array>
	<key>dhcp_enabled</key>
	<array>
		<string>bridge100</string>
	</array>
	<key>dhcp_ignore_client_identifier</key>
	<true/>
	<key>ignore_allow_deny</key>
	<array>
		<string>bridge100</string>
	</array>
	<key>use_server_config_for_dhcp_options</key>
	<false/>
</dict>
</plist>

网上介绍都是需要修改这里面的配置,然后重启。其实本质原因是配置信息没有更新到系统,完全不需要修改配置文件。只需要重新启动一下服务即可,如下:

$ sudo /bin/launchctl unload -w /System/Library/LaunchDaemons/bootps.plist

$ sudo /bin/launchctl load -w /System/Library/LaunchDaemons/bootps.plist

操作之后,需要断开蓝牙,重新连接。

目前测试发现,Honor 30/Android 10.0.0,MI NOTE LTE/Android 6.0.1,HonorV8/Android 8.0.0 都不能立即正常上网,需要折腾好几次才可能能用。

但是有时候先让Honor 30/Android 10.0.0连接成功之后,再让MI NOTE LTE/Android 6.0.1,HonorV8/Android 8.0.0连接蓝牙,就立即可以正常上网了,有些莫名其妙。

有时候多个设备同时连接的情况下,第一个设备不能正常上网,后面连接的设备都可以,再次断开第一个重新连接,又都正常了。感觉还是协议栈不够稳定。

参考链接


发布者

《macOS Catalina(10.15.5)用蓝牙PAN共享Wi-Fi上网》上有3条评论

  1. 我用两台android手机测试,发现确实第一台连接的设备上不了网,第二台连接后可以上网,然后wireshare抓bluetooth PAN,不管能不能上网的设备,DHCP分配到的ip都是192.168.2.x,按你上面说的重启服务,重新连接也不行。
    1. 这个现象我也解释不了,只能说这最大的可能是系统的BUG,另外这样上网网速太慢了,后来也没怎么折腾了
      1. 并不是要通过这样的方式持续上网,是因为在某些场景特殊需要才这样选择的。感觉确实是苹果系统的bug,找苹果技术支持了,看下会怎么回应。

回复 默默 取消回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注