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を使います。
Raspberry Pi 3で仮想ブリッジインターフェースを作ります。
ブリッジデバイスを作るためにbridge-utilsパッケージをインストールします。
ブリッジを作るには"brctl"コマンドを使います。また、インターフェースデバイスにIPアドレスを適切に割り当てる必要があります。いろいろ面倒なので今回は/etc/network/interfacesで書く方法を紹介します。
/etc/network/interfacesへ仮想ブリッジインターフェースの設定を加えます。それに合わせeth0インターフェースのIPアドレスの設定を変えます。
それでは/etc/network/interfacesをテキストエディタで開きます。
iface eth0 のスタンザを次のように置き換えます。
次に仮想ブリッジインターフェースを作ります。次のスタンザを追加します。
良く見るとただの仮想インターフェースと区別がつかない気もします。ブリッジだと判るのはbridge用コマンドを書いている所だけです。何か書いておかないとブリッジと認識されないでしょうね。
書き加えたら保存して再起動します。
これで仮想ブリッジを通してルータへ接続されるはずです。ルータのDHCPからのIPアドレスはbr0に割り当てられているでしょう。eth0のIPアドレスは変なのになっていますが通信は問題なく行われているでしょう。
いよいよスマートフォンとBluetoothでつないでみます。bt-panを動かします。
スマートフォンとのペアリングは済んでいるものとして説明していますが、もしも接続できない場合はこの時点でペアリングをし直してみると良いかもしれません。bt-panをサーバーモードで動かしていないとスマートフォンのBluetooth接続はインターネット接続先として認識しないようです。
これでスマートフォンからRaspberry Piを通してインターネット接続ができているはずです。スマートフォンのipアドレスを表示するアプリを入れていればルータからIPアドレスが付与されているのがわかるでしょう。
この時のRaspberry Piのインターフェースを表示してみると次のようになっています。
さて、これでインターネット回線がBluetooth接続で共有できてめでたしめでたし・・・
だと思ったのですが、一つできない事があります。
それはスマートフォンからRaspberry PiへのSSH接続です。eth0側の他のパソコンからbr0のIPアドレスへアクセスする事はできます。しかし、Bluetooth側のスマートフォンからbr0のSSHサーバが見えません。Bluetooth側からのSSHのパケットはeth0インターフェースへブリッジされ素通りしているだけだと思われます。
これを避けるにはbnep0インターフェースのIPアドレスに"0.0.0.0"を付与すれば良いと思ったのです。
ここで行き詰ってしまいました。
ちなみにBluetoothからSSH接続だけをする事はできました。ブリッジbr0からeth0のバインドを外してRaspberry PiでDHCPサーバを動かし、bnep0とスマートフォンが同じサブネットアドレスになるようアドレスを割り当てるのです。当然インターネット接続はできません。
ここでeht0をバインドすれば・・・するとラズパイは透明になって見えなくなります。ルート設定やIPマスカレードなど試していますが成功していません。
う~ん・・・ネットワーク設定の理解が不足しているようです。
Bluetoothを使う本来の目的はSSH接続なので少し不満です。何が抜けているのだろうか。
有線LAN eth0ではなく無線LAN wlan0を使う場合は大きく設定が変わります。wlan0はブリッジにバインドできないという面倒な仕様があるようです。ルーティングとかちゃんとすれば良いのでしょうが、今のところ私には使い道がないので手を付けません。
Raspberry Piの設定ファイルをleafpadで編集しています。最初から入っているエディタなので記事では良く使いますが、使い勝手が悪いですね。特にxrdpなどでWindowsからリモートデスクトップ接続して編集する場合は注意が必要です。WindowsのブラウザからテキストをRaspberry Piのleafpadへコピペすると改行コードの違いが悪さするようです。見た目はちゃんと書いてあるのに解釈されないファイルが出来上がります。
今回は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.0IPアドレスを0.0.0.0にします。
次に仮想ブリッジインターフェースを作ります。次のスタンザを追加します。
auto br0 iface br0 inet dhcp bridge_ports eth0 bridge_stp off bridge_maxwait 1br0という名前で仮想ブリッジインターフェースを作ります。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:bnep0というインターフェースがBluetooth接続です。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
さて、これでインターネット回線が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へコピペすると改行コードの違いが悪さするようです。見た目はちゃんと書いてあるのに解釈されないファイルが出来上がります。
この通りにやってもうまくいかなかったのですが、eth0をプロミスキャスモードにしたらうまくいきました。
返信削除$ sudo ip link set dev eth0 promisc on
逆にプロミスキャスモードにしない場合は外部⇔ラスパイ及びラズパイ⇔bluetoothデバイスの通信はできるのですが外部⇔bluetoothデバイスの通信ができませんでした。
(理屈の上ではラズパイ上にプロキシを立てればOKということにはなるとあは思います)
ありがとうございます。
削除今度はその辺の知識を勉強しつつトライしてみます。
/etc/network/interfacesを使うこのページの情報は古くなってしまいました。NetworkManagerを使った方法を紹介する予定なのですが・・・早くRaspbianがNetworkManagerを使うようになって欲しいです。