概要
Private IPしか持たない GCEインスタンスに対し、Global IPによる外部 sshアクセスが出来ないので、Global IPを持つ別のGCEインスタンスから ssh接続する手順を示す。
TL; DR
- 鍵ペアを生成して公開鍵をアクセス先に登録する(後者は稼働中にGUI上から設定可能)
- 内部通信を許可する Firewall Ruleを追加する
- SSH公開鍵認証(
ssh -i ${秘密鍵}
)を利用してログインする
背景
VPC内に GIP(Global IP)を持たないインスタンスが必要
- 例として VPC内から NAT経由での外部APIコールができるか確認したい場合、この様なインスタンスが必要となる
- GCEインスタンスはデフォルトで エフェメラルなGIPを持つ。その状態でVPC外のAPIをコールしようとすると NATではなく自身のGIP経由で外部通信してしまう
- アクセス経路を確認するには例えば以下の様なコマンドで確認可能。(GIPが出てくるか、NATに紐付いたIPが出てくるか)
$ curl https://httpbin.org/get | grep origin
$ curl https://ifconfig.io
- アクセス経路を確認するには例えば以下の様なコマンドで確認可能。(GIPが出てくるか、NATに紐付いたIPが出てくるか)
VPC内の GIP(Global IP)を持たないインスタンスには 外からssh接続できない
- アクセス先の GIPがないのでもう仕方ない
解決策
幾つか解決策はあるが、ここではVPC内の別GCEインスタンスから ssh接続するという手法をとる。単純に ssh接続を行おうとしても繋がらないので、その方法をメモしておく。
準備①: 踏み台となる別のGCEインスタンスを用意する
以下の条件を満たすインスタンスを用意する。条件を満たす既存のインスタンスを利用しても良い。
- アクセス先インスタンスと同一のVPCネットワーク上に存在する
- Global IPと Private IPの両方を持つ(前者はローカルからのssh接続に、後者はアクセス先へのssh接続に利用)
- Firewall Ruleでローカルの作業環境から VPC環境へのssh(TCP:22)アクセスを許可している (*1)
# *1) アクセス元の ローカル環境の Global IPレンジを仮に `100.100.100.2/32`とした際のイメージ
gcloud compute --project=(your-project) firewall-rules create (your-rule-name-0) \
--direction=INGRESS \
--priority=1000 \
--network=(your-vpc-network) \
--action=ALLOW \
--rules=tcp:22 \
--source-ranges="100.100.100.2/32"
準備②: Firewallルールを追加し内部通信を許可する
内部通信にも明示的なルールの存在が必要なので、以下の様なルールを追加する
GUI上の入力項目
# | 項目名 | 指定内容 |
---|---|---|
1 | ネットワーク | (対象のVPC) |
2 | ターゲット | "ネットワーク上の全てのインスタンス" |
3 | ソースフィルタ | "IPv4 範囲" |
4 | 送信元 IPv4範囲 | (共有するVPCの Private IP範囲を CIDR表記で - 例: 192.0.2.0/24) |
5 | 2番目のソースフィルタ | なし (任意で指定しても良い) |
6 | プロトコルとポート | "指定したプロトコルとポート" : TCP : 22 |
同等のCLI出力
GUI上からCLIを出力すると以下になります(情報の表現が大きく異なるので要素同士のマッピングができない)
# 共有の PrivateIPレンジを仮に `192.0.2.0/24`とした際のイメージ
$ gcloud compute --project=(your-project) firewall-rules create (your-rule-name-1) \
--direction=INGRESS \
--priority=2000 \
--network=(your-vpc-network) \
--action=ALLOW \
--rules=tcp:22 \
--source-ranges="192.0.2.0/24"
準備③ アクセス元の GCEインスタンスで鍵ペアを生成する
鍵ペア生成
アクセス元の GCEインスタンスに sshで入り、以下のコマンドを実行し鍵ペアを生成する。
# ssh-keygen -t ecdsa -b 256 -f ~/.ssh/google_compute_engine
公開鍵コピー
秘密鍵 google_compute_engine
と 公開鍵 google_compute_engine.pub
が ${HOME}/.ssh/
配下に生成されているので、後者をコピーする。
$ cat ~/.ssh/google_compute_engine.pub
(公開鍵が表示されるのでコピー)
準備④ アクセス元の公開鍵をアクセス先に登録する
先の手順でコピーしておいた公開鍵を、アクセス先の GCEに登録する。
- クラウドコンソール上の GCEから対象のインスタンスを選択する
- 詳細画面上部の 「編集」 リンクを押下する
- "セキュリティとアクセス”の "SSH認証鍵" 欄に先程コピーしておいた アクセス元の公開鍵をペーストする
- 「保存」 ボタンを押下する
接続
接続元となる GIP付きのインスタンスから下記形式のSSHコマンド(公開鍵認証)で接続可能
$ ssh -i ~/.ssh/google_compute_engine ${公開鍵を生成したユーザ}@${接続先の内部IP}
- 公開鍵を生成した際のユーザが不明なら、アクセス元インスタンスで
cat ~/.ssh/google_compute_engine.pub
すれば末尾に以下の記載がある。
(公開鍵を生成したユーザ)@(接続元VM)
参考