NanoPi NEO2 インストールとインターネット越しSSH

# はじめに
~ NanoPi NEO2 quick launch and remote SSH access over the Internet ~
ラズパイよりも一回り以上ちいさい、とてもかわいいけどパワフルなNanoPi NEO2を開封からちゃちゃっと立ち上げて、remote.itをインストールしてインターネット越しにSSH接続してみます。


# NanoPiとは
名前から想像する通り、Raspberry Piライクなシングルボードコンピューターです。小さいけれど豪華、それでいて汎用性の高いハードウェア構成、かつ不要なものは削ぎ落としたシンプルなコンピューターです。
 - 本家はこちら： https://www.friendlyarm.com/index.php?route=product/category&path=69 
 - ハードウェア構成により様々なバージョンあり
 - 手に入れやすいのは今回解説する「NanoPi NEO2」、秋月電子で購入可能
 - ARMのCPU、公式のOS以外にarmbianをサポート： https://www.armbian.com/nanopi-neo-2/
 - microSDカード（class10以上）、USB micro-Bの電源（2A以上の指示）など、ラズパイ用の周辺機器が利用しやすい。
 

# 開封、ハードウェアの準備
開封、Micro SDカード、ヒートシンク、電源そしてLANケーブルを準備

- Micro SDカード、今回はとりあえずclass10の16GB
![photo_2020-09-13_01-38-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/db014a69-3c8a-26e6-09f9-60b2bd04922a.png)

- 裏に見えるAllwinner h5はクアッドコア64ビットのCortex A53、ヒートシンクをネジ＋ナットx4で装着
![photo_2020-09-13_01-38-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/689db83e-d59e-50dd-4c13-cc70865a99a5.png)![photo_2020-09-13_01-38-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/2290f36d-8595-3be7-7838-e9bd4b4d718e.png)

- 電源、ラズパイ2Bに使っていた2Aくらいのやつ、USB Micro-B

![photo_2020-09-13_20-47-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/8db3d49d-0ba3-86d6-d6e5-08480a5e51ce.png)


- LANケーブル、DHCPでIPアドレスを取得できる環境へ接続

- おまけ：ラズパイ(Raspberry Pi 2B)との比較 
![photo_2020-09-13_01-38-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/8a253823-1fc6-1573-04d3-9e31787d4bae.png)


# armbian OSを準備
 - まずはイメージファイルをダウンロード：
 
> armbian : https://www.armbian.com/

より、［Download］−［NanoPi NEO 2］を選択。WebページをCtlf+Fで検索すると簡単。
【注意】上記検索で「NanoPi NEO 2 Black」が先にでてきますが間違えないように。
Armbian Busterをダウンロードしてみます。
直リンク： https://www.armbian.com/nanopi-neo-2/
![スクリーンショット 2020-09-13 2.22.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/f7a0aacc-af3a-c2ea-3293-c3fb0316a8fa.png)


# Micro SDカードのフォーマットとOSの書き込み　
- Micro SDカードをフォーマット
なにげによく使う「SD Card Formatter」でMicro SDカードをフォーマット
![スクリーンショット 2020-09-13 2.18.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/4456fd9c-366a-6da5-7b55-cfdc78bec2e2.png)

- OSの書き込み
armbianのサイトにも書き込みツールが紹介されていますが…今回はラズパイでおなじみ「Raspberry Pi Imager」を使ってみました。
![スクリーンショット 2020-09-13 2.30.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/dd2aa373-d5bf-dc36-79b2-cc8bc4afe305.png)

「CHOOSE OS」からメニュー一番下「Use custom」で先ほどダウンロードした「Armbian Buster」を、
![スクリーンショット 2020-09-13 2.19.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/149870ef-373d-97cd-c400-c6c5ab1fc9d8.png)
「CHOOSE SD Card」から先ほどフォーマットしたMicro SDカードを選択
![スクリーンショット 2020-09-13 2.21.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/c3501259-4b60-6750-d364-0f6c4616b60e.png)
最後に「WRITE」で書き込み開始


# 電源投入
前項で準備したMicro SDカードを挿入、有線LANケーブルをHUB、ルーターに接続して電源を接続します。
少し待つとOS起動しDHCPでIPアドレスを取得している、はず。
LANのルーターの管理画面か、もしくは「Fing」などのツールでIPアドレスを確認します。
次は同一LAN上の他のコンピューターからターミナルソフトでSSHアクセスしてみます。


