SSH 経由でクローンができない #5

Open
opened 2026-08-23 12:20:21 +09:00 by genji1024 · 5 comments
Owner

HTTPS 経由でのリポジトリのクローンはできるが、SSH 経由でのクローンができない。

HTTPS 経由でのリポジトリのクローンはできるが、SSH 経由でのクローンができない。
Author
Owner

@bot-genji1024 原因を調査して報告してください。

@bot-genji1024 原因を調査して報告してください。
Collaborator

調査結果(原因報告)

@genji1024 SSH 経由のクローンができない原因を調査しました。報告のみでコード・設定の変更は行っていません。

結論

SSH のクローンができないのは、「コンテナの SSH(22) ポートがホストに公開されておらず、かつ接続先ドメインが Cloudflare 経由(80/443 のみ)のため、外部から SSH ポートへ到達できない」ことが原因です。HTTPS(3000)が動くのは HTTP ポートが公開されているためです。

調査で確認した事実

  • app.ini [server] セクション(デプロイ先 forgejo/gitea/conf/app.ini)
    • DISABLE_SSH = false(SSH 機能は有効)
    • SSH_PORT = 22 / SSH_LISTEN_PORT = 22(コンテナ内で SSH を 22 で待受ける設定)
    • SSH_DOMAIN = forgejo.genji1024.com
    • START_SSH_SERVER(SSH サーバー起動フラグ)が明示設定されていない(デフォルトは有効)
  • SSH ホスト鍵 — forgejo/ssh/ 配下に ssh_host_ed25519_key・ssh_host_rsa_key・ssh_host_ecdsa_key(各 .pub あり)を確認
  • authorized_keys — forgejo/git/.ssh/authorized_keys に command=... gitea ... serv key-1 ラッパ付きでユーザの公開鍵が登録済み(SSH 内部配線は正常)
  • ポート公開
    • リポジトリの compose.yaml(server サービス): ports: ['3000:3000'] のみ → SSH(22) のポートマッピングなし
    • 実デプロイの compose.yaml も ports: ['3000:3000'] のみ
  • 接続性(live 確認)
    • forgejo.genji1024.com は Cloudflare の IP(104.21.77.223 / 172.67.212.31 等)に解決
    • ポート 443 / 80 は接続可(Cloudflare 経由)、ポート 22 はタイムアウト(3022 / 2222 / 8022 も同様)

原因の整理

  1. ホストに SSH ポートが公開されていない: compose の server サービスに SSH(22) のポートマッピングが無いため、コンテナ内の SSH(22) 待受が外部に到達しない。
  2. ドメインが Cloudflare プロキシの背後にある: ポート 22 は Cloudflare のプロキシ対象外のため、forgejo.genji1024.com:22 への TCP は Cloudflare で遮断される(HTTPS:443 は proxy される)。

修正の方向性(参考・未実施)

  • compose.yaml の server サービスに SSH 用ポートマッピングを追加(例: '2222:22'。ホスト側で 22 が空いていれば '22:22' も可)
  • app.ini の SSH_PORT / SSH_LISTEN_PORT / SSH_DOMAIN を上記マッピングに合わせ、START_SSH_SERVER = true を明示する
  • Cloudflare プロキシ背後では SSH(22) が通らないため、SSH 接続は Cloudflare のプロキシ対象外の経路(Docker ホストの実 IP / 非プロキシのサブドメイン)にする必要がある

その他

  • デプロイ先の設定ファイルは実際に読み取って確認しました(報告のみ・変更なし)。
  • ご承認いただければ、この修正(compose の SSH ポート追加など)を実装して PR を出します。ご確認ください。
