２台のパソコンでサーバーごっこ

## モチベーション

パソコンとサーバーの違いは主にスペックや使用用途で、境界は思ったより曖昧です。実際、手元にあるパソコンを、まるでネットワーク上にあるサーバーのように使うことが可能です。そこで、自宅にある２台のパソコンを使って、一方から他方へSSH接続し、リモートサーバー作業をシミュレートしてみます。

## 用意するもの・前提

- 接続元PC： SSHが使えるもの。OSは任意。
- 接続先PC： Ubuntu or MacBook. 他のLinux ディストリビューションではコマンドが異なる部分がある。Windowsの場合は設定が異なるようなので割愛。
- 両PCが同一のネットワークにつながっていること


## 接続先PCのIPを確認

### Ubuntu の場合

```bash
# server ubuntu
$ ip a
...
inet 192.168.X.Y/24 ...
...
```

### MacBook の場合

```bash
# server macbook
$ ifconfig
...
inet 192.168.X.Y netmask 0xffffff00 ...
...
```

上記コマンドで、接続しているネットワークのプライベートIPが表示される。通常は `192.168.X.Y` という形式で、X, Y は0~255の数字。

### IP アドレスについて

IPアドレスは 32ビットの数字で、それを8ビットずつに区切り数字で表すとよく目にするIPアドレスになる。8ビットは0~255の数字を表すので、この範囲の数字４つでIPアドレスになる

`/24` が付いている場合、それはIPアドレスの初めの24ビットがグループ内で固定されていることを意味する。つまり、最初の３つの数字は固定されていて、最後の数字が異なる。
`netmask 0xffffff00` は同じことを表現している。つまり、固定されているビットを１、可変部分を０となるように16進数で書くとこうなる。

プライベートアドレスが通常 `192.168` から始まる理由はよく分からなかった。

## サーバー側でSSHサービスを開始

初期状態では、外部からSSH接続はできない設定になっています。それを `ping`で確認してみます。

```bash
# 接続元
$ ping 192.168.X.Y
Request timeout for icmp_seq 0
...
```

`X`, `Y` には先ほど確認した値を入れます。この結果は、IPへアクセスできないことを意味しています。

そこで、接続先でSSHサービスを開始してみます。

### Ubuntu の場合

```bash
# 接続先 Ubuntu
$ sudo apt-get install -y openssh-server
```

`openssh-server` をインストールすると、SSHサービスが自動で起動します。下記のコマンドで確認できます。

```bash
# 接続先 Ubuntu
$ sudo systemctl status ssh
...
Active: active (running)
...
```

なお、次回以降PCを起動すると自動でSSHサービスが起動するようになります。
自動起動をやめたい場合は、次のような方法があるようです（[参考](https://askubuntu.com/questions/56753/how-do-i-disable-sshd-from-starting-automatically)）。

1. 下記のコマンドで `ssh.conf` ファイルの名前を変える（自動起動させるには名前を元に戻す）

    ```bash
    $ sudo mv /etc/init/ssh.conf /etc/init/ssh.conf.disabled
    ```
2. `/etc/init/ssh.conf` 内の自動起動に関わる部分をコメントアウトする

```bash
...
#start on filesystem or runlevel [2345] 
...
```

### MacBook の場合

System Preferences > Sharing において、"Remote Login" を選択し、アクセス可能なユーザーを選択（[参考](https://support.apple.com/guide/mac-help/allow-a-remote-computer-to-access-your-mac-mchlp1066/mac)）。
下図のような画面。丁寧に、SSHコマンドを教えてくれる。
<img width="666" alt="Sharing.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80588/9024ae03-5c3f-2dd3-f39b-7c202aefa517.png">

ここで、もう一度 `ping` をしてみます。

```bash
$ ping 192.168.X.Y
64 bytes from 192.168.10.224: icmp_seq=0 ttl=64 time=108.883 ms
...
```

うまくいっていれば、IPへのアクセスが確認できます。


## SSHで接続する

接続方法は、通常のサーバーと同じです。

```bash
#接続元
$ ssh <user>@192.168.X.Y
```

普通のPCはパスワードログインになっているので、この後パスワードを聞かれることが多いと思います。接続先で通常使っているログインパスワードを入力すると、接続できるはずです。


## ファイアウォールを設定する

単にSSHサービスを始めた段階だと不正アクセスに対する防御はパスワードのみです。接続先にファイアウォールを設定することで、アクセス方法に制限をかけます。

### Ubuntu の場合

ファイアウォールの現状確認を確認します。

```bash
$ sudo ufw status
Status: inactive
```

`inactive` はファイアウォールが設定していないことを意味します。

まず、原則アクセス禁止し、SSHのみを許可することにします。

```bash
$ sudo ufw default deny
$ sudo ufw allow ssh
$ sudo ufw enable
```

これで、SSH（22番ポート）以外へのアクセスが禁止されます。次のコマンドで確認できます。

```bash
$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere      
22/tcp (v6)                ALLOW       Anywhere (v6)
```

もう少しセキュアにするには、接続元を同一ネットワークセグメントに限定することが可能です。

```bash
$ sudo ufw reset
$ sudo ufw default deny
$ sudo ufw allow from 192.168.X.0/24 to any port ssh
$ sudo ufw enable
```

`X` は、確認したIPアドレスの数字で置き換えます。`/24` により、このIPの最初の24ビット（３つの数字）がマッチしているネットワークからしかアクセスできなくなります。

```bash
$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       192.168.10.0/24
```

### MacBook の場合

System Preferences > Security & Privacy の "Firewall" タブから設定が可能です。SSHアクセスを許している場合、自動でSSHポートだけはアクセスできるように設定されるようです。
<img width="667" alt="Screen Shot 2020-07-05 at 14.23.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80588/750f93ec-c4cd-8f6a-0815-30cbea2442dd.png">