藍牙個人區域網 (PAN) 透過 BNEP (Bluetooth Network Encapsulation Protocol) 實現 IPv6/IPv4 封包在藍牙鏈路上傳輸,適合無 Wi-Fi 環境下設備間檔案傳輸、網路共享。本文記錄雙 Linux 系統建立 NAP (Network Access Point) / PANU 角色連線、IP 設定與 iptables 共享上網全流程。
# 安裝藍牙協議棧工具 (Debian/Ubuntu)
sudo apt-get install bluez bluez-tools
# 載入 BNEP 核心模組
sudo modprobe bnep
# 開機自動載入
echo "bnep" | sudo tee /etc/modules-load.d/bnep.conf
# 1. 啟用藍牙介面並設為可被發現/連接
sudo hciconfig hci0 up piscan
# 2. 確認介面狀態
hciconfig -a
# 應顯示 UP RUNNING PSCAN ISCAN
# 監聽連線,扮演 NAP 角色
sudo pand --listen --role NAP --master
# 主動連線主機 MAC (以 00:11:67:46:4E:4E 為例)
sudo pand --connect 00:11:67:46:4E:4E --role PANU --service NAP
--service NAP 指定連接 NAP 服務 (預設即為 NAP)。
pand -l
# 輸出應包含:
# bnep0 00:11:67:46:4E:4E PANU
# 表示 bnep0 介面已建立,對端 MAC 為主機
sudo ifconfig bnep0 10.10.106.1 netmask 255.255.255.0 up
sudo ifconfig bnep0 10.10.106.2 netmask 255.255.255.0 up
# 客戶端 ping 主機
ping 10.10.106.1
# 主機 ping 客戶端
ping 10.10.106.2
sudo route add default gw 10.10.106.1
#!/bin/bash
# 保存為 /usr/local/bin/bt-nat.sh, chmod +x
IPTABLES=/usr/sbin/iptables
EXTIF=ppp0 # 主機連外網介面 (如 ppp0/eth0/wlan0)
INTIF=bnep0 # 藍牙 PAN 介面
# 1. 開啟核心 IP 轉發
echo 1 > /proc/sys/net/ipv4/ip_forward
# 2. 清空現有規則
$IPTABLES -F
$IPTABLES -X
$IPTABLES -t nat -F
$IPTABLES -t nat -X
# 3. NAT 偽裝 (MASQUERADE 適用動態 IP 介面)
$IPTABLES -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE
# 4. 轉發鏈:允許來自 bnep0 的新建立/已建立連線流向外網
$IPTABLES -A FORWARD -i $INTIF -o $EXTIF -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
# 允許回應流量返回
$IPTABLES -A FORWARD -i $EXTIF -o $INTIF -m state --state ESTABLISHED,RELATED -j ACCEPT
# 5. 選擇性開放主機服務 (SSH/HTTP)
$IPTABLES -A INPUT -p tcp --dport 22 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 80 -j ACCEPT
echo "Bluetooth PAN NAT enabled: $INTIF -> $EXTIF"
執行:sudo /usr/local/bin/bt-nat.sh
# 客戶端
ping 8.8.8.8
curl https://www.google.com
# 客戶端斷開
sudo pand -K # 終止所有 pand 連線
# 或針對特定介面
sudo ifconfig bnep0 down
sudo pand --disconnect 00:11:67:46:4E:4E
# /etc/systemd/system/bluetooth-pan-nap@.service
[Unit]
Description=Bluetooth NAP for %i
After=bluetooth.service
Requires=bluetooth.service
[Service]
Type=simple
ExecStart=/usr/bin/pand --listen --role NAP --master -d
Restart=on-failure
[Install]
WantedBy=multi-user.target
啟用:sudo systemctl enable bluetooth-pan-nap@hci0
# /etc/systemd/system/bluetooth-pan-panu@.service
[Unit]
Description=Bluetooth PANU to %i
After=bluetooth.service
Requires=bluetooth.service
[Service]
Type=simple
ExecStart=/usr/bin/pand --connect %i --role PANU --service NAP -d
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
啟用:sudo systemctl enable bluetooth-pan-panu@00:11:67:46:4E:4E
| 現象 | 原因 | 對策 |
|---|---|---|
pand --connect 逾時 | 主機未 piscan / 防火牆阻擋 L2CAP | 檢查 hciconfig hci0、開放 iptables -A INPUT -p l2cap -j ACCEPT |
| bnep0 無 IP / 無法 ping | 未手動配置 IP / DHCP 失敗 | 靜態配置 ifconfig bnep0 ... 或啟用 dhclient bnep0 |
| 共享上網 DNS 失效 | 客戶端 /etc/resolv.conf 無名稱伺服器 | 手動添加 nameserver 8.8.8.8 或啟用 systemd-resolved |
| 傳輸速度極慢 (~50KB/s) | 藍牙 2.0/2.1 EDR 理論上限 2.1Mbps | 升級藍牙 3.0+HS (AMP) 或 4.0/5.0 設備 |
藍牙 PAN (BNEP) 提供無需 Wi-Fi 基建的輕量級 IP 互聯方案。掌握 pand 角色建立、bnep 介面 IP 配置與 iptables NAT 轉發,即可在嵌入式設備、筆電、手機熱點替代場景快速組建個人區域網。現代 bluez 5 已整合 bluetoothctl 統一管理介面,建議新專案優先使用 D-Bus API 程式化控制。