Raspberry Pi3を使ってネットワークカメラを構築してみる

ラズパイを使ってネットワークカメラを構築し、外部ネットワークからカメラの映像を閲覧できるようにします。また、カメラはUSB接続のできるWebカメラを使用します。

本記事は外から家にいるペットの様子を見たいという方にはおすすめです。また、防犯目的で使うことも良いでしょう。

# 大まかな流れ
1. [Webカメラをラズパイに接続](#Webカメラをラズパイに接続)
2. [MJPG-streamerのインストール](#mjpg-streamerのインストール)
3. [ストリーミングサーバーをローカルで起動](#ストリーミングサーバーをローカルで起動)
4. [動作確認](#動作確認)
5. [Webカメラをラズパイに接続](#webカメラをラズパイに接続)
6. [ストリーミングサーバーをローカルで起動](#ストリーミングサーバーをローカルで起動)
7. [SSH接続](#ssh接続)
8. [ファイアウォール](#ファイアウォール)
9. [ポート開放の設定](#ポート開放の設定)
10. [グローバルIPアドレス](#グローバルIPアドレス)

# Webカメラをラズパイに接続
Webカメラをラズパイにつなげた後、lsusbを実行します。

```
$ lsusb
```
Webカメラがラズパイに認識されているか確認します。認識されていれば接続成功です。

# MJPG-streamerのインストール
MJPG-streamerと呼ばれる、ストリーミング形式でネットワークカメラを構築するためのソフトをインストールします。

```
$ sudo apt-get update
$ sudo apt-get install -y subversion libjpeg-dev imagemagick
$ svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer
$ cd mjpg-streamer
$ make
$ sudo make install
```

# ストリーミングサーバーをローカルで起動
フレームフレートやポート番号などを指定してmjpg-streamerを起動します。

```
$ sudo ./mjpg_streamer -i "./input_uvc.so -f 10 -r 320x240 -d /dev/video0 -y -n" -o "./output_http.so -w ./www -p 8080"
```
![mjpg-streamer2.png](https://qiita-image-store.s3.amazonaws.com/0/141658/e4c8cf2c-04ca-7d97-3abf-7e6e4a5ff4fb.png)


# 動作確認
ブラウザからポート番号を指定したIPアドレスにアクセスします。
IPアドレスはラズパイに割り当てられたアドレスで、ポート番号はストリーミングサーバーを起動するときに設定した8080です。

IPアドレスは`ifconfig`コマンドで確認できます。

`http://xxx.xxx.xxx.xxx:8080`のように指定します。

![mjpg-streamer.png](https://qiita-image-store.s3.amazonaws.com/0/141658/d1807694-3158-1106-7f46-d4dca672f02f.png)

こんな感じで映像が見られます。

次に外部ネットワークからWebカメラの映像を見るためにセキュリティーの設定を行います。

# SSH接続
SSHを有効にします。

以下のコマンドを実行してラズパイの設定画面を開きます。

```
$ sudo raspi-config
```

実行すると設定用の画面が開くので、7 Advanceed Optionsを選択します。
![ファイアウォールラズパイ4.png](https://qiita-image-store.s3.amazonaws.com/0/141658/085abd6d-fab7-feab-0b4f-f204a5ca4a6e.png)

次に、A4 SSHを選択します。すると「SSHを起動しますか」ときかれるので、はいを選択します。これでSSHの起動は完了です。
![ファイアウォールラズパイ5.png](https://qiita-image-store.s3.amazonaws.com/0/141658/0b6c94f0-b22a-3ecc-34a5-ce9b6d88c92d.png)

# ファイアウォール
ファイアウォールの設定にはufwというツール使います。このツールはLinuxでよく使われるツールだそうです。
時間があればufwよりもiptablesを使用することをおすすめします。

> 参考
[iptablesを使ったファイアーウォール設定](https://qiita.com/nisyuu/items/333bf5bd0b8c4e71a26b#%E3%83%95%E3%82%A1%E3%82%A4%E3%82%A2%E3%83%BC%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%AB%E3%81%AE%E8%A8%AD%E5%AE%9A)

まずはufwのインストールをします。

```
$ sudo apt-get install ufw
```

この段階のファイアウォールの状態は無効になっているはずです。以下のコマンドで確認してみます。

```
$ sudo ufw status
```

実行後、Status: inactiveと結果が返ってくるはずです。これは無効の状態です。有効にするには以下のコマンドを実行します。

```
$ sudo ufw enable
```

無効にするには以下のコマンドを実行します。

```
$ sudo ufw disable
```

次にファイアウォールの最後の設定をします。
Webカメラで8080番ポートを使用するものとして、以下の設定を行います。4行コマンドラインがありますが上から順に、

1. 外部からの接続は基本的に受け付けない
2. ローカルアドレスからのssh接続(22番ポート)は受け付ける
3. 8080番ポートは受け付ける
4. 80番ポートは受け付ける

となっています。

```
$ sudo ufw default deny
$ sudo ufw allow proto tcp from 192.168.10.0/24 to any port 22
$ sudo ufw allow 8080
$ sudo ufw allow 80
```

状態を確認します。

```
$ sudo ufw status
Status: active
  
To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       192.168.10.0/24
8080                       ALLOW       Anywhere
80                         ALLOW       Anywhere
```

上のように結果が帰ってきたら成功です。

# ポート開放の設定
あとはネットワークの設定を行います。使用しているルーターの管理画面にアクセスし、ポート開放を行います。指定するポート番号は今まで使用してきた8080で設定します。通信プロトコルはTCPです。スタートポート(開始ポート)とエンドポート(終了ポート)の指定欄がある場合はどちらも8080と設定してください。

また、ssh接続で使う22ポートも同じように開放してください。

# グローバルIPアドレス
内部ネットワークからのアクセスであれば、[プライベートIPアドレス]:[ポート番号]でよいのですが、外部からアクセスするとなると[グローバルIPアドレス]:[ポート番号]を指定しなければなりません。

グローバルIPアドレスはCMANのIPアドレス確認ページで見ることができます。
>[グローバルIPアドレス確認サイトCMAN](http://www.cman.jp/network/support/go_access.cgi)

確認後、グローバルIPアドレス:8080でアクセスするとラズパイにつながり、Webカメラの映像を見ることができます。

この記事の内容だけだとセキュリティに心配なので、https://qiita.com/nisyuu/items/333bf5bd0b8c4e71a26b も参考にしてみてください。

# 参考文献
[ネットワーク入門サイト](http://beginners-network.com/)
[【グローバルIPアドレス】と【プライベート（ローカル）IPアドレス】の違いと、確認方法についてまとめてみた](http://viral-community.com/other-it/global-private-ip-2004/)
[Raspberry Pi 3 Model Bでネットワーク ライブカメラを構築する方法 MJPG-streamer編](http://www.neko.ne.jp/~freewing/raspberry_pi/raspberry_pi_3_camera_mjpeg_streamer/)
[USBカメラで監視カメラ](http://make.bcde.jp/raspberry-pi/usb%E3%82%AB%E3%83%A1%E3%83%A9%E3%81%A7%E7%9B%A3%E8%A6%96%E3%82%AB%E3%83%A1%E3%83%A9/)