ネットワーク経由でsshする

## やりたいこと
ホスト側からサーバーにインターネット経由でsshを行えるようにする。
サーバー側ipは192.168.1.2とする。
ホスト名はpiとする。
`$`から始まるのはコマンドです。

## Linux

### ユーザーの追加
サーバー側にuserを追加しておく。

```bash
$ sudo su -
$ useradd -m ユーザー名:pi
$ passwd ユーザー名:pi
    or
$ adduser ユーザー名:pi
```

### 間違えたとき

```bash
$ userdel -r ユーザー名
```

### 参考にしたサイト
脳内サイト。

## ネットワーク系

### ipを固定する
> 追記：50-cloud-init.yamlを触るのは宜しくないらしい
> https://qiita.com/yas-nyan/items/9033fb1d1037dcf9dba5

50-cloud-init.yamlを変更し、ネットワークを更新する。
```bash
$ sudo vi /etc/netplan/50-cloud-init.yaml

network:
    ethernets:
        eth0:
            addresses:
            - 192.168.1.2/24
            gateway4: 192.168.1.1
            dhcp4: false
            dhcp6: false
            accept-ra: false
            nameservers:
                addresses:
                - 192.168.1.1
    version: 2
    
$ sudo netplan apply
```

- 書き方
```bash
network:
    ethernets:
        <デバイス>:
            addresses:
            - <IPアドレス>
            gateway4: <デフォルトゲートウェイ>
            gateway6: <v6のデフォルトゲートウェイ>
            dhcp4: false
            dhcp6: false
            accept-ra: false
            nameservers:
                addresses:
                - <DNSネームサーバー>
    version: 2
```

### 参考にしたサイト
[ip固定について](https://jyn.jp/ubuntu-localip-static/)

## ssh

### sshインストールしておく。
```bash
$ sudo apt update && sudo apt upgrade -y

$ sudo apt install ssh
```

### 鍵を用意する
ホスト側に鍵を生成する

```bash
$ ssh-keygen -t rsa
enter連打。(好ましくないので設定したい方は参考にしたサイトにて)
```

鍵をサーバー側に渡す
```bash
$ ssh-copy-id pi@192.168.1.2
```

接続してみる。
```bash
$ ssh pi@192.168.1.2
```

### 設定変更
パスワード認証でのSSH接続を無効化する。

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

# Port 22
# Port 自由なポート番号
Port 2222

# PasswordAuthentication yes
PasswordAuthentication no

# PermitRootLogin yes
PermitRootLogin no

# MaxSessions 10
# 最大同時接続。なるべく少なく
MaxSessions 1

# 一番下に追記
AllowUsers pi
# これだけでも良いが pi@接続元IP の方が好ましい
```
```bash
$ sudo sshd -t
構文チェック

$ sudo systemctl restart sshd.service
または
$ sudo reboot

$ exit

$ ssh -p 2222 pi@192.168.1.2
```

### 参考にしたサイト
[ip固定について](https://jyn.jp/ubuntu-localip-static/)
[sshについて](https://qiita.com/3no3_tw/items/4b5975a9f3087edf4e20)
[特定のuser](https://www.server-memo.net/server-setting/ssh/allow-users.html)

## ポート開放

ファイアウォールをサーバー側にインストールしておく
```bash
$ sudo apt install ufw
```

一旦すべてのポートを拒否する
```bash
$ sudo su -
$ ufw default deny
```
sshのポートを開けて確認する
```bash
$ ufw enable
$ ufw allow 2222
$ ufw status
```

こっちのほうが好ましい
例：
```bash
ufw allow from 192.168.1.0/24 to any port 2222
```

192.168.1.0は接続先ip

### ルーターによるポート開放。
ここが難点、だがルーターによって設定方法が違うので省きます。

### 参考にしたサイト
脳内サイト。

## 接続系

### ログ監視
サーバー側で以下コマンドで確認できる。

```bash
$ sudo tail -f -n 3 /var/log/auth.log
```

### 不正アクセス対策

[参考リンク](https://www.osarusystem.com/misc/fail2ban_with_ufw.html)

### 接続してみる
[ip確認リンク](https://www.cman.jp/network/support/go_access.cgi)
ip確認(コマンド)
```bash
$ curl ifconfig.io
```
```bash
ssh -p ルーターで設定したポート pi@確認したip
```

### 接続簡略化
毎回このコマンドを打つのは面倒なので以下ファイル作成

.ssh/config
```bash
# homeサーバー
Host pi
    HostName 192.168.1.2
    Port 2222
    User pi
    IdentityFile ~/.ssh/id_rsa

Host home
    HostName 確認したip
    Port ルーターで設定したポート
    User pi
    IdentityFile ~/.ssh/id_rsa
```

```bash
$ ssh home
```

### 参考にしたサイト
[ssh省略について](https://qiita.com/DotEarl/items/ad5ac97d814f29adca9f)

## 以上。

### 注意事項
- 内部LANのクライアントからはグローバルIPでSSH接続出来ないので注意してください。
- 自己責任でお願いします。

### 経緯
自宅サーバーを作ってみたかったから。

### 動作環境
raspi4b
ubuntu-21.04