# SSHでログイン
ターミナルソフトを起動し、SSHでアクセスします。
同梱の簡易ドキュメントに記載の通り。

- 初期ユーザー名：root
- 初期パスワード：1234

```console
xxx@macbookpro:~ $ ssh -l root 192.168.xxx.xxx
```

ログインに成功すると以下のようなバナーとrootパスワード設定のプロンプトが表示されます。

```console
 _   _ ____  _   _   _              ____  
| \ | |  _ \(_) | \ | | ___  ___   |___ \ 
|  \| | |_) | | |  \| |/ _ \/ _ \    __) |
| |\  |  __/| | | |\  |  __/ (_) |  / __/ 
|_| \_|_|   |_| |_| \_|\___|\___/  |_____|
                                          
Welcome to Armbian 20.08.1 Buster with Linux 5.8.5-sunxi64

System load:   0.13 0.15 0.08  	Up time:       5 min		Local users:   2            	
Memory usage:  22 % of 475MB  	IP:            192.168.xxx.xxx
CPU temp:      31°C           	
Usage of /:    10% of 15G    	

Last login: Wed Sep  2 19:10:59 2020
New to Armbian? Documentation: https://docs.armbian.com Support: https://forum.armbian.com

New root password: 
```

新しいrootのパスワードを設定、ロケールとキーボードを自動設定するか質問されるので「Y」
続いて新しい一般ユーザー作成を促すプロンプトが表示されるので、好きなユーザー名とパスワードを設定（例：demo）


```console
New root password: ********
Repeat password: ********
Detected timezone: Asia/Tokyo (JST, +0900)
Do you want to set locales and console keyboard automatically from your location [Y/n]
Generating locales: ja_JP.UTF-8

Console keyboard layout: jp

Creating a new user account. Press <Ctrl-C> to abort

Please provide a username (eg. your forename): demo
Creating a new user account. Press <Ctrl-C> to abort

Create password: ********
Repeat password: ********
```

名前の入力を促されますが、空白で良いでしょう、そのままEnter

```console
Please provide your real name (eg. John Doe): 
Dear demo, your account demo has been created and is sudo enabled.
Please use this account for your daily work from now on.

root@nanopineo2:~# 
```

で、コマンドプロンプトが表示され初期設定完了です。


# SSH設定の変更
rootでのログインを無効化します。

```console
root@nanopineo2:~# sudo vi /etc/ssh/sshd_config
```

この行をコピー＆編集してコメントアウトし「no」に変更、上書きして保存

```console
# PermitRootLogin yes
PermitRootLogin no
```

一度リブートして新しいユーザーでログインし直します。

```console
root@nanopineo2:~# shutdown -r now
```

少し時間をおいて再度SSH接続、今度は新しいユーザー名「demo」で
先ほどの設定でrootユーザーではもうログインできないはずです（確認しておきましょう）

```console
xxx@macbookpro:~ $ ssh -l demo 192.168.xxx.xxx
demo@192.168.1.29's password: xxxxxxxx

 _   _ ____  _   _   _              ____  
| \ | |  _ \(_) | \ | | ___  ___   |___ \ 
|  \| | |_) | | |  \| |/ _ \/ _ \    __) |
| |\  |  __/| | | |\  |  __/ (_) |  / __/ 
|_| \_|_|   |_| |_| \_|\___|\___/  |_____|
                                          
Welcome to Armbian 20.08.1 Buster with Linux 5.8.6-sunxi64

System load:   0.00 0.00 0.00  	Up time:       3 days 15:13		
Memory usage:  20 % of 475MB  	IP:            192.168.xxx.xxx
CPU temp:      40°C           	
Usage of /:    11% of 15G    	

Last login: Tue Sep 15 00:28:53 2020 from 192.168.1.183
demo@nanopineo2:~$ 
```

無事一般ユーザーでログインできました。


# nanopiのアップデート
OSとパッケージのアップデートを確認、適用します。updateで少し、upgradeは結構時間がかかるので、upgradeを流したら少し放置ですね。

```console
demo@nanopineo2:~$ sudo apt update
```
```console
demo@nanopineo2:~$ sudo apt upgrade
```

:::note info
2021.10.19 更新
これ以降の手順を従来のconnectd_installerを使う手順からDevice Packageを使う手順に更新しました。
:::


