ミラーレス一眼カメラを LAN に接続 ~ Raspberry Pi で作った NAPT ルーター経由

先日購入したミラーレス一眼カメラである OLYMPUS OM-D E-M10 III の Wi-Fi 機能を使って、Raspberry Pi 3B+ で作った NAPT ルーター経由で LAN に接続したよ、って話です。思い付きでやってみた感じで、設定も比較的単純な内容なのですが、他に記事になっているようなものを見かけなかったことと、やってみて、思ったように出来たこと、出来なかったことがありますので、まとめてみたいと思います。



プロジェクトの概要

ミラーレス一眼カメラでも、最近の上位機種は、LAN ポートを持っていたりして、直接ネットワークに接続できるものもあるようです。ですが、私の持っているものも含めて、現状の多くのカメラの場合、Wi-Fi 機能があると言っても、大抵は次のような使い方を想定したものであるようです。




カメラ側が Wi-Fi アクセスポイントとして機能するため、そこに接続するスマートフォンなどは、既存のインターネットなどの接続を切断した上で、新たに接続し直す必要があります。カメラがネットワークに組み込まれるわけではなく、Wi-Fi という形を取りながらも、ピア・トゥ・ピアでの接続となります。
屋外で使う前提でいくとこの形がいいのはわからなくもないのですが、既に LAN が導入され、Wi-Fi が飛び交っているような屋内で使おうとすると、手間ばかりかかります。他の PC などでも使おうとした場合、それぞれに接続し直さなきゃいけないし、デスクトップ PC などの場合は、そもそも Wi-Fi インタフェースを持っていない場合も多いし。ノート PC などで、Wi-Fi を使っていたとしても、既存の LAN やインターネットの接続を切ってつなぎ直さなきゃなきゃならないというのは、NAS などへのアクセスもできなくなることを意味するので、たとえば、カメラから取り込んだデータを NAS に保存したい場合などだと、作業に制限が出てしまいます。
というわけで、次の図みたいにできたら、便利なんじゃないかなー、という思い付きです。調査してみたところ、カメラとスマートフォンの間の通信プロトコルは、HTTP だということも判明したので、もしかしたら WebDAV が使えるのではないか、と期待してテストはしてみたのですが、そこは今のところ、わからないままです。対応していない可能性もありますが、非公開で内部的に使っている可能性も無くはないという感じです。ディレクトリの情報等が公開されている様子がないので、「対応していない」とは言い切れない部分があるわけですが、いずれにしても仕様が不明で接続できない、って感じです。これが対応していたら、エクスプローラーでカメラ内に保存されたファイルを直接取り扱えるようになるハズで、SNS にアップロードする時などにも、PC などに取り込む必要なく、直接、カメラ内のファイルを指定できるようになるので、すごく便利になると思うんですけどね。とりあえず、E-M10 III では実現できていないという感じなのですが、Wi-Fi 機能を持った SD カードである東芝の Flash Air の第 3 世代以降のものは、これに対応しているとのことです。私も 1 枚、古い Flash Air を持っているのですが、残念ながら第 2 世代のものだったので、WebDAV には対応していませんでした。
あと、IPv4 のみで IPv6 は使われていない様子です。



できたこと・できたなかったこと

以上の図を示した所で、ちょっと知識のある方なら、「ああ、なるほど」って感じて、それぞれ独自の方法に発展されられるのではないかと思ってしまうのですが、全てがうまくいったかというと、そうでもないので、先に、できたこと、できなかったことを、明示しておこうかと思います。詳しい設定内容は、後程、記載します。

Andoroid スマホには経路情報が追加されない

