wiki:linux/bnetp

Linuxを使ってBluetoothでインターネット接続

Linuxをアクセスポイントとして、Bluetoothでネットワーク接続する方法を紹介します。

Xperia Z1(C6903)を購入したのですが、WIFIに不具合があり使い物にならなかったので、 Bluetoothで接続することにしたメモです。

なお、Ubuntu 16.04で構築しているので、他のディストリビューションをお使いの方は適用に読み替えてください。

用意するもの

  • bluezパッケージ
    • apt-get install bluezでインストールしておきます。bluetoothデバイスを操作するのに必要です。
  • bt-panスクリプト
    • Bluetoothでネットワーク共有を行うためのスクリプトです。下記のサイトのスクリプトを/usr/local/binなどにコピーして使います。

準備

まず、bluetooh自身を利用できるようにします。

bluetoothサービスを設定します。

# systemctl start bluetooth.service
# systemctl enable bluetooth.service

bluetoothコマンドで、bluetoothの有効化、ペアリングなどを行います。

root@piano:/etc/systemd/system/multi-user.target.wants# bluetoothctl
[NEW] Controller 00:1B:DC:0F:C1:52 mypc [default]
[NEW] Device 74:23:44:6B:XX:XX Android
[bluetooth]# power on
Changing power on succeeded
[bluetooth]# discoverable on
Changing discoverable on succeeded
[CHG] Controller 00:1B:DC:0F:C1:52 Discoverable: yes
[bluetooth]# agent on
Agent registered
[bluetooth]# scan on

これでAndroidから認識されるようになるので、Androidからデバイスの登録を行い、ペアリングを行います。

[bluetooth]# pair 74:23:44:6B:XX:XX
[bluetooth]# trust 74:23:44:6B:XX:XX

ペアリングコマンドを実行すると、Androidの方で許可メッセージが出るので、許可します。

ネットワークの設定

Bluetoothで接続するネットワークの設定をします。

auto bt-br
iface bt-br inet static
        address 192.168.12.1
        netmask 255.255.255.0
        network 192.168.12.0
        broadcast 192.168.12.255
        gateway 192.168.12.254
        dns-nameservers 8.8.8.8

DNSが動作していなければ、DNSを設定します。下記は、dnsmasqの例です。

/etc/dnsmasq.d/bnetp

dhcp-range=tag:bt-br,192.168.12.2,192.168.12.63,30m
dhcp-option=tag:bt-br,option:router,192.168.12.1
dhcp-option=tag:bt-br,option:dns-server,8.8.8.8

適当にdnsmasqパッケージをインストールして起動しておきます。

サービスの設定

net-bnetp.serviceファイルを作成し、/etc/systemd/system/multi-user.target.wantsディレクトリに 置きます。

[Unit]
After=bluetooth.service
PartOf=bluetooth.service

[Service]
ExecStart=/usr/local/bin/bt-pan server bt-br

[Install]
WantedBy=bluetooth.target

bt-panの実行コマンドで、Bluetoothデバイスを接続するブリッジをしています。配置したら、サービスとして起動します。

# systemctrl daemon-reload
# systemctl start net-bnetp.service

Android側でBluetoothネットワークに接続

Bluetoothのデバイスを表示すると、「Internet access(インターネットアクセス)」という項目があるので、ONにするとインターネットアクセス可能になります。

Firewallの設定

Bluetooth側のネットワークから、外にでれるようにNATの設定をします。

# iptables -t nat -A POSTROUTING -o eth0 -s 192.168.12.0/24 -j MASQUERADE
# iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A FORWARD -i bt-br -o eth0 -s 192.168.12.0/24 -j ACCEPT

電源を切ると消えるので、永続化しておきます。

# netfilter-persistent save