今天有需要共享上网进行抓包分析报文的情况。
研究了一下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
的地址给手机。显然这个地址是没办法让手机上网的。
我们查询响应这个网络报文的应用信息:
1 2 3 4 |
$ 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"字段),配置文件信息如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
$ 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> |
网上介绍都是需要修改这里面的配置,然后重启。其实本质原因是配置信息没有更新到系统,完全不需要修改配置文件。只需要重新启动一下服务即可,如下:
1 2 3 |
$ 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连接蓝牙,就立即可以正常上网了,有些莫名其妙。
有时候多个设备同时连接的情况下,第一个设备不能正常上网,后面连接的设备都可以,再次断开第一个重新连接,又都正常了。感觉还是协议栈不够稳定。
现在的新系统好像不行了,你这个是老版本的系统。