RasPiマウスを無線LANアクセスポイント化
Simple Wiki Based Contents Management System
関心分野 >> RasPi Mouse >> RasPiマウスを無線LANアクセスポイント化

RasPiマウスを無線LANアクセスポイント化

RasPiマウスを無線LANアクセスポイントにして、直接無線LAN経由でアクセスできるようにします。この設定により、無線LANルータがない場合にも、タブレットやPCからネットワーク接続できるようになります。
無線LANアクセスポイント化するには、USBの無線LANアダプタとアクセスポイント(hostapd)とDHCPサーバー(isc-dhsp-server)のソフトウェアのインストールが必要になります。
RaspberryPiをWi-Fiアクセスポイント化に関しては、このサイトの記事を参考にしています。
私の環境では、USB無線LANアダプタとして、プラネックス社のGW-USNANO2Aを使いました。
この無線LANアダプタは、Realtekの8192CUというチップを使用しており、アクセスポイント化のためのソフトウェア hostapdにはデフォルトでは対応していません。
しかしながら、Realtekからソースコードが提供されていますので、自力でコンパイルすることができます。
ちなみに、hostapdがデフォルトで対応している無線LANは、下記のデバイスになっています。
  • Linux mac80211 drivers
  • Linux drivers that support nl80211/cfg80211 in AP mode
  • Host AP driver for Prism2/2.5/3
  • madwifi (Atheros ar521x)
  • BSD net80211 layer (e.g., Atheros driver) (FreeBSD 6-CURRENT)
注意
下記の設定は、ネットワークの再起動を伴いますので、コンソールで作業をして下さい。

固定IPアドレスの設定

まず、RasPiマウスを無線LANアクセスポイント化に際して、無線LANのインターフェースであるwlan0に固定IPアドレスを割り振ります。以前のRaspbianでは、/etc/network/interfaceを編集することで、固定IPアドレスの設定を行うことができましたが、Debian8(jessie)系統となった現在のRaspbianでは、固定IPアドレスの設定方法がdhcpcd.confに変更されています。
したがって、wlan0にクラスCのプライベートアドレス(192.168.11.1/24)を、固定IPアドレスとして設定します。/etc/dhcpcd.confを適当なエディタで開いて、ファイルの最後に下記を追記します。
interface wlan0
static ip_address=192.168.11.1/24
static routers=192.168.11.1
static domain_name_servers=192.168.11.1
また、/etc/network/interface の中で、wlan0の設定(スタンザ)のwpa_supplicantの部分を下記のようにコメントアウトします。
allow-hotplug wlan0
iface wlan0 inet manual
#    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
これで、固定IPアドレスの設定は終了です。
コメント
/etc/network/insterfaces の無線LANの部分の設定は、すべてコメントアウトしても良さそうなのですが、USB無線LANアダプタの場合、抜き差し時に設定を変更したいので、このままにしておきます。このページの最後に、自動起動の設定を説明します。

hostapdをインストール

