DreamerDreamのブログ

夢想家の夢です。〜揚げたてのモヤっとしたものをラフレシアと共に〜

備忘録:ラズパイを無線アクセスポイント化する

なかなか苦労したので備忘録として残します。

基本的に弄る設定は

 

  • /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]

f:id:DreamerDream:20191122121549p:plain

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の設定

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

を有効にします。

f:id:DreamerDream:20191129102621p:plain


 

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 sh -c "iptables-save > /etc/iptables.ipv4.nat"

そして、起動時にこの設定が有効になるよう、

sudo nano /etc/rc.local

 でコードの最終行にある「exit 0」の上に

iptables-restore < /etc/iptables.ipv4.nat

を記述します。

 

 

これで設定は完了!

システムの再起動すると!

sudo reboot

 

 残念ながら僕の環境の場合、繋がりませんでしたー!

 

 

調べてみると、dnsmasqがエラーを吐いているようです。

systemctl status dnsmasq

f:id:DreamerDream:20191122123526p:plain

どうやら先の参考サイトの通りに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

f:id:DreamerDream:20191122123855p:plain

 

 

いろいろやってみて、試しに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ドングルを使って同じようにアクセスポイント化することが出来ます↓

dreamerdream.hateblo.jp

 

kampa.me