使用 ssh-agent 搭配 Preemptible GCE 暫時連線只有內部IP GCE 小記
OS: openSUSE Leap 15.2
gcloud: 340.0.0
WFH 期間, 有時候可能要臨時連線雲端上面的主機, 但是有些專案的主機未必有對外 IP, 連線可能的方式有
透過 VPN 進行連接
使用 Bastion host 方式 來進行連接
今天要實作的就是以 Bastion host 方式( 使用 Preemptible GCE ) 搭配 ssh-agent 來進行連線
首先先來使用 gcloud 指令建立測試的 內部 GCE
# gcloud compute instances create --zone asia-east1-b --machine-type n1-standard-1 --image-project opensuse-cloud --image-family opensuse-leap --subnet sakana-test-10-12-53 --boot-disk-size 30 --boot-disk-device-name sakana-disk --boot-disk-type pd-standard --scopes service-control,service-management,storage-rw,bigquery,logging-write,monitoring-write,trace test2021062601 --no-address --project sakanatest
這邊使用 --no-address 的方式, 告訴 gcloud 不要建立外部 IP
這邊我是指定在某一個 subnet
再來建立要來連線的 Bastion Host, ( 使用 Preemptible GCE, 當然也是 openSUSE Leap )
# gcloud compute instances create --maintenance-policy=TERMINATE --preemptible --zone asia-east1-b --machine-type n1-standard-1 --image-project opensuse-cloud --image-family opensuse-leap --subnet sakana-test-10-12-53 --boot-disk-size 30 --boot-disk-device-name sakana-disk --boot-disk-type pd-standard --scopes service-control,service-management,storage-rw,bigquery,logging-write,monitoring-write,trace test2021062602 --project sakanatest
使用 Preemptible 的原因是因為, 這台 VM 最多不會超過 24 小時且價格相對於正常的 GCE, 最多可以節省 80 %, 可以參考官網 https://cloud.google.com/preemptible-vms
要使用 Preemptible 會同時使用 --maintenance-policy=TERMINATE --preemptible
機器類型可以使用客製化的規格, 使用更小的會更省錢 :p
Bastion Host 請自行設定只能從家中的固定 IP 進行連線
接下來就是家中主機端這邊
作法上使用 ssh-agent 搭配 Forwarding 功能, 先連到 Bastion Host, 再經由 Bastion Host 連線到內部主機
好處是 ssh-agent 搭配 forwarding 功能可以讓遠端的機器, 在不透過網路傳送金鑰的狀況下, 跟自己的主機進行驗證, 很適合有防火牆的狀況. 也就是不用把金鑰存放到堡壘機或是跳板機上 :)
參考網路上找到的文章
https://blog.gtwang.org/linux/using-ssh-agent-forwarding-to-avoid-being-asked-passphrase/
https://blog.tinned-software.net/manage-ssh-keys-with-the-ssh-agent/
首先觀察機器上面有沒有啟用 ssh-agent
可以使用 ssh-agent -s 觀察
> ssh-agent -s
SSH_AUTH_SOCK=/tmp/ssh-2OKjHwAUgnXd/agent.8965; export SSH_AUTH_SOCK;
SSH_AGENT_PID=8966; export SSH_AGENT_PID;
echo Agent pid 8966;
如果 ssh-agent 沒有啟動可以參考上述的文章使用
> eval $(ssh-agent)
eval 用法可參考鳥哥 http://linux.vbird.org/linux_basic/0320bash/0320bash.php
要知道目前 ssh-agent 有哪些 Key, 可以使用
> ssh-add -l
> ssh-add -L
使用 ssh-add 指定加入私鑰
> ssh-add ~/.ssh/YOUR_PRIVATE_KEY
這邊請對應要連線的私鑰檔案位置, 例如 ~/.ssh/id_rsa
接下來就是在使用 SSH 指令的時候加上 -A 參數即可
> ssh -A -l sakana 34.81.6.152
openSUSE Leap 15.2 x86_64 (64-bit)
As "root" use the:
- zypper command for package management
- yast command for configuration management
Have a lot of fun…
sakana@test2021062602:~>
使用 -A 進行 Forwarding
使用者名稱請對應到金鑰的使用者
後面請對應到 Bastion Host 對外 IP
目前已經在 Bastion Host, 接下來嘗試連線到內部主機, ssh 後面接對方內部 IP
> ssh -l sakana 10.12.53.32
openSUSE Leap 15.2 x86_64 (64-bit)
As "root" use the:
- zypper command for package management
- yast command for configuration management
Have a lot of fun...
sakana@test2021062601:~>
搞定收工
先紀錄下來, 以免之後自己又忘記
Notes:
之前有在 Cloud Shell 以及主機使用過比較沒常用的 IAP, 但是沒有成功, 就沒有花時間去研究他
# gcloud beta compute ssh --zone "asia-east1-b" "test2021062601" --tunnel-through-iap --project "sakanatest"
ERROR: (gcloud.beta.compute.start-iap-tunnel) Error while connecting [4003: 'failed to connect to backend']. (Failed to connect to port 22)
另外如果要刪除 ssh-agent 的 Key, 可以使用
ssh-add -D 刪除所有的 Key
ssh-add -d 刪除指定的 Key
~ enjoy it
Reference: