Raspberry Piに外部ネットワークからアクセスできる様にして携帯でペットを遠隔監視する方法

はじめに
-
前回、赤外線カメラモジュールを繋げて「mjpg-streamer」を使い、家内のネットワークのブラウザから動画を見れる様にしました。
[【Raspberry Piで赤外線カメラモジュールを使ってみる】](http://qiita.com/kinpira/items/940f34e11d1f856c5880)

今回はその続きで、外出時にも携帯から動画を確認できるようにします。

やりたい事
-
・外部ネットワークからRaspberryPiにアクセスできる様にして、外出先からペットを監視する。

その前に
-
まず、作業内容を書く前に、なぜ家内からはRaspberryPiにアクセスできるのに、外部からはアクセスできないのか？

今まで、RaspberryPiにアクセスするときには「<b>192.168.x.x</b>」というIPアドレスでアクセスしていました。
このIPアドレスはプライベートIPと呼ばれる物になります。
これは、NAT（Network Address Translation)という技術でルーターが受け口となって、通常のグローバルIPアドレスとは別にルーターが家の中の機器にプライベートIPを割り振っているというものになります。

こんなイメージ
<img width="635" alt="スクリーンショット 2016-01-10 1.15.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/93763/2d4c3d67-b1e7-5714-0c11-623f2e1c4d56.png">


なので、今回はルーターが持つグローバルIPアドレスにアクセスすると、RaspberryPiのIPアドレスに繋がるようにしないといけません。

プライベートIPアドレスの固定
-
割り振られるプライベートIPアドレスは、必ずしも固定では無いので、プライベートIPアドレスを固定し、このプライベートIPアドレス(例:<b>192.168.3.2</b>」)は必ずRaspberryPiを指す様にしてあげる必要が有ります。

そこで、「/etc/wpa_supplicant/wpa_supplicant.conf」の内容を変更します。
ちなみにwpa_supplicantとは
>wpa_supplicant は、ドライバと協調して、AP(アクセスポイント)との接続ネゴシエーションを行い、また定期的に変更/交換される WPA および WAP2 キーの面倒を見てくれるデーモンです。

