Raspberry Piの有線LANのネット接続をスマートフォンのBluetoothから使う方法(Bluetooth NAP)

Raspberry PiとスマートフォンをBluetoothで接続してみます。
今回はRaspberry Piのインターネット接続をスマートフォンから利用してみます。




前回はスマートフォンのテザリングを使い、Raspbery PiからスマートフォンへBluetooth接続してインターネット接続する方法を試しました。
スマートフォンのBluetoothテザリングとRaspberry Pi 3を接続する
今回は逆を試します。Raspberry Pi 3のインターネット接続をBluetooth接続したスマートフォンから使ってみます。(Bluetooth Network Access Point)

Raspberry Pi 3へBluetooth接続してネットワーク接続をするにはbt-panを使います。
mk-fg /fgtk / bt-pan
このスクリプトをホームディレクトリにダウンロードします。
wget https://raw.githubusercontent.com/mk-fg/fgtk/master/bt-pan
実行許可を与えます。
chmod +x bt-pan

Raspberry Piのインターネット接続を使う場合はインターフェースの種類やIPアドレスの割り当て方により設定の仕方が異なります。ご自分のネットワーク環境を正しく把握していないとうまく動かないでしょう。
今回はRaspberry Piの有線LAN eth0 のインターネット接続を使う場合を書いてみます。eh0はルータに接続されておりルータのDHCPサーバからIPアドレスが割り当てられる環境で説明します。
スマートフォンとのペアリングは済んでいるものとしますのでペアリングしておいてください。

有線LANインターフェースeth0のインターネット接続をbluetooth接続したスマートフォンから使う

Raspberry Piのインターネット接続を使うにはbt-panをserverモードで動かします。
./bt-pan server <BRIDGE_IF>
<BRIDGE_IF>の部分にはブリッジインターフェース名を指定する必要があります。eth0とかの物理インターフェースは指定できません。
Raspberry Pi 3で仮想ブリッジインターフェースを作ります。

ブリッジデバイスを作るためにbridge-utilsパッケージをインストールします。
sudo apt-get install bridge-utils
これをインストールしないとブリッジインターフェースを作れません。/etc/network/interfacesで書いてもブリッジインターフェースができません。

ブリッジを作るには"brctl"コマンドを使います。また、インターフェースデバイスにIPアドレスを適切に割り当てる必要があります。いろいろ面倒なので今回は/etc/network/interfacesで書く方法を紹介します。

/etc/network/interfacesへ仮想ブリッジインターフェースの設定を加えます。それに合わせeth0インターフェースのIPアドレスの設定を変えます。
それでは/etc/network/interfacesをテキストエディタで開きます。
iface eth0 のスタンザを次のように置き換えます。
auto eht0
iface eth0 inet static
  address 0.0.0.0
IPアドレスを0.0.0.0にします。
次に仮想ブリッジインターフェースを作ります。次のスタンザを追加します。
auto br0
iface br0 inet dhcp
  bridge_ports eth0
  bridge_stp off
  bridge_maxwait 1
br0という名前で仮想ブリッジインターフェースを作ります。IPアドレスはルータのDHCPサーバから取得する例です。
良く見るとただの仮想インターフェースと区別がつかない気もします。ブリッジだと判るのはbridge用コマンドを書いている所だけです。何か書いておかないとブリッジと認識されないでしょうね。
書き加えたら保存して再起動します。

これで仮想ブリッジを通してルータへ接続されるはずです。ルータのDHCPからのIPアドレスはbr0に割り当てられているでしょう。eth0のIPアドレスは変なのになっていますが通信は問題なく行われているでしょう。

いよいよスマートフォンとBluetoothでつないでみます。bt-panを動かします。
sudo ./bt-pan --debug server br0
この後、スマートフォン側のBluetooth画面からRaspberry Piと接続してください。スマートフォン側に接続のインターネット共有を有効にする項目があると思いますのでチェックされているか確認します。
スマートフォンとのペアリングは済んでいるものとして説明していますが、もしも接続できない場合はこの時点でペアリングをし直してみると良いかもしれません。bt-panをサーバーモードで動かしていないとスマートフォンのBluetooth接続はインターネット接続先として認識しないようです。

これでスマートフォンからRaspberry Piを通してインターネット接続ができているはずです。スマートフォンのipアドレスを表示するアプリを入れていればルータからIPアドレスが付与されているのがわかるでしょう。