無線LANのインターフェースに固定IPアドレスの設定が終了したら、次は、hostapdをインストールします。hostapdのインストールは、apt-getで標準パッケージをインストールして、8192cu用のバイナリに置き換えるという手順で行います。
まずは、標準パッケージをインストールします。
% sudo apt-get install hostapd
ここでインストールしたバイナリ(hostapd)は、8192cuをサポートしていませんので、8192cuのソースコードをRealtek社のHPからダウンロードしてコンパイルを行うか、このサイトの添付したアーカイブをダウンロードしたものと置き換えます。
次に、hostapdの設定として、/etc/hostapd/hostapd.conf を下記のように設定します。この設定では、8192cu を利用するために driver=rtl871xdrv を指定しています。ssid,channel,wpa_passphraseに関しては、適当に変更してください。
interface=wlan0
driver=rtl871xdrv
ssid=myssid
hw_mode=g
channel=6
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=raspberrypi
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
次に、hostapdの起動設定を行います。
hostapd の起動設定ファイル /etc/default/hostapd に先ほど定義した設定ファイルを指定します。
DAEMON_CONF="/etc/hostapd/hostapd.conf"
ここまで設定できれば、無線LANアクセスポイントとして動作しますので(DHCPサーバーを起動していないので、各クライアントは、固定IPアドレスのみ有効ですが)、hostapdを起動して動作テストを行いますので、ネットワークを再起動します。
% sudo /etc/init.d/networking restart
エラーがでなければ、hostapdを起動して、クライアントからの接続テストを行います。
% sudo /usr/sbin/hostapd /etc/hostapd/hostapd.conf
Configuration file: /etc/hostapd/hostapd.conf
drv->ifindex=3
l2_sock_recv==l2_sock_xmit=0x0x195f638
+rtl871x_sta_deauth_ops, ff:ff:ff:ff:ff:ff is deauth, reason=2
rtl871x_set_key_ops
rtl871x_set_key_ops
rtl871x_set_key_ops
rtl871x_set_key_ops
Using interface wlan0 with hwaddr 00:22:cf:XX:YY:XX and ssid 'myssid'
rtl871x_set_wps_assoc_resp_ie
rtl871x_set_wps_beacon_ie
rtl871x_set_wps_probe_resp_ie
rtl871x_set_key_ops
rtl871x_set_beacon_ops
rtl871x_set_hidden_ssid ignore_broadcast_ssid:0, myssid,11
rtl871x_set_acl
      (クライアントからの接続)
+rtl871x_get_sta_wpaie, 9c:d2:1e:AA:BB:CC is sta's address 
wlan0: STA 9c:d2:1e:AA:BB:CC  IEEE 802.11: associated
rtl871x_set_key_ops
rtl871x_set_key_ops
rtl871x_set_key_ops
+rtl871x_send_eapol
+rtl871x_send_eapol
rtl871x_set_key_ops
wlan0: AP-STA-CONNECTED 9c:d2:1e:AA:BB:CC 
wlan0: STA 9c:d2:1e:AA:BB:CC  RADIUS: starting accounting session 572C8FE3-00000000
wlan0: STA 9c:d2:1e:AA:BB:CC  WPA: pairwise key handshake completed (RSN)
上記のようにクライアントからの接続ができればOKです。
可能であれば、クライアントからpingなどで接続を確認してください。(この場合にが、クライアント側は自分で固定IPアドレスを設定しておく必要があります)
このままでは、クライアントがDHCPでIPアドレスを設定するようになっていると接続ができませんので、DHCPサーバーとDNSサーバーを設定します。

DHCPサーバーの設定

現在のところDHCPサーバーのパッケージは、ISCのもののようですのでapt-getでインストールします。(ISCが今後数年以内にdhcpdの開発をやめるという話もありますが、取り敢えずはISCの設定を記載します)
% sudo apt-get install isc-dhcp-server
次に、設定ファイル /etc/dhcp/dhcpd.conf の修正を行います。RasPiMouseの場合には、単独での接続を想定していますので、既に有効化されているグローバルの domain-name と domain-name-servers の設定をコメントアウトします。さらに、無線LAN部分(wlan0インターフェース)のみにDHCPでIPアドレスの配布をしたいと思いますので、subnetを使って設定を行います。
/etc/dhcp/dhcpd.confの12行目付近の下記の修正を行います。
    ...
# option definitions common to all supported networks...
#option domain-name "example.org";
#option domain-name-servers ns1.example.org, ns2.example.org;
default-lease-time 600;
max-lease-time 7200;
# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
authoritative;

ping-check true;

subnet 192.168.11.0 netmask 255.255.255.0 {
       range 192.168.11.100 192.168.11.199;
       option broadcast-address 192.168.11.255;
       default-lease-time 600;
       max-lease-time 7200;
       option routers 192.168.11.1;
       option domain-name "local";
       option domain-name-servers 192.168.11.1;
}
   ...
