【RasPi】アクセスポイントにする

# はじめに

おじさんは日夜頑張って報われない仕事をしているのですが、これが何度も挑戦してもうまくできなくて貴重な人生の時間をつぶしていました。それは、、、「RasPiをアクセスポイントにし、ノートPCやスマホからRasPiを操作する」です。まだ、できていません。。

~~今回、RasPiをアクセスポイントにするOSSがあり、本当に簡単にできたので紹介しておきます。また、関連する内容として、wlanの設定の確認のメモも書いておきます。~~

(修正) RasAPを使った生地を最初書きましたが、その後、もっと簡単にできる方法(Network Manager, nmcliの利用方法)が分かりました。記事を修正しましたが、もとのRaspAPの部分は残しておきます。

# 内容

## GUIでの設定

Raspberry Pi OSでデスクトップ画面を開いている場合、最も簡単なのは画面右上にあるWiFIネットワークに関する設定を利用する方法です。"Advanced Options" から "Create Wi-Fi Hotspot" を選択します。network name, WI-FI security, Password を設定します。

## CUIでの設定

Network Manager (nmcli)を用いて下記でできます。device で　wifi を指定し、hotspot でモードでwlan0 というインターフェイスを動かします。

```
$ sudo nmcli device wifi hotspot ifname wlan0 ssid "myhotspot" password "mypassword"
```

設定したネットワーク接続 myhotspot をシステム起動時やネットワークを利用可能になった時に自動的に接続するように設定します。

```
$ sudo nmcli connection modify myhotspot autoconnect yes
```

設定の確認。

```
$ sudo nmcli connection show
```


# 参考情報(他の方法)

## RaspAPでアクセスポイントにする

RaspAPというものが存在するようです。ありがたや、ありがたや。

https://raspap.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294040/d9f5a7ba-a88d-5b57-970d-eb835e7808eb.png)

RasPiとノートPCとモニターが手元にある環境で作業しました。

### インストール


下記でインストールできました。最後 bash 以下でオプションを指定し、途中でY/nを答えることなく最後まで設定されます。

```
sudo apt-get update
sudo apt-get dist-upgrade
sudo reboot
curl -sL https://install.raspap.com | bash -s -- --yes --openvpn 1 --adblock 0﻿
```

このinstall loader のオプションの説明はこちらのございます。

　https://docs.raspap.com/quick/


### 設定と接続確認

今、おいらはRasPiをモニターにつないでいるので、そのまま http://localhost をブラウザで開きました。
下記は、全てこのWebUIから全て行いました。デフォルトで、user: admin, password:secret のBasic認証で接続できたと思います。

- SSIDの変更 (default: RaspAP-webgui)
- channel 番号の設定(default: 1)
- PSK: "hotspot"の項目で "Security"タブを開くとPSKを編集できます。

"start hotspot" のボタンを押してみると、何かが立ち上がり、Hstspotの画面の右上が hstapt up が緑色になりました。

次に、ノートＰＣ側でWiFi接続先を、今用意したＡＰに変更します。要求されるパスワードは "ChangeMe"です。無事に接続できると、IPアドレスが降られているはずです。コマンドプロンプトでＩＰアドレスを確認してみました。

```
Wireless LAN adapter Wi-Fi:

   接続固有の DNS サフィックス . . . . .:
   リンクローカル IPv6 アドレス. . . . .: fe80::52e0:d21d:add6:5bc9%3
   IPv4 アドレス . . . . . . . . . . . .: 10.3.141.108
   サブネット マスク . . . . . . . . . .: 255.255.255.0
   デフォルト ゲートウェイ . . . . . . .: 10.3.141.1
```

この状態で、GetewayにもなっているRasPiのアドレス http://10.3.141.1 をブラウザで開くと、同じように管理画面を開けます。また、"ssh pi@10.3.141.1" でログインもできました。

### systemctl で raspapd の制御

再起動したとき、動いていると思います。サービス？として動いているのを確認できます。

```
$ sudo systemctl status raspapd
```

```systemctl stop raspapd.service``` で停止することも、```systemctl disable raspapd.service``` として起動しないようにすることもできるようです。

## Access point にするためのrouting設定

ここまでの状態では

 (internet) <---> eth0 [RasPi] wlan0 <---

 という感じでeth0からは外のインターネットに接続できる一方で、wlan0は外から接続を求めてくるスマホなどにIPアドレスを割り振りRasPiにはアクセスできます。が、wlan0からeth0経由で外のインターネットにはいけませんでした。

