ラズパイ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などにセットアップに必要な媒体をいつも持っていれば、その方が安心です。

手持ちの媒体が思わぬ原因で故障したとか、緊急時にどうしようもなくなった時に知っていれば「まだ手はあるよ!」的な奥の手ネタです。

★★★★★★★  ラズパイネタはこちらから  ★★★★★