一番の計算違いは、ここでした。おそらく Andoroid 設計ポリシーにまつわる原因だと思われるのですが、一般的な方法だと、Android スマホにデフォルトゲートウェイ以外の経路情報を追加する方法は、存在しないのではないかと思われます(もし、ご存知の方がいらっしゃいましたら、教えてください)。DHCP からの配布も、デフォルトげーウェイは反映されますが、それ以外の経路は無視されるようです。
で、結局、Android スマホからのパケットは、一度、既存のデフォルトゲートウェイの方に向かい、さらにそこからホップされるという、スマートではない経路をとることになってしまいました。一応、これにより通信自体はできるようになったのですが、既存のデフォルトゲートウェイの方は、実はガッチガッチに固めたファイアウォールでして、元々、DHCP なんか受け付けていないので、経路は手動で追加しなきゃいけないし、フォワーディングの許可も追加しなければならない状況になりました。閉鎖された LAN 内でのお気軽設定というわけにはいかなくなった感じです。回避方法としては、別のルーターを咬ませるなどの方法が考えられると思うのですが、手持ちに適当なハードウェアが無いこともあって、とりあえずファイアウォールの設定を変更して対応しました。既存のデフォルトゲートウェイの方に、余ったポートがあったら、そこにつなぐ手も考えられるんですけどね。残念ながら、余っておりません。ここは、それぞれのネットワーク環境によって変わるところなので、個別に考える必要があるかと思います。
逆に言えば、Andoroid スマホ以外の Windows PC や Linux マシンからは、予定の方法だけで問題なく通信できています。ちなみに、iPhone はどうなんでしょう? 私は持っていないので、わからないです。

OLYMPUS OM-D E-M10 III に WebDAV では接続できなかった

WebDAV というのは HTTP プロトコルの拡張で、これが使えると、カメラ内のファイルに Windows のエクスプローラーなどから、直接、アクセスできるようになると思われます。最初の方にも書きましたが、仕様が不明だということもあり、実現していません。対応しているかどうかは、カメラ側の仕様に関わることなので、今回のような接続方法をとるかどうかには関係なく、ノート PC などから直接 Wi-Fi でカメラに接続した時でも、同じことが言えます。カメラの機種によっても変わると思うので、あくまでも、私のカメラでの結果です。
東芝の Wi-Fi 機能内蔵 SD カードである Flash Air の新しい世代のものを使えば、この機能も使えるようになるのではないかと思われるのですが、逆に、OLYMPUS のスマホアプリである OI.Share の機能は制限されてしまうみたいです。私としては、この OI.Share の機能であるリモコン(ワイヤレスレリーズ)が使えることの方が重要なので、カメラ内臓 Wi-Fi での接続を切り捨てるわけにはいかないです。まぁ、今回のような NAPT ルーターを 2 台立てて別々に接続すれば行けるような気はするのですが、今のところ、そこまでの必要性も感じていないし、Flash Air を使わなければならなくなることによる弊害の方が大きいので、やっていないです。

OI.Share のライブビュー撮影は使えなかった

上記のように、OLYMPUS のスマホアプリである OI.Share のリモコン機能のうち、ワイヤレスレリーズは問題なく使えたのですが、テストした環境だと、ライブビュー撮影の方は、使えませんでした。これは、カメラのファインダーの情報をスマホの画面に転送して、スマホ側からシャッターなどの操作ができる機能です。これは、単純に、スループットやレイテンシーの問題だと思われるのですが、NAPT ルーターに使ったハードウェアが Raspberry Pi 3B+ だというのが影響している可能性もあると思われます。4B が国内でも入手できるようになったら、置き換えてためしてみたい気もしますが、私自身の使い方としては、ワイヤレスレリーズの方が使えれば問題ないので、とりあえず、考慮しないことにしました。

※ 2019/10/27 追記 ----
このカメラ自体の通信仕様については、一般公開されている様子がないのですが、同社が過去に製造販売していた Air A01 という機種の技術仕様が公開されているので、見てみました。それによると、アプリ側からアクセスするのは、全てコマンド通信と呼んでいるものだけで、TCP のポート 80 のみを使っているようなのですが、カメラ側からは、一部、違うプロトコル・ポート番号でアクセスしているようです。ライブビューについては、rtp ということなのですが、ポート番号は「ライブビュー開始コマンド」というもの(つまり、アプリ側からの http)で指定されるとのことで、既存の MASQUERADE では対応できないんじゃないかと思われます。
---- 追記終わり 2019/10/27

