🐙

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スキル開発など、元気と技術力を武器にお客様に真摯に向き合う価値創造企業です。
https://onewedge.co.jp

Discussion