Linux
WiFi
hostapd
accesspoint

hostapd を用いた無線 LAN アクセスポイントの構築

はじめに

このページは hostapd を使用したソフトウェアアクセスポイントの構築手順について記載しています。パッケージを使わず、ソースからビルドする方法です。

準備

ソフトウェアアクセスポイントとは

通常、無線 LAN アクセスポイントを入手するためには市販品を買ってくれば事足ります。
ですが、無線 LAN アクセスポイント機能をソフトウェアで実現すれば、手元の PC を無線 LAN アクセスポイントにすることができます。
そのようにして構築した無線 LAN アクセスポイントをソフトウェアアクセスポイントと言います。

どのソフトウェアを使えば良いのか

無線 LAN アクセスポイント機能を持つソフトウェアは hostapd が有名です。この文書も hostapd について解説していきます。

OSは?

Linux での構築を前提とします。今回は Ubuntu Desktop 16.04 x86_64 を用いて解説します。

必要な機材は?

ath9k/ath9k_htc/ath10k ドライバに対応し、かつアクセスポイント機能を持った Qualcomm Atheros 製無線 LAN カードと PC です。
お手持ちの無線 LAN カードがアクセスポイント機能を持っているかは、メーカーのサイト等で事前に調べておく必要があります。
参考までにドライバごとの対応デバイスリストです。

ドライバ リンク
ath9k https://wireless.wiki.kernel.org/en/users/Drivers/ath9k/devices
ath9k_htc https://wireless.wiki.kernel.org/en/users/drivers/ath9k_htc/devices
ath10k https://wireless.wiki.kernel.org/en/users/drivers/ath10k

※ ath5k でも可能ですが、最新のLinuxでは徐々にサポート切れになりつつあります。

ドライバの確認

無線 LAN カードを挿してから下記コマンドを入力しましょう。

# lsmod | grep ath

ath9kの場合は以下のように表示されていれば ok です。

ath9k                 124580  0
mac80211              181236  1 ath9k
led_class               4096  1 ath9k
ath                     8060  1 ath9k
cfg80211               93052  3 ath9k,mac80211,ath

構築手順

ソースコードをビルドして構築する手順を説明します。

hostapd ソースコードのダウンロード

hostapd のサイトからダウンロードします。 2018/05/06 現在では 2.6 が最新版です。

$ wget https://w1.fi/releases/hostapd-2.6.tar.gz

ビルド

まずビルドに必要なパッケージを入れます。

$ sudo apt install git make pkgconf gcc libssl-dev libnl-3-dev libnl-genl-3-dev binutils-dev libiberty-dev

ダウンロードした hostapd-2.6.tar.gz を解凍します。任意のディレクトリで下記コマンドを実行します。

$ tar xzf hostapd-2.6.tar.gz
$ cd hostapd-2.6/hostapd/
$ cp defconfig .config

ここで .config というのは、ビルドを制御するための定義を記載するファイルです。 今回は ath9k/ath9k_htc/ath10k を使用するので nl80211 (FAQ を参照)を使用します。

$ diff -u defconfig .config
--- defconfig   2016-10-03 03:51:11.000000000 +0900
+++ .config 2018-05-06 08:43:10.805754073 +0900
@@ -10,7 +10,7 @@
 # to override previous values of the variables.

 # Driver interface for Host AP driver
-CONFIG_DRIVER_HOSTAP=y
+#CONFIG_DRIVER_HOSTAP=y

 # Driver interface for wired authenticator
 #CONFIG_DRIVER_WIRED=y
@@ -31,7 +31,7 @@
 #CONFIG_LIBNL20=y

 # Use libnl 3.2 libraries (if this is selected, CONFIG_LIBNL20 is ignored)
-#CONFIG_LIBNL32=y
+CONFIG_LIBNL32=y


 # Driver interface for FreeBSD net80211 layer (e.g., Atheros driver)
@@ -114,7 +114,7 @@
 #CONFIG_EAP_FAST=y

 # Wi-Fi Protected Setup (WPS)
-#CONFIG_WPS=y
+CONFIG_WPS=y
 # Enable UPnP support for external WPS Registrars
 #CONFIG_WPS_UPNP=y
 # Enable WPS support with NFC config method
@@ -241,7 +241,7 @@
 # This will save some in binary size and CPU use. However, this should only be
 # considered for builds that are known to be used on devices that meet the
 # requirements described above.
