1 分で読了 #devops
このページの目次

SSH 操作マニュアル

接続と設定

ssh user@host
ssh -p 2222 user@host
ssh -i ~/.ssh/id_ed25519 user@host       # 秘密鍵を指定

~/.ssh/config は SSH で最も重要な設定ファイルであり、各 Host ブロックは接続パラメータのセットを定義します:

Host myserver
    HostName 1.2.3.4                     # 実際の IP アドレスまたはドメイン名
    Port 2222                            # デフォルトは 22
    User root                            # ログインユーザー
    IdentityFile ~/.ssh/id_ed25519        # 秘密鍵のパス
    ServerAliveInterval 60               # 60 秒ごとに keepalive を送信 (NAT/ファイアウォールによる接続切断を防ぐ)
    ServerAliveCountMax 3                # 3 回連続で失敗した場合に切断
    # 鍵認証が設定済み → ssh myserver で直接ログイン可能

Host github.com
    HostName github.com
    IdentityFile ~/.ssh/id_ed25519_github  # 複数の鍵がある場合に異なる鍵を指定
    IdentitiesOnly yes                     # この鍵のみを使用し、エージェント内の他の鍵を試さない

Host jump-*
    ProxyJump jumphost                    # ジャンプホスト経由で接続

鍵管理

# ED25519 鍵を生成 (推奨。RSA より高速で安全)
ssh-keygen -t ed25519 -C "comment" -f ~/.ssh/id_ed25519

# 公開鍵をリモートに配置 (パスワード → 鍵による認証の無効化)
ssh-copy-id user@host
# 同等のコマンド: cat ~/.ssh/id_ed25519.pub | ssh user@host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

# エージェント内の鍵を一覧表示
ssh-add -L
ssh-add ~/.ssh/id_ed25519               # 鍵をエージェントに追加
ssh-add -D                              # エージェントをクリア

# 既知のホスト一覧 (known_hosts) から古い鍵を削除 (OS 再インストール後など)
ssh-keygen -R hostname
ssh-keygen -R 1.2.3.4

ポートフォワーディング

# ローカルフォワーディング: localhost:8080 にアクセス = リモートからアクセス可能な internal:80 にアクセス
ssh -L 8080:internal:80 user@remote
# 用途: リモート内のサービス (例: データベース) をローカルのポートにマッピング

# リモートフォワーディング: remote:3000 にアクセス = localhost:22 にアクセス
ssh -R 3000:localhost:22 user@remote
# 用途: ローカルの SSH を外部に公開 (homessh の原理)
# 注意: デフォルトではリモートの localhost のみにバインドされます。0.0.0.0 にバインドするには GatewayPorts yes が必要です

# ダイナミックフォワーディング (SOCKS5 プロキシ): ブラウザのプロキシ設定を localhost:1080 に設定
ssh -D 1080 user@remote
# 用途: SSH サーバーをプロキシとして使用 (HTTP CONNECT より汎用的)

ファイル転送

scp file.txt user@host:/path/
scp -r dir/ user@host:/path/
scp user@host:/path/file.txt ./

# rsync は増分転送と再開に対応
rsync -avz --progress dir/ user@host:/path/
# -a: アーカイブ (権限/タイムスタンプ/シンボリックリンクを保持)
# -v: 詳細表示
# -z: 圧縮
# --progress: 進行状況を表示
# 注意: dir/ (末尾にスラッシュあり) = ディレクトリの内容を転送, dir (スラッシュなし) = ディレクトリ自体を転送

トラブルシューティング

# 詳細なデバッグ出力 (鍵交換、認証プロセスの確認、問題が発生したステップの特定)
ssh -vvv user@host

# Permission denied (publickey)
# → ローカルの鍵にパスフレーズが設定されているがアンロックしていないか確認
# → リモートの ~/.ssh/authorized_keys に正しい公開鍵が含まれているか確認
# → リモートの ~/.ssh の権限を確認: chmod 700 ~/.ssh; chmod 600 ~/.ssh/authorized_keys
# → リモートの /etc/ssh/sshd_config を確認: PubkeyAuthentication yes

# Connection refused
# → リモートの sshd は実行されていますか? systemctl status sshd
# → リモートのファイアウォールでポート 22 が許可されていますか? iptables -L -n -v | grep 22

# Host key verification failed (OS 再インストール後)
ssh-keygen -R hostname

# 接続確立後にハングアップ (DNS 逆引きが遅い可能性がある)
# → リモートの /etc/ssh/sshd_config で UseDNS no を設定