だそうです。[こちらより参照](http://homepage2.nifty.com/tosiharu/wlan/fc5-wlan-main.htm)

簡単に言うと[WPA (Wi-Fi Protected Access)](http://e-words.jp/w/WPA.html)の認証とかアクセスポイント接続をサポートするものらしいです。
wpa_supplicant.confの中にwlan0と言う項目があるので、そこを変更していきます。
「wlan」というのは無線LANを指すようです。
ちなみに有線は「eth」だそうです。
固定方法に関しては[ここ](http://ysdyt.github.io/blog/2015/06/28/raspi-wifi-static-ipaddress/)を参考にして、下記の様に修正します。

wpa_supplicant.conf 【Before】

```bash
auto wlan0
allow-hotplug wlan0
iface wlan0 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
```
まずは「iface wlan0 inet」の「manual」を「static」に変更し、IPを固定に設定します。
後は固定するIPアドレスを指定します。
ちなみにwpa_supplicant.confには無線の接続先情報が入ってます。
これを見て、接続認証を行うようです。
今回は、事前にRaspberryPiを無線LANと接続していたので、既にwpa_supplicantの中に諸々の接続情報が入っていました。


wpa_supplicant.conf 【After】

```bash
allow-hotplug wlan0
iface wlan0 inet static 
address 192.168.3.101
netmask 255.255.255.0
gateway 192.168.3.1
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

```
修正が終わったらイーサネットインターフェースの再起動を行い、設定を有効化します。

```bash
$ sudo ifdown wlan0  # WiFiの接続を切る
$ sudo ifup wlan0   # WiFiを接続する
```
注意事項としては、RaspberryPiの無線LAN接続が切れる訳なので、この再起動の作業はSSH接続で行うのではなく、RaspberryPi本体で行った方が良いです。

さて再起動したら、IPアドレスを確認します。
固定した、「192.168.3.101」になっていれば成功です。

```bash
$ ip addr show
3: wlan0: 
~~snip~~
    inet 192.168.3.101/24 brd 192.168.3.255 scope global wlan0
~~snip~~
```
なってますね！成功です！
これでwlan0で接続している時は、ローカルネットワーク内では「192.168.3.101 = RaspberryPi」となったわけです。
これでプライベートIPアドレスの固定が完了しました。

ルーターのポートを解放する
-
次に、外部からRaspberryPiアクセスできる様にルーターのポートを解放し、解放したポートを先ほど固定したRaspberryPiのプライベートIPアドレスと紐づけます。

こんなイメージ
<img width="731" alt="スクリーンショット 2016-01-10 1.24.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/93763/6bb5a6bd-f5ee-9a8a-bf0e-e9e315af5e2c.png">

この場合ルーター側に設定する必要があるので、ルーターによって設定方法が違います。
うちの場合はこんな感じでポートを指定して、転送先IPアドレスに先ほど固定したプライベートIPアドレスを指定して、ポートと転送先を紐づけます。
![スクリーンショット 2015-12-30 16.40.42.png](https://qiita-image-store.s3.amazonaws.com/0/93763/95d6a445-6cbf-ba65-9540-2327fa7452a0.png)

これでルーターのグローバルIPの「8080ポート」と「22ポート」にアクセスが来た場合RaspberryPiに転送されるわけですね。
※ルーターのグローバルIPはプロバイダーによって動的に変更されるようなのですが今回は考慮していません。

ここまでできたら、ローカルネットワーク外からアクセスしてみます。
22ポートを開けているので、グローバルIPアドレスに対して、SSH接続出来ればOkです。

公開鍵認証する
-
さて、今回は出先でも操作できるように、外部からSSH接続できるようにしましたが、今のパスワード認証だとセキュリティ的に恐いので、公開鍵認証方式に変更します。
まずはRaspberryPiにアクセスするPCで、対となる秘密鍵と公開鍵を作成します。<img width="412" alt="スクリーンショット 2016-01-10 2.07.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/93763/b02bbd04-817b-5163-8dee-1ba54c9deb3e.png">

鍵が出来たら公開鍵をRaspberryPiに渡します。
<img width="369" alt="スクリーンショット 2016-01-10 2.07.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/93763/0172628f-f041-2cdb-3ff0-ce2f915b7960.png">

渡された公開鍵情報をRaspberryPiの.sshフォルダのauthorized_keysファイルに書き出します。
権限も付与します。

```bash
raspberrypi ~ $ cat id_rsa.pub >> .ssh/authorized_keys
raspberrypi ~ $ chmod 700 .ssh
raspberrypi ~ $ chmod 600 .ssh/authorized_keys
```
次にSSHの設定を変更する為にsshd_configを編集します。

```bash
raspberrypi ~ $ sudo vi /etc/ssh/sshd_config 
```

rootログインを禁止します

```bash
PermitRootLogin without-password
変更↓
PermitRootLogin no
```
公開鍵ファイル認証を有効にします

```bash
#AuthorizedKeysFile  %h/.ssh/authorized_keys
変更↓
AuthorizedKeysFile  %h/.ssh/authorized_keys
```

最後に、パスワード認証をコメントアウトして無効にします

```bash
PasswordAuthentication yes
変更↓
#PasswordAuthentication yes
```

これで、設定が有効になったら、SSH接続する時にRaspberryPiの「authorized_keys」に書いてある公開鍵情報と対になる秘密鍵情報が無いと接続できなくなりました。
<img width="363" alt="スクリーンショット 2016-01-10 2.07.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/93763/e032d9af-e74d-1502-0711-1dc0535b45e6.png">

では、sshd_configの修正を保存して、再起動して変更した設定を有効にします。

```bash
sudo /etc/init.d/ssh restart
```
有効化されたら接続テストしてみます。
まずは鍵情報をつけないで接続してみます。

```bash
$ ssh user@xxx.xxx.xxx.xxx ←グローバルIPアドレス
Permission denied (publickey)
```
お！エラーになりました。
つぎに鍵情報と一緒に接続します。

```bash
$ ssh -i ~/.ssh/raspi -p 22 user@xxx.xxx.xxx.xxx
~~snip~~
user@raspi ~ $
```
接続できました！
という事で鍵認証設定もできました。

動画配信してみる
-
通信回りが完了したので、カメラをセットします。
赤外線カメラはセロテープで固定。笑
![IMG_4069.jpg](https://qiita-image-store.s3.amazonaws.com/0/93763/5cedc1d8-ef55-45f9-f506-72cc90f0d4cf.jpeg)

では、監視するペットのゲージの前に設置します。
![IMG_4070.jpg](https://qiita-image-store.s3.amazonaws.com/0/93763/21faf155-aa98-ec57-2970-d60bc4b41d21.jpeg)

それでは、外出先から携帯で確認してみます。
![Evernote_Camera_Roll_20160110_014534.png](https://qiita-image-store.s3.amazonaws.com/0/93763/cffc35c0-26c0-79f3-9c53-dc95decea8d2.png)
見れました！！ばっちりです！

まとめ
-
年末年始に外出先からずっとペットの様子が確認できるので安心できました(^o^)
動画自体はカクカクしてましたが、ペットの様子を確認する程度なら全然問題ありませんでした。
今回は、時間が無くて突貫で準備したので色々雑ですが、なんとか完成して良かったです! (●｀∀´)9