概要
RaspberryPiをWi-Fiアクセスポイントにするときにちょっとハマったので、メモ。
背景と目的
RaspberryPiをWi-Fiアクセスポイントで動かそうと思い、適当にやったら意外とハマってしまったので、次回ハマらないようにメモしておく。
詳細
0.実施条件およびやりたいこと
- Raspberry Pi 3 Model B
- Raspbian Stretch
- Raspberry PiをWi-Fiアクセスポイントとして動作させたい
- 手元のタブレットをこのアクセスポイントに接続させ、Raspberry Pi上にあるローカルWebサーバ上のコンテンツを表示させたい
- IPアドレスは固定したい
- Ethernetはつながない、インターネットへの接続はできなくてもよい
1.関連ソフトインストール
いきなり、apt-get install ... と行きたいところだが、そもそもアクセスポイントとして動くために何が必要かというと、
- アクセスポイント化するソフト
- アクセスポイント化するソフトは絶対必要なのは言うまでもない。hostapdというソフトがネット上でよく例に上がってくるので、それを使う。
- DHCPクライアント
- 自分がアクセスポイントであっても、IPアドレスをDHCPサーバに振ってもらわないといけないので必要(自動、固定の場合ともに)。だが、これは通常Wi-Fiアクセスポイントに接続する場合にはRaspberry Piが振られる側なので、dhcpcdというソフトがもともと入っている。インストール必要なし。
- DHCPサーバ
というわけで、
sudo apt-get update sudo apt-get install hostapd sudo apt-get install isc-dhcp-server sudo apt-get install rng-tools
最後のrng-toolsは、やってみて必要なのが分かったので、書いておく。これがないと、hostapdがうまく動かない。/dev/random関連でエラーが出る。
2.Wi-Fiクライアントとしての設定を無効化
現在、自宅のWi-Fiにクライアントとして接続しているが、これを無効化する。
2.1 wpa_supplicantを止める
sudo systemctl stop wpa_supplicant
sudo systemctl disable wpa_supplicant
なお、wpa_supplicant.confはwpa_supplicant自体が止まり参照されなくなるので、そのままでよい。
2.2 dhcpcdの設定を固定IPに変える
IPアドレス固定で使いたいので、現在のクライアントモードの設定をバックアップしてから編集する。
sudo cp /etc/dhcpcd.conf /etc/dhcpcd.conf.client
- /etc/dhcpcd.conf
denyinterfaces wlan0 interface wlan0 static ip_address=192.168.2.167/24
アクセスポイントモードの設定も、後で戻せるようにバックアップ。
sudo cp /etc/dhcpcd.conf /etc/dhcpcd.conf.apmode
編集したら再起動。
sudo systemctl restart dhcpcd
ここで、もしも
Job for dhcpcd.service failed because the control process exited with error code. See "systemctl status dhcpcd.service" and "journalctl -xe" for details.
と出る場合は、
sudo systemctl status dhcpcd
で、ログを見て
Not running dhcpcd because /etc/network/interfaces defines some interfaces that will use a DHCP client or static address
と出ている場合は、/etc/network/interfacesの設定がまずいので、以下の2行をコメントアウトしてから再度実行。
#auto wlan0 #iface wlan0 inet dhcp
3.hostapdの設定
/etc/hostapd/hostapd.confを作成し以下を記入。ただし、ここは環境により違うので、うまくいかなかったら適宜設定を変える。(私の環境の場合、以下でとりあえずうまくいっている)
interface=wlan0 driver=nl80211 hw_mode=g channel=3 ssid=SSID名 wpa=2 wpa_key_mgmt=WPA-PSK wpa_passphrase=パスフレーズ rsn_pairwise=CCMP
hostapdをデーモンとして動かすときに上記ファイルを読むように、/etc/default/hostapdの下記部分を編集。
DAEMON_CONF="/etc/hostapd/hostapd.conf"
デーモンを有効化。
sudo systemctl unmask hostapd sudo systemctl enable hostapd sudo systemctl start hostapd
4.isc-dhcp-serverの設定
/etc/dhcp/dhcpd.confを編集。それにしても、dhcpcdとdhcpdはめちゃくちゃ紛らわしい。。。今回固定したいアドレスを192.168.2.167とすると、rangeをそれが入る範囲とする。
sudo cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.original
subnet 192.168.2.0 netmask 255.255.255.0 { range 192.168.2.100 192.168.2.200; option broadcast-address 192.168.2.255; default-lease-time 600; max-lease-time 7200; }
sudo cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.apmode
デーモンを起動。
sudo systemctl enable isc-dhcp-server sudo systemctl restart isc-dhcp-server # すでに起動しているかもしれないので
ここまでで、自分に固定IPアドレスが振られて、SSIDを吹いているはず。クライアントを接続させて、クライアントにもIPアドレスが振られればOK。自分にIPアドレスが振られていない場合は、DHCPクライアントの設定、クライアントに振られていない場合はDHCPサーバの設定がまずいかもしれない。 SSIDを吹いているのに、接続できなかったりする場合は、hostapd.confがだめかもしれない。私はこれで結構ハマった。結局どうすればいいのか、はっきりわからないが、動いてしまったのでよしとする。。。
5. アクセスポイントモードに一気に変更
上記を一度はやったという前提で、一気にアクセスポイントモードに変えるには以下。
sudo systemctl stop wpa_supplicant sudo systemctl disable wpa_supplicant sudo cp /etc/dhcpcd.conf.apmode /etc/dhcpcd.conf sudo systemctl restart dhcpcd sudo systemctl enable rng-tools sudo systemctl restart rng-tools sudo systemctl enable hostapd sudo systemctl restart hostapd sudo systemctl enable isc-dhcp-server sudo systemctl restart isc-dhcp-server
6. クライアントモードに戻す
逆に戻すには、各種サービスを切り替えればよい。
sudo systemctl stop isc-dhcp-server sudo systemctl disable isc-dhcp-server sudo systemctl stop hostapd sudo systemctl disable hostapd sudo cp /etc/dhcpcd.conf.client /etc/dhcpcd.conf sudo systemctl restart dhcpcd sudo systemctl enable wpa_supplicant sudo systemctl restart wpa_supplicant
まとめと今後の課題
Raspberry PiをWi-Fiアクセスポイントにすることができた。実際にやってみたら結構ハマってしまったのでなめてかからないほうがよいと思った。