[この掲示板](https://forums.raspberrypi.com/viewtopic.php?t=283149)を情報に、以下の設定を行うとできるようになりました。

 ### IPv4 forwarding を有効にする。

 (1) まず/etc/sysctl.conf で下記を有効にします。初期設定ではコメントアウトされていたので、uncomment します。

 ```[/etc/sysctl.conf]
net.ipv4.ip_forward=1
 ```

と編集して

```
$ sudo sysctl -p
```

(2) 下記を実行して転送するようにします。

```
$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE  
$ sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
$ sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
$ sudo netfilter-persistent save
```

## wlan設定の確認

こちらの公式ドキュメントを参考にしています。

https://igarashi-systems.com/sample/translation/raspberry-pi/configuration/wireless-cli.html


### APをスキャンする

自宅に設定したWiFiルータにつなげたい、とかするとき、アクセスポイントが見えているかを確認できます。

```
pi@raspberrypi:~ $ sudo iwlist wlan0 scan | grep ESSID
                    ESSID:"Family Room TV.v,"
                    ESSID:"0C67XXXXXXXX-5G"
                    ESSID:"F660A-xxxx-G"
                    ESSID:"USPOT_xxxxxxxx_5.0G"
                    ESSID:"aterm-xxxxxx-g"
                    ESSID:"E81XXXXXXXX-2G"
                    ESSID:"TP-Link_XXXX"
                    ESSID:"pr500m-xxxxxx-3"
                    ESSID:"BCW720J-XXXXX-G"
                    ESSID:"SPWH_H32_XXXXXXX"                    ESSID:"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
                    ESSID:"TownWiFi"00001240
```

接続するには、パスワードを書かなくてはいけません。暗合するには

```
$ sudo su -
# wpa_passphrase your_ssid password >> /etc/wpa_supplican/wpa_supplicant.conf
$ sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
```

で行えるようです。最後のファイル編集は、暗号化されていない passwordの行を削除するためのものです。


さて、下記でwlan0で取れているIPアドレスはこちらでも確認できるのかな？

```
pi@raspberrypi:~ $ arp -a
? (172.20.10.1) at <不完全> on wlan0
? (192.168.3.1) at 0c:67:00:00:00:00 [ether] on eth0
? (192.168.3.7) at 7c:2a:00:00:00:00 [ether] on eth0
```

固定IPアドレスを割り当てに成功しているようです。

```
pi@raspberrypi:~ $ ifconfig wlan0
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.20.10.10  netmask 255.255.0.0  broadcast 172.20.255.255
        inet6 fe80::e65f:1ff:0000:0000  prefixlen 64  scopeid 0x20<link>
        inet6 2400:2410:a9c1:b100:e65f:1ff:fea8:ab63  prefixlen 64  scopeid 0x0<global>
        ether e4:5f:01:00:00:00  txqueuelen 1000  (イーサネット)
        RX packets 51281  bytes 15158782 (14.4 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 98580  bytes 22841830 (21.7 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
```

### WiFiをリセットする

よくWiFiをオフにして、再度オンにするとかやりますよね。同じことを行いたいと思いました。

```
$ wpa_cli -i wlan0 reconfigure
OK
```

また、昔は```ifdown```や```ifup```のコマンドを使っていましたが、今では下記で行うようです。

```
$ sudo ifconfig wlan0 down
$ sudo ifconfig wlan0 up
```

とするようです。これ、忘れて何度も調べています。人生の時間の無駄だった。

### IPアドレスの固定、動的取得

dhcpdがなくては。

```
$ sudo apt install dhcpcd
```

以前は /etc/network/interfaces に書いたが、現在は/etc/dhcpcd.confに書くらしい。

```/etc/dhcpd.conf
interface wlan0
static ip_address=192.168.2.10/24
static routers=192.168.0.1 # default gateway
static domain_name_servers=192.168.0.1 # DNS server
```

### hostapd

まずはインストールする。

```
$ sudo apt install hostapd
```

設定ファイルを編集します。

$ sudo nano /etc/hostapd/hostapd.conf

これを参照するのように編集します。

```/etc/default/hostapd
...
DAEMON_CONF="/etc/hostapd/hostapd.conf"
```

そして、```$ sudo systemctl restart hostapd```でサービスを起動させるようです。

### 参考にしたサイト

https://note.com/airily_inc/n/n1ccf98fb7b24

https://zenn.dev/ijiwarunahello/scraps/b39ddb082c8ea8

https://neenet-pro.com/raspap-vp/

https://raspida.com/rpi-wifi-ap

https://blog.soracom.com/ja-jp/2022/10/31/how-to-build-wifi-ap-with-
bridge-by-raspberry-pi/

https://hyottokoaloha.hatenablog.com/entry/2015/02/24/000655

## SSL Certificateを追加する


HTTPSを自分で発行した証明書で行うために、追加の作業が必要です。下記を参照。

https://docs.raspap.com/ssl/#quick-installer

### mkcertによる証明書の作成とlighttpd の起動

mkcert というソフト？を使うのですが、manual install と quick install の二つの方法が紹介されています。私はquick の方で行いました。


```
$ curl -sL https://install.raspap.com | bash -s -- --cert

 888888ba                              .d888888   888888ba
 88     8b                            d8     88   88     8b
a88aaaa8P' .d8888b. .d8888b. 88d888b. 88aaaaa88a a88aaaa8P
 88    8b. 88    88 Y8ooooo. 88    88 88     88   88
 88     88 88.  .88       88 88.  .88 88     88   88
 dP     dP  88888P8  88888P  88Y888P  88     88   dP
                             88
                             dP      version 3.0.9

The Quick Installer will guide you through a few easy steps


RaspAP mkcert: Configure a new SSL certificate
Current system hostname is raspberrypi
Create an SSL certificate for raspberrypi.local? (Recommended) [y/N]y
Install to lighttpd SSL directory: /etc/lighttpd/ssl? [y/N]: y
***************************************************************
A new SSL certificate for: raspberrypi.local
will be installed to lighttpd SSL directory: /etc/lighttpd/ssl
***************************************************************
Complete installation with these values? [y/N]: y
RaspAP mkcert: Fetching mkcert binary
RaspAP mkcert: Installing mkcert
Created a new local CA at "/home/pi/.local/share/mkcert" 💥
The local CA is now installed in the system trust store! ⚡️
Warning: "certutil" is not available, so the CA can't be automatically installed in Firefox and/or Chrome/Chromium! ⚠️
Install "certutil" with "apt install libnss3-tools" and re-run "mkcert -install" 👈

RaspAP mkcert: Generating a new certificate for raspberrypi.local
Using the local CA at "/home/pi/.local/share/mkcert" ✨
Warning: the local CA is not installed in the Firefox and/or Chrome/Chromium trust store! ⚠️
Run "mkcert -install" to avoid verification errors ‼️

Created a new certificate valid for the following names 📜
 - "raspberrypi.local"
 - "*.raspberrypi.local.local"
 - "raspberrypi.local"

Reminder: X.509 wildcards only go one level deep, so this won't match a.b.raspberrypi.local.local ℹ️

The certificate is at "./raspberrypi.local+2.pem" and the key at "./raspberrypi.local+2-key.pem" ✅

RaspAP mkcert: Combining private key and certificate
OK
RaspAP mkcert: Creating SLL directory for lighttpd
OK
RaspAP mkcert: Setting permissions and moving .pem file
OK
RaspAP mkcert: Configuring lighttpd for SSL
Adding line server.modules += ("mod_openssl")
Adding line $SERVER["socket"] == ":443" {
Adding line ssl.engine = "enable"
Adding line ssl.pemfile = "/etc/lighttpd/ssl/raspberrypi.local.pem"
Adding line ssl.ca-file = "/home/pi/.local/share/mkcert/rootCA.pem"
Adding line server.name = "raspberrypi.local"
Adding line server.document-root = "/var/www/html"}
OK
RaspAP mkcert: Copying rootCA.pem to RaspAP web root
OK
RaspAP mkcert: Restarting lighttpd service
...
***************************************************************
Open a browser and enter the address: http://raspberrypi.local/rootCA.pem
Download the root certificate to your client and add it to your system keychain.
Note: Be sure to set this certificate to 'Always trust' to avoid browser warnings.
Finally, enter the address https://raspberrypi.local in your browser.
Enjoy an encrypted SSL connection to RaspAP 🔒
For advanced options, run mkcert -help
***************************************************************
```

PEMファイル/etc/lighttpd/ssl/raspberrypi.local.pem　ルートCA証明書　/home/pi/.local/share/mkcert/rootCA.pem　が作るようです。そして lighttpd というサービスが起動するようです。設定ファイル類は、/etc/lighttpd/にあります。

私はここに書かれているようにブラウザ経由でrootCA.pem を持ってくれなかったので、/var/www/html/rootCA.pem を scp で持ってきました。

### ルートCA証明書のインストール

独自証明書のインストール方法を調べ、インストールしました。

https://qiita.com/msi/items/9cb90271836386dafce3
https://www.incredigeek.com/home/import-cert-pem-on-windows/
https://www.furukawa.co.jp/fitelnet/product/setting/pdf/l2tpv2_rsa_Windows10_certificate.pdf


# まとめ

とりあえず、RaspAPでRasPiを起動直後にアクセスポイントにする、という目的は達成できていました。がいくつか課題があり、

- 起動しているのに、ノートPCからAPとして接続しようとしてもできない。（ＩＰアドレスが割り振られない）という状態がある
- もとのWiFiの設定の戻せない。。

まぁ、どうしようか、、、という感じです。そのほか、気になるのはDocker での利用。

https://docs.raspap.com/docker/#using-the-container-registry

まぁ、何とかなるでしょう。生きてさえいれば。
(2024/2/12)

[追記]

- 「SSL Certificateを追加する」の節を追加しました(2024/3/7)
- IPv4 forwarding の設定方法を追記しました。(2024/8/19)
- RaspAPの方法を参考歳、nmcli（Network Manager)を利用する方法を書きました。(2024/11/4)