# インターネット越しのSSHアクセス設定（remote.itの導入）
FWのポート公開をせずともインターネット越しに遠隔アクセスできる「[remote.it](https://remote.it/)」サービスを設定します。
remote.itのアカウント作成とnanoPiへのインストールを実施します。
remote.itが何か、アカウントの作成方法については以下記事が参考になると思います。
「[インターネット世界の「どこでもドア」remote.it](https://qiita.com/u___sk/items/e0df9581d2e58891ec8a)」
「[ラズパイにRPi-Cam-Web-Interfaceとremote.itで遠隔Web IPカメラ](https://qiita.com/mskairmail/items/25f985927beb5d3f1b04)」
「[ラズパイにScreenlyとremote.itで遠隔デジタルサイネージ](https://qiita.com/mskairmail/items/226b650fb16256173ea5)」
「[これは魔法か？！ インバウンドポートを全閉したAWSのサーバに接続する方法](https://qiita.com/tkhmhiroc/items/0724d4b1d6bc688aa474)」
「[remot3.itでインバウンド全閉じ状態のマシンにインターネット経由でアクセスしてみた](https://qiita.com/kojiisd/items/5ccc14098ba34fb508ce)」

今回の構成の概略はこんな感じです。

![overview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/4cfb8c67-edb9-168d-712c-f63a2ef20eaa.png)


### remote.it アカウント作成（① remoteit Cloudで実施）
- アカウントのサインアップ：　[remote.it](https://remote.it/)ホームページから`Get Started`　→　`Sign up`

![signup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/c58186cb-4b50-27a0-fb03-2b0de1194738.png)


### nanoPi へのremote.it インストール（② remoteit ターゲットにソフトウェアをインストール）
- nanoPiへのインストール方法：　[remote.it](https://remote.it/)ホームページから`Download`　→　`Device Packages`

![download00a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/4a6841d0-4aad-f6c1-e555-5f34e165f624.png)

`See More Options`から他のパッケージを探します。

`remote.it Device Package for Pi OS (ARM64)`が今回利用するパッケージ、ラズパイ用ですが大丈夫。

![download02a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/e2cdd723-89ca-9ab0-fe49-c603b6f24a16.png)

矢印のドキュメントボタンを押して手順を確認します。

https://docs.remote.it/device-package/installation

![arm64rpi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/4652db44-8e5a-dd13-5091-366b54af4e22.png)

Download用のURIをコピー、以下nanoPiのコンソールでcurlコマンドでダウンロードを実行します。

```console
demo@nanopineo2:~$ curl -LkO https://downloads.remote.it/remoteit/v4.13.5/remoteit-4.13.5.arm64.rpi.deb
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  100k  100  100k    0     0   142k      0 --:--:-- --:--:-- --:--:--  142k
demo@nanopineo2:~$ 
```

パッケージ一覧をアップデートし、remoteitパッケージをインストールします。

```console
demo@nanopineo2:~$ sudo apt update -y
demo@nanopineo2:~$ sudo apt install ./remoteit-4.13.5.arm64.rpi.deb
```

以下のように出力されればインストールは成功です。

```console
.
.
.
.../remoteit-4.13.5.arm64.rpi.deb を展開する準備をしています ...
remoteit (4.13.5) を展開しています...
remoteit (4.13.5) を設定しています ...
Created symlink /etc/systemd/system/multi-user.target.wants/connectd.service → /etc/systemd/system/connectd.service.

--------------------- Claim this device ---------------------

Use the code XXXXXXXX to register this device to your account

--------------------- Claim this device ---------------------

demo@nanopineo2:~$ 
```
ターゲットデバイス登録のためのコード（XXXXXXXXの部分）が表示されるのでコピーします。
これは次項のデバイス登録作業で必要になります。
またこのClaim Codeは24時間の期限があるため、続けて事項の作業を進めてください。


### nanoPi をターゲットデバイスとして登録（③remoteit Desktop appからの操作）
remoteitパッケージをインストールしたnanoPiをremoteit ターゲットとして動作させるためのデバイス登録作業を行います。この作業によりnanoPiはremoteit ターゲットとなりインターネットを超え遠隔からの接続ができるようになります。
今回はDesktop appを利用しますが、Mobile appも利用可能です。

作業用のPCにremoetit Desktop app をインストール／起動しサインインします。
![desktop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/ca6a77cc-6556-ea36-564e-721f13298020.png)

左ペイン上部のデバイス登録ボタン `+` をクリックします。
![plus.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/14c6ba8c-a737-6f15-efcc-db3c819326bf.png)

レジストレーションコードを入力する画面が開きます。nanoPi上での操作の最後で入手したClaim Codeを入力し、`REGISTER`をクリックします。
![claim.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/379940e5-6ffb-4167-df0c-b0bea6b5e476.png)

レジストレーションが成功すると下記のようなメッセージが表示されます。
![succeed02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/61ebcd2a-c158-24f4-d088-d655c339ca5d.png)

ここでは`My Device`という名前でデバイスが登録されました。リスト上に表示されていると思いますので探してみましょう。もし表示されていない場合は矢印部分から再読み込みをしてみてください。
![mydevice.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/eb485381-e58b-c6cf-84b3-29873af45695.png)


### nanoPi 上のデバイス名を編集（③remoteit Desktop appからの操作）

先程登録されたデバイスをクリックします。
![service01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/45112b3b-f322-6698-63bb-b244807b4b4d.png)

デバイスの詳細画面が表示されます。`Edit`からデバイスの名前を編集します。
![service02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/9ae66156-7fb5-8964-2bbb-557a3a5c890d.png)

デバイス名の編集アイコンからお好きなデバイス名に変更可能です。この例では `nanopi_JPN_01` とします。
![service03a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/9245c0c3-5be6-2abc-432d-c693ec9b7d27.png)
![service03b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/ffa77054-c1da-f851-1785-8d8949e298b1.png)


### nanoPi 上のサービスを追加（③remoteit Desktop appからの操作）

デバイスに戻り、サービス追加`[+]`をクリックします。
![service04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/40e65290-0a13-32dd-c8b6-4f3524cc67e0.png)

追加するサービスの編集画面が表示されます。
`[SERVICE TYPE]`として`[SSH]`を選択し`[SAVE]`をクリックします。
![service05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/3439c7c0-3c91-874a-247b-ca92f0428c0f.png)

続けて再度`[+]`をクリックし、nanoPiの状態ダッシュボード「armbian monitor」も追加します。`HTTP`を選択し、今度はわかりやすいように`SERVICE NAME`を変更し、さらに`SERVICE PORT`を実際のデバイス上での待受ポート番号8888に編集します。
![service06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/2ab226ed-184b-fa71-9a2f-4546a637592d.png)

少し待つとサービス一覧画面に追加されたサービスが表示されます。グレーから濃い黒い字に表示変わるとオンライン状態です。もし変化がない場合はリロードしてみてください。
![service07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/49bf3cc9-c018-3a87-70ff-fd512c4c5336.png)


# インターネット越しにremote.it経由でSSH接続する
ターゲットデバイスに接続するには、remoteit Web appからプロキシ接続する方法と、remoteit Desktop appを利用してP2P接続する2種類の方法があります。

### プロキシ接続の場合

[remote.it](https://remote.it/)ホームページから`Sign in`
うまく設定できていると以下のようなデバイスがオンラインになっていると思います
![web01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/69966849-9f38-e166-7c7d-cb91aa6fd17d.png)

デバイス名をクリックすると以下のようなモーダル画面が表示されます
![web02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/58251e4c-4768-852d-c7c4-71e9c5999194.png)

Serviceの部分`Secure shell terminal`をクリックし接続情報を取得します
![web03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/c2cb931d-e464-27e9-b9fe-4e4ea84af181.png)

`All others`から文字列をコピーしPCのターミナルに貼り付け、この例ではユーザー名を`demo`に変更していよいよ接続してみます。
SSH接続ソフトを利用する場合は取得したホスト名とポート番号をそれぞれ入力してみてください。

```console
xxx@macbookpro:~ $ ssh -l demo proxyXX.xxx.xx -p nnnnn
The authenticity of host '[proxyXX.xxx.xx]:nnnnn ([xxx.xxx.xxx.xxx]:nnnnn)' can't be established.
ECDSA key fingerprint is SHA256:/zzzzzzzzyyyyyyyyxxxxxxxxwwwwwwwwvvvvvvvvvv.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[proxynn.rt3.io]:xxxxx,[aaa.bbb.ccc.ddd]:ppppp' (ECDSA) to the list of known hosts.
demo@proxyXX.xxx.xx's password: xxxxxxxx 
 _   _ ____  _   _   _              ____  
| \ | |  _ \(_) | \ | | ___  ___   |___ \ 
|  \| | |_) | | |  \| |/ _ \/ _ \    __) |
| |\  |  __/| | | |\  |  __/ (_) |  / __/ 
|_| \_|_|   |_| |_| \_|\___|\___/  |_____|
                                          
Welcome to Armbian 20.08.1 Buster with Linux 5.8.6-sunxi64

System load:   0.00 0.00 0.00  	Up time:       3 days 16:20		
Memory usage:  20 % of 475MB  	IP:            192.168.xxx.xxx
CPU temp:      42°C           	
Usage of /:    11% of 15G    	

[ General system configuration (beta): armbian-config ]

Last login: Tue Sep 15 00:56:34 2020 from xxx.xxx.xxx.xxx
demo@nanopineo2:~$ 
demo@nanopineo2:~$ 
demo@nanopineo2:~$ 
```

接続できました！


### P2P接続の場合
remoteit Desktop app の`Devices`に表示されるデバイスから接続したいサービスを選択します。この例では先程同様に`Secure shell terminal`（SSH）に接続してみます。サービスを選択し、`[ADD TO NETWORK]`をクリックします。
![p2p01a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/7b7ea4b7-07e5-f6f2-ca47-f41a13c2744e.png)

下記表示に変わったら接続の準備完了です。この段階でPC上のremoteit Desktop appはPC上で「待機状態」として接続を待ち受けています。アプリケーションからの実際にアクセスする段階でターゲットへのP2P接続を作成します。
![p2p02a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/b48b3d4f-cf05-b4e6-d77f-5647427ff4bb.png)

`ADDRESS`に表示されている文字列をコピーしPCのターミナルに貼り付け、この例ではユーザー名をdemoに変更していよいよ接続してみます。
SSH接続ソフトを利用する場合は取得したホスト名とポート番号をそれぞれ入力してみてください。初回は下記のような補助ウインドウが表示されます。`USERNAME`にnanoPi上のユーザー名を設定し`SAVE`します。再度コピーすると文字列内にユーザー名も埋め込まれていると思います。
![p2p03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309124/ec35d637-21a8-e9d9-a4ad-b568bab2e892.png)

```console
xxxx:~ xxx$ ssh -l demo nanopi_jpn_01-secure-shell-terminal.at.remote.it -p 30000
The authenticity of host '[nanopi_jpn_01-secure-shell-terminal.at.remote.it]:30000 ([127.0.0.1]:30000)' can't be established.
ECDSA key fingerprint is SHA256:/zzzzzzzzyyyyyyyyxxxxxxxxwwwwwwwwvvvvvvvvvv.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[nanopi_jpn_01-secure-shell-terminal.at.remote.it]:30000' (ECDSA) to the list of known hosts.
demo@nanopi_jpn_01-secure-shell-terminal.at.remote.it's password: xxxxxxxx
 _   _ ____  _   _   _              ____  
| \ | |  _ \(_) | \ | | ___  ___   |___ \ 
|  \| | |_) | | |  \| |/ _ \/ _ \    __) |
| |\  |  __/| | | |\  |  __/ (_) |  / __/ 
|_| \_|_|   |_| |_| \_|\___|\___/  |_____|
                                          
Welcome to Armbian 20.08.1 Buster with Linux 5.8.6-sunxi64

System load:   0.11 0.04 0.01  	Up time:        2:48		
Memory usage:  29 % of 475MB  	Zram usage:    14 % of 237Mb  	IP:            192.168.xxx.xxx
CPU temp:      33°C           	
Usage of /:    22% of 15G    	

Last login: Tue Oct 19 17:56:08 2021 from 127.0.0.1
demo@nanopineo2:~$ 
demo@nanopineo2:~$ 
demo@nanopineo2:~$ 
```

こちらも接続できました！


# まとめ
インターネット越しでもポートを公開せずFW設定も不要、またDHCP運用でどのネットワークに移動してもremote.it経由で接続性を確保できます。携帯電話ネットワーク越しでも接続できますので遠隔地への設置とアクセスを実現できます。nanoPiは元々HDMI出力が無いですのでコンソール接続のためにIPアドレスを固定して運用しがちだと思いますが、remote.itがあればDHCPのまま運用して容易に別ネットワークに移動させる、なんて事も可能だと思います。（でなくともremoteit appsからローカルIPアドレスが見れるのが地味に便利です）