LinuxにWiFiアクセスポイントを設定する(再)

以前の記事で何度か取り上げているLinuxのWiFiアクセスポイント化だが、好みの設定がコマンドライン一行で出来てしまうcreate_apという秀逸なコマンドを見つけたので再度記事にしようと思う。今回はコマンドラインからcreate_apを使ってオンデマンドで起動させる場合と、create_apを使わずにブート時に自動起動させる場合の大きく2通りの設定方法をまとめる。

create_apコマンドは各種ディストリビューションで動作可能だ。今回は、Ubuntu18.04、RaspberryPi(Raspbian)、ArchLinuxで動作確認した。
(CentOS8もトライはしてみたものの、hostapdが標準パッケージに含まれていないため断念)

スポンサーリンク

想定するアダプタ構成

以下のようなアダプタ構成とし、WiFiアダプタwlp2s0が設定対象、有線イーサーネットenp1s0にインターネット接続があるものとする。

デバイス名IPアドレス用途
enp1s0インターネット接続用→既に設定されているものとする
wlp2s0192.168.12.1/24アクセスポイント用→今回の設定対象

ディストリビューションやハードウエア構成によってアダプタ名が異なるため、例えばRaspbianで内蔵WiFiアダプタwlan0をインターネット接続用、USB接続で追加したWiFiアダプタwlan1をアクセスポイント用に使う場合、以下ではenp1s0→wlan0およびwlp2s0→wlan1のように適宜読み替えのこと。

create_apのインストール

まずはcreate_apをインストール。ArchLinuxならパッケージが用意されている。

$ sudo pacman -S create_ap

Ubuntu・Raspbianの場合は以下でインストール。

$ git clone https://github.com/oblique/create_ap
$ cd create_ap
$ sudo make install

更にcreate_apの中から呼ばれるhostapdとdnsmasqのインストールも必要。

$ sudo apt-get install hostapd dnsmasq

create_apコマンドで作るアクセスポイント

create_apは設定ファイルも不要で操作が非常に簡単。
詳細はcreate_ap付属のREADMEに色々書かれているが、代表的な例を挙げておく。

普通のWiFiアクセスポイント

以下のコマンド一発で、クライアント側からenp1s0に設定された接続を介してインターネット接続可能なアクセスポイントが立てられる。

$ sudo create_ap wlp2s0 enp1s0 SSID Passphrase

インターネット共有無しの場合

クライアント側でインターネット接続が不要な場合は、以下(–no-virtaオプションが必要な場合あり)。これも呆気ないほど簡単。

$ sudo create_ap -n wlp2s0  SSID Passphrase

コマンド一発のカラクリ

上でも少し触れたが実は中からhostapdが呼ばれている。

$ ps -ef | grep hostapd
root     18309 18132  0 08:23 pts/6    00:00:00 /usr/sbin/hostapd /tmp/create_ap.wlp2s0.conf.NZfZESGt/hostapd.conf

ディレクトリ/tmp/create_ap.wlp2s0.conf.NZfZESGt/の下を覗いてみると…

$ ls /tmp/create_ap.wlp2s0.conf.NZfZESGt/
dnsmasq.conf  dnsmasq.leases  dnsmasq.pid  hostapd.conf  hostapd.pid  hostapd_ctrl/  nat_internet_iface  pid  wifi_iface

hostapdの設定ファイルの他にdnsmasqの設定ファイルらしき物と何やらNATの設定ファイルらしき物も見える。

インターネット共有無しのアクセスポイントを自動起動させる

コマンドラインからオンデマンドで起動するのではなく、ブート時に自動でWiFiアクセスポイントが有効化された方が嬉しいケースもある。例えば、ヘッドレス運用のRaspberryPiなどでは、いちいちコマンドを打ってアクセスポイントを起動するよりブート時に勝手に立ち上がってくれた方がいつでもssh接続出来て便利。インターネット接続は不要でssh接続さえ出来れば良いと割り切れる場合は以下3つの設定するだけなので割と簡単。

  • WiFiアダプタのIPアドレス(systemd-networkd)
  • hostapd
  • dhcpサーバ

以下、具体的な設定方法。

systemd-networkdの設定

hostapdは先にWiFiアダプタのIPアドレスが設定されていないと起動に失敗するため、systemd-networkdを使って設定する。

systemd-networkdが無効化されている場合は以下を実行。

$ sudo systemctl enable systemd-networkd

設定ファイル。

/etc/systemd/network/wlp2s0-static.network

[Match]
Name=wlp2s0

