DebianにUSB Wi-Fiアダプタを付けてAP化
古いPCにフリーOSのDebianをインストールして、使っていないUSBのWi-Fiアダプタを利用し、Wi-Fiアクセスポイントを作ってみようと思います。せっかくなので家庭用ルーターではあまりみかけないWPA2エンタープライズにも対応させてみるつもりです。
ハードウェアの設定
筆者の手持ちのUSB Wi-Fiアダプタ(Buffalo WLI-UC-G)を接続してみると次の通り認識されました。
インターフェースとしての認識はしていたのですが、起動できませんでした。
ip link set wlan0 up
dmesgを確認したら次のようなエラーがでいました。
[ 640.353445] rt73usb 1-5:1.0: firmware: failed to load rt73.bin (-2) [ 640.353519] rt73usb 1-5:1.0: Direct firmware load for rt73.bin failed with er
rt73.binファイルを読み込めないということですが、おそらくファームウェアがないのだと思います。ファイル名をネットで調べることでも、それが含まれるパッケージを見つけられますが、apt-fileがインストールしてあればそちらからでも調べられます。
パッケージを見つける前に、この手のファームウェアは通常のAPTレポジトリには含まれませんので、/etc/apt/sources.listを次のように変更しておきます。
sources.list
deb htttp://deb.debian.org/debian bluster main contrib non-free
このcontribとnon-freeの意味ですが、contribはdebianが定めるフリー規定に準拠しているが依存する部分でそうでないものが含まれるもの、non-freeは準拠していないものです。
debianが定めるfreeの規定には改修や再配布まで含まれているので、non-freeにあるからといって有料かというとそうではありません。
記述を変えたら再度apt updateを実行しします。
準備ができたので、あらためてapt-fileでパッケージを探してみます。firmware-misc-nonfreeというパッケージ名を見つけられたので、aptでインストールします。
# # apt-fileのデータベース更新 # apt-file update # # rt73.binファイルが含まれるライブラリを検索 # apt-file search rt73.bin firmware-misc-nonfree: /lib/firmware/rt73.bin # # firmware-misc-nonfreeをaptでインストール # apt install firmware-misc-nonfree ...
子機として接続
まず子機として接続してみることにしました。
WiFiHowToUseのwpa_supplicantの項目を参考に進めていきますGNOMEやKDEのGUIユーザーはNetworkManager経由で設定をする必要があるらしいのですがここでは触れません。
まずwpasupplicantをインストールします。
$su ... #apt update ... #apt install wpasupplicant ...
まずwpa_supplicant.confファイルを作成します。
$su ... #cd /etc/wpa_supplicant #wpa_passphrase [SSID] [Wi-Fiパスワード]>wpa_supplicant.conf #chmod 600 wpa_supplicant.conf #history -c
wpa_passphraseを使うことで.confファイルの作成が簡単になります。作成したファイルはWi-Fiのパスワードが含まれますので権限を600にして他者の読み取り権限を外します。また作成時のコマンド履歴からもパスワードが漏れる可能性があるのでhistory -cでコマンド履歴を削除しています。(履歴を全部消したくない場合はhistoryから番号を確認して、history -d [番号]で消してください)
またwpa_supplicantのバージョン2.6以降は次の設定も.confファイルに書き込む必要があるということです。dpkg -lで確認したところ、インストールされたものはバージョン2.7でしたので記述します。
ctrl_interface=/run/wpa_supplicant update_config=1
/etc/network/interface.d/に新たにインターフェースの設定ファイルを作成して記述します。これは/etc/network/interfaceに記述してもいいです。どちらの方法をとるにしてもconfファイルと同様の理由からファイルの権限は600にしてください。
ここでは/etc/network/interface.d/wifiというファイルを作りました。そこに次のように記述をします。
allow-hotplug [Wi-Fiインターフェース名] iface [Wi-Fiインターフェース名] inet dhcp wpa-ssid [SSID] wpa-psk [ハッシュ化済みパスワード]
SSIDとハッシュ化済みパスワードにはconfファイルで設定した値と同じものを記述してください。
wpa_supplicantサービスを設定します。
systemctl reenable wpa_supplicant systemctl restart wpa_supplicant
再起動したところ、Wi-Fiアクセスポイント経由でIPアドレスの配布を無事受けることができました。pingの疎通も問題ありません。
親機として設定(WPA2-PSK)
今度はDebianをWi-Fiの親機にします。いきなりエンタープライズにするのは難しそうなのでまずはパーソナル(PSK)でためしてみます。親機化の設定はIBM Developerのページを参考に進めていきます。
まず、先ほどテストしたWi-Fiクライアントの設定を無効にします。
systemctl stop wpa_suppliacnt systemctl disable wpa_supplicant
また/etc/network/interfaces.d/wifiに記述した内容をすべてコメントアウトします。後で利用するつもりがなければ削除してもかまいません。
次に無線デバイスの設定ツールであるiwをインストールします。# apt install iw
インストールが終わったら接続しているUSB-Wi-Fiが親機能として使えるかを確認します。
iw list
出力された中の「Supported interface modes」の部分にAPという文字があるかをを確認します。
APは、マスターやインフラストラクチャーモードとも呼ばれ、これが無線LAN親ととして機能するモードです。この記述があれば無線LANの親になれます。
他、IBSSは、アドホックモードとも呼ばれ端末同士が直に接続できる機能です。Managedは、クライアントモードとも呼ばれ無線のアクセスポイントに接続する機能です。
また出力順序が逆転してしまいますが、今回はWPA2での暗号化に対応しているかを「Supported Ciphers:」の項目で確認ができます。WPA2ではCCMPが暗号化プロトコルとして用いられますのでその記述があるかどうかを確認します。
hostapd
無線LAN親機の核となるアプリはhostapdです。USB-Wi-Fiアダプタが対応可能だと確認できたら、これをインストールします。
#apt install hostapd
設定ファイル/etc/hostapd/hostapd.confを作成し次のように設定を入力します。
- interface=[インターフェース名]
インターフェース名を入力します。
- bridge=
ブリッジ名を入力します。存在しない場合は空白にします。接続できたら他のインターフェースとブリッジしますが、ここでは空白にしておきます。
- driver=nl80211
ほとんどの環境でnl80211固定となると思います。
- ssid=test
SSIDを任意で付けます。
- auth_algs=1
認証方式です。1がWPAのみ、2がWEPのみ、3が両方です。
- wpa=2
wpaのバージョン指定です。1が1、2が2、3が両方です。(WPA3は未対応のようです)
- wpa_psk_file=/etc/hostapd/psk
APのパスワード設定ファイルを指定します。ファイルの中身はmacアドレスとパスワードのセットを1行とした記述方法になります。各行は空白で区切って入力します。macアドレスは:区切りでアルファベットは小文字にします。もしmacアドレスの制限をしない場合は、オール0のmacアドレスに(00:00:00:00:00:00)に共通のパスワードを設定します。
# 端末(macアドレス)毎
aa:bb:cc:dd:ee:ff password
# 全端末共通
00:00:00:00:00:00 password
... - wpa_key_mgmt=WPA-PSK
鍵の暗号化アルゴリズムを指定します。WPA-PSKかWPA-EAP、または両方を指定します。とりあえずPSKでテストします。
- wpa_pairwise=CCMP TKIP
利用できる暗号化方式を指定します。CCMPかTKIP、または両方を指定できます。基本的には強度の高いCCMPでいいのですが一部のWindows端末を利用する場合はTKIPが必要になることがあるそうです。
- rsn_pairwise=CCMP
一つ前と同じです。
- country_code=JP
国コードを日本に設定します
- ieee80211d=1
1を設定すると指定された国の設定に基づいていチャンネルと出力が設定されます。0は無効になります。
- ieee80211h=0
1を設定すると5G帯域の屋外使用で必要なDFSの運用をします。0にすると無効になります(5G帯域の屋外使用はできません)。筆者の持つWi-Fiアダプタの場合は5G帯の規格はないので0としました。
- hw_mode=g
Wi-Fiのモードを指定します。5Gならa、2.4Gならgを指定します。筆者の場合はbとgに対応可能なアダプタでしたのでgとしました。bを利用する場合も設定はgでいいようです。
また、 Gento Linuxによると、nに対応するにはieee80211n=1の記述を追加します。この時設定がgだと2.4G、aだと5Gとなるようです。nで2.4Gと5Gの両方の周波数に対応するにはもう一本アンテナが必要です。acの場合はこの設定をaにして、ieee80211ac=1を加えます。nやacを利用する場合は、ほかにQoSの設定であるwmm_enabled=1も設定に加えます。axには対応していないようです。
- channel=1
チャンネル番号設定します。2.4G帯域のチャンネルはg規格の場合13個ありますが、もともと周波数が重なり合う部分があります。20MHz幅の時は重ならないで使える最大は3チャンネルです。b規格では一つだけ他と干渉しない14chがありそれを含めると最大4チャンネルとなります。nではチャンネルを40MHzに束ねて利用することができますが、それだと利用できるチャンネルは半分となります。5G帯では19のチャンネルがありどれも重なることがありません。こちらは20,40,80,160MHzとチャンネルを束ねることができますが、そうすると利用できるチャンネル数は減っていきます。また、5G帯では屋外使用が制限されます。DFSやTPCといった干渉回避機能を求められたり、屋外で受信すると法律違反となる帯域が存在します。
現地調査をしてすいているチャンネルを選択するのが手っ取り早いと思います。また、ソースコードからCONFIG_ACSを有効にしたビルドが必要になりますが0を指定して自動検出する設定も存在するようです。
これらの設定はhostapd.conf 覚書にも詳しく載っていて、参考にさせていただきました。ありがとうございます。
この設定で動かしてみます。
hostapd -d /etc/hostapd/hostapd.conf
長くログが出力されますが、成功時は接続を待ち受けたままカーソルが戻ってきません。戻ってきている時はどこかでエラーが出ているはずなので、それを手がかりに対応します。hostapd.confの記述ミスやPSKのパスワード文字数が少なすぎる等が原因だと思います。
ブリッジの設定
ここまでの設定でWi-Fiへの接続は可能になります。スマホでもいいので別の端末からアクセスしてみましょう。認証までは進みますが、IPアドレスが配布されず頻繁に切断される状態だと思います。そこで、DHCPが機能しているネットワークとつながっている固定イーサネットインターフェースとブリッジを設定します。
DHCPサーバーを新たに立ち上げる場合はこちらの記事を参考にしてみてください。
ブリッジに必要なアプリをインストールします。
apt install bridge-utils
/etc/network/interfacesを次のように変更します。元に戻す時にわかるようにバックアップを取っておきましょう。
#既存のイーサネットの設定をすべて削除 auto br0 iface br0 inet static address 既存のイーサネットの値 gateway 既存のイーサネットの値 dns-nameservers 既存のイーサネットの値 bridge_ports 既存のイーサネットのインタフェース名
これでいったん再起動します。
再びhostapdを起動します。その後に次のコマンドを入力してWi-Fiインターフェースをブリッジに加えます。コマンドはhostapdが起動していないとエラーになります。
brctl addif br0 [無線インターフェース名]
ブリッジが有効になった状態で再度クライアントからWi-FiにアクセスするとIPアドレスが得られて接続が安定すると思います。
また、hostapd.confの先ほど空白にしておいたエントリーに次のようにブリッジ名を設定をしておけば、wi-fiインターフェースを自動的にブリッジに追加してくれます。
bridge=br0
さらに、PC起動時にAPを自動起動させる設定も簡易的にしておきます。管理者のcronに次の記述をします。PCの起動後15秒待った後に、hostapdをバックグラウンドで実行する設定となっています。無線LANアダプタがDebianに認識される前に実行されたりするとエラーになりますが、その際は15の部分で調整をしてください。
$su
...
#crontab -e
@reboot sleep 15; /sbin/hostapd -B /etc/hostapd/hostapd.conf
次に、WPA2エンタープライズに対応させたいと思うのですが、長くなりましたので別記事にしたいと思います。→freeRadiusでWPA2エンタープライズ認証