宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
「毎回 ssh -i ~/.ssh/id_rsa_server1 -p 2222 user@192.168.10.5 と打つのが面倒」と思ったことはないですか。
あるいは本番サーバーへ踏み台(踏み台サーバー)経由で接続するたびに、2段階のコマンドを打っていませんか。

~/.ssh/config(SSHクライアント設定ファイル)を使えば、こうした繰り返し作業を一行のエイリアスにまとめられます。
設定さえ済ませれば ssh web01 と打つだけで接続完了です。

この記事では ~/.ssh/config の基本的な書き方から、ProxyJump・IdentityFile・複数鍵の使い分けまで実践的に解説します。

この記事のポイント

・ ~/.ssh/config に Host ブロックを書くとコマンドが大幅に短縮できる
・ ProxyJump で踏み台サーバー経由の接続を自動化できる
・ IdentityFile で複数の秘密鍵を用途別に使い分けられる
・ パーミッション(600/700)を間違えると接続できないので注意


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

~/.ssh/config とは何か

~/.ssh/config は SSH クライアントの設定ファイルです。
OpenSSH がインストールされている環境であれば、ファイルを置くだけで利用できます(追加インストール不要)。

設定しない場合は、接続のたびに ssh コマンドのオプションをすべて手打ちする必要があります。

# 設定なしで本番サーバーに接続する場合(毎回これを打つ) ssh -i ~/.ssh/id_rsa_prod -p 2222 deploy@203.0.113.10

~/.ssh/config に Host ブロックを書くと、以下のように短縮されます。

# 設定後 ssh prod

接続先が増えるほど恩恵が大きく、チームで共有する場合も設定ファイルを配布するだけで済みます。

ファイルの作成とパーミッション設定

~/.ssh/config が存在しない場合は新規作成します。

# .ssh ディレクトリがなければ作成 mkdir -p ~/.ssh # .ssh ディレクトリのパーミッションを設定(700 必須) chmod 700 ~/.ssh # config ファイルを作成 touch ~/.ssh/config # config ファイルのパーミッションを設定(600 必須) chmod 600 ~/.ssh/config

パーミッションは厳守です。
~/.ssh が 700 以外、または config が 600 以外だと SSH は「パーミッションが緩すぎる」と判断して設定を無視します。
接続できなくて焦ったときは、まずここを確認してください。

# パーミッション確認 ls -la ~/.ssh/ # 正しい出力例 drwx------ 2 yamada yamada 4096 May 18 09:00 .ssh/ ← 700 -rw------- 1 yamada yamada 312 May 18 09:00 config ← 600 -rw------- 1 yamada yamada 2610 May 15 10:00 id_rsa ← 600 -rw-r--r-- 1 yamada yamada 579 May 15 10:00 id_rsa.pub ← 644

基本的な書き方(Host ブロック)

設定の基本単位は Host ブロックです。Host ホスト名 を起点に、その接続に使う設定をインデントして列挙します。

# ~/.ssh/config の基本構造 Host web01 HostName 203.0.113.10 User deploy Port 2222 IdentityFile ~/.ssh/id_rsa_prod

設定が終わると ssh web01 で接続できます。

よく使う主要なキーワードを以下にまとめます。

キーワード 説明
HostName 実際のIPアドレスまたはFQDN 203.0.113.10
User 接続ユーザー名 deploy
Port SSHポート番号(デフォルト22) 2222
IdentityFile 使用する秘密鍵のパス ~/.ssh/id_rsa_prod
ProxyJump 踏み台サーバーの指定 bastion
ServerAliveInterval 死活確認パケットの送信間隔(秒) 60
StrictHostKeyChecking ホスト鍵の確認動作 no

複数のサーバーを使い分ける設定例

開発・ステージング・本番と複数の環境を持つ場合、一つの config にまとめて管理できます。

# ~/.ssh/config に複数 Host を定義 # 開発サーバー Host dev HostName 192.168.10.5 User vagrant Port 22 IdentityFile ~/.ssh/id_rsa_dev # ステージングサーバー Host stg HostName 10.0.1.20 User deploy Port 2222 IdentityFile ~/.ssh/id_rsa_stg # 本番サーバー Host prod HostName 203.0.113.10 User deploy Port 2222 IdentityFile ~/.ssh/id_rsa_prod ServerAliveInterval 60

接続は ssh dev / ssh stg / ssh prod で切り替えられます。
本番のみ ServerAliveInterval を設定して、セッションが切断されにくくしている点もポイントです。

ProxyJump で踏み台サーバー経由の接続を自動化する

セキュリティ要件の高いシステムでは、インターネットから直接 SSH できないよう踏み台サーバー(Bastion Host)を挟む構成がよく使われます。

設定なしの場合は次のように2段階のコマンドが必要です。

# 踏み台を経由する昔ながらの手順(手動2段階) # 1. まず踏み台に接続 ssh -i ~/.ssh/id_rsa deploy@bastion.example.com # 2. 踏み台の中から本番サーバーに接続 ssh -i ~/.ssh/id_rsa deploy@10.0.2.100

ProxyJump を使えば、ローカル PC から直接 ssh prod-db と打つだけで踏み台を経由して接続できます。

# ~/.ssh/config に ProxyJump を設定 # 踏み台サーバー Host bastion HostName bastion.example.com User deploy IdentityFile ~/.ssh/id_rsa_bastion # 本番 DB サーバー(踏み台経由) Host prod-db HostName 10.0.2.100 User deploy IdentityFile ~/.ssh/id_rsa_prod ProxyJump bastion

