ラズパイ2台をLANケーブル直接接続して、APIPA通信する
ラズパイZEROは、通常のUSBではなく、microUSBなので、変換アダプタが必要なのですが、それよりもポートが1つしかないのが使うときのネックになります。特にイニシャルでRasbianの設定がまったく行われていない、ダウンロードしてきたimgからインストールするとなると、OSのパッケージ更新、アップグレードから困ったちゃんになります。
インターネット通信は、無線のセットアップができていない段階では、LANアダプタをUSB接続して、有線LAN使う必要があるので、そこでUSBポート終わってしまうし、それ以前にキーボード、マウスにもUSB必要だし、USBハブ接続して、3ポートで設定するにも、消費電力の問題で接続USB機器を外したりしたときに、構成変更により、リブートを繰り返す羽目になります。
そんな時、すでにセットアップが終わっているラズパイ3などと、LANケーブルを直接、初期設定しているラズパイZEROに直付けして、通信できることを最近知りました。
DHCPでIPアドレスを配布している場合に、うまくIPアドレスを受け取れなかった端末には、169.254.0.0/16 のIPアドレス(APIPAアドレス)が割り振られることが、RFCで定義されています。この場合には、うまく通信できないと思い込んでいましたが、接続されている両方の端末が同一IPアドレス範囲で割り振られているので、端末間での通信は可能なようです。
ラズパイには、ARPスキャンするために、arp-scan をインストールし、親ラズパイ3には、ラズパイ3の持つ無線LAN接続を利用するために、ufw をインストールしておきます。
Rasbian は、2020-02-13-raspbian-buster.zip を使用しました。
SSH接続できるように、ZEROのbootパーテーションに、sshファイルを生成しておきます。
root@r3b-bsf-zero:/home/pi# lsblk -p NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT /dev/sda 8:0 1 7.2G 0disk tq/dev/sda1 8:1 1 256M 0part mq/dev/sda2 8:2 1 3.3G 0part /dev/mmcblk0 179:0 0 29.7G 0disk tq/dev/mmcblk0p1 179:1 0 256M 0part /boot mq/dev/mmcblk0p2 179:2 0 29.5G 0part / root@r3b-bsf-zero:/home/pi# sudo mount/dev/sda1/media root@r3b-bsf-zero:/home/pi# sudo touch/media/ssh root@r3b-bsf-zero:/home/pi# sudo umount/media root@r3b-bsf-zero:/home/pi# sync
LANケーブル接続後、以下コマンドでAPIPAアドレスがわかります。
root@r3b-bsf-zero:/home/pi# ip addr show eth0 | grep "inet"
inet 169.254.136.83/16 brd 169.254.255.255 scope global noprefixroute eth0 inet6 fe80::4bc0:14a2:217c:7391/64 scope link noprefixroute
ネットワークスキャンしてみれば、相手のAPIPA・IPアドレスがわかります。
root@r3b-bsf-mst:/home/pi# sudo arp-scan --local --interface eth0
Interface: eth0, datalink type: EN10MB (Ethernet) Starting arp-scan 1.9.5 with 65536 hosts (https://github.com/royhills/arp-scan) 169.254.220.5 b8:27:eb:20:a1:42 Raspberry Pi Foundation ←ここ ^C ←CTL+C で脱出 root@r3b-bsf-mst:/home/pi#
デフォルトのホスト名、パスワードで、SSH接続できます。
root@r3b-bsf-mst:/home/pi# ssh pi@r3b-bsf-base.local
できない場合には、APIPA・IPアドレスで接続できます。
root@r3b-bsf-mst:/home/pi# ssh pi@169.254.220.5
後は、ラズパイ3の無線経由でインターネット接続できるように、ラズパイ3に設定します。
➊ ufw の自動起動設定
root@r3b-bsf-mst:/home/pi# sudo systemctl enable ufw
Synchronizing state of ufw.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable ufw
root@r3b-bsf-mst:/home/pi# sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? ←y
Firewall is active and enabled on system startup
➋ ufw の設定で、OpenSSH、VNCの通信を許可します。
root@r3b-bsf-mst:/home/pi# sudo ufw allow OpenSSH
Rule added
Rule added (v6)
root@r3b-bsf-mst:/home/pi# sudo ufw allow VNC
Rule added
Rule added (v6)
➌ IP転送を許可します。
root@r3b-bsf-mst:/home/pi# sudo sed -i ‘s/^#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/’ /etc/ufw/sysctl.conf
root@r3b-bsf-mst:/home/pi# sudo sed -i ‘s/DEFAULT_FORWARD_POLICY=”DROP”/DEFAULT_FORWARD_POLICY=”ACCEPT”/’ /etc/default/ufw
➍ NAPTの設定を、ネットワークアドレス 192.168.0.0/24 に対して行います。
root@r3b-bsf-mst:/home/pi# vi /etc/ufw/before.rules
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 192.168.0.0/24 -o wlan0 -j MASQUERADE
COMMIT
を、最終尾のCOMMITの前に入れる
➎ ラズパイ3のIPアドレスを固定化させておきます。
root@r3b-bsf-mst:/home/pi# vi /etc/dhcpcd.conf
profile static_177 static ip_address=192.168.0.177 interface eth0 fallback static_177
➏ ラズパイZEROの通信は、ラズパイ3をゲートウエイとして、固定化させておきます。
root@r3b-bsf-zero:/home/pi# vi /etc/dhcpcd.conf profile static_77 static ip_address=172.28.94.77 static routers=172.28.94.177 static domain_name_servers=8.8.8.8 interface eth0 fallback static_77
まとめ
ラズパイZEROのmicroUSBでのRasbianイニシャル設定は大変。消費電力問題でLAN、キーボード、マウスの構成変更はリブート地獄に!!そんな時、ラズパイ同士でLANケーブル直付けがとても便利!!
という話でした。
とここまで、便利だと持ち上げたのですが、動作がちょっと不安定なのです。
ネットワークスキャンで相手端末のIPアドレスを調査する時点で、なかなか表示されなかったり、ファイル転送も流しっぱなしにするにはちょっと不安定な感じです。
そうすると、作業の安全面を考えると、USBメモリや外付けHDDなどにセットアップに必要な媒体をいつも持っていれば、その方が安心です。
手持ちの媒体が思わぬ原因で故障したとか、緊急時にどうしようもなくなった時に知っていれば「まだ手はあるよ!」的な奥の手ネタです。