接続はカメラ側から Wi-Fi を起動するだけ

このあたりの操作感がどうなるかも、やってみないとわからないような所があったのですが、結果、一度設定してしまえば NAPT ルーター上での操作は全く不要で、カメラ側から Wi-Fi 機能の On/Off だけで大丈夫でした。On にしてちょっとだけ待てば、NAPT ルーター側がアドレスを取得して、経路もちゃんと確立されます。カメラで撮影した後、Wi-Fi を On にするだけで、すぐに PC やスマホから今撮ったばかりの写真にアクセスできるので、非常に便利になりました。もちろん、先のスマホ版 OI.Share によるワイヤレスレリーズを使いたい時でも、同様です。


設定方法

では、具体的にどのように設定したか、紹介します。

既存のネットワークアドレスの確認

最初の方で図に示したように、私の環境で OLYMPUS OM-D E-M10 III を使って調べたところ、192.168.0.0 / 24 の範囲をネットワークアドレスとして使っている様子でした。具体的には、カメラ側が 192.168.0.10 で、端末(NAPT ルーター)側に割り振られるアドレスが 192.168.0.3 になっていました。このアドレスが、個体によって変わるのか、あるいは、永続的なものかどうかも判然としない部分があるのですが、少なくとも、接続の度に変わるような物ではなく、同じ環境で使っていれば、同じアドレスが割り振られている様子でした。ただ、機種が変われば、当然のようにアドレスも変わると思われますので、お使いの環境と機種で調べる必要があるかと思います。逆に、カメラなどの設定でこのアドレスを変更できるのかどうかについては、不明となっております。機種によっても違うかと思います。
幸い、我が家のネットワークでは、この範囲を使っていなかったので、何の変更もなく、構想の通りに行けました。仮に、被ってしまっていた場合、既存のアドレスの方を変更するか、マスク長を変えて細かく分けるか、などする必要が出てくると思います。ただ、カメラ側のアドレスや端末側のアドレスがドンピシャで被ってしまった場合には、変更せざるを得ないのかと思います。

NAPT ルーター・ベースマシン

使用したハードウェアは、手持ちであった Raspberry Pi 3B+ です。こちらには、1000Base-T と Wi-Fi インタフェースを持っているので、追加のハードウェアは必要ないです。Wi-Fi インタフェースは、カメラとの接続に使用しますので、LAN とは有線で接続する必要があります。内部インタフェースの仕様で、ギガイーサーの本来の速度で通信できないのがネックになる可能性もあるのですが、OLYMPUS OM-D E-M10 III の場合、Wi-Fi の方の対応が 2.4GHz 帯のみなので、おそらく影響はないのではないかと思っています。
OS としては、Raspbian Buster Lite を入れました。このインストール手順自体は、標準的なもので良いと思われるので、割愛します。私自身は、バックアップなどの管理がしやすいように、我が家にある他の既存のサーバーなどと合わせて多少変更していますが、ここが動作に影響あるものではないです。また、Raspbian Desktop を使ったり、あるいは、DHCP サーバーと兼用することも可能だと思いますので、お手持ちの環境に合わせて準備されると良いのかと思います。

NAPT ルーター・LAN 側固定アドレスの設定

LAN 側のアドレスは、他の PC などから追加のゲートウェイアドレスとして認識させる必要があるので、固定されていた方がやりやすいです。この固定アドレスの割り振りについても、お使いのネットワーク環境でのポリシーみたいなのがあって、DHCP で固定のアドレスを割り振ったりする方法もあるかと思うのですが、私自身は、単純に、個々のマシンに設定していってます。
Raspbeian Buster の場合、デフォルトで dhcpcd という DHCP クライアントが導入されています。これが導入されているマシンの場合、固定アドレスの記述は、/etc/dhcpcd.conf というファイルに行います。私の場合は、192.168.4.33/24 というアドレスを割り振りました。また、ソフトウェアのアップデートなどでインターネットへの接続も必要になるため、デフォルトゲートウェイも設定する必要があります。こちらは、先に示した図のとおり 192.168.4.1 となっています。同様の理由で、DNS サーバーのアドレスも設定する必要がありますが、これについては、我が家の環境に合わせて IPv6 で指定しています。あとは、一応、IPv6 のユニークローカルアドレスも割り振っておきました。アドレスは全てお使いの環境やネットワークアドレスに依存しますので、それに合わせた値を指定する必要があります。

