毎回「ssh user@host -p 2222 -i ~/.ssh/id_ed25519」のように長いコマンドを打つのは非効率です。
OpenSSH の設定ファイル ~/.ssh/config
に接続情報をまとめれば、PowerShell から短いエイリアスだけで安全・確実に自動接続できます。
ここでは Windows(PowerShell)環境での config ファイル作成から、多段踏み台、ポート転送、鍵管理まで実用設定を順に解説します。
configファイルの場所と準備
Windows の OpenSSH はユーザープロファイル配下の C:\Users\<ユーザー名>\.ssh\config
を読み込みます。
ファイルが無ければ新規作成します。文字コードは UTF-8、改行は CRLF のままで問題ありません。PowerShell からは次のように作成できます。
# フォルダ作成(存在しない場合)
New-Item -ItemType Directory -Force -Path $HOME\.ssh | Out-Null
# 空の config を作成(既存なら開く)
if (-not (Test-Path "$HOME\.ssh\config")) { New-Item -ItemType File -Path "$HOME\.ssh\config" | Out-Null }
# メモ帳で開く
notepad $HOME\.ssh\config
最小構成:短いエイリアスで接続する
基本形は Host
ブロックに接続先の別名とパラメータを列挙します。これで ssh web
の一語で接続できます。
Host web
HostName 192.168.1.100
User ubuntu
Port 22
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
設定後は PowerShell で ssh web
を実行します。うまくいかない場合は ssh -v web
で詳細ログを確認します。
複数環境を整理する:ワイルドカードと共通設定
似たホスト名をまとめて扱う時はワイルドカードが便利です。共通設定を最上段に、個別の上書きを下段に記述します。
# 開発用は共通でユーザーと鍵を指定
Host dev-*
User ec2-user
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
# 個別の差分だけを下で上書き
Host dev-app
HostName 10.0.0.21
Host dev-db
HostName 10.0.0.22
Port 2222
踏み台経由(多段SSH)を自動化する
直接到達できない内部サーバーへは踏み台(bastion)を経由します。現代的な方法は ProxyJump
を使う書き方です。
# 踏み台
Host bastion
HostName bastion.example.com
User ubuntu
IdentityFile ~/.ssh/id_ed25519
# 内部サーバー(bastion を経由)
Host internal-app
HostName 10.1.0.50
User ubuntu
ProxyJump bastion
IdentityFile ~/.ssh/id_ed25519
複数段を連ねる場合は ProxyJump host1,host2
のようにカンマ区切りで指定できます。
ポート転送で開発を快適にする
ローカルへ安全にトンネルするには LocalForward
、サーバーから外部へ公開するには RemoteForward
を使います。
Host ブロックに書いておけば接続時に自動で転送が張られます。
# リモートのDB(5432)をローカルの15432へ転送
Host db-tunnel
HostName db.internal
User ubuntu
IdentityFile ~/.ssh/id_ed25519
LocalForward 127.0.0.1:15432 127.0.0.1:5432
VS Code などからは localhost:15432
に繋ぐだけで、リモートDBへ安全にアクセスできます。
鍵の管理:ssh-agent を常駐させる
毎回パスフレーズ入力を避けたい場合は Windows の ssh-agent
サービスを自動起動にします。追加した鍵は再起動後も保持されます。
# サービスを自動起動にして開始
Set-Service ssh-agent -StartupType Automatic
Start-Service ssh-agent
# 鍵を登録(ed25519 の例)
ssh-add $HOME\.ssh\id_ed25519
# 登録確認
ssh-add -l
config 側には鍵のパスを IdentityFile
で明示し、IdentitiesOnly yes
を付けて不要な鍵送信を抑制します。
接続を堅牢にする追加オプション
転送やタイムアウトで切れやすい回線では keepalive を有効化すると安定します。エージェント転送が必要なワークフロー以外では無効化するのが安全です。
# すべての接続に既定を適用(最上段に記述)
Host *
ServerAliveInterval 30
ServerAliveCountMax 3
ForwardAgent no
StrictHostKeyChecking accept-new
UserKnownHostsFile ~/.ssh/known_hosts
条件付き設定:環境に応じて自動切替
同じ別名を社内・社外で切り替えたい場合は Match
で条件分岐できます。以下は社内ネットワークからのみ直接接続し、外部では踏み台経由にする例です。
# 既定は踏み台経由
Host corp-app
HostName app.corp.local
User ubuntu
ProxyJump bastion
# 社内サブネットから来たら踏み台を無効化
Match host corp-app exec "ipconfig | findstr 10\.0\.0\."
Hostname app.corp.local
ProxyJump none
巨大構成を分割する:Include ディレクティブ
プロジェクトごとにファイルを分けたい場合は Include
で読み込みます。社用と個人用を安全に分離できます。
# メイン config
Host *
ServerAliveInterval 30
Include ~/.ssh/config.d/*.conf
動作確認とトラブルシュート
設定が反映されないときは詳細ログで解析します。特に読み込まれたファイルの順序や、どの鍵が送られたかを確認します。
# 詳細ログで接続(-vvv で更に詳細)
ssh -v web
# どの設定が効いているかをダンプ(OpenSSH 9.3+)
ssh -G web | more
セキュリティの注意点
不要な ForwardAgent
は無効化し、鍵は ed25519
などの現代的アルゴリズムで作成します。公開鍵は必要なサーバーの ~/.ssh/authorized_keys
にのみ配置し、config は Git 等で公開しないよう注意します。
認証失敗を繰り返す場合は IdentitiesOnly yes
を入れて、意図しない鍵の試行を止めると収束が早くなります。
まとめ
PowerShell 環境でも ~/.ssh/config
を整えるだけで、別名一発接続、踏み台の自動経由、ポート転送の自動張り直し、鍵の自動読込みまで含めた「SSH 接続の自動化」が実現できます。
まずは最小の Host ブロックから始め、必要に応じて ProxyJump
・LocalForward
・Match
・Include
を足して運用に最適化してください。