« ZYNQで作るロックインアンプ、0.1uVへの挑戦 | トップページ | CGIからrebootなどのroot権限が必要なコマンドを実行する »

2022.03.24

DHCPが使えない環境でも使える「IoT機器の管理者画面」を作る

Linuxを使う組み込み機器の開発時には、/etc配下のファイルを自分でいろいろ書き換えてネットワークの設定は如何様にもできるのですが、お客様に納品した後だと急に難しくなります。

 

IPアドレスはDHCPで取得するか、組織のポリシーに従って固定すると思いますが、大学や研究機関やネットワーク管理が厳しい企業では、新しい機器をLANにつないでもDHCPからアドレスが得られません。

お客様に更新用ファームウェアをダウンロードしてもらおうと思っても、プロキシを通さないとIoT機器からインターネットに出られなかったりもします。時刻合わせでNTPを使うおうにも、NTPプロトコルが外に出られないため1970年1月1日のまま使い続けているという場合もあります。

そのため、ネットワークにつながらないと何が原因かを調べるのも大変です。お客様にUSB-UARTでログインしてコマンドを打ってもらって診断したり、ファイルを書き換えてもらうということがあったのですが、viの使い方を説明する必要があったりで、とにかく大変でした。

そこで、Web画面の管理者パネルからIPアドレスの確認や、PINGの試験をしたり、名前解決ができるか、WGETが通じるかという試験ができるようにしました。

Adminpanel1

目標は

  • USB UARTのコンソールからLinuxの設定ファイルを触らなくてもよいようにする
  • DHCPが使えない環境にも、DHCPが使える環境にも、どちらにも対応する
  • ネットワークセキュリティが厳しい組織でもIoT機器を簡単に使えるようにする

 

Adminpanel2

Adminpanel3

Adminpanel4

 

こういうことをするには、基本的にはajaxを使ってCGIの中でawkやsedを使いまくり、得られらた結果をjsonで整形して返すということで実現しています。

一例を挙げると、ホスト名やIPアドレスを得るスクリプトは、

HOSTNAME=`hostname`
IPADDR=`ip a | awk '/eth0\:/ {ETH0=1} (/inet/ && ETH0) {print $2}'`
MACADDR=`ip a | awk '/eth0\:/ {ETH0=1} (/link\/ether/ && ETH0) {print $2}'`
echo -n ","
echo -n "\"hostname\":\"$HOSTNAME\" "
echo -n ","
echo -n "\"ipaddr\":\"$IPADDR\" "
echo -n ","
echo -n "\"macaddr\":\"$MACADDR\" "

とか、

PINGの試験であれば

IP=$1
COUNT=0
if ping -c 1 $IP > /dev/null; then
COUNT=$(expr $COUNT + 1)
fi
if ping -c 1 $IP > /dev/null; then
COUNT=$(expr $COUNT + 1)
fi
if ping -c 1 $IP > /dev/null; then
COUNT=$(expr $COUNT + 1)
fi
if ping -c 1 $IP > /dev/null; then
COUNT=$(expr $COUNT + 1)
fi
if [ $COUNT -eq 0 ];then
echo "{\"message\":\"$IP へのPINGは失敗しました ($COUNT/4)\", \"result\":false}";
else
echo "{\"message\":\"$IP へのPINGは成功しました ($COUNT/4)\", \"result\":true}";
fi

などと、しています。

 

情報取得系は難しくなく出来たのですが、書き換え系の処理はセキュリティが絡んできて難しくなります。

例えばホスト名を変更する作業は、/etc/hosts 、/etc/hostname 、hostnameコマンドの実行、と3つやることがありますが、root権限が必要でもあり、こういう操作がWebのCGIからできるようにするとだんだんセキュリティが怪しくなってきます。

どうするのが一番いいんでしょうね。

 

そもそもこのような管理パネルを作るきっかけとなったのは、どんなお客様でも最初に使い始めるときにUSB-UARTのコンソールをつないで/etc/network/interfaceとかを書き換えることなく使い始められるようにするためです。

セキュリティに厳しい組織では、新規のIoT機器をつないでもDHCPでアドレスが設定されるわけではありません。何かの新しい機器を所内LANにつなぐには情報システム部門に申請しないといけないとか、そもそもLANに接続することが許されていないとか、いろいろあります。

DHCPでアドレスがもらえない環境ではPCと1対1でつないで通信をする場合のために、169.254.0.0/16のAPIPAのアドレスが使えるようにもしました。

やり方は、apt install avahi-autoipd でインストールして、avahi-autoipd eth0 & で開始です。Ubuntu 14ならば、/etc/init.rcに書いておけば、システム起動時に自動的に起動させることもできます。

/etc/init.rcに avahi-autoipd eth0 & を書いて再起動してみると、

Autoipd1_20220325185601

このような感じでアドレスが自動で設定できました。

 

avahi-autoipdは169.254のIPアドレスを設定するサービスで、avahi-daemonは名前解決のサービスです。いずれもZEROCONFというシリーズのものです。

avahi-daemonというサービスが名前解決をしてくれるので、IoT機器と1対1でつないだWindows PCのブラウザにホスト名を入れれば、Webから管理者パネルにアクセスできました。

Apipa_20220325185901

詳しいことはわかりませんが、avahi-autoipdで設定したIPアドレスはavahi-daemonで名前解決しないといけないようで、nmbdではうまく行かないようでした。

DHCPが使えない環境でも1対1でつないで、IoT機器に「名前」で接続することができ、管理パネルを通じてアドレス情報を得ることができるようになりました。

さて、次はIPアドレスの手動設定機能などを作っていくことにします。

 

|

« ZYNQで作るロックインアンプ、0.1uVへの挑戦 | トップページ | CGIからrebootなどのroot権限が必要なコマンドを実行する »

コメント

コメントを書く



(ウェブ上には掲載しません)




« ZYNQで作るロックインアンプ、0.1uVへの挑戦 | トップページ | CGIからrebootなどのroot権限が必要なコマンドを実行する »