## 調査結果(原因報告) @genji1024 SSH 経由のクローンができない原因を調査しました。**報告のみでコード・設定の変更は行っていません。** ### 結論 SSH のクローンができないのは、「コンテナの SSH(22) ポートがホストに公開されておらず、かつ接続先ドメインが Cloudflare 経由(80/443 のみ)のため、外部から SSH ポートへ到達できない」ことが原因です。HTTPS(3000)が動くのは HTTP ポートが公開されているためです。 ### 調査で確認した事実 - **`app.ini` `[server]` セクション**(デプロイ先 `forgejo/gitea/conf/app.ini`) - `DISABLE_SSH = false`(SSH 機能は有効) - `SSH_PORT = 22` / `SSH_LISTEN_PORT = 22`(コンテナ内で SSH を 22 で待受ける設定) - `SSH_DOMAIN = forgejo.genji1024.com` - `START_SSH_SERVER`(SSH サーバー起動フラグ)が明示設定されていない(デフォルトは有効) - **SSH ホスト鍵** — `forgejo/ssh/` 配下に `ssh_host_ed25519_key`・`ssh_host_rsa_key`・`ssh_host_ecdsa_key`(各 `.pub` あり)を確認 - **`authorized_keys`** — `forgejo/git/.ssh/authorized_keys` に `command=... gitea ... serv key-1` ラッパ付きでユーザの公開鍵が登録済み(SSH 内部配線は正常) - **ポート公開** - リポジトリの `compose.yaml`(server サービス): `ports: ['3000:3000']` のみ → **SSH(22) のポートマッピングなし** - 実デプロイの compose.yaml も `ports: ['3000:3000']` のみ - **接続性(live 確認)** - `forgejo.genji1024.com` は Cloudflare の IP(104.21.77.223 / 172.67.212.31 等)に解決 - ポート 443 / 80 は接続可(Cloudflare 経由)、**ポート 22 はタイムアウト**(3022 / 2222 / 8022 も同様) ### 原因の整理 1. **ホストに SSH ポートが公開されていない**: compose の server サービスに SSH(22) のポートマッピングが無いため、コンテナ内の SSH(22) 待受が外部に到達しない。 2. **ドメインが Cloudflare プロキシの背後にある**: ポート 22 は Cloudflare のプロキシ対象外のため、`forgejo.genji1024.com:22` への TCP は Cloudflare で遮断される(HTTPS:443 は proxy される)。 ### 修正の方向性(参考・未実施) - `compose.yaml` の server サービスに SSH 用ポートマッピングを追加(例: `'2222:22'`。ホスト側で 22 が空いていれば `'22:22'` も可) - `app.ini` の `SSH_PORT` / `SSH_LISTEN_PORT` / `SSH_DOMAIN` を上記マッピングに合わせ、`START_SSH_SERVER = true` を明示する - Cloudflare プロキシ背後では SSH(22) が通らないため、SSH 接続は Cloudflare のプロキシ対象外の経路(Docker ホストの実 IP / 非プロキシのサブドメイン)にする必要がある ### その他 - デプロイ先の設定ファイルは実際に読み取って確認しました(報告のみ・変更なし)。 - ご承認いただければ、この修正(compose の SSH ポート追加など)を実装して PR を出します。ご確認ください。
Author
Owner

@bot-genji1024 Rootless Docker でコンテナを起動し、ホストの Nginx をリバースプロキシとして運用しています。特権ポートは Rootless コンテナからは直接公開できないと思いますが、どうしましょうか?

@bot-genji1024 Rootless Docker でコンテナを起動し、ホストの Nginx をリバースプロキシとして運用しています。特権ポートは Rootless コンテナからは直接公開できないと思いますが、どうしましょうか?
Collaborator

回答: Rootless Docker での SSH(22) ポートの公開方針

@genji1024 ご質問ありがとうございます。ご認識の通り、Rootless Docker のコンテナからは特権ポート(1024 未満、例: 22)を直接ホストに公開できません。これを踏まえた方針案をご提示します(提案のみ・未実施。承認いただければ実装に着手します)。

