工作と競馬2

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

Wi-Fiアクセスポイントにする

概要

RaspberryPiをWi-Fiアクセスポイントにするときにちょっとハマったので、メモ。


背景と目的

RaspberryPiをWi-Fiアクセスポイントで動かそうと思い、適当にやったら意外とハマってしまったので、次回ハマらないようにメモしておく。


詳細

0.実施条件およびやりたいこと

  • Raspberry Pi 3 Model B
  • Raspbian Stretch
  • Raspberry PiWi-Fiアクセスポイントとして動作させたい
  • 手元のタブレットをこのアクセスポイントに接続させ、Raspberry Pi上にあるローカルWebサーバ上のコンテンツを表示させたい
  • IPアドレスは固定したい
  • Ethernetはつながない、インターネットへの接続はできなくてもよい


1.関連ソフトインストール

いきなり、apt-get install ... と行きたいところだが、そもそもアクセスポイントとして動くために何が必要かというと、

  • アクセスポイント化するソフト
    • アクセスポイント化するソフトは絶対必要なのは言うまでもない。hostapdというソフトがネット上でよく例に上がってくるので、それを使う。
  • DHCPクライアント
    • 自分がアクセスポイントであっても、IPアドレスDHCPサーバに振ってもらわないといけないので必要(自動、固定の場合ともに)。だが、これは通常Wi-Fiアクセスポイントに接続する場合にはRaspberry Piが振られる側なので、dhcpcdというソフトがもともと入っている。インストール必要なし。
  • DHCPサーバ
    • これは、自分がアクセスポイントになったときに、接続してきた相手にIPアドレスを振ってあげないと通信できないので、必要。いろいろあるようだが、isc-dhcp-serverというのが代表的に使われているようなので、それを使う。

というわけで、

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 PiWi-Fiアクセスポイントにすることができた。実際にやってみたら結構ハマってしまったのでなめてかからないほうがよいと思った。