はじめに
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):メイン機:クライアントとして使用
環境構築の際に主に参考にしたサイトは以下の2つです。
上記参考サイトからの改善点は、以下の通りです。
- 固定IPを取得していないIPアドレスを利用
- ルーターとしてAirMac Time Cupsuleの使用
- Jupyterの実行がゴール
SSH接続先の設定
以下の手順で設定を行いました。
macOSの共有設定
システム環境設定の共有からリモートログインの許可とユーザの設定を行いました。画面上の[共有]>[リモートログイン]>[(ログイン)ユーザーの追加]からSSH接続を行うユーザーを追加しました(デフォルトの設定ではAdministratorのみが登録されていたため)。
鍵の生成
以下のコマンドで鍵の生成と結果の確認を行いました。
ssh-keygen
の実行の際にパスフレーズの設定を尋ねられますが、終了までEnterキーを連打で大丈夫です。
cd
mkdir .ssh
ssh-keygen -t rsa
cd ~/.ssh/
ls
id_rsa id_rsa.pub #id_rsa:秘密鍵、id_rsa.pub:公開鍵
また、生成した公開鍵から認証公開鍵の複製・アクセス権の設定を以下のコマンドで実施しました。
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
を実行して以下のパラメータを変更しました。
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接続の設定で決めた数字の入力)
以上2つの設定を行った後、アップデートの実行。
私の環境では固定IPアドレスを取得していないため、AirMac Time Cupsuleの再起動時にIPアドレスは変わります。基本的に電源を切らない限りは変わらないものと認識しています。
SSH接続の確認
メイン機からサブ機へアクセスを試して見ます。必要になるのは以下のものです。
ユーザー名:macOSの共有設定で追加したもの
秘密鍵:SSH接続先から何かしらの方法でクライアントへ移しておいたもの(Path)
グローバルIPアドレス:AirMacユーティリティからIPアドレスを調べメモ
準備ができたら、以下のコマンドでサブ機へアクセス。
ssh -p 10022 -I /持ってきた秘密鍵のPath/ ユーザー名@グローバルIPアドレス
初めての接続の場合はAre you sure you want to continue connecting (yes/no)?
と聞かれますがyes
としてください。無事に繋がりました。
Jupyterの実行と接続
Jupyterを起動すると、特に設定していない限りlocalhost:8888
に繋いで実行されます。サブ機の8888番のポートにポートフォワードして、nohup
からJupyterを起動して見ます。
以下のコマンドでポートフォワードしてサブ機へアクセス。
ssh -p 10022 -I /持ってきた秘密鍵のPath/ ユーザー名@グローバルIPアドレス -L 8888:localhost:8888
これにより、localhost:8888
にアクセスするとサブ機のJupyterへ繋がります。まだ起動していないので、ページは開けず、open failed: connect failed: Connection refused
的なエラーが出ます。
以下のコマンドで、nohup
からJupyterを起動します。
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アプリの接続が切れることがあるため、結果の簡易確認程度に利用するのが良さそうでした。