なかなか苦労したので備忘録として残します。
基本的に弄る設定は
- /etc/dnsmasq.conf
- /etc/hostapd/hostapd.conf
- /etc/dhcpcd.conf
の3つです。(設定前にソフトをインストールする必要があります)
そして、各デーモンの起動タイミングをコントロールするのが重要です。(最後の方に記載)
「アクセスポイント化」で調べてすぐに発見できるサイトがこちらのサイトですが、情報が古いようで僕の環境ではうまくいきませんでした。
<僕の環境>
基盤は「ラズベリーパイ3」
バージョンは下記コマンドで確認
lsb_release -alsb_release -a
すると、
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 10 (buster)
Release: 10
Codename: buster
という環境です。
<参考>
https://nw-electric.way-nifty.com/blog/2018/05/pi-3wifi-access.html
https://nw-electric.way-nifty.com/blog/2018/05/pi-3wifi-access.html
とりあえず、Wi-Fiの国指定をする必要があるようなので
sudo raspi-config
でWi-Fiの設定をします。
[Localisation Options]→[Change Wi-fi Country]
Japanを選んでEnterです。
必要なソフトは
- アクセスポイントにするデーモンプログラム「hostapd」
- IPアドレスを振り分ける役割をする「dnsmasq」
の2つです。下記のコマンドでインストール出来ます。
sudo apt-get update
sudo apt-get install hostapd dnsmasq
ここ以降、古い参考サイトを見て実行してもうまくいかなかったので、2019年8月に執筆されているサイトを参考にしました。
<参考>
Raspberry Pi 3 Model B+の無線LANでルータを構成する - mekiku.com
まずは、設定を弄るので先ほどインストールしたソフトを一度停止します。
sudo systemctl stop hostapd
sudo systemctl stop dnsmasq
IPアドレスの固定
dhcpcd.confを弄ってwlan0のIPアドレス固定をします。
sudo nano /etc/dhcpcd.conf
古い記事に「denyinterfaces wlan0」と記載されていましたが、特に書かなくても良いみたいです。
うまく行かないときにコチラの記事を発見して
<参考>
DNSMASQ problem - Raspberry Pi Forums
「allow-hotplug wlan0〜」と記載されていましたので真似てみましたが、こちらも不要なようでコメントアウトしています。
#allow-hotplug wlan0 << Unhashed this line in /etc/network/interfaces
interface wlan0
static ip_address=192.168.123.1/24
static routers=192.168.123.1
static domain_name_servers=192.168.123.1
static broadcast 192.168.123.255
アクセスポイントの設定
hostapd.confを弄ってアクセスポイントとして接続するときの名前やパスワードを設定します。
sudo nano /etc/hostapd/hostapd.conf
概ねこのような感じになりました。
interface=wlan0
driver=nl80211
ssid=MY-SSID
hw_mode=g
channel=3
wmm_enabled=0
macaddr_acl=0
auth_algs=1
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
wpa_passphrase=PASSWORD
「MY-SSID」と「PASSWORD」は任意で変更しましょう。というかする必要があります。
次いで、この設定を有効にするように
sudo nano /etc/default/hostapd
で中身の#を外してこの設定ファイルを指定します。
DAEMON_CONF="/etc/hostapd/hostapd.conf"
DNSの設定
接続したクライアントにどのIPを振り分けるか?を設定します。
ひとまず元の設定ファイルは移動させておきます。
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf-copy
設定ファイルを新規作成します。
sudo nano /etc/dnsmasq.conf
中身は、「wlan0に接続してクライアントに"192.168.123.2"~"192.168.123.40"までのアドレスを振り分ける」という設定内容です"192.168.123.1"はIP固定時に自身のアドレスを既に指定していますので外しましょう。
interface=wlan0
dhcp-range=192.168.123.2,192.168.123.40,255.255.255.0,24h
ここまでで、概ね設定は完了です。
ポートフォワード設定
これまでの設定で、アクセスポイントとして機能し、さらにIPアドレスを振り分けられるようになりました。
ところが、アクセスはできるもののインターネットの閲覧は出来ません。
外部へアクセスするにはWi-Fi←→LANを繋ぐ「ポートフォワード」という機能を使う必要があります。
sudo nano /etc/sysctl.conf
で、コードの#を外して
net.ipv4.ip_forward=1
を有効にします。
sudo nano /proc/sys/net/ipv4/ip_forward
でデフォルトで設定0なので、1にする。
参考サイトでは何故か皆シェルコマンド叩いてあるのでshで設定してみました。
sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
IPマスカレード設定
ポートフォワードで繋いだWi-Fi機器をラズパイのIPアドレスとして通信させるための設定です。
僕には何だかよくわかりませんが、ファイルを下記のコマンドを実行するようです。
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
そして、起動時にこの設定が有効になるよう、
sudo nano /etc/rc.local
でコードの最終行にある「exit 0」の上に
を記述します。
これで設定は完了!
システムの再起動すると!
sudo reboot
残念ながら僕の環境の場合、繋がりませんでしたー!
調べてみると、dnsmasqがエラーを吐いているようです。
systemctl status dnsmasq
どうやら先の参考サイトの通りにdnsmamsqの起動タイミングを遅らせる必要があるようです。
先ほど設定したファイル、
sudo nano /etc/rc.local
に、参考サイトの通りにexit 0の前に8秒後にdnsmasqを再起動させるコマンドを入れます。
service dnsmasq stop
sleep 8
service dnsmasq start
iptables-restore < /etc/iptables.ipv4.nat
再起動します。
sudo reboot
未だ繋がりません!!
dnsmasqは一応起動しているようなので他を当たります。
systemctl status dnsmasq
いろいろやってみて、試しにhostapdを再起動させようとすると、
sudo service hostapd restart
Failed to start hostapd.service: Unit hostapd.service is masked.
となってマスクされて出来なかったです。
この場合、マスクを外して再度起動させる必要があるようです。
<参考サイト>
RaspberryPiでルーターを自作し無線AP化 - Qiita
sudo systemctl unmask hostapd
sudo systemctl enable hostapd
sudo systemctl start hostapd
再起動させてみると、
sudo service hostapd restart
なんだかうまくいったようです。
しかし、再度再起動させるとまた繋がらない!
しかしhostapdを再起動させると繋がる!!?
ということで、要するにhostapdを再起動させると繋がるようなので、先の起動時に実行するファイルに
sudo nano /etc/rc.local
3秒後にhostapdを再起動させるコマンドを書き加えます。
service dnsmasq stop
sleep 8
service dnsmasq start
iptables-restore < /etc/iptables.ipv4.nat
sleep 3
service hostapd restart
なんだかよく解りませんが、ようやく繋がるようになりました。
ヤレヤレ
これでラズパイをWi-Fiアクセスポイント化することができました!
これでラズパイを中継機を挟むことなく(ルーターでIPを割り振ること無く)、外部から直接Wi-Fiで繋いで制御させることが出来るようになりますね!
<続>
今回使ったSDカードをそのまま流用して、WiFiの搭載されていないラズパイ2でもWiFiドングルを使って同じようにアクセスポイント化することが出来ます↓