/etc/dhcpcd.conf
        :
interface eth0
static ip_address=192.168.4.33/24
static routers=192.168.4.1
static ip6_address=fd69:5866:b61f::4:21/112
static domain_name_servers=fd69:5866:b61f::4:43 fd69:5866:b61f::4:44
        :

デフォルトのファイルの最後の方にコメントとして Example が記載されているので、そこを変更してもいいですし、新たに追加しても大丈夫です。
その後、DHCP で取得したアドレスを解放して、固定アドレスの割り振りを行うために、まともにやろうとするといくつかコマンドを入れる必要があるのですが、まぁ、ここはマシン全体を再起動してしまった方が早いかと思います。ただし、ssh でログオンして作業している場合は、その接続先アドレスが変わることには注意が必要です。間違えると、再び ssh でログインすることができなくなるので、ハマります。私の場合は、インストールも含めて、初期設定は大抵はシリアルコンソールで行っています。もちろん、ディスプレーとキーボードをつないで作業しても大丈夫だと思うのですが、マシンの数が多くなってくるとつなぎ変えなどが大変なのと、キーボードのロケールなどを設定するのが面倒なので、避けています。一度設定してしまった後は、セキュリティ的に問題ないマシンについては、ssh のみで管理しています。

NAPT ルーター・Wi-Fi 設定

これについては、raspi-config ユーティリティを使うのが簡単です。Wi-Fi の国別設定をしておく必要もあります。コンソール画面より、

sudo raspi-config

と入力し、

[2 Network Options] → [N2 Wi-fi]

と進みます。Wi-Fi の国別が未設定の場合は、選択項目が出てくるかと思うので、適切なものを選択します。続いて、SSID とパスワードを入力すれば完了です。
OLYMPUS OM-D E-M10 III の場合は、Wi-Fi を On にすると、SSID と Password が背面ディスプレーに表示されるので、その値を入力します。

NAPT ルーター・パケットフォワーディングの設定

複数のネットワークインタフェースを持つマシンをルーターとして動作させるためには、/etc/sysctl.conf 内の net.ipv4.ip_forward= の値を変更(追記)します。デフォルトの /etc/sysctl.conf の場合、この項目はコメントになっていますので、コメントを外して有効にします。存在しなければ、追記します。

/etc/sysctl.conf
        :
net.ipv4.ip_forward=1
        :

設定を有効にするためには、

sudo sysctl -p

と入力します。この記述は、システムを再起動しても有効になります。

NAPT ルーター・NAT の設定

この設定で 1 つ悩ましいのが、古くから使われている iptables を使うか、新しい nftables を使うかです。Raspbian Buster より、内部的には nftables が使われているとのことで、せっかくなら新しい方にしようかと思ったのですが、結局、とりあえずは iptables の方にしておきました。というのも、今のところ、nftables のコマンド自体が、デフォルトではインストールされておらず、使うなら追加でインストールしなければならない、設定に使われるユーティリティのスタンダードが定まっていない、といった理由からです。
といっても、今回行う設定は、主になる設定項目は 1 つだけで、特にユーティリティを使っていません。設定した内容をシステムの再起動後も有効にするツールとして、netfilter-persistent を使っています。
まずは、その netfilter-persistent をインストールしておきます。

sudo apt-get update
        :
sudo apt-get install netfilter-persistent

にて行います。
iptables を使った設定では、私自身は、シェルスクリプトに列記する方法を使っています。なお、スクリプトの作成方法や、エディタの使い方については、ここに含めると範囲が広くなりすぎてしまうので、ファイルの内容だけ示すことにします。

