SSHトンネルで踏み台サーバを使うコマンド
まえがき
最近、VPC内にあるGitリポジトリからローカル端末にソースコードをクローンする作業をやることになり、理解に時間がかかったのでわかったことを解説します。
SSHトンネルとは
SSHトンネルは、SSH接続を使って「安全な経路」を作り、リモートサーバーのポートにアクセスできるようにする仕組みです。
簡単に言うと、「ローカルの特定のポートに接続すると、その通信がSSH経由でサーバーの別のポートにつながる」というものです。
踏み台サーバとは
外部に公開されていないネットワーク内のサーバ群にアクセスするための玄関口となるサーバ。
プライベートネットワーク内にあるが、このサーバだけ外部からのアクセスを条件付きで受け付けることができる。
条件は秘密鍵だったり、固定IPアドレス(VPN経由での通信など)だったりする。
ここで不正なアクセスを遮断しておいてから、その奥にあるプライベート領域のサーバにアクセスする。
なぜトンネルにする必要がある?
例えば、プライベートネットワーク内のサーバでログをみたり、シェルを実行するだけであれば、踏み台にSSHコマンドで入って、踏み台サーバの中でもう一度SSHコマンドを使うだけで実現可能です。
しかし、目的のサーバにあるGitリポジトリからクローンしたい時など、一旦踏み台サーバにクローンしてから、またローカルに落としてくるというパターンなどは、大きな無駄が生じてしまいます。
プライベートサーバでログ確認やシェル実行(一般的なSSH操作)
[ローカルPC]
│
│ sshで接続
▼
┌──────────────┐
│ 踏み台サーバ │
│ bastion-host │
└────┬─────────┘
│
│ さらに ssh 接続
▼
┌──────────────────┐
│ プライベートサーバ │
│ private-server │
│ (ログ確認・シェル実行)│
└──────────────────┘
Gitクローンが必要なケース(非効率な中継コピー)
[ローカルPC]
│
│ ssh 接続
▼
┌──────────────┐
│ 踏み台サーバ │
│ bastion-host │
└────┬─────────┘
│
│ ssh 接続
▼
┌────────────────────────┐
│ プライベートGitサーバ(GitBucket等) │
│ gitbucket.internal │
└────────────┬─────────┘
│
│ git clone 実行(踏み台上)
▼
┌──────────────┐
│ リポジトリを踏み台に保存 │
└──────────────┘
│
│ scp などで再度ローカルに転送
▼
[ローカルPC]
🚫 結果:中継保存・再転送という「二度手間」
SSHトンネル作成コマンド
-L [ローカルポート]:[目的のリモートホスト:ポート] [踏み台ホスト:ポート]
-L は「ローカルポートフォワーディング」と呼ばれます。
上のコマンドを実行すると、ローカルポートにアクセスした通信を、SSH先のサーバー経由でリモート側ポートに転送するようになります。
最後の引数に踏み台を指定します。
目的のリモートホストは、SSH先(踏み台)から見える内部ネットワーク上のホストである必要があります。
例えば以下のようになります。
ssh -L 8100:gitbucket.internal:8100 bastion-user@bastion-host
このコマンドの流れを図にするとこんな感じです。
[ローカルPC]
┌────────────┐
│ localhost │
│ (port:8100)│ ← http://localhost:8100 にアクセス
└────┬───────┘
│
▼
(SSHトンネルで転送)
│
▼
┌──────────────┐
│ 踏み台サーバ │ ← SSH接続(bastion-user@bastion-host)
│ bastion-host │
└────┬─────────┘
│
▼
(内部ネットワーク内で転送)
│
▼
┌──────────────────────┐
│ GitBucketサーバ │
│ gitbucket.internal │
│ port:8100(GitBucket) │
└──────────────────────┘
localhost:8100 にアクセスすると、SSHトンネル経由で gitbucket.internal:8100 に接続されます。
ブラウザで GitBucket を開くには http://localhost:8100/
クローンコマンドは、もう1つ別のターミナルを立ち上げて、別のプロセスで以下を実行。
git clone http://localhost:8100/owner/repo.git
株式会社ONE WEDGE
【Serverlessで世の中をもっと楽しく】 ONE WEDGEはServerlessシステム開発を中核技術としてWeb系システム開発、AWS/GCPを利用した業務システム・サービス開発、PWAを用いたモバイル開発、Alexaスキル開発など、元気と技術力を武器にお客様に真摯に向き合う価値創造企業です。
Discussion