[Network]
Address=192.168.12.1/24

systemd-networkd起動。

$ sudo systemctl start systemd-networkd

アダプタの状態を確認。wlp2s0が”configuring”になっていればOK。

$ networkctl -a
IDX LINK             TYPE               OPERATIONAL SETUP     
  1 lo               loopback           carrier     unmanaged 
  2 enp1s0           ether              routable    unmanaged 
  3 wlp2s0           wlan               no-carrier  configuring
3 links listed.

hostapdの設定

hostapd.confに設定内容を書く。wpa_passphraseでスクランブルした暗号化キーは(“)で囲んで指定する。逆に暗号化キーをそのまま指定する時は(“)で囲まない。

/etc/hostapd/hostapd.conf

interface=wlp2s0
hw_mode=g
country_code=JP
channel=1
auth_algs=1             # 1=wpa, 2=wep, 3=both
wpa=2                   # WPA2 only
wpa_key_mgmt=WPA-PSK  
rsn_pairwise=CCMP
ssid=SSID
wpa_passphrase=Passphrase
ignore_broadcast_ssid=0 # 1-->SSID stealth

(Raspbian・Ubuntuの場合のみ)設定ファイルの場所を/etc/default/hostapdに指定する。

/etc/default/hostapd

DAEMON_CONF="/etc/hostapd/hostapd.conf"

デフォルトではhostapdはマスクされている。アンマスクしたうえで、有効化。

$ sudo systemctl unmask hostapd
$ sudo systemctl enable hostapd

hostapd起動。

$ sudo systemctl start hostapd

DHCPサーバの設定

ISC DHCPを使う。とりあえずRaspbian・Ubuntuの場合についての設定方法。

isc-dhcp-serverをインストール。

$ sudo apt-get install isc-dhcp-server

以下のように設定ファイルを作成。

/etc/dhcp/dhcpd.conf

default-lease-time 600;
max-lease-time 7200;

ddns-update-style none;
authoritative;

subnet 192.168.12.0 netmask 255.255.255.0 {
  range 192.168.12.10 192.168.12.100;
  option subnet-mask 255.255.255.0;
  option routers 192.168.12.1;
}

アダプタはwlp2s0を指定。

/etc/default/isc-dhcp-server

INTERFACESv4="wlp2s0"

systemd有効化

$ sudo systemctl enable isc-dhcp-server
$ sudo systemctl start isc-dhcp-server

ArchLinuxの場合はISC DHCPのパッケージ名等が違う。下の表に従って適宜読み替えれば、上記と同じ設定ファイルが使える。(但し、/etc/default/isc-dhcp-serverの設定は不要)。

Raspbian・UbuntuArch Linux
パッケージ名isc-dhcp-serverdhcp
設定ファイル/etc/dhcp/dhcpd.conf/etc/dhcpd.conf
systemdサービス名isc-dhcp-serverdhcpd4

アクセスポイントが立ち上がらない場合

UbuntuでNetworkManagerが動いているとWiFiクライアント接続用のコマンドwpa_supplicantが勝手に起動してWiFiアダプタを掴んでしまい、hostapdが失敗する場合がある。NetworkManagerをアンインストールする方法も一つだが、そうすると有線接続も手動設定しなくてはならず面倒だ。
根本的な解決にはならないが、

$ ps -ef | grep wpa_supplicant

でPIDを調べてkillするなど原始的な方法しか今の所思いついていない…

RaspberryPiでは2つのWiFiアダプタ両方共インターネット接続に設定されてしまう場合がある。インターネット接続させたいアダプタwlan0に関して/etc/wpa_supplicant/wpa_supplicant-wlan0.confに設定しておけばwpa_supplicantはwlan0だけを設定するので、勝手にwlan1を掴んでしまう事は無いようだ。

まとめ

create_apを使えばLinuxにWiFiアクセスポイントが簡単に立てられる。

Linuxにアクセスポイントを立てたいケースは様々あるだろう。自分の場合以下の2通りある。

  • 立てたアクセスポイントにMicroPythonなどIoTデバイスを接続させてtcpdumpでパケットキャプチャしデバッグに活用
  • RaspberryPiの中にアクセスポイントを立てて他から接続しRaspberryPiにsshでログインする

どちらの場合もcreate_apなら簡単に対応可能。後者でクライアントにインターネット接続が不要な場合、create_apを使わなくてもhostapdとdhcpサーバを設定するだけでsystemdによる自動起動が簡単に設定出来、ヘッドレス運用のRaspberryPiなどには便利だ。

コメント