#!/bin/bash

iptables -t nat -F

iptables -t nat -X
iptables -t nat -Z

iptables -t nat -A POSTROUTING -s 192.168.4.0/24 -o wlan0 -j MASQUERADE


netfilter-persistent save

最初に、既存の nat テーブルを初期化した上で、今回の目的の設定を行い、最後にそれを netfilter-persistent を使って保存する、という内容になっています。nat テーブルの設定内容としては、192.168.4.0/24 の範囲から来たパケットを ip masquerade を使って wlan0 に送り出す、という内容になります。これだけで wlan0 のアドレスは自動的に割り振られたものが使われますし、戻りのパケットも自動で変換してくれるので、大丈夫です。
なお、今回は、閉鎖された LAN 内での利用を前提にしているので、その他のフィルター等は、一切、設定していないです。

DHCP による経路情報の配布

我が家のネットワークの場合、既存で Raspberry Pi 3B 上に isc-dhcp-server が立ててあり、これによってアドレスの配布を行っていました。ここに、経路情報をオプションを配布するように追加しました。ただし、この方法だと、先にも書いたように、Android スマホには反映されないです。なので、Android スマホでの利用のみを考えている場合には、この設定は無意味ですし、利用する PC などが限定されている場合には、PC などで直接コマンドを実行して設定する方法も考えられます。
既存の DHCP サーバーが立ててある場合には、isc-dhcp-server に限らず、別のものでも対応できるのではないかと思うのですが、既成の Wi-Fi ルーターや、光ホームゲートウェイの DHCP 機能を使っている場合の対応度合いは、調べていないです。個人的には、DHCP や DNS のサーバーについては、ルーターなどの機器に内臓されている機能を使うよりも専用のものを立ててしまった方がわかりやすい印象があるので、以前から立てていたわけですが、こういった用途には、Raspberry Pi は持って来いですね。家庭内のような環境では、性能の不足は、まず無いと思います。
isc-dhcp-server の場合は、/etc/dhcp/dchpd.con に設定内容を記載します。我が家での設定例を示します。

/etc/dhcp/dhcpd.conf
        :
option rfc3442-classless-static-routes code 121 = array of integer 8;
option ms-classless-static-routes code 249 = array of integer 8;

subnet 192.168.4.0 netmask 255.255.255.0 {
  range                                     192.168.4.129 192.168.4.190;
  option subnet-mask                        255.255.255.0;
  option broadcast-address                  192.168.4.255;
  option domain-name-servers                192.168.4.67, 192.168.4.68;
  option routers                            192.168.4.1;
  option rfc3442-classless-static-routes    24, 192, 168, 0, 192, 168, 4, 33, 0, 192, 168, 4, 1;
  option ms-classless-static-routes         24, 192, 168, 0, 192, 168, 4, 33, 0, 192, 168, 4, 1;
  option ntp-servers                        192.168.4.1;
  option smtp-server                        192.168.4.1;
}
        :

新たに加えたのは 4 行です。最初にオプションの宣言をして、subnet 内でそのオプションに対する値を定義している形になります。isc-dhcp-server の場合、マニュアルを参照してもよくわからないような部分があって、多少、試行錯誤しました。ファイルを変更した後に、

sudo systemctl restart isc-dhcp-server

とすると、DHCP サーバーが再起動します。

systemctl status isc-dhcp-server

と入力すると、ステータスが表示されます。設定内容に間違いがあるとエラーが表示されて起動しません。
最近の Windows は、オプションの code=121 で定義すれば機能するとのことで、実際にそのような感じなのですが、古い Window の場合は、code=249 で定義するとのことです。通常、121 だけで大丈夫だと思うのですが、Andoroid スマホに機能しなかった時にに試行錯誤して、249 も追加してみました。結局、ダメでしたが。両方定義しておいても、特に、問題ないです。ちなみに、Andoroid スマホの方は、routers で定義した値の方が使われているみたいです。なお、オプションの個別の値の指定方法については、あまりに特定の環境に依存してた内容になってしまうので、ここでは割愛します。マニュアル等、別の文献を。
isc-dhcp-server 自体についても、KEA という新しいバージョンのものがあって、新たに立てるならどっちを使うべきか、といった悩みも出るかと思います。その他にも、dnsmasq など、人気のあるサーバーアプリが使われているので、お使いの環境での設定方法をご確認ください。