次に、wlan0側にのみDHCPサービスを提供したいので /etc/default/isc-dhcp-server でINTERFACEをwlan0に指定します。
INTERFACES="wlan0"
以上で、dhcpサーバーの設定は終了です。
次に、DNSサーバーを導入します。ここまで問題なくできていれば、DNSサーバーの設定は、apt-getでインストールするだけでOKです。
% sudo apt-get install dnsmasq dnsutils
で導入しておきましょう。
最後にhostapdとDHCPサーバの起動設定をします。

無線LANの抜き差し時に自動的にhostapdとisc-dhcp-serverを起動するように設定する

Raspberry Pi では、無線LANアダプタは、USBドングルを使っていますので、update-rc.d コマンドを利用してhostapdとisc-dhcp-serverを自動起動使用としてもうまく動作しない場合があります。これは、USBアダプタのプラグインのイベントハンドリングが、ネットワークの設定のあとになってしまう場合があるからです。そこで、USB無線LANアダプタの抜き差しのタイミングで、hostapd, isc-dhcp-serverの起動と終了を制御できるように設定します。
USBの無線LANアダプタを利用する場合には、無線LANアダプタの抜き差しのイベント情報をハンドリングする必要があります。このイベントのハンドリングは、上記の固定アドレスの設定の時にも記述していますが、/etc/network/interfaces の中でwlan0 のスタンザを allow-hotplug にしておくことで良いと思います。(詳細はこちら
このスタンザを設定しておくと、無線LANアダプタを抜き差ししたときに、/etc/network/[if-up.d, if-pre-up.d, if-down.d, if-post-down.d]/の下にあるスクリプトを呼び出してくれるようです。そこで、hostapd, isc-dhcp-server の起動と終了を行うスクリプトを作成して、if-up.d と if-down.dのディレクトリに置いておけばOKです。
ひな形のスクリプトとして下のようなものを作成しました。このスクリプトを /etc/network/if-up.d と /etc/network/if-down.d に置いておき、
% sudo ifup wlan0
% sudo ifdown wlan0
を実行して動作を確認してみてください。抜き差しの時にそれぞれ実行される部分を確認して、hostapdとisc-dhcp-serverの起動と終了のスクリプトを該当部分(post-up と pre-downのところ)に書き込めばOKです。
#!/bin/sh
#####################################################################
# quit if interface is not wlan0
if [ "$IFACE" != wlan0 ]; then
	exit 0
fi
#
#
do_start () {
  echo "Startup sequence.."
}

do_stop () {
  echo "Shutdown sequence..."
}

case "$MODE" in 
	start)
		do_start
		case "$PHASE" in
			pre-up)
  				echo "Startup sequence(pre-up)..."
				;;
			post-up)
  				echo "Startup sequence(post-up)..."
#                       起動スクリプト
				;;
			*)
  				echo "Error Shutdown sequence(unknown phase)..." 
				exit 1
				;;
		esac
		;;
	stop)
		do_stop
		case "$PHASE" in
			pre-down)
  				echo "Shutdown sequence(pre-down)..."
#                          終了スクリプト
				;;
			post-down)
  				echo "Shutdown sequence(post-down)..."
				;;
			*)
  				echo "Error Shutdown sequence(unknown phase)..."
 				exit 1
				;;
		esac
		;;
	*)
  		echo "Error in ifupdown.sh..."
 		exit 1
		;;
esac
exit 0
以上で、無線LANのホスト化は終了です。
また、このスクリプトを応用して、起動時にRaspberry Pi MouseのコントロールRTCを自動実行することができます。

ネットワークIFの名称の変更(2018/10/11追記)

上記までで、アクセスポイントとして動作しますが、wlan0のままでは都合が悪い場合があります。その時には、
/etc/udev/rules.d/70-persistent-net.rules
というファイルを作成し、
SUBSYSTEM=="net",ACTION=="add",ATTR(address)=="XX:XX:XX:XX:XX:XX",NAME="wlan_ap0"
としておけば、特定のNICに別名称を付けることができます。
この文書のwlan0 を wlan_ap0 に変更すれば、特定のNICを差したときのみアクセスポイントにすることができます。

資料