KSMNの IoT ×アクアリウム

アクアリウム × IoT

Raspberry Pi 4 と Ubuntu 20.04 LTS で無線ルータを作成

はじめに

こんにちは!クソミネです。

今回からIoT × アクアリウムをテーマにブログを書いていきます。

いま考えてる構成は↓な感じ。水槽につけるラズパイでどんな処理をするかはまだ考えていません。

f:id:KSMN:20200720214130p:plain
仮構成図

自宅には固定回線を引いているので、水槽につけたデバイス間の通信はGreengrassを使う必要はないですが、技術のキャッチアップのため利用しようと思います。

さて本題

さて今回はGateway用のラズパイの設定、つまり無線ルータの作成を実施します。Greengrassのインストールはまた今度。

通信の経路は以下のようになります。各水槽のラズパイからGateway用ラズパイにWiFiで接続し別のラズパイやインターネットへ通信できるようにします。

ラズパイ(水槽) <- (WiFi) -> ラズパイ(Gateway用) <- (有線) -> 中継器 <- (WiFi) -> 無線ルータ <-> インターネット

サブネットは以下の構成とします。ルータではなくブリッジにしてもいいかと思いますが、、、今後ラズパイをinternet-facingな環境でルータとして使うかもしれないので練習として。。。

f:id:KSMN:20200720220029p:plain

方法

  • ラズパイはRaspberry Pi 4 Model B 8GBを利用。
  • OSはUbuntu 20.04 LTSを利用。
  • hostapdやDHCPサーバなどインストールして設定。

ubuntuのデスクトップから設定する方法やコマンド一発で設定できるcreate_apというのがありますが、なぜかうまく動作しませんでした。。。下記に実際にした作業内容を記載します。しかしこれがあってるかわかりません。トラシュしながらだったので不要な設定があるかもしれません。見つけたらぜひコメント欄で教えてください。

OSのインストール

ネットに情報があふれているので割愛します。

Ubuntu 20.04 LTSをPCにダウンロードしEtcherでSDカードに書き込みました。

初期設定

OSへSSHログイン、もしくはHDMIでモニターへつないでログインして、パッケージのupdateをします。

$ sudo apt update -y
$ sudo apt upgrade -y

wpa_supplicantの停止

wpa_supplicantは無線LANに接続するためのサービスだそうです。こいつを停止・自動起動無効化します。WiFIのインターフェースをつかんでしまってアクセスポイントを作れないとかどうとか。

$ sudo systemctl stop wpa_supplicant.service
$ sudo systemctl disable wpa_supplicant.service

ネットワークインターフェースの確認

ネットワークインターフェースのデバイス名を確認します。以下は私の環境の例で記載します。後の手順もこちらのデバイス名で記載するので、同じことをする場合はご自身の環境のものによみかえてください。

$ ls /sys/class/net/
eth0  lo  wlan0

ここでは eth0が有線でつないでる側(192.168.10.0/24)、wlan0 が新たにネットワークを構築して無線ルータのアクセスポイントとなる側(192.168.20.1/24)となります。

wlan0にIP固定

wlan0固定IPアドレス設定をしたいのですが、どうもうまくいかない。というか方法が見つからなかった。ubuntu 18.04からはnetplanとやらでネットワーク周りの設定ができるそうだが、新たにネットワークを構築する場合のIP固定方法が見つからない。いい方法と思えないが下記の方法で固定はできている。

netplanのデフォルトの設定ファイルをコピー。

$ sudo cp /etc/netplan/50_config.yaml /etc/netplan/99_config.yaml

編集して以下のようにした。アクセスポイントとパスワードを記載するが、この設定の書き方はホントはデバイスから別のアクセスポイントへ接続するための設定のよう。自分自身にアクセスする感じになりであまりイケてないが、これがないとエラーになるため記載した。

$ sudo vim /etc/netplan/99_config.yaml

network:
    version: 2
    renderer: networkd
    ethernets:
        eth0: #有線側のNIC設定
            dhcp4: true
            gateway4: 192.168.10.1 #私の自宅のデフォルトゲートウェイ
            optional: true
    wifis:
        wlan0: #新規作成する無線ネットワーク側のNIC設定
            dhcp4: false
            dhcp6: false
            addresses: 192.168.20.1/24
            gateway4: 127.0.0.1 #デフォゲはラズパイ自身を指定
            nameservers:
                addresses: [8.8.8.8, 8.8.4.4]
            access-points:
                "アクセスポイント名": #後の手順で作成するアクセスポイントとパスワード。
                    password: "パスワード" 

