GCPでNATインスタンスを構築する で書いたように、外部ネットワークへの通信をNATインスタンス経由にする場合、GCEインスタンスにグローバルIPアドレスは付与できないため、踏み台サーバ経由でログインすることになります。
本記事は踏み台サーバの構築メモと踏み台サーバ経由でGCEインスタンスにログインする方法を紹介します。
踏み台サーバの要件
- オフィスからのみログインさせる(IPアドレス制限する)
- デフォルトのポート番号(22)から変更する。今回は 48833 にした
Firewallルールの作成
カスタムポートでSSHログインできるようにFirewallルールを作成します。
初期設定で22番ポートでログインする必要があるため、22番ポートも合わせて許可するようにします。
以下のIPアドレスは例示専用です。
$ gcloud compute firewall-rules create "allow-ssh-bastion" \ --allow tcp:48833,tcp:22 --target-tags bastion \ --description "オフィスからSSH接続を許可(踏み台サーバ専用)" \ --priority=1000 \ --source-ranges "203.0.113.20/32","203.0.113.21/32" \ --network=sample
サーバ作成
名前は今回は bastion
としました。
OSは何でもいいのですが、今回はCentOS 7にしました。マシンタイプはf1-microと一番小さいものにしました。
gcloud compute ssh
コマンドでログインするにあたり、 Compute EngineのAPIアクセスを「読み取り / 書き込み」を許可します。
タグ付け
先程作成したFirewallルールが適用されるよう bastion
タグをつけます。
$ gcloud compute instances add-tags bastion --tags bastion
設定
パッケージアップデートします。
% yum makecache % yum update kubectl \ google-cloud-sdk \ google-cloud-sdk-app-engine-grpc \ google-cloud-sdk-pubsub-emulator \ google-cloud-sdk-app-engine-go \ google-cloud-sdk-datastore-emulator \ google-cloud-sdk-app-engine-python \ google-cloud-sdk-cbt \ google-cloud-sdk-bigtable-emulator \ google-cloud-sdk-datalab \ google-cloud-sdk-app-engine-java
SSHポート番号変更
% diff -u /etc/ssh/sshd_config.orig /etc/ssh/sshd_config --- /etc/ssh/sshd_config.orig 2018-07-16 22:27:12.725667712 +0000 +++ /etc/ssh/sshd_config 2018-08-02 09:55:54.291169281 +0000 @@ -14,7 +14,7 @@ # SELinux about this change. # semanage port -a -t ssh_port_t -p tcp #PORTNUMBER # -#Port 22 +Port 48833 #AddressFamily any #ListenAddress 0.0.0.0 #ListenAddress ::
% service sshd restart
踏み台サーバへのログイン
gcloudコマンドでログインする場合、以下のようにログインします。
初回ログインの際に秘密鍵を作成するのですが、パスフレーズを設定した方がセキュアです。
Linux / Mac:
--
以降にSSHコマンドと同じオプションを指定できます。
$ gcloud compute ssh bastion -- -p 48833 ARNING: The public SSH key file for gcloud does not exist. WARNING: The private SSH key file for gcloud does not exist. WARNING: You do not have an SSH key for gcloud. WARNING: SSH keygen will be executed to generate a key. Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): <パスフレーズを入力> Enter same passphrase again: <パスフレーズを入力> Your identification has been saved in /Users/sample_user/.ssh/google_compute_engine. Your public key has been saved in /Users/sample_user/.ssh/google_compute_engine.pub. The key fingerprint is: SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxx sample_user@localhost The key's randomart image is: +---[RSA 2048]----+ | | | . . . | | . o + o | | ooo+ + | | +=E+o.. | | . +*=*=* | | ooo++O+o . | | .oo=o..+.o | | o..+. .+..| +----[SHA256]-----+ Updating project ssh metadata...⠹Updated [https://www.googleapis.com/compute/v1/projects/sample]. Updating project ssh metadata...done.
Windows:
google-cloud-sdk内部のputty.exeが使われます。-p
の代わりに-P
オプションを指定します。
$ gcloud compute ssh bastion -- -P 48833
踏み台経由でLinuxサーバにログインする場合
踏み台サーバにログイン後例えば sample-linux001 というサーバにログインしたい場合は以下のコマンドを実行します。
$ gcloud compute ssh sample-linux001 --internal-ip --zone asia-northeast1-a
踏み台サーバに秘密鍵を作成するよう求められるのでそこでも作成します。
~/.ssh/config
やProxyCommandを使って一発で入れる方法を模索中です。。。
踏み台サーバと同じゾーン(asia-northeast1-a
)のVMインスタンスの場合は --zone
オプションは省略できます。
VMインスタンスの一覧は gcloud compute instances list
で確認できます。
踏み台経由でWindowsサーバにログオンする場合
SSHポートフォワーディングで入ります。例としてsample-windows001 というWindowsサーバにログインしたい場合は以下のようにします。これを実行した後、 localhost:13390
でWindowsサーバにRDP接続できるようになります。13390はリッスンするローカルポートなので適当なポート番号です。他のポート番号でもいいのですが、ウェルノウンポート以外にしてください。
Linux / Mac
$ gcloud compute ssh bastion -- -p 48833 \ -L 13390:sample-windows001:3389
Windows
> gcloud compute ssh bastion -- -P 48833 \ -L 13390:sample-windows001:3389
最後に
GCPで踏み台サーバの構築と踏み台サーバ経由でVPCネットワーク内部のGCEインスタンスにログインする方法を紹介しました。
gcloud compute ssh
コマンドを使った方法だと二回実行する必要があるのと踏み台サーバに秘密鍵が残ってしまうのであまり好手ではありません。 ~/.ssh/config
などで一発で入れる方法があれば教えてください。