方針案: SSH を非特権ポート 2222 で公開する

  1. compose.yaml の server サービスに ports: ['2222:22'] を追加(コンテナ内の SSH(22) をホストの 2222 に公開。Rootless Docker でも 1024 以上のホストポートなら公開可能)
  2. デプロイ先 app.ini の [server] を以下の通り設定:
    • SSH_PORT = 2222(クライアントが接続する公開ポート)
    • SSH_LISTEN_PORT = 22(コンテナ内の待受ポートは 22 のまま)
    • SSH_DOMAIN = forgejo.genji1024.com
    • START_SSH_SERVER = true を明示
  3. これによりクローン URL は ssh://[email protected]:2222/genji1024/<repo>.git になります

前提として外せない制約: Cloudflare は 80/443 のみプロキシ

前回報告(c308)の通り、forgejo.genji1024.com は Cloudflare プロキシ背後にあり、Cloudflare は 80/443 しかプロキシしないため、どのポート番号にしても forgejo.genji1024.com 経由の SSH は通じません。SSH 接続は Cloudflare のプロキシ対象外の経路、具体的には:

  • Docker ホストの実 IP(例: ssh://git@<ホスト実IP>:2222/...)、または
  • Cloudflare プロキシを無効化した(DNS only の)サブドメイン

を利用する必要があります。

承認のお願い

上記方針案(2222 での公開 + app.ini 設定)で進めてよろしいですか? 承認いただければ、compose.yaml のポートマッピング追加と app.ini 設定・動作確認を PR として実装します。ご希望のポート番号・接続経路(ホスト実 IP or サブドメイン)があれば併せてご指定ください。

## 回答: Rootless Docker での SSH(22) ポートの公開方針 @genji1024 ご質問ありがとうございます。ご認識の通り、Rootless Docker のコンテナからは特権ポート(1024 未満、例: 22)を直接ホストに公開できません。これを踏まえた方針案をご提示します(**提案のみ・未実施**。承認いただければ実装に着手します)。 ### 方針案: SSH を非特権ポート 2222 で公開する 1. `compose.yaml` の server サービスに `ports: ['2222:22']` を追加(コンテナ内の SSH(22) をホストの 2222 に公開。Rootless Docker でも 1024 以上のホストポートなら公開可能) 2. デプロイ先 `app.ini` の `[server]` を以下の通り設定: - `SSH_PORT = 2222`(クライアントが接続する公開ポート) - `SSH_LISTEN_PORT = 22`(コンテナ内の待受ポートは 22 のまま) - `SSH_DOMAIN = forgejo.genji1024.com` - `START_SSH_SERVER = true` を明示 3. これによりクローン URL は `ssh://[email protected]:2222/genji1024/<repo>.git` になります ### 前提として外せない制約: Cloudflare は 80/443 のみプロキシ 前回報告(c308)の通り、`forgejo.genji1024.com` は Cloudflare プロキシ背後にあり、**Cloudflare は 80/443 しかプロキシしない**ため、どのポート番号にしても `forgejo.genji1024.com` 経由の SSH は通じません。SSH 接続は Cloudflare のプロキシ対象外の経路、具体的には: - Docker ホストの実 IP(例: `ssh://git@<ホスト実IP>:2222/...`)、または - Cloudflare プロキシを無効化した(DNS only の)サブドメイン を利用する必要があります。 ### 承認のお願い 上記方針案(2222 での公開 + app.ini 設定)で進めてよろしいですか? 承認いただければ、`compose.yaml` のポートマッピング追加と app.ini 設定・動作確認を PR として実装します。ご希望のポート番号・接続経路(ホスト実 IP or サブドメイン)があれば併せてご指定ください。
Author
Owner

@bot-genji1024 ありがとうございます。その方針で問題ないと思います。実装と PR 発行をお願いします。

@bot-genji1024 ありがとうございます。その方針で問題ないと思います。実装と PR 発行をお願いします。
Sign in to join this conversation.
No labels
No milestone
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
genji1024/forgejo-server#5
No description provided.