ブログからの転載です。
概要
ESP-WROOM-02にような安価なWiFi搭載マイコンが市場に出回り、個人でもIoTアプリケーションを容易に作れるようになりました。ESP-WROOM-02のようなセキュリティに不安のあるマイコンを直接インターネットに繋げるのは不安かもしれません。そんな場合はRaspberry Piを中継機としてインターネットと家庭内LANを別のネットワークとして分離してセキュリティーを高めるという方法があります。
Raspberry Pi3を使ったIoTハブ構築作業の一部を紹介します。
外付けハードディスクを2つのパーティションに区切り、128GBをルートファイルシステムに残りをファイルサーバー用にし、ブートパーティションのみをSDカードに残して、起動後は外付けハードディスクを使用するものです。
紹介する内容は次の通りです。
- Raspberry PiのIPアドレスを固定する
- hostapdとisc-dhcp-serverをインストールしてRaspberry PiをWiFiルーターにする
- TightVNCサーバーをインストールする
- Sambaをインストールする
- Netatalkをインストールする
- MySQLをインストールする
- mosquittoをインストールする
以下、簡単な作業内容の記録です。
1. 外付けハードディスクの準備とルートファイルシステムの移動
セルフパワーのUSBハブをRaspberry Pi3に接続し、そのハブに外付けハードディスクを接続する。Raspberry Pi3に直接外付けハードディスクを接続した場合は電力不足となり動作が不安定になるので、セルフパワーのUSBハブを使用する必要がある。
外付けハードディスクのデバイス名を把握する
以下のコマンドでUSB接続した外付けハードディスクのデバイス名を記録する。
$ sudo fdisk -l
当環境では /dev/sda1 でした。
ハードディスクをフォーマットする
以下のコマンドで外付けハードディスクをフォーマットする。
$ sudo mkfs.ext4 /dev/sda
パーティションの作成
以下のコマンドで外付けハードディスクにパーティションを作成する。すでにパーティションが作成されている場合は d コマンドで削除する。当工房の環境では128GBをルートファイルシステム、残りをファイルサーバー用にするために、この操作を2回行う。
$ sudo fdisk /dev/sda
パーティションを削除する場合はCommandプロンプトで d を入力し、続いて削除するパーティション番号を入力する。
パーティションを作成するにはCommandプロンプトでnを入力する。1回目の作成操作では Last sectorに +128G を指定する。
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-1953525166, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-1953525166, default 1953525166): +128G
Created a new partition 1 of type 'Linux' and of size 128 GiB.
二回目の操作では Last sectorには何も指定せずにリターンキーを押す。
Commandプロンプトで w を入力して、作成したパーティションを反映させてfdiskを終了する。
ここで一旦リブート
$ sudo reboot
パーティションのフォーマット
以下のコマンドで2つのパーティションをフォーマットする。
$ sudo mkfs.ext4 /dev/sda1
$ sudo mkfs.ext4 /dev/sda2
もしすでにハードディスクがマウントされている場合は、事前にアンマウントしておく。
$ sudo umount /dev/sda1
$ sudo umount /dev/sda2
外付けハードディスクのマウント
以下のコマンドでハードディスクのルートファイルシステムのパーティションをマウントする。
$ sudo mkdir /mnt/hdd
$ sudo mount /dev/sda1 /mnt/hdd
SDカードのルートファイルシステムの内容を外付けハードディスクにコピーする
以下のコマンドでルートファイルシステムの内容を外付けハードディスクにコピーする。
$ sudo rsync -a --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} / /mnt/hdd
外付けハードディスクのfstabを書き換える
/dev/sda1をルートに、/dev/sda2をその他領域としてマウントする設定にする。
$ sudo vi /mnt/hdd/etc/fstab
書き換え前
proc /proc proc defaults 0 0
PARTUUID=3c5764a6-01 /boot vfat defaults 0 2
PARTUUID=3c5764a6-02 / ext4 defaults,noatime 0 1
書き換え後
proc /proc proc defaults 0 0
PARTUUID=3c5764a6-01 /boot vfat defaults 0 2
PARTUUID=b03104d4-01 / ext4 defaults,noatime 0 1
PARTUUID=b03104d4-02 /home/pi/Storage ext4 defaults,noatime 0 1
PARTUUIDは以下のコマンドで確認できる。
$ ls -l /dev/disk/by-partuuid
合計 0
lrwxrwxrwx 1 root root 15 6月 1 12:13 3c5764a6-01 -> ../../mmcblk0p1
lrwxrwxrwx 1 root root 15 6月 1 12:13 3c5764a6-02 -> ../../mmcblk0p2
lrwxrwxrwx 1 root root 10 6月 1 12:13 b03104d4-01 -> ../../sda1
lrwxrwxrwx 1 root root 10 6月 1 12:13 b03104d4-02 -> ../../sda2
SDカードのcmdline.txtを書き換える
SDカードのcmdline.txtを書き換えてルートファイルシステムは外付けハードディスクを使うように設定する。root=xxxxxxxxの部分を/dev/sda1のPARTUUIDに書き換える。
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=b03104d4-01 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
Raspberry Piを再起動する
$ sudo reboot
無事に起動すれば設定完了。
2. Raspberry PiのIPアドレスの固定
当IoTハブではRaspberry PiをWiFiルーターとして動かして、WiFi側はdhcpを利用してセンサーネットワークを構築し、Ethernetインターフェースは固定IPとします。
/etc/dhcpcd.conf の最後に以下の定義を追加します。(使用する環境に応じてアドレスの値は変わります)
interface eth0
static ip_address=192.168.0.202
static routers=192.168.0.1
static domain_name_servers=192.168.0.1
一旦リブートするか以下のコマンドで設定内容を反映して、Raspberry PiのIPアドレスが固定されていること、インターネット接続などのネットワーク機能が正常に動作していることを確認しておく。
$ sudo service dhcpcd reload
3. hostapdとisc-dhcp-serverのインストール
hostapd(WiFiアクセスポイントとして機能するソフトウェア)とisc-dhcp-server(dhcpサーバー)をインストールする。
$ sudo apt-get update
$ sudo apt-get install hostapd ics-dhcp-server
/etc/dhcp/dhcpd.confを編集してdhcp設定を変更する。
以下の部分を変更。(authoritativeのコメントを外す)
# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
authoritative;
以下の行をファイルの最後に追加する。当方の場合はメインのLANは192.168.0のネットワークで今回追加するのは192.168.11のネットワーク。(192.168.11.XXXの部分は自分の環境に合わせる)
subnet 192.168.11.0 netmask 255.255.255.0 {
range 192.168.11.100 192.168.11.199;
option broadcast-address 192.168.11.255;
default-lease-time 600;
max-lease-time 7200;
option routers 192.168.11.1;
option domain-name "local";
option domain-name-servers 8.8.8.8, 8.8.4.4;
}
/etc/default/isc-dhcp-serverを以下の行を編集する。
INTERFACES="wlan0"
/etc/hostapd/hostapd.confを修正してWiFiアクセスポイントの設定をする。
interface=wlan0
driver=nl80211
ssid=pi3-ap ---> 他の端末から見えるアクセスポイントの名称
hw_mode=g
channel=6
ieee80211n=1
wmm_enabled=1
ht_capab=[HT40] [SHORT-GI-20] [DSSS_CCK-40]
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_key_mgmt=WPA-PSK
wpa_passphrase=パスワード
rsn_pairwise=CCMP
/etc/default/hostapdの以下の行を編集する。
DAEMON_CONF="/etc/hostapd/hostapd.conf"
ルーター化の設定。/etc/sysctl.confを編集する。(以下の行のコメントを外す)
net.ipv4.ip_forward=1
iptablesコマンドを使ってiptableの設定を追加する。(ネットワーク間のルーティング設定)
$ 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 sh -c "iptables-save" > /etc/iptables.ipv4.nat"
/etc/network/interfacesを編集する。(元のファイルはコメントアウトした内容)
allow-hotplug wlan0
#iface wlan0 inet manual
# wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
iface wlan0 inet static
address 192.168.11.1
netmask 255.255.255.0
gateway 192.168.0.1
pre-up iptables-restore < /etc/iptables.ipv4.nat
これでRaspberry Piを再起動し、他の端末からWiFiアクセスポイントとして見えて・接続でき、接続するとちゃんとIPアドレスが振られることを確認する。
4. TightVNCサーバーのインストール
Raspberry Piでsshを有効にしておけば、サーバー管理の作業には困ることはありませんが、GUIを使いたい場合はVNCサーバーをインストール・設定する。
TightVNCをインストール
$ sudo apt-get update
$ sudo apt-get install tightvncserver
最初の起動の際にパスワードの入力が要求される。
$ vncserver
You will require a password to access your desktops.
Password:********
Verify:********
Would you like to enter a view-only password (y/n)? n
New 'X' desktop is raspberrypi:1
VNCサーバーを停止するには以下のコマンドを実行する。
$ vncserver -kill :1
VNCサーバーの自動起動設定
VNCサーバーを自動起動にする設定を行うために、/etc/init.d/vncbootファイルを作成して以下のように入力して保存する。(rootユーザーとして1440×960 24bit ColorでVNCサーバーを起動する例)
#! /bin/sh
# /etc/init.d/vncboot
### BEGIN INIT INFO
# Provides: vncboot
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start VNC Server at boot time
# Description: Start VNC Server at boot time.
### END INIT INFO
USER=root
HOME=/root
export USER HOME
case "$1" in
start)
/usr/bin/vncserver :1 -geometry 1440x960 -depth 24
echo "Starting VNC Server."
;;
stop)
/usr/bin/vncserver -kill :1
echo "VNC Server Has been stoped."
;;
*)
echo "Usage: /etc/init.d/vncboot {start|stop}"
exit 1
;;
esac
exit 0
他の端末からVNCクライアント使って画面表示ができるかを確認する。
5. Sambaのインストール
最低限の設定です。
まずはSambaをインストール
$ sudo apt-get update
$ sudo apt-get install samba
/etc/samba/smb.confを編集する。
[pi]
path = /home/pi/Storage/Share ---> ここに外付けハードディスクのパーティション2をマウントしている
read only = no
guest ok = yes
browsable = yes
force user = pi
Sambaを再起動する
$ sudo service smbd restart
他の端末からsmbを使ってsmb.confで設定したフォルダーにアクセスできることを確認する。
6. Netatalkのインストール
まずはインストール。
$ sudo apt-get update
$ sudo apt-get install netatalk
/etc/default/netatalkを編集する
以下の行を修正。
#### server (unix) and legacy client (<= Mac OS 9) charsets
ATALK_UNIX_CHARSET='UTF8'
ATALK_MAC_CHARSET='MAC_JAPANESE'
#### UAMs (User Authentication Modules)
#### available options: uams_dhx.so, uams_dhx2.so, uams_guest.so,
#### uams_clrtxt.so(legacy), uams_randnum.so(legacy)
AFPD_UAMLIST="-U uams_dhx2.so,uams_clrtxt.so"
#### config for cnid_metad. Default log config:
CNID_CONFIG="-l log_note"
/etc/netatalk/afpd.confを編集する
以下の行をファイル末尾に追加。
- -maccodepage MAC_JAPANESE -setuplog "default log_info /var/log/afpd.log"
/etc/netatalk/AppleVolumes.defaultを編集する
以下の部分を変更。
# The line below sets some DEFAULT, starting with Netatalk 2.1.
:DEFAULT: options:upriv,usedots dperm:0700 fperm:0600 maccharset:MAC_JAPANESE ea:sys
# By default all users have access to their home directories.
~/ "Home Directory"
/home/pi/Storage/Share "Data Directory" allow:@users
デーモンを再起動
$ sudo systemctl restart netatalk
他の端末からafpでアクセスして /home/pi/Storage/Shareの内容にアクセスできることを確認する。
7. MySQLのインストール
インストール
インストール時にrootのマスワード入力を求められる。
$ sudo apt-get update
$ sudo apt-get install mysql-server
mysqlコマンドでサーバーに接続して動作確認する
$ mysql -u root -p
Enter password: ←パスワードを入力
mysql>
文字コードを設定する(utf8を使用)
/etc/mysql/my.cnfを編集する。(以下に修正した箇所を記載)
[client]
....
#add
default-character-set=utf8
....
[mysqld]
....
# add
collation-server = utf8_unicode_ci
init-connect = 'SET NAMES utf8'
character-set-server = utf8
....
[mysqldump]
....
# add
default-character-set = utf8
....
mysqldを再起動する
$ sudo /etc/init.d/mysql restart
mysqlコマンドでサーバーにログインして statusコマンドで設定内容が反映されていることを確認する。
mysql> status
ネットワーク上の他のコンピューターからこのMySQLサーバーにアクセスしたい場合は、/etc/mysql/my.cnfの以下の行
bind-address = 127.0.0.1
をアクセスしたいコンピューターのIPアドレスに変更して特定のコンピューターからのアクセスを許可する
bind-address = 192.168.0.6
か、コメントアウトして、すべてのネットワーク上のコンピューターからアクセス可能にする。
#bind-address = 127.0.0.1
ただしこの方法はセキュリティ上好ましくない。
8. mosquittoのインストール
インストール
$ sudo apt-get update
$ sudo apt-get install mosquitto
$ sudo apt-get install mosquitto-clients
動作確認をする
端末画面を開いて次のコマンドを実行しサブスクライバーを登録する。
$ mosquitto_sub -d -t iothub
端末画面をもう1枚開いて次のコマンドを実行しデータをパブリッシュする。
$ mosquitto_pub -d -t iothub -m "Hello"
上記は一方でiothubというトピックをサブスクライブし、もう一方からiothubというトピックに”Hello”というメッセージを送信するコマンド。
一枚目のサブスクライバー登録した画面にパブリッシュしたメッセージが表示されることを確認する。
ネットワーク上の他のコンピューターから接続確認するには、上記2つのコマンド以下のようにする。
$ mosquitto_sub -h 192.168.0.202 -d -t iothub
$ mosquitto_pub -h 192.168.0.202 -d -t iothub -m "Hello"
簡単ではありますが、参考になれば幸いです。