既存デフォルトゲートウェイ(ファイアウォール)での経路の追加とフォワーディング許可

ここは、完全に Android スマホ対応のためです。DHCP での経路情報配布がきちんと機能してくれれば、LAN セグメント内で完結して、ファイアウォール設定には全く関係ないハズだったのですが、うまくいかなかったため、仕方なく設定を変更しています。
このファイアウォールルーターの OS は、Debian Strech で、この場合、経路の追加は、/etc/network/interfaces に記述します。該当のインタフェースの up/down に合わせて経路が追加・削除されるように、コマンドを記述します。同じ Linux でも、CentOS などの場合は別の管理方法をとっているので、それぞれの方法で行う必要があります。ルーター専用機の場合も、それぞれの方法があるかと思います。

/etc/network/interfaces
        :
auto enp4s0
iface enp4s0 inet static
address 192.168.4.1/24
iface enp4s0 inet6 static
address fd69:5866:b61f::4:1/112
up ip route add 192.168.0.0/24 via 192.168.4.33
down ip route del 192.168.0.0/24
        :

続いて、パケットフィルターに、カメラアドレス向けのフォワーディングの許可を行います。こちらも、先の NAPT ルーターの時と同様に、シェルスクリプトに iptables コマンドを列記する方法で管理しているので、以下の行を追加しました。こちらの方は、デフォルトが DROP にしてあるので、個別に許可をしない限り、パケットを通さない形になっています。

      : 
iptables -P FORWARD DROP
      :
iptables -A FORWARD -i enp4s0 -o enp4s0 -p tcp -m tcp --dport 80 -d 192.168.0.10 -j ACCEPT
iptables -A FORWARD -i enp4s0 -o enp4s0 -p tcp -m tcp --sport 80 -s 192.168.0.10 -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -A FORWARD -i enp4s0 -o enp4s0 -p udp -m udp --dport 80 -d 192.168.0.10 -j ACCEPT
iptables -A FORWARD -i enp4s0 -o enp4s0 -p udp -m udp --sport 80 -s 192.168.0.10 -m state --state RELATED,ESTABLISHED -j ACCEPT
        :

ちょっと観察した限りでは、tcp しか使われていない感じなのですが、スマホからのリモコンでライブビュー撮影が使えなかったため、udp の設定も追加してみました。結局、ダメだったわけですが。


結論 : やはり便利なカメラの LAN への接続

テストに使った OLYMPUS OM-D E-M10 III は、既に発売から 2 年以上経過している機種で、しかも、下位グレードの製品なため、最新の機種だと事情が異なるかもしれないのですが、やってみたら、やはり便利です。最新の機種の LAN への対応度合いはともかくとして、カメラというのは長く所持される製品でもあると思うので、まだまだ私の物と同じような事情の製品も多く使われているんじゃないかと思います。これをちょっとした工夫で LAN に接続してやろうというのが、今回のプロジェクトでした。Raspberry Pi が 1 台で、特に他に追加のハードウェアも必要ない(もちろん、電源やマイクロ SD カード、LAN ケーブルは必要です)ので、お勧めできます。お使いのネットワーク環境に合わせて変更しなければならないだろう部分もあり、そのまま使えるものではないと思いますが、何かの参考になれば幸いです。

コメント

このブログの人気の投稿

ハードディスクへ Raspbian Strech をインストール [続報]

XCY X33J1900 というベアボーン PC … ルーターとして使用中

ハードディスクから Raspbian Buster を起動の予定が … Raspbian Stretch を入れ直す・詳細手順の紹介