Mac miniにSSH接続（+Jupyterへのポートフォワード）

# はじめに
Mac mini (Late 2014, 以下メイン機)を購入した直後に、Mac mini (Mid 2011, 以下サブ機)を購入することになりました。このままではサブ機の使い道がないと思ったので、Jupyter専用マシンとして運用することにしました。
しかしながら、解析のたびに画面の切り替え等を毎回やるのは大変なので、SSH接続+ポートフォワードでメイン機のブラウザからアクセス出来るようにする、さらにせっかくなので外からもサブ機に接続できるようにしました。

今回の記事では、Mac miniのSSH接続設定、ルーターとして用いているAirMac Time Cupsuleでの設定、ポートフォワードによるJupyterへのアクセスなどを備忘録として残すことにしました。

構築環境は以下の通りです。
- Mac mini (Mid 2011, High Sierra)：サブ機・SSH接続先として使用
- AirMac Time Cupsule：ルーター
- Mac mini (Late 2014, High Sierra)：メイン機：クライアントとして使用

環境構築の際に主に参考にしたサイトは以下の２つです。
- [iPadでMac mini ServerにSSH接続する](https://www.episode02.com/entry/2016/12/28/205606)
- [MacMiniに外部からSSH接続できるようにしてみる。](https://blog.mattny.net/2017/06/macminissh.html)

 
上記参考サイトからの改善点は、以下の通りです。
- 固定IPを取得していないIPアドレスを利用
- ルーターとしてAirMac Time Cupsuleの使用
- Jupyterの実行がゴール

## SSH接続先の設定
以下の手順で設定を行いました。
### macOSの共有設定
システム環境設定の共有からリモートログインの許可とユーザの設定を行いました。画面上の[共有]＞[リモートログイン]＞[（ログイン）ユーザーの追加]からSSH接続を行うユーザーを追加しました（デフォルトの設定ではAdministratorのみが登録されていたため）。

### 鍵の生成
以下のコマンドで鍵の生成と結果の確認を行いました。
`ssh-keygen`の実行の際にパスフレーズの設定を尋ねられますが、終了までEnterキーを連打で大丈夫です。

```bash
cd
mkdir .ssh
ssh-keygen -t rsa
cd ~/.ssh/
ls
  id_rsa id_rsa.pub ＃id_rsa：秘密鍵、id_rsa.pub：公開鍵
```

また、生成した公開鍵から認証公開鍵の複製・アクセス権の設定を以下のコマンドで実施しました。

```bash
cat id_rsa.pub >> authorized_keys
chmod 600 authorized_keys
rm id_rsa.pub
```

作成された秘密鍵（id_rsa）をメイン機に送ります。セキュリティとかを重視しないのであれば、`sudo vi id_rsa`から全部コピーしてメール転送、私の場合はUSBメモリで移しました。

### SSHの設定変更
`sshd_config`の設定を行い、セキュリティの向上を行いました。
`sudo vi /etc/ssh/sshd_config`を実行して以下のパラメータを変更しました。

```bash
PermitRootLogin no ＃rootユーザーでのログインを不許可
RSAAuthentication yes ＃RSA公開鍵認証を有効
PubkeyAuthentication yes ＃RSA公開鍵認証を有効
AuthorizedKeysFile　/authorized_keysのpathを記述/ 
PasswordAuthentication no ＃パスワード認証を不許可
PermitEmptyPasswords no ＃空のパスワードの利用を不許可
ChallengeResponseAuthentication no ＃チャレンジレスポンス認証を禁止
```

また、SSHの標準ポートである22番を使用していると、ポートスキャン等でアクセスされやすいので、ポート番号の変更を以下の通り実施しました。

```
sudo vi /etc/services
ssh 10022/udp # SSH Remote Login Protocol
ssh 10022/tcp # SSH Remote Login Protocol
```

ポート番号は1024番から49151番の適当な所で設定して良いはずですが、私の場合は参考サイトを真似しました。

上記の設定終了後に、再起動してSSH接続先の設定は終了です。

ただし、次のルーター(AirMac Time Cupsule)の設定でSSH接続先であるサブ機のMACアドレスとローカルIPアドレスが必要になるので、[システムレポート]>[ネットワーク環境]からネットの接続にしている方のハードウェア（MAC）アドレスを記録しておきます（私の場合はWi-Fiでした）。


## ルーター(AirMac Time Cupsule)の設定
AirMacユーティリティを立ち上げて、ネットワークタブから以下の手順で設定を行いました。

### DHCPの予約
ルーターの持つグローバルIPアドレスをマンションの住所とすると、部屋番号がローカルIPアドレスだと認識していますが（間違っていたら教えてください）、設定をしないと再起動のたびに部屋を入れ替えられてしまうので、MACアドレスを使ってローカルIPアドレスの固定を行います。
DHCPの予約の[＋]から、下記の設定を行いました。

```
説明：分かりやすい名前を付けました。
アドレスの予約方法：MACアドレス
MACアドレス：先ほどメモしたサブ機のMACアドレス
IPv4アドレス：先ほどメモしたサブ機のローカルIPアドレス
```

これで再起動してもサブ機のローカルIPアドレスは固定されます。

### PORT設定
次にPORT設定を行います。グローバルIPアドレス＋ポート番号で接続があった時に、ローカルIPアドレス＋ポート番号への接続へと変えてくれるようです（きちんとは認識していません・勉強します）。
ポート設定の[＋]から下記の設定を行いました。

```
説明：
パブリックTCPポート：10022（SSH接続の設定で決めた数字の入力）
プライベートIPアドレス：DHCPの予約でも用いたサブ機のローカルIPアドレス
プライベートTCPポート：10022（SSH接続の設定で決めた数字の入力）
```

以上２つの設定を行った後、アップデートの実行。
私の環境では固定IPアドレスを取得していないため、AirMac Time Cupsuleの再起動時にIPアドレスは変わります。基本的に電源を切らない限りは変わらないものと認識しています。

## SSH接続の確認
メイン機からサブ機へアクセスを試して見ます。必要になるのは以下のものです。

```
ユーザー名：macOSの共有設定で追加したもの
秘密鍵：SSH接続先から何かしらの方法でクライアントへ移しておいたもの(Path)
グローバルIPアドレス：AirMacユーティリティからIPアドレスを調べメモ
```

準備ができたら、以下のコマンドでサブ機へアクセス。

```bash
ssh -p 10022 -I /持ってきた秘密鍵のPath/ ユーザー名@グローバルIPアドレス
```

初めての接続の場合は`Are you sure you want to continue connecting (yes/no)?`と聞かれますが`yes`としてください。無事に繋がりました。

### Jupyterの実行と接続
Jupyterを起動すると、特に設定していない限り`localhost:8888`に繋いで実行されます。サブ機の8888番のポートにポートフォワードして、`nohup`からJupyterを起動して見ます。

以下のコマンドでポートフォワードしてサブ機へアクセス。

```bash
ssh -p 10022 -I /持ってきた秘密鍵のPath/ ユーザー名@グローバルIPアドレス -L 8888:localhost:8888
```

これにより、`localhost:8888`にアクセスするとサブ機のJupyterへ繋がります。まだ起動していないので、ページは開けず、`open failed: connect failed: Connection refused`的なエラーが出ます。

以下のコマンドで、`nohup`からJupyterを起動します。

```bash
mkdir work #作業ディレクトリの作成
cd work
nohup jupyter notebook > out.log & #Jupyterを起動
```

`nohup`によりssh終了後もJupyterは実行を続けてくれます。ただし、このままではJupyterのtokenが分からないので、`vi out.log`から`Copy/paste this URL into your browser when you connect for the first time, to login with a token:`を探してアドレスを確認してください。

ログイン後は実行が出来てるか確認してください。一度起動後は、ポートフォワードしてサブ機へアクセスすれば、`localhost:8888`からJupyterを活用出来ます。

# おわりに
今回の記事では、Mac miniのSSH接続設定、ルーターとして用いているAirMac Time Cupsuleでの設定、ポートフォワードによるJupyterへのアクセスを実施しました。
同じようなことをしようとしている方の参考になれば幸いです。

## Appendix
編集ついでに補足情報を記載します。iPadのSSHアプリを利用してサブ機に接続することが確認出来ました。
使用したアプリは(一部)フリーで利用可能な「Termius」です。設定等については他に詳しいサイトもあるので割愛しますが、SSH接続・ポートフォワードによるJupyterへの接続など、メイン機で確認出来たことは同じく出来ました。
ただし、Safari等のブラウザを起動しているとSSHアプリの接続が切れることがあるため、結果の簡易確認程度に利用するのが良さそうでした。