この時のRaspberry Piのインターフェースを表示してみると次のようになっています。
$ ip a
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0:  mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether ab:cd:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 169.254.82.11/16 brd 169.254.255.255 scope global eth0
       valid_lft forever preferred_lft forever
3: wlan0:  mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether bc:de:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
4: br0:  mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether ab:cd:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 192.168.11.44/24 brd 192.168.11.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 abcd::xxxx:xxxx:xxxx:xxxx/64 scope link 
       valid_lft forever preferred_lft forever
5: bnep0:  mtu 1500 qdisc pfifo_fast master br0 state UNKNOWN group default qlen 1000
    link/ether cd:ef:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 169.254.125.133/16 brd 169.254.255.255 scope global bnep0
       valid_lft forever preferred_lft forever
    inet6 bcde::xxxx:xxxx:xxxx:xxxx/64 scope link 
       valid_lft forever preferred_lft forever
bnep0というインターフェースがBluetooth接続です。

さて、これでインターネット回線がBluetooth接続で共有できてめでたしめでたし・・・

だと思ったのですが、一つできない事があります。
それはスマートフォンからRaspberry PiへのSSH接続です。eth0側の他のパソコンからbr0のIPアドレスへアクセスする事はできます。しかし、Bluetooth側のスマートフォンからbr0のSSHサーバが見えません。Bluetooth側からのSSHのパケットはeth0インターフェースへブリッジされ素通りしているだけだと思われます。

これを避けるにはbnep0インターフェースのIPアドレスに"0.0.0.0"を付与すれば良いと思ったのです。
sudo ip addr add 0.0.0.0/24 dev bnep0
ですがこれではダメでした。bnep0インターフェースはbt-panでスマートフォンと接続が完了した後でないと存在しません。初期設定はどうしたら良いのでしょうか?
ここで行き詰ってしまいました。

ちなみにBluetoothからSSH接続だけをする事はできました。ブリッジbr0からeth0のバインドを外してRaspberry PiでDHCPサーバを動かし、bnep0とスマートフォンが同じサブネットアドレスになるようアドレスを割り当てるのです。当然インターネット接続はできません。
ここでeht0をバインドすれば・・・するとラズパイは透明になって見えなくなります。ルート設定やIPマスカレードなど試していますが成功していません。

う~ん・・・ネットワーク設定の理解が不足しているようです。

まとめ

納得いかない部分はありますが、Raspberry Piのインターネット接続をbluetoothから共有するという目的は達成できました。
Bluetoothを使う本来の目的はSSH接続なので少し不満です。何が抜けているのだろうか。

有線LAN eth0ではなく無線LAN wlan0を使う場合は大きく設定が変わります。wlan0はブリッジにバインドできないという面倒な仕様があるようです。ルーティングとかちゃんとすれば良いのでしょうが、今のところ私には使い道がないので手を付けません。

Raspberry Piの設定ファイルをleafpadで編集しています。最初から入っているエディタなので記事では良く使いますが、使い勝手が悪いですね。特にxrdpなどでWindowsからリモートデスクトップ接続して編集する場合は注意が必要です。WindowsのブラウザからテキストをRaspberry Piのleafpadへコピペすると改行コードの違いが悪さするようです。見た目はちゃんと書いてあるのに解釈されないファイルが出来上がります。

コメント

  1. この通りにやってもうまくいかなかったのですが、eth0をプロミスキャスモードにしたらうまくいきました。

    $ sudo ip link set dev eth0 promisc on

    逆にプロミスキャスモードにしない場合は外部⇔ラスパイ及びラズパイ⇔bluetoothデバイスの通信はできるのですが外部⇔bluetoothデバイスの通信ができませんでした。
    (理屈の上ではラズパイ上にプロキシを立てればOKということにはなるとあは思います)

    返信削除
    返信
    1. ありがとうございます。
      今度はその辺の知識を勉強しつつトライしてみます。
      /etc/network/interfacesを使うこのページの情報は古くなってしまいました。NetworkManagerを使った方法を紹介する予定なのですが・・・早くRaspbianがNetworkManagerを使うようになって欲しいです。

      削除

コメントを投稿

最近のコメント

Threaded Recent Comments will be here.