0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PrivateIPしか持たない GCEインスタンスにVPC内の別インスタンスからSSH接続する

Last updated at Posted at 2022-11-11

概要

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

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)

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?