設定の適用。

$ sudo netplan apply

DHCPサーバ設定

無線ネットワークへ接続しに来るデバイスへIPを払い出すためにDHCPサーバが必要となります。

インストール。

$ sudo apt install isc-dhcp-server

設定ファイルを編集。

$ sudo vim /etc/default/isc-dhcp-server

DHCPDv4_CONF=/etc/dhcp/dhcpd.conf
INTERFACESv4="wlan0"

サブネットや払い出すIPレンジの設定ファイルを記載。CIDRやIPレンジは各自の環境で読み替えてください。

$ sudo vim etc/dhcp/dhcpd.conf

option domain-name-servers 8.8.8.8, 8.8.4.4;
default-lease-time 600;
max-lease-time 7200;
subnet 192.168.20.0 netmask 255.255.255.0 {
  option routers 192.168.20.1;
  option broadcast-address 192.168.20.255;
  option subnet-mask 255.255.255.0;
  range 192.168.20.100 192.168.20.254;
}

iptablesのIPフォワーディング設定

wlan0 (192.168.20.0/24)側のネットワークからet0 (192.168.10.0/24)側のネットワークへ通信させるためIPフォワーディング設定を実施します。

/etc/sysctl.confを編集します。 net.ipv4.conf.default.rp_filter=1 だけでよいという情報もあるのでこんなには不要かも。。。

$ sudo vim /etc/sysctl.conf

net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.all.rp_filter=1
net.ipv4.tcp_syncookies=1
net.ipv4.ip_forward=1
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
net.ipv4.conf.all.log_martians = 0

IPフォワードのフラグを立てます。rootユーザーでないと権限エラーになりました。

$ sudo su -
$ echo 1 > /proc/sys/net/ipv4/ip_forward
$ exit

iptablesでwlan0 -> eth0の通信の設定をします。

$ 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

同じくeth0 -> wlan0の通信の設定をします。いまのところeth0からwlan0への通信は発生しない想定ですが、今後トラシュなどで必要になるかもしれないのでしておきます。

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

iptables設定の保存

上記のIPフォワーディング設定は停止・再起動すると消えてしまいます。iptables-persistentをつかってこれを保存します。

iptables-persistentインストールとiptableの保存

$ sudo apt install iptables-persistent
$ sudo /etc/init.d/netfilter-persistent save

hostapdのインストールと設定

無線アクセスポイントを設定するのにhostapdを利用します。

インストール

$ sudo apt install hostapd

設定ファイルの場所を指定。

$ sudo vim /etc/default/hostapd

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

設定ファイルの記載。私の環境では以下としました。

$ sudo vim /etc/hostapd/hostapd.conf

interface=wlan0
channel=10
auth_algs=1
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
ssid=アクセスポイント名
wpa_passphrase=パスワード

サービスの起動設定

DHCPサーバとhostapdの起動設定を行います。

$ sudo systemctl enable isc-dhcp-server
$ sudo systemctl enable hostapd

確認

再起動しアクセスポイントが利用できるか確認します。

$ sudo reboot

ifconfigコマンドで確認するとwlan0にIPが割り当てられています。

$ ifconfig

{略}
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.20.1  netmask 255.255.255.0  broadcast 192.168.20.255
{略}

DHCPサーバとhostapdが起動しているか確認します。それぞれ active であれば問題ないです。

$ systemctl status isc-dhcp-server
$ systemctl status hostapd

アクセスポイントが実際に使えるインターネットへ抜けれるかはスマホなどから接続してためします。上記を確認した後、スマホからアクセスポイントへ接続でき、IP 192.168.20.100 が払いだされたこと、インターネットのWEBページや動画サイトを閲覧できることを確認しました。

まとめ

普段の仕事ではクラウドばかり触っておりネットワーク周りのことは意識することは少ないですが、基礎知識として知っていたことが実践できてとても学びになりました。今回の内容はUbuntuやネットワーク周りの話でしたが、IoTというだけあって、いかにデバイス間・クラウドと通信させるかに関わるネットワークインフラはかなり重要なファクターです。単にデバイスのことだけでなく、こういったネットワーク周りのキャッチアップを怠ってはいけないと再実感しました。

参考