Bluetooth ネットワークアグリゲーションポイント

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page Bluetooth Network Aggregation Point and the translation is 100% complete.
Other languages:

この記事では Gentoo Linux 上での Bluetooth ネットワークアグリゲーションポイント (NAP) の構築について扱います。

NAP とは

Bluetooth の仕様は、パーソナルエリアネットワーク (Personal Area Network, PAN) の作成能力を組み込んでいます。これは Ethernet 透過プロトコルなので、そのような PAN 内ではすべての標準プロトコル (特に IP) を使用することができます。NAP はそのようなネットワークのマスタとして考えることができます。NAP はBluetooth を経由して、最大 8 台の接続された PAN デバイス (携帯電話、PDA、ノート PC など) に他のネットワーク (例えばインターネット) への接続を提供するでしょう。これらのデバイスは Wi-Fi の代わりに Bluetooth を使用することで消費電力を抑えられるでしょう。

この記事の取り扱い範囲

ここでは、Bluetooth が有効化された携帯電話をインターネットに接続するための、Gentoo NAP の作成について取り扱います。そうすると例えば、携帯電話の連絡先やカレンダーを、インターネット (またはローカルネットワーク) 上のどこかに設置された SyncML に対応したグループウェアサーバと同期することができるでしょう。以降は、NAP サーバを「Gentoo マシン」("Gentoo-Box")、そして PAN クライアントを「携帯電話」("cell phone") と呼ぶことにします。

前提

まず Bluetooth のインストールが行われていなくてはなりません。simple-agent または bluetoothctl を使用する場合は、GUI プログラムやアプレットは必要ありません。最新の bluez-test-nap スクリプトを入手するために、net-wireless/bluez パッケージの "test-programs" USE フラグを設定してください。ネットワークブリッジの構成も必要ですが、ホスト側の構成だけで十分です。

ネットワークブリッジを構成する

BlueZ NAP サーバは BlueZ によって作成された Ethernet リンクを操作するために Gentoo に依存するので、この節では netifrc を使用して Ethernet ブリッジを作成します。編集する前にすべてのファイルをバックアップしておいてください。

次のシナリオを考慮します。これがおそらく最も簡単で、最もよくあるケースでしょう:

                                                       +−−−−−−−−−−+
                             Global IP address  ┌─────>╎ Internet ╎
                                                │      +−−−−−−−−−−+
                                                │
                                                v
                          ┌────────────────────────────────────────────┐
                          │                   Router                   │
                          │ (with DHCP and routing (NAT) capabilities) │
                          └────────────────────────────────────────────┘
                                         ^              ^
                                         │              │
┌────────────┐       ┌────────────┐      │              │      +−−−−−−−−−−−−−−−+
│ Cell phone │<─────>│ Gentoo-Box │<─────┘              └─────>╎ Local network ╎
└────────────┘       └────────────┘                            +−−−−−−−−−−−−−−−+
                                         Local IP address

ルータに接続しているネットワークカードを見つけるために、ip addr を実行してください:

root #ip addr
1: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:13:8f:a2:8e:76 brd ff:ff:ff:ff:ff:ff
        inet 192.168.0.2/24 brd 192.168.0.255 scope global eth0
           valid_lft forever preferred_lft forever
        inet6 fe80::00:13:8f:a2:8e:76/64 scope link
           valid_lft forever preferred_lft forever

"inet 192.168.0.2/24 brd 192.168.0.255 scope global eth0" 行が、探しているものです。

デバイス名 (eth0) を覚えて、/etc/conf.d/net を編集してください:

ファイル /etc/conf.d/net
...
# この行をコメントアウトして、それ以降の行を追加してください:
#config_eth0="dhcp"
config_eth0="null"
bridge_br1="eth0"
config_br1="dhcp"
bridge_forward_delay_br1=100
bridge_stp_state_br1=1
...

これは netifrc に対して eth0 上での DHCP リースを行わないように指定し (実際には、netifrc に対して eth0 では何もしないように指示しています)、eth0 を含む新しい br1 ブリッジを作成するように指定しています。eth0 は DHCP を経由して IP アドレスを取得していたので、br1 はそれとまったく同じことをするように設定されています。オプション "bridge_stp_state_br1=1" および "bridge_forward_delay_br1=100" は、スパニングツリープロトコルを使用すること、そしてブリッジのフォワーディング状態がトポロジの変更後 1 秒以内に到達するようにしています。最後のオプションは、Gentoo は約 10 秒をデフォルトとする傾向にあり、すべての携帯電話の接続が少なくともそれだけかかってしまうので、これで携帯電話の接続を大幅に高速化します。

新しいシンボリックリンクを作成して、ネットワークを再起動してください:

root #ln -sr /etc/init.d/net.lo /etc/init.d/net.br1
root #rc-service net.eth0 stop && rc-service net.br1 start
...
 * Bringing up interface br1
 *   Creating bridge br1 ...
 *   Adding ports to br1
 *     eth0 ...                                                                                         [ ok ]
 *   192.168.0.2 ...                                                                                    [ ok ]

