Raspberry Pi 4 と Ubuntu 20.04 LTS で無線ルータを作成
はじめに
こんにちは!クソミネです。
今回からIoT × アクアリウムをテーマにブログを書いていきます。
いま考えてる構成は↓な感じ。水槽につけるラズパイでどんな処理をするかはまだ考えていません。
自宅には固定回線を引いているので、水槽につけたデバイス間の通信はGreengrassを使う必要はないですが、技術のキャッチアップのため利用しようと思います。
さて本題
さて今回はGateway用のラズパイの設定、つまり無線ルータの作成を実施します。Greengrassのインストールはまた今度。
通信の経路は以下のようになります。各水槽のラズパイからGateway用ラズパイにWiFiで接続し別のラズパイやインターネットへ通信できるようにします。
ラズパイ(水槽) <- (WiFi) -> ラズパイ(Gateway用) <- (有線) -> 中継器 <- (WiFi) -> 無線ルータ <-> インターネット
サブネットは以下の構成とします。ルータではなくブリッジにしてもいいかと思いますが、、、今後ラズパイをinternet-facingな環境でルータとして使うかもしれないので練習として。。。
方法
- ラズパイは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というだけあって、いかにデバイス間・クラウドと通信させるかに関わるネットワークインフラはかなり重要なファクターです。単にデバイスのことだけでなく、こういったネットワーク周りのキャッチアップを怠ってはいけないと再実感しました。