-#CONFIG_NO_RANDOM_POOL=y
+CONFIG_NO_RANDOM_POOL=y

 # Should we use poll instead of select? Select is used by default.
 #CONFIG_ELOOP_POLL=y

※ .config ファイルの CONFIG_NO_RANDOM_POOL については個人で使う分にはこのままで良いですが業務で使う場合は無効にしておいた方が良いでしょう。

make してエラーが出なければ ok です。

$ make

メッセージを見てエラーかどうかわからなければ

$ make > /dev/null

で何も表示されなければ ok です。

設定ファイルの作成

アクセスポイントの SSID や暗号方式の設定のためには、設定ファイルを使用します。ここでは設定ファイルの書き方を説明します。
hostapd-2.6/hostapd/hostapd.conf はサンプル兼設定ファイル説明書ですので、これをコピーして使います。
例として WPA2-PSK を CCMP で行なうように設定してみましょう。また WPS も有効にします。
hostapd.conf を以下のように記載します。

ctrl_interface=/var/run/hostapd
interface=wlan0
driver=nl80211
ssid=wpa-psk
country_code=JP
hw_mode=g
channel=11
wpa=2
wpa_passphrase=12345678
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
eap_server=1
wps_state=2
uuid=87654321-9abc-def0-1234-56789abc0000
wps_pin_requests=/var/run/hostapd.pin-req
device_name=Wireless AP
manufacturer=Company
model_name=WAP
model_number=123
serial_number=12345
device_type=6-0050F204-1
os_version=01020300
config_methods=label virtual_display virtual_push_button keypad

起動

hostapd をビルドしたディレクトリにて下記コマンドを実行します。

$ sudo service network-manager stop; sudo service ModemManager stop; sudo killall dhclient; sudo killall wpa_supplicant; sudo killall nm-applet; sudo killall bluetoothd
$ sudo ./hostapd <path to hostapd.conf>

ステーションからアクセスして ping が通れば ok です。

WPS の操作

WPS PBC は hostapd をビルドしたディレクトリにて下記コマンドを実行します。

$ sudo ./hostapd_cli -i wlan0 wps_pbc

WPS PIN は同ディレクトリにて下記コマンドを実行します。

$ sudo ./hostapd_cli -i wlan0 wps_pin any <PIN コード>

OpenSSL を使いたくない

hostapd はデフォルトで OpenSSL を使用していますが、これを使いたくない方もいるでしょう。 hostapd は内部に代替ライブラリを持っていますので OpenSSL を使わずにビルドすることができます。 .config に下記を追記しましょう。

CONFIG_TLS=internal
CONFIG_INTERNAL_LIBTOMMATH=y

ただし制限もあります。 OpenSSL を使用した場合よりも扱える証明書の種類が少なくなります。

※個人で PC にインストールする場合にはこの箇所は無視して構いません。組み込み機器に hostapd を移植するような場合、 OpenSSL の移植がネックになる場合があり、その回避策です。

NetBSD でも使いたい

.config を書き換えるだけでビルドできます。

CONFIG_DRIVER_HOSTAP=y
CONFIG_IAPP=y

の先頭に # を付けてコメントアウトします。そして

#CONFIG_DRIVER_BSD=y

の先頭の # を削除します。 NetBSD 5.0.2 + hostapd 0.7.2 で動作確認済みです。

最新を追う

hostapd は git 上で日々開発が行なわれています。日々実装されている最新機能を使いたい方や、開発に加わりたい方は、以下の手順で最新版を使用することができます。

$ git clone git://w1.fi/srv/git/hostap.git

最新版を使用していてバグにでくわした場合は、メーリングリストに報告しましょう。もちろんパッチも歓迎されます。

FAQ

nl80211 とは?

無線 LAN のカーネル API です。 ath9k/ath9k_htc/ath10k ドライバはnl80211の下に位置します。

madwifi はもう古い?

はい、古いです。 madwifi は既に開発を終了し、バグパッチのみの提供を行なうと告知されています。現在は Qualcomm Atheros チップのドライバは ath9k/ath9k_htc/ath10k であり、共に Qualcomm Atheros の社員が開発を行なっています。

※ 残念なことに未だに madwifi を使うべしというサイトが検索で多く引っかかって来ます。それらの情報に惑わされずに、 ath5k/ath9k を使うようにしましょう。
※ hostapd/wpa_supplicant 2.4 からは madwifi のサポートが無くなります。