以前の記事で何度か取り上げているLinuxのWiFiアクセスポイント化だが、好みの設定がコマンドライン一行で出来てしまうcreate_apという秀逸なコマンドを見つけたので再度記事にしようと思う。今回はコマンドラインからcreate_apを使ってオンデマンドで起動させる場合と、create_apを使わずにブート時に自動起動させる場合の大きく2通りの設定方法をまとめる。
create_apコマンドは各種ディストリビューションで動作可能だ。今回は、Ubuntu18.04、RaspberryPi(Raspbian)、ArchLinuxで動作確認した。
(CentOS8もトライはしてみたものの、hostapdが標準パッケージに含まれていないため断念)
想定するアダプタ構成
以下のようなアダプタ構成とし、WiFiアダプタwlp2s0が設定対象、有線イーサーネットenp1s0にインターネット接続があるものとする。
デバイス名 | IPアドレス | 用途 |
---|---|---|
enp1s0 | – | インターネット接続用→既に設定されているものとする |
wlp2s0 | 192.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・Ubuntu | Arch Linux | |
---|---|---|
パッケージ名 | isc-dhcp-server | dhcp |
設定ファイル | /etc/dhcp/dhcpd.conf | /etc/dhcpd.conf |
systemdサービス名 | isc-dhcp-server | dhcpd4 |
アクセスポイントが立ち上がらない場合
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などには便利だ。
コメント