接続の流れを確認します。

# 確認(-v でデバッグ出力) ssh -v prod-db # 出力例(抜粋) debug1: Connecting to bastion.example.com [203.0.113.1] port 22. debug1: Connection established. ... debug1: channel 0: new [direct-tcpip] debug1: Connecting to 10.0.2.100 [10.0.2.100] port 22. debug1: Connection established.

踏み台への接続が成功した後、内部ネットワークの 10.0.2.100 へ転送されているのが分かります。
Linux ポート確認の全コマンドを合わせて読むと、踏み台でのポート疎通確認にも役立ちます。

IdentityFile で複数の鍵を使い分ける

GitHub 用の鍵と仕事のサーバー用の鍵を分けて管理している場合、IdentityFile で鍵を明示指定します。
指定がない場合、SSH は ~/.ssh/id_rsa~/.ssh/id_ecdsa~/.ssh/id_ed25519 の順に鍵を試します。
接続先が多いと「どの鍵で認証されたか」が分かりにくくなるため、明示指定を習慣にしてください。

# 複数鍵の使い分け例 # GitHub(HTTPS 443 経由 SSH の場合) Host github.com HostName github.com User git IdentityFile ~/.ssh/id_ed25519_github # 社内 GitLab Host gitlab.internal HostName 10.0.0.50 User git IdentityFile ~/.ssh/id_rsa_gitlab # AWS 本番環境 Host aws-prod HostName ec2-54-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com User ec2-user IdentityFile ~/.ssh/aws-prod.pem Port 22

鍵の生成方法についてはssh-keygenコマンドでSSH公開鍵認証を設定する方法も参考にしてください。

ワイルドカードで共通設定をまとめる

複数の Host に共通する設定は Host * に書くと重複を避けられます。
SSH は上から順に Host ブロックを評価し、最初にマッチした値を優先します。
共通設定は必ずファイルの末尾に置くのがルールです。

# 個別設定(上位) Host prod HostName 203.0.113.10 User deploy Port 2222 IdentityFile ~/.ssh/id_rsa_prod # 全サーバー共通設定(必ず末尾) Host * ServerAliveInterval 60 ServerAliveCountMax 3 AddKeysToAgent yes IdentityFile ~/.ssh/id_rsa

ServerAliveInterval 60 はクライアントから 60 秒ごとに死活確認パケットを送り、セッションが意図せず切れるのを防ぎます。
AddKeysToAgent yes は ssh-agent への自動追加で、一度パスフレーズを入力すれば同一セッション内で再入力を求められなくなります。

トラブルシュート・よくあるエラーと対処法

1. 設定が反映されない

config のパーミッションが緩い場合(644 など)、SSH は設定ファイルを無視します。

# パーミッションを修正 chmod 600 ~/.ssh/config chmod 700 ~/.ssh

2. Host ブロックが認識されない

インデントにタブとスペースを混在させると解析エラーになります。スペースで統一してください。
設定が正しいかどうかは -v オプションで確認できます。

# デバッグモードで接続を試みる(設定の読み込み順を確認) ssh -v web01 2>&1 | grep -E "config|identity|Offer" # 出力例 debug1: Reading configuration data /home/yamada/.ssh/config debug1: /home/yamada/.ssh/config line 1: Applying options for web01 debug1: identity file /home/yamada/.ssh/id_rsa_prod type 0

3. ProxyJump が Permission denied になる

踏み台側に秘密鍵が存在しないのが原因です。ローカルの秘密鍵を踏み台経由で転送するには ForwardAgent を使います。

Host bastion HostName bastion.example.com User deploy IdentityFile ~/.ssh/id_rsa_bastion ForwardAgent yes ← エージェント転送を有効化 Host prod-db HostName 10.0.2.100 User deploy ProxyJump bastion

ForwardAgent yes を設定すると、踏み台に接続したまま踏み台から先のサーバーへも同じ鍵で認証できます。
ただしセキュリティリスクがあるため、信頼できる踏み台のみに限定してください。

4. scpやrsyncに設定が適用されない

scp および rsync -e ssh~/.ssh/config を参照します。
Host 名を使って以下のように書けます。

# scp でファイル転送(prod はconfig で定義済み) scp ./deploy.tar.gz prod:/var/deploy/ # rsync でディレクトリ同期 rsync -avz ./html/ prod:/var/www/html/

本記事のまとめ

やりたいこと 設定・コマンド
接続先を短い名前にする Host web01 ブロックを追加
ユーザー・ポート・鍵を固定 User / Port / IdentityFile をブロック内に記述
踏み台経由を自動化 ProxyJump bastion を目的ホストのブロックに追加
複数鍵の使い分け Host ブロックごとに IdentityFile を明示
全サーバー共通の設定 ファイル末尾の Host * ブロックにまとめる
設定が反映されない chmod 600 ~/.ssh/config でパーミッション修正
設定内容を確認 ssh -v ホスト名 でデバッグ出力を確認

~/.ssh/config はほとんどのエンジニアが「なんとなく使っている」ままになりがちですが、ProxyJump や ForwardAgent を組み合わせると複雑な構成も一発コマンドで接続できます。
設定ファイルをバージョン管理(Git)に入れておくと、PC 切り替え時の移行も楽になります。

現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、Linuxサーバー構築入門マニュアル(図解60P)を無料でお渡ししています。

>> Linuxサーバー構築入門マニュアル(図解60P)を無料で受け取る

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。