インターネット接続を確認し、すべてうまく行っていれば、br1 を "default" ランレベルに追加してください:

root #ping -c1 wiki.gentoo.org
root #rc-update add net.br1 default

携帯電話をインターネットに接続する

NAP サービスを開始すると、インターフェース br1 があることに気づくでしょう。端末に入り:

root #bluez-test-nap br1

携帯電話で Gentoo マシンを NAP として使用してインターネットに接続するように操作して、Syslog を監視してください:

root #tail -F /var/log/messages
Nov 04 17:37:38 [bluetoothd] bnep: bridge br1: interface bnep0 added
Nov 04 17:37:38 [kernel] br1: port 2(bnep0) entered blocking state
Nov 04 17:37:38 [kernel] br1: port 2(bnep0) entered disabled state
Nov 04 17:37:38 [kernel] device bnep0 entered promiscuous mode
Nov 04 17:37:38 [kernel] br1: port 2(bnep0) entered blocking state
Nov 04 17:37:38 [kernel] br1: port 2(bnep0) entered listening state
Nov 04 17:37:40 [kernel] br1: port 2(bnep0) entered learning state
Nov 04 17:37:42 [kernel] br1: port 2(bnep0) entered forwarding state
Nov 04 17:37:42 [kernel] br1: topology change detected, propagating

これで web ページに接続し、ロードできるようになっているはずです。

バックグラウンドサービス

NAP サービスは 4 通りの方法で開始することができます:

  • バックグラウンドでスクリプトを実行し、停止する (CTRL-C = KeyboardInterrupt = SIGINT) には:
root #bluez-test-nap br1 >/dev/null 2>&1 &
root #killall -SIGINT bluez-test-nap
  • システム開始時に実行させるには、/etc/init.d/local に次のスクリプトを読み込ませます。これらのファイルは実行可能にしておかなくてはなりません:
ファイル /etc/local.d/bluez-test-nap.start
exec /usr/bin/bluez-test-nap br1 >/dev/null 2>&1 &
ファイル /etc/local.d/bluez-test-nap.stop
killall -SIGINT bluez-test-nap
root #chmod +x /etc/local.d/bluez-test-nap.start /etc/local.d/bluez-test-nap.stop
  • local.d ファイルを使用するアプローチの代わりに、本当の init スクリプトを使用する方が良いでしょう。このファイルは実行可能にしておかなくてはなりません:
ファイル /etc/init.d/nap
#!/sbin/openrc-run
# Copyright 1999-2019 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
 
command="/usr/bin/bluez-test-nap"
command_args="br1"
command_background="yes"
description="Bluetooth NAP"
pidfile="/var/run/nap.pid"
retry="-INT/4/-TERM/1/-KILL/1"
 
depend() {
	use net.br1
	need bluetooth
}
root #chmod +x /etc/init.d/nap
  • USB ドングルを接続および取り外す場合は、udev ルールが仕事をしてくれます:
ファイル /etc/udev/rules.d/90-bluetooth.rules
ACTION=="add", KERNEL=="hci0", \
  RUN+="/bin/sh -c 'sleep 0.5; exec /usr/bin/bluez-test-nap br1 >/dev/null 2>&1 &'"
ACTION=="remove", KERNEL=="hci0", \
  RUN+="/usr/bin/killall -SIGINT bluez-test-nap"
# 問題がある場合 (汚いですが):
#ACTION=="remove", KERNEL=="hci0", \
#  RUN+="/bin/sh -c 'killall -INT bluez-test-nap; killall -KILL bluetoothd; rc-service bluetooth restart'"

または:

ファイル /etc/udev/rules.d/90-bluetooth.rules
ACTION=="add", KERNEL=="hci0", \
  RUN+="/bin/sh -c 'sleep 0.5; rc-service nap start'"
ACTION=="remove", KERNEL=="hci0", \
  RUN+="/bin/sh -c 'rc-service nap stop'"

トラブルシューティング

web ページが読み込まれない

携帯電話が接続された様子が確認できない場合は、どんなパケットが送受信されているか確認するために、Wireshark を試してください。単に

root #echo 1 > /proc/sys/net/ipv4/ip_forward

で解決するかもしれません。Gentoo マシンのインターフェースにファイアウォール設定が無いことを確認してください。

元のインターネット接続に復帰する

何かがおかしくなり、インターネット接続を失ってしまった場合は、/etc/conf.d/net のバックアップを復元して、ネットワーク接続を再起動してください:

ファイル /etc/conf.d/net
(古いファイル)
root #rc-service net.eth0 restart

テストのためのツール

サーバ側から開始された PAN 接続をテストするために使用することができる bluez-test-network ユーティリティがあります。/var/log/messages を監視するだけでは十分でない場合に、D-Bus の背後で何が起きているのかを監視する monitor-bluetooth ユーティリティがあります。

関連項目

  • Bluetooth — Bluetooth コントローラーとデバイスの設定・使用について説明します。