Ubuntu 24.04 で SSHD に複数のポートを設定する方法

### はじめに
Ubuntu 24.04 で `sshd` にデフォルトの `22` 以外のポートを追加しようとしたところ、通常の `sshd_config` への設定だけではうまくいかず、`ssh.socket` の設定を変更する必要がありました。

本記事では、そのトラブルシューティングの過程と、正しく複数のポートを設定する方法をまとめます。

---

### なぜ複数のポートが必要か？

今回、SSHのポートを2つ設定するのは、異なる接続用途を分けるためです。

- **ポート22**: ローカルネットワークからの接続専用
- **ポート8922**: 外部からの接続用（公開鍵認証のみ）

外部からの不正アクセスを防ぐため、ポート8922では **パスワード認証を無効にし、公開鍵認証のみ許可** する設定を行います。また、ルータのポート転送設定を行い、外部からのアクセスが適切な内部IPアドレスに転送されるように設定します。

---

### 複数ポートの設定方法

まず、`/etc/ssh/sshd_config.d/` にカスタム設定ファイルを作成し、複数のポートを指定します。

```bash
sudo nano /etc/ssh/sshd_config.d/custom.conf
```

内容:

```bash
Port 22
Port 8922
Match Address 0.0.0.0/0
    PasswordAuthentication no
    PubkeyAuthentication yes
```

保存後、`sshd` を再起動します。

```bash
sudo systemctl restart sshd
```

---

### ファイアウォール設定 (UFW)

追加したポート `8922` を開放します。

```bash
sudo ufw allow 8922/tcp
sudo ufw reload
```

設定が適用されたかを確認します。

```bash
sudo ufw status
```

期待する出力:
```
22/tcp                     ALLOW       Anywhere
8922/tcp                   ALLOW       Anywhere
```

---

### `sshd` のポート確認

#### **1. 開いているポートを確認**

```bash
ss -tulnp | grep ssh
```

出力:
```
tcp   LISTEN 0      4096                *:22               *:*    users:("sshd",pid=4699,fd=3)
```

ポート `22` のみがリスンされており、`8922` が適用されていません。

#### **2. 設定を確認**

```bash
sudo sshd -T | grep port
```

出力:
```
port 22
port 8922
```

設定自体は認識されていますが、実際には `8922` が開いていません。

---

### AppArmor の影響を確認

一部のネット情報では `AppArmor` が `sshd` のポート制限をしているとありましたが、Ubuntu 24.04 ではデフォルトでそのような制限はないようです。

```bash
aa-status | grep ssh
```

このコマンドで `sshd` のポリシーが有効でないことを確認しました。

---

### `ssh.socket` がポートを制限している可能性

Ubuntu 24.04 では `systemd` による **ソケット起動 (socket activation)** が有効になっており、`ssh.socket` によって `sshd` が開けるポートが制限されていました。

```bash
systemctl status ssh.socket
```

出力:
```
● ssh.socket - OpenSSH Server Socket
     Loaded: loaded (/lib/systemd/system/ssh.socket; enabled; preset: enabled)
     Active: active (listening) since ...
   Triggers: ● ssh.service
     Listen: [::]:22 (Stream)
```

ポート `22` のみがリスンされていることが分かります。

---

### `ssh.socket` に追加ポートを設定

以下の手順で `ssh.socket` に `8922` を追加します。

```bash
sudo systemctl edit ssh.socket
```

エディタが開くので、以下を追加。

```ini
[Socket]
ListenStream=
ListenStream=22
ListenStream=8922
```

設定を反映します。

```bash
sudo systemctl daemon-reload
sudo systemctl restart ssh.socket
sudo systemctl restart sshd
```

その後、ポートのリスン状態を確認。

```bash
ss -tulnp | grep ssh
```

出力:
```
tcp   LISTEN 0      4096                *:22               *:*    users:("sshd",pid=12345,fd=3)
tcp   LISTEN 0      4096                *:8922             *:*    users:("sshd",pid=12345,fd=4)
```

---

### **systemd のソケット起動を無効化する方法（オプション）**

もし `ssh.socket` を無効にし、従来通り `sshd` のみでポートを管理したい場合は、以下の手順を実行。

```bash
sudo systemctl disable --now ssh.socket
sudo systemctl restart sshd
```

その後、`ss -tulnp | grep ssh` でポートのリスン状態を確認。

---

### **まとめ**

Ubuntu 24.04 では `systemd` の `ssh.socket` が有効になっているため、単に `sshd_config` に `Port 8922` を追加するだけでは `sshd` に反映されません。

**解決策:**
1. `/etc/ssh/sshd_config.d/custom.conf` に `Port 22` `Port 8922` を記述し、公開鍵認証のみ許可
2. `sudo ufw allow 8922/tcp && sudo ufw reload` でファイアウォールを設定
3. `systemctl edit ssh.socket` で `ListenStream=8922` を追加
4. `sudo systemctl daemon-reload && sudo systemctl restart ssh.socket`
5. `sudo systemctl restart sshd` で `sshd` を再起動
6. `ss -tulnp | grep ssh` でポートのリスン状態を確認

この手順を踏めば、追加のポートでも問題なく SSH 接続が可能になります！