今回は、現在”みまもりカメラ”として稼働中の Raspberry Pi にOpenVPNサーバー機能を追加する、ということをやります。
理由はPCのOpenVPNサーバーでは常時接続がきびしいということ、電気代等のコスパ的にもRaspiが良いと考えたためです。
カメラとVPNを同時に処理するので、当然パフォーマンスの低下は否めませんが、そういった状況を判断するためにもいわば「実験的な取り組み」でもあります。
しかし、最近ではあまり安価なラズパイが出回っていないようなので、vpnサーバーを別のラズパイにすることは難しいようです。
準備
以前にやったOpenVPNサーバーの構築手順を参考に作業を進めていきます。
openvpnのインストール
まずは、raspiにopenvpnをインストールします。
一応 apt list コマンドで調べておきます。
~$ apt list openvpn
システムのsudo apt update 後にopenvpn をインストールします。
~$ sudo apt install openvpn
インストールが完了したらサンプル設定ファイル(server.conf)を規定の場所( /etc/openvpn/server )へコピーしておきます。
~$ sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/server/
opensslによるserver証明書・鍵の作成
raspi vpnサーバは新しくserver証明書・鍵を作成する必要があります。
今回のserver証明書の内容は次のようになります。
C(countryName)、ST(stateOrProvinceName)、L(localityName)、O(organizationName) は ca.crt の内容に付随します。
CN(commonName:FQDN)のみ rc1.example.com にしました。
登録するホスト名 (FQDN: rc1.example.com) は 一応 /etc/hosts へ登録します。
~$ sudo vi /etc/hosts
他の固定IPアドレスと一緒に登録しておきます。
自分は証明書作成を管理者権限(root)で作業することを好まないので、openssl の設定ファイル(openssl.cnf)をユーザー(picamera)の作業ディレクトリ(~/openssl)へコピーしました。
~/openssl$ sudo cp /etc/ssl/openssl.cnf ./
権限をユーザー(picamera)へ移行します。
~/openssl$ sudo chown picamera:picamera openssl.cnf
設定ファイル(openssl.cnf)を編集します。
~/openssl$ vi openssl.cnf
次の項目を変更します。
[ req ]
req_extensions = v3_req ← 有効化
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth ← 追加
次のコマンドで鍵(rc1_server.key)とserver証明書要求(rc1_server.csr)を作成します。
~/openssl$ openssl genrsa -out rc1_server.key
~/openssl$ openssl req -new -key rc1_server.key -config openssl.cnf -out rc1_server.csr
~/openssl$ openssl req -in rc1_server.csr -text ← 確認
証明書要求ファイルが作成されたら、内容を確認して、CAサーバーへ転送します。
systemctl で自動起動をするので鍵(rc1_server.key)は /etc/openvpn/server/ へ移動しておきます。
CA(認証局)で証明書の作成
こちらも以前にやったことですので、簡単に流します。
CA(認証局)サーバー (deb1.example.com) の作業ディレクトリは ~/openssl/CA/ になりますので、証明書要求ファイル(rc1_server.csr)はこちらへ移動します。
~/openssl/CA$ ls
certs crl newcerts private ca.crt cacrl.pem crlnumber index.txt openssl_CA.cnf rc1_server.csr serial
caコマンドで証明書を作成します。
~/openssl/CA$ openssl ca -config openssl_CA.cnf -in rc1_server.csr -out rc1_server.crt
有効期限日など確認しておきます。
~/openssl/CA$ openssl x509 -in rc1_server.crt -text
問題がなければ scpなど使って raspberry pi へ証明書 (rc1_server.crt) をコピーします。
~/openssl/CA$ scp rc1_server.crt picamera@192.168.10.xxx:~/openssl/
その他の必要な証明書や鍵 (ca.crt, ta.keyなど) もコピーしておくと良いです。
OpenVPNサーバーの起動
OpenVPNサーバーの起動は systemctl 自動起動の前に openvpn コマンドで動作確認します。
OpenVPNサーバーを openvpn コマンドで起動
まずは、起動に必要なファイルをraspi のOpenVPNサーバー の場所 ( /etc/openvpn/server/ ) へコピーします。
今回は、スマホにダウンロードしたクライアントの設定ファイル(client.ovpn)をそのまま使いたいということもあり、現行のOpenVPNサーバー(ubn2.example.com)で使用中の証明書 (ca.crt)や鍵 (ta.key、dh2048.pem ) を使います。
picamera@raspi:/etc/openvpn/server$ ls
ca.crt dh2048.pem rc1_server.crt server.conf rc1_server.key ta.key
server.conf 設定は、cert と key の名称変更と内部ネットワークルーティングを有効化しました。
/etc/openvpn/server$ sudo vi server.conf
ca ca.crt
cert rc1_server.crt ← 名称変更
key rc1_server.key ← 名称変更
push "route 192.168.10.0 255.255.255.0" ← 有効化
これで openvpn サーバーを起動します。
/etc/openvpn/server$ sudo openvpn server.conf
待受状態を確認して、クライアントから接続してみます。
クライアント(スマホアプリ)から接続
スマホアプリは外部ネットワークからの接続になりますので、ファイアウォールやルーターの設定変更が必要になります。
今回はraspi os liteにファイアウォール(iptables)が入っていないということもあり、ルーターのポートマッピングを追加するだけになりました。
raspi vpn ipアドレス | プロトコル | ポート |
192.168.10.xxx | udp | 1194 |
クライアント側の設定(client.ovpn)は変更がありませんので、そのままスマホアプリを起動します。
Wifi接続を解除したら(モバイル接続へ切替)、webブラウザへ”みまもりカメラ”の内部ネットアドレス(192.168.10.xxx:8080)を入れてみて映像を確認します。(特に遅延状況など確認します。)
raspi_openvpnサーバーの自動起動
openvpn コマンド起動で問題がなければ systemctl で自動起動します。
~$ sudo systemctl status openvpn-server@server.service ← ステータス
~$ sudo systemctl start openvpn-server@server.service ← 起動
~$ sudo systemctl enable openvpn-server@server.service ← 自動起動有効
停止は
~$ sudo systemctl stop openvpn-server@server.service ← 停止
自動起動無効はさほど
~$ sudo systemctl disable openvpn-server@server.service ← 自動起動無効
ステータスを確認してエラーがなければクライアント(スマホアプリ)からモバイル接続して確認します。
まとめ
今回は、あっさりと終わってしまいましたが、日常的にかなり必要度が高い内容だと思っています。
というのも、ここまでできれば個人で手軽に “みまもりカメラ” を設置できるとさほどいうことですので、大変心強い味方になるのではないでしょうか。
しかし、今回使った raspiは、特にraspi os liteはファイアウォールが入っていないということもあり、セキュリティの面でやや不安があり、注意が必要です。
ファイアウォール(iptables)は機会があればやっていきたいと思っています。
また、カメラとVPNの処理が重なるので動作もかなり遅くなると予想されましたが、さほど気にならないので、このまま長時間稼働して様子をみようと思います。
何か不具合がありましたら追記していきますので、よろしくおねがいします。
ご質問・ご感想などありましたら、お気軽にコメント下さい。
【追記】
稼働3日後の状況:VPN接続後にwebブラウザでカメラを確認したところ、画面表示まで1分以上かかった。その後一度閉じて、再度開くと問題なく映像を見ることができた。
最初のVPN接続処理で遅延があるようでした。
その他、カメラの録画記録データに問題はなさそうでしたが、引き続き継続していきたいと思います。