【ssh環境構築編】AndroidスマホとMohistとubuntuでMinecraftサーバーをディープに立てる

身内が余ったOPPOで何かできないか探していたのでLinuxを布教すべく
適当に彼向けのHow toを書いて行きます。
今回はTermux内の**Openssh-serverのセットアップ**までをしていきます。

::: note warn
LinuxとCUIを触れたことがない
慣れていない
そんな方を想定しています
:::

# 目次

1. <a href="#事前知識">事前知識</a>
    1. <a href="#必要なもの">必要なもの</a>
    1. <a href="#必要なアプリ">必要なアプリ</a>
1. <a href="#環境構築">環境構築</a>
    1. <a href="#step1-必要なアプリのインストール">Step1 必要なアプリのインストール</a>
    1. [ Step2 Termux&pkgのセットアップ](#step2-termuxpkgのセットアップ)
    1. [ Step3 Opensshのセットアップ](#step3-opensshのセットアップ)
        1. [クライアント側の準備](#クライアント側の準備)
        1. [サーバー側の準備](#サーバー側の準備)
        1. [SSH接続](#ssh接続)
        1. [公開鍵認証への切り替え](#公開鍵認証への切り替え)
# 事前知識

<dl>
 

### 必要なもの
<dl>
<dt>手頃なAndroidスマホ<dt>
<dd>Snapdragon845以上だと快適かも？<dd><br>

<dt>ポート開放できる環境 or NAT超えできるサービス<dt>
    <dd>他のプレイヤーが参加できるようにするには当然ですがポートを開ける必要があります。
    TailscaleとかZerotierとか使えばポート開放環境がなくてもどうにかなります。~~Hamachi...?~~
    </dd><br>
    
<dt>がんばる元気と根気</dt>
    <dd>サーバを運営していく以上Linuxの知識は最低限必要です。
    頑張って覚えよう☆</dd><br>
</dl>

<dt>(推奨)PC</dt>
    <dd>やっぱりコマンドを打つならキーボードがなくては始まりません。<br>
    なくてもどうにかなるけど合ったほうが絶対にいい</dd><br>
</dl>

### 必要なアプリ
1. Termux
    サーバー本体をこのアプリを使って管理します。

    
1. Termux:boot
        端末の再起動時とかにSSH(リモートアクセス)とかを有効化するのに必須
    
1. (推奨)hacker's keyboard
    スマホ単体でコマンドを入力するときとかにあると便利
<br>

# 環境構築

## Step1 必要なアプリのインストール

まず最初に、Termux本体のアプリ本体をダウンロードしましょう。
<a href="https://github.com/termux/termux-app/releases">ダウンロード先</a>
Githubの見方などはさすがに省略しますが、とりあえず一番上に近い`"latest"`を選んでおけば大丈夫です。<br>
末尾が`github-debug_arm64-v8a.apk`となっているものをダウンロードしましょう。
記事執筆時点の最新バージョン(<a href="https://github.com/termux/termux-app/releases/tag/v0.118.1">v0.118.1</a>)では`termux-app_v0.118.1+github-debug_arm64-v8a.apk`が適切なファイルになります。<br>
ダウンロードができたらAPK(アプリ本体)をインストールしましょう。
手順については以下の記事にお任せします！

https://akiralogroom.com/android-apk-install/

同様の手順で<a href="https://github.com/termux/termux-boot/releases">termux:boot</a>もインストールしましょう。
hacker's keyboardはあるとすごく楽です。<a href="https://f-droid.org/packages/org.pocketworkstation.pckeyboard/">F-Droid</a>からダウンロードできます。

<br>

## Step2 Termux&pkgのセットアップ

termuxはいわゆる<a href="https://wa3.i-3-i.info/word12678.html">ターミナルエミュレーター</a>です。
これを使ってサーバー本体とその実行環境を構築していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654625/1c70ab39-16be-6850-f53c-ad4f112e7460.png)
これがtermux本体です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654625/8b18f302-9103-6d8b-88d8-c4f1f9236ac6.png)
ランチャーによっては検索したほうが早いかもしれません。<br><a href="https://play.google.com/store/apps/details?id=com.teslacoilsw.launcher&hl=ja&pli=1">個人的おすすめランチャー</a>
<br>
Termuxを開くと、数秒の初期設定の後、このような[CUI](https://wa3.i-3-i.info/word1373.html)が立ち上がると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654625/a73b7d64-e7bf-2051-77ec-ded28f417556.png)

これがいわゆる[CUI](https://wa3.i-3-i.info/word1373.html)です。
ここから先の操作は、この画面上でコマンドを打ち込んでいく作業となります。

まずはじめに、[パッケージマネージャー](https://e-words.jp/w/%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0.html)のパッケージリストをアップデートしましょう。
Termuxでは`pkg`というパッケージマネージャが採用されています。
そのため、`pkg`のパッケージリストのアップデートをしましょう。
以下のコマンドをCUIに打ち込んだ後、Enter(改行)をしてみましょう。

:::note alert
$は基本的に入力しません！
CUIのお決まりだと思って、＄（とそれより前の文字列）は無視しましょう。
:::

```terminal
$ pkg update && pkg upgrade
```
すると以下のようにログが流れると思います。

![A222 (online-video-cutter.com).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654625/283ce936-e6cd-0e66-6415-18f15d54f78e.gif)

そして途中で以下のように質問され止まります。（容量によっては止まらないこともあります）
```terminal
After this operation, [数字] kB disk space will be use.
Do you want to continue? [Y/n] 
```
これの意味は
`このソフトをインストールすると[数字]kbの容量を消費するけど、このまま続けて良い？`
というような意味です。
` [Y/n] `と聞かれているのでy/nで答えましょう。このケースでは承諾したいので`y`のちEnterを入れます。

:::note info
`Do you want to continue? [Y/n] `と言われたときは基本的になにか操作の承諾を求めています。
上に表示されている文章をよく読み、解答をy/nで考えましょう。
:::

さらに幾つかの必須ツール/ソフト郡をインストールします。
以下のコマンドを実行しましょう。
```terminal
$ pkg install vim screen proot-distro iproute2 openssh -y
```

<details><summary>解説</summary>
<dl>
<dt>pkg<dt><dd>パッケージマネージャ本体</dd>
<dt>install<dt><dd>パッケージをインストール</dd>
<dt>vim screen...<dt><dd>vim screen...をインストール</dd>
<dt>-y<dt><dd>インストール時に確認を取らない</dd>
</dl>
</details>

インストールが終了次第、このセクションは一区切りつきます。
<br>

## Step3 Opensshのセットアップ

:::note info 
PCを使わない/持っていない場合はこのセクションはほぼ必要ありません。
:::

### SSHとは？
　
https://wa3.i-3-i.info/word11726.html

すごく簡単に言えばスマホをPCから遠隔操作（リモートアクセス）するのに使うものです。
これのサーバーをtermux側に入れ、PCから快適に操作できるようにしましょう。

セキュリティ的な観点からできる限り[公開鍵認証](https://wa3.i-3-i.info/word17549.html)を使うのが望ましいので、今回はその方法を解説します。

<br>

### クライアント側の準備

まずはじめに、接続する側（クライアント）の秘密鍵/公開鍵を生成しましょう。

:::note warn
password認証でもssh接続は可能ですが、セキュリティ観点から
公開鍵認証を使うことを推奨します。
:::
まず最初に、PCでcmd(コマンドプロンプト)を立ち上げます。
`win + R` を押し`ファイル名を指定して実行`を開き、`cmd`と打ちcmdを立ち上げましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654625/e2de718d-ef97-7cb1-17ac-fc715b9049e7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654625/98b09aaf-9491-b3d7-ff66-93743f83aa05.png)
次回から、この**cmd**を使って**SSH**を接続したりなどします。
立ち上げ方を覚えておきましょう。
<br>
では、秘密/公開鍵を実際に生成していきます。
cmdに
```terminal
>ssh-keygen -t rsa -b 406
```
と入力し`Enter`、聞かれた項目はとりあえずenterを押してスキップします。

:::note warn
すでに生成してある場合は上書きするかどうかここで聞かれます。
特別な事情がない限りすでにあるキーを使って問題ありません。
`n`で上書きをキャンセルしましょう。
:::


すべて飛ばすと、以下のようなログが出ると思います。
```terminal
C:\>ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\hoge/.ssh/id_rsa):
Created directory 'C:\\Users\\hoge/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\hoge/.ssh/id_rsa
Your public key has been saved in C:\Users\hoge/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:5ZDcIakna/hoggehogepiypiyo hoge@2411
The key's randomart image is:
+---[RSA 4096]----+
|        ...      |
|       ..+ .     |
|       .+ o      |
|    . o .+       |
| . . + +S .      |
|. + + + .        |
| o = @ + .       |
|  *oO.#.o        |
|  .*B#EBo        |
+----[SHA256]-----+

C:\>
```
これで実際に鍵が生成されました。
クライアント側の準備はこれでほぼ完了です。
### 蛇足
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654625/49457cd0-c778-7000-091e-06e560a9e5cd.png)
これで簡単に秘密鍵/公開鍵の保存先が開けます。
```terminal
%userprofile%\.ssh
```

### サーバー側の準備

先ほど作ったtermux環境でopensshサーバーを立ち上げ、実際に接続をしてみましょう。
#### 環境確認＆一時的なパスワード認証の有効化
まずsshによる通信をするには、以下の用件を満たす必要があります。
1. サーバーとクライアントが直接接続できること
1. クライアントがサーバーに登録されたの認証情報を持っていること
1. サーバ側でsshサーバーが稼働していること

順番に見ていきます。
> 1. サーバーとクライアントが直接接続できること

これは、ipアドレスによるダイレクトアクセス（もしくはポート単位でのダイレクトアクセス）が存在する、
もしくは同じネットーワークに属していることが必要です。
同じLAN内でも中継機などにより多重ルーター化しており、直接接続できないことがあるのでチェックしましょう。

**例:  `192.168.0.5`と`192.168.0.8`は直接通信できますが、`192.168.0.5`と`192.168.1.8`は直接通できません！**

基本的にクライアントからサーバーへpingがきちんと通れば問題ないと思います。

> 2.クライアントがサーバーに登録されたの認証情報を持っていること

要はサーバー側に登録された公開鍵やサーバのパスワードを知らないとログインできない
そういうことです。

>3 サーバー側でsshサーバーが稼働していること

ssh接続はosが標準で有効にしているケースだけでなく、ユーザが自分で有効化（インストールも）しなくてはならないこともあり、今回はそのケースです。
そのため、sshサーバーの設定などをここから行っていきます。
<br>
#### IPアドレスの確認
まず最初に、サーバ（Android）側のIPアドレスを調べましょう。
設定画面から見ることもできますが、今回はTermuxを使って調べます。

以下のコマンドをtermuxで実行してください。
```terminal
$ ip a
```
すると結果が以下のように表示されます。
```terminal
~ $ ip a 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: bond0: <BROADCAST,MULTICAST,MASTER> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 06:10:42:dc:7a:dc brd ff:ff:ff:ff:ff:ff
3: dummy0: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether 46:f3:eb:33:2d:40 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::44f3:ebff:fe33:2d40/64 scope link
       valid_lft forever preferred_lft forever
...
9: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP,40000000> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether de:6a:7c:d2:52:aa brd ff:ff:ff:ff:ff:ff
    inet 192.168.15.22/24 brd 192.168.15.255 scope global wlan0
       valid_lft forever preferred_lft forever
    inet6 fe80::dc6a:7cff:fed2:52aa/64 scope link
       valid_lft forever preferred_lft forever
```
たくさんデバイスが出てくると思いますが、見るべきはwlan0のipアドレス（192.168.x.x）です。
これが本体のIPアドレスとなります。
これをメモするなり覚えておきましょう。後で使います。

**有線接続などの特殊な場合はインターフェイス名(この場合はwlan0)は変わることがあります。
IPアドレスで判断しましょう。**

#### 蛇足２
重要な情報だけ絞り込み
```terminal
$ ip a | grep 192
```
「|」はパイプという特殊文字なので注意！やるならコピペ推奨

#### パスワードの書き換え
termuxは初期状態ではアカウントにパスワードが設定されていません。
そのため、最初のsshログインのために自分で一時的なパスワードを設定する必要があります(公開鍵を何らかの方法で飛ばせるならこの限りではない)
<br>では設定していきましょう。
termuxで以下のコマンドを入力してください。
```terminal
passwd
```

~~passwordじゃなくてpasswdだぞ~~

多分`New password:`って聞かれると思うので、とりあえずのパスワードを設定しましょう。
この時、**文字を入力しても画面には表示されない**ことにお気をつけあれ。変化がなくても基本的には入力されています。
<br>
`Retype New password`ってのはいわゆるパスワード確認です。もう一度打ちましょう。
正常に設定できればログが以下のようになるはずです。
```terminal
~ $ passwd
New password:
Retype new password:
New password was successfully set.
```
これでパスワードの設定は完了です。

#### SSHサーバの起動
これはかなり簡単。termuxで`sshd`と打ちましょう。何も表示されませんがサーバは稼働しています。
<br>

### SSH接続
これにて準備はすべて整いました。実際にsshを繋いで見ましょう。
cmdで以下のコマンドを実行してください
先ほど`ip a`して出てきたIPアドレスを使います。
```terminal
ssh hoge@[さっきのipアドレス] -p 8022
```
<details><summary>解説</summary>
<dl>
<dt>ssh</dt><dd>

> ssh接続するよ！ってことです。
ssh.exeをダブクリするみたいなもん

</dd>

<dt>hoge@ipあどれす</dt><dd>

> 接続先のユーザー@ipアドレス
といった構成になっています。
Termuxの使用上ユーザはなんでもいいのでとりあえず適当に指定しました。

</dd>
<dt>-p 8022</dt><dd>

> ポート8022をつかって通信するよ！ってこと
termuxのopensshの初期ポートは8022です。

</dd>


</dl>
</details>


うまいこといけば
```
The authenticity of host '例のIP (例のip)' can't be established.
ED25519 key fingerprint is SHA256hofgehoge.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])?
```
<details><summary>解説</summary>


> こいつ初めて会ったサーバーだけどほんとに繋いでダイジョブそ？
ってことを言われてます。
初回接続はすべてこうなるので、違和感がない限りyesって言っておけばおｋ


</details>

とか聞かれるはずなので、とりあえず`yes`って打っておきましょう。
これで
```
Welcome to Termux!

Community forum: https://termux.com/community
Gitter chat:     https://gitter.im/termux/termux
IRC channel:     #termux on libera.chat

Working with packages:

 * Search packages:   pkg search <query>
 * Install a package: pkg install <package>
 * Upgrade packages:  pkg upgrade

Subscribing to additional repositories:

 * Root:     pkg install root-repo
 * X11:      pkg install x11-repo

Report issues at https://termux.com/issues

~ $
```
とか言われれば正常にsshがひとまずは接続できています。お疲れ様でした。

#### 公開鍵認証への切り替え

ここからパスワード認証よりよい安全な公開鍵認証に切り替えていきます。
まずは、クライアント側の公開鍵のファイルを引っ張り出しましょう。
[開き方](#蛇足)
ここに入っている`id_rsa.pub`をメモ帳当たりで開きます。
開けたらそのウィンドウは一旦最小化しておきましょう。後で使います。

:::note warn 
`id_rsa`は秘密鍵本体で、これが流出すると自分の鍵を使って不正アクセスが可能になります。（合鍵なので）
開くのは`id_rsa.pub`です。
:::

次に、今開いているsshセッションを使い、実際に公開鍵を登録して行きます。

### 重要
ここから、linuxの基礎的な移動コマンド(cd,ls,pwdなど)をたくさん活用します。
これらに関する最低限の知識がないと、この先詰まる可能性が高いです。
これに関しては以下の記事にお任せします！

https://qiita.com/satohiro/items/e1194214306bce7bcf20

では次に、termux内に新しく`.ssh`ディレクトリを作成し、移動します。`
```terminal 
$ mkdir .ssh && cd .ssh
```
作成したら、なかに公開鍵を入れるためのテンプレートを書いていきましょう。
以下のコマンドを入力してください。
**まだ実行(Enter)は切らないでください！！！**
```terminal
$ echo "" >> authorized_keys
```
入力が終わったら、この`""`の中にさっきメモ帳で開いた`id_rsa.pub`の中身を丸ごと貼り付けます。
改行などあると問題になるので変更を加えずにコピーした後、十字キーを使い`""`の間にカーソルを動かし、`右クリック`します。
すると以下のように公開鍵が貼り付けられると思います。
```terminal
~/.ssh $ echo "ssh-rsa AAAAB3NzaC1yc2E（省略）YOCunz hoge@hogepc" >> authorized_keys
```
この状態になったらEnterを切ります。
次に、いくつか権限の修正が必要になるため、以下のコマンドを実行しましょう。
```terminal
chmod 600 ~/.ssh/authorized_keys && chmod 700 ~/.ssh
```
次に、正常に公開鍵が登録されたかデバッグするために、実際に接続を試行してみます。
一旦sshセッションを
```terminal
exit
```
コマンドで切断します。
次に、もう一度接続します。
間違ってcmdを閉じていなければ、十字上でログを呼び出し、そのままEnterで接続できるはずです。
この時、パスワードが要求されなければ公開鍵が正常に登録できています。

#### パスワード認証の切り離し
正常であれば公開鍵認証が使えるようになったはずなので、パスワード認証を切ってしましましょう。
以下のコマンドでパスワード認証を無効化できます。
```terminal
sed -i 's/^#*PasswordAuthentication.*/PasswordAuthentication no/' ~/../usr/etc/ssh/sshd_config
```
これで公開鍵認証への切り替えは完了です。お疲れ様でした。
**なお実際の切り替えの反映はtermuxを再起動した後の次の`sshd`から有効になります<br>頃合いをみて再起動しましょう。**




<br>
お疲れ様でした。
以上で、termuxでssh環境を構築するまでの流れは完了となります。<br>
次回は*proot-distroのセットアップ&ubuntuのインストール*をしていきます。
<br>
次回→TODO