2

I would like to use my ssh config to use a google cloud compute instance as a jumpbox to connect to another box. However, I am having problems getting a config that will allow me to even connect to the google cloud compute instance.

The desired functionality is ssh gcloud would connect me to the gcloud instance. ssh foo connects me to a node that I can only connect to through the gcloud box.

To connect to gcloud I can run:

/home/me/google-cloud-sdk/bin/gcloud compute --project "myproject" ssh --zone "myzone" me@gcloud

So I added an entry to my .ssh/config:

Host gcloud
    ProxyCommand /home/me/google-cloud-sdk/bin/gcloud compute --project "myproject" ssh --zone "myzone" me@gcloud

I then run ssh gcloud and get:

# ssh gcloud
Pseudo-terminal will not be allocated because stdin is not a terminal.
-bash: line 1: $'SSH-2.0-OpenSSH_8.0\r': command not found

It seems to establish a connection, but I don't have a prompt to type at, so I press ctrl-c to kill it.


Debugging

I tried

/home/me/google-cloud-sdk/bin/gcloud compute --project "myproject" ssh --zone "myzone" me@gcloud --dryrun

This shows the ssh command that is run, it adds on a lot of flags I don't really care to have, adding the --plain flag gives me a stripped down version, with one -t flag.

# /home/me/google-cloud-sdk/bin/gcloud compute --project "myproject" ssh --zone "myzone" me@gcloud
/usr/bin/ssh -t me@<gcloud_ip>

Without adding --dryrun I can connect with the --plain flag, but not when I use it in my ssh config. Arguments after -- are passed to ssh. This led me to try adding -- -t which once again connects, this time no warning is provided and no prompt. I've also tried -- -tt which gives the error and no prompt.

By adding -- -vvv I can get more verbose logs, here they are:

$ ssh gcloud
OpenSSH_8.0p1, OpenSSL 1.1.1d FIPS  10 Sep 2019
debug1: Reading configuration data /home/me/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config
debug3: /etc/ssh/ssh_config line 51: Including file /etc/ssh/ssh_config.d/05-redhat.conf depth 0
debug1: Reading configuration data /etc/ssh/ssh_config.d/05-redhat.conf
debug2: checking match for 'final all' host <gcloud_ip> originally <gcloud_ip>
debug3: /etc/ssh/ssh_config.d/05-redhat.conf line 3: not matched 'final'
debug2: match not found
debug3: /etc/ssh/ssh_config.d/05-redhat.conf line 5: Including file /etc/crypto-policies/back-ends/openssh.config depth 1 (parse only)
debug1: Reading configuration data /etc/crypto-policies/back-ends/openssh.config
debug3: gss kex names ok: [gss-gex-sha1-,gss-group14-sha1-,gss-group1-sha1-]
debug3: kex names ok: [curve25519-sha256,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1]
debug1: configuration requests final Match pass
debug2: resolve_canonicalize: hostname <gcloud_ip> is address
debug1: re-parsing configuration
debug1: Reading configuration data /home/me/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config
debug3: /etc/ssh/ssh_config line 51: Including file /etc/ssh/ssh_config.d/05-redhat.conf depth 0
debug1: Reading configuration data /etc/ssh/ssh_config.d/05-redhat.conf
debug2: checking match for 'final all' host <gcloud_ip> originally <gcloud_ip>
debug3: /etc/ssh/ssh_config.d/05-redhat.conf line 3: matched 'final'
debug2: match found
debug3: /etc/ssh/ssh_config.d/05-redhat.conf line 5: Including file /etc/crypto-policies/back-ends/openssh.config depth 1
debug1: Reading configuration data /etc/crypto-policies/back-ends/openssh.config
debug3: gss kex names ok: [gss-gex-sha1-,gss-group14-sha1-,gss-group1-sha1-]
debug3: kex names ok: [curve25519-sha256,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1]
Pseudo-terminal will not be allocated because stdin is not a terminal.
debug2: ssh_connect_direct
debug1: Connecting to <gcloud_ip> [<gcloud_ip>] port 22.
debug1: Connection established.
debug1: identity file /home/me/.ssh/google_compute_engine type 0
debug1: identity file /home/me/.ssh/google_compute_engine-cert type -1
debug1: Local version string SSH-2.0-OpenSSH_8.0
debug1: Remote protocol version 2.0, remote software version OpenSSH_7.4p1 Debian-10+deb9u7
debug1: match: OpenSSH_7.4p1 Debian-10+deb9u7 pat OpenSSH_7.0*,OpenSSH_7.1*,OpenSSH_7.2*,OpenSSH_7.3*,OpenSSH_7.4*,OpenSSH_7.5*,OpenSSH_7.6*,OpenSSH_7.7* compat 0x04000002
debug2: fd 4 setting O_NONBLOCK
debug1: Authenticating to <gcloud_ip>:22 as 'metrics'
debug3: send packet: type 20
debug1: SSH2_MSG_KEXINIT sent
debug3: receive packet: type 20
debug1: SSH2_MSG_KEXINIT received
debug2: local client KEXINIT proposal
debug2: KEX algorithms: curve25519-sha256,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1,ext-info-c
debug2: host key algorithms: ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-ed25519-cert-v01@openssh.com,rsa-sha2-512-cert-v01@openssh.com,rsa-sha2-256-cert-v01@openssh.com,ssh-rsa-cert-v01@openssh.com,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-ed25519,rsa-sha2-512,rsa-sha2-256,ssh-rsa,ssh-dss
debug2: ciphers ctos: aes256-gcm@openssh.com,chacha20-poly1305@openssh.com,aes256-ctr,aes256-cbc,aes128-gcm@openssh.com,aes128-ctr,aes128-cbc
debug2: ciphers stoc: aes256-gcm@openssh.com,chacha20-poly1305@openssh.com,aes256-ctr,aes256-cbc,aes128-gcm@openssh.com,aes128-ctr,aes128-cbc
debug2: MACs ctos: hmac-sha2-256-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha2-256,hmac-sha1,umac-128@openssh.com,hmac-sha2-512
debug2: MACs stoc: hmac-sha2-256-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha2-256,hmac-sha1,umac-128@openssh.com,hmac-sha2-512
debug2: compression ctos: none,zlib@openssh.com,zlib
debug2: compression stoc: none,zlib@openssh.com,zlib
debug2: languages ctos:
debug2: languages stoc:
debug2: first_kex_follows 0
debug2: reserved 0
debug2: peer server KEXINIT proposal
debug2: KEX algorithms: curve25519-sha256,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group14-sha256,diffie-hellman-group14-sha1
debug2: host key algorithms: ssh-rsa,rsa-sha2-512,rsa-sha2-256,ecdsa-sha2-nistp256,ssh-ed25519
debug2: ciphers ctos: chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com
debug2: ciphers stoc: chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com
debug2: MACs ctos: umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1
debug2: MACs stoc: umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-64@openssh.com,umac-128@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1
debug2: compression ctos: none,zlib@openssh.com
debug2: compression stoc: none,zlib@openssh.com
debug2: languages ctos:
debug2: languages stoc:
debug2: first_kex_follows 0
debug2: reserved 0
debug1: kex: algorithm: curve25519-sha256
debug1: kex: host key algorithm: ecdsa-sha2-nistp256
debug1: kex: server->client cipher: aes256-gcm@openssh.com MAC: <implicit> compression: none
debug1: kex: client->server cipher: aes256-gcm@openssh.com MAC: <implicit> compression: none
debug1: kex: curve25519-sha256 need=32 dh_need=32
debug1: kex: curve25519-sha256 need=32 dh_need=32
debug3: send packet: type 30
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug3: receive packet: type 31
debug1: Server host key: ecdsa-sha2-nistp256 SHA256:SSiahqZ80hKyZnrwU7tXf7yVH4iw0T1VuGa273/rSm8
debug1: using hostkeyalias: compute.6046273207033681025
debug3: hostkeys_foreach: reading file "/home/me/.ssh/google_compute_known_hosts"
debug3: record_hostkey: found key type ECDSA in file /home/me/.ssh/google_compute_known_hosts:164
debug3: load_hostkeys: loaded 1 keys from compute.6046273207033681025
debug1: Host 'compute.6046273207033681025' is known and matches the ECDSA host key.
debug1: Found key in /home/me/.ssh/google_compute_known_hosts:164
debug3: send packet: type 21
debug2: set_newkeys: mode 1
debug1: rekey out after 4294967296 blocks
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug3: receive packet: type 21
debug1: SSH2_MSG_NEWKEYS received
debug2: set_newkeys: mode 0
debug1: rekey in after 4294967296 blocks
debug1: Will attempt key: /home/me/.ssh/google_compute_engine RSA SHA256:v+I+Ar49s9xNTLoC6jSGYwsSeYhHtnCw7B2JWDF8UWs explicit agent
debug2: pubkey_prepare: done
debug3: send packet: type 5
debug3: receive packet: type 7
debug1: SSH2_MSG_EXT_INFO received
debug1: kex_input_ext_info: server-sig-algs=<ssh-ed25519,ssh-rsa,ssh-dss,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521>
debug3: receive packet: type 6
debug2: service_accept: ssh-userauth
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug3: send packet: type 50
debug3: receive packet: type 51
debug1: Authentications that can continue: publickey
debug3: start over, passed a different list publickey
debug3: preferred gssapi-with-mic,publickey,keyboard-interactive,password
debug3: authmethod_lookup publickey
debug3: remaining preferred: keyboard-interactive,password
debug3: authmethod_is_enabled publickey
debug1: Next authentication method: publickey
debug1: Offering public key: /home/me/.ssh/google_compute_engine RSA SHA256:v+I+Ar49s9xNTLoC6jSGYwsSeYhHtnCw7B2JWDF8UWs explicit agent
debug3: send packet: type 50
debug2: we sent a publickey packet, wait for reply
debug3: receive packet: type 60
debug1: Server accepts key: /home/me/.ssh/google_compute_engine RSA SHA256:v+I+Ar49s9xNTLoC6jSGYwsSeYhHtnCw7B2JWDF8UWs explicit agent
debug3: sign_and_send_pubkey: RSA SHA256:v+I+Ar49s9xNTLoC6jSGYwsSeYhHtnCw7B2JWDF8UWs
debug3: sign_and_send_pubkey: signing using ssh-rsa
debug3: send packet: type 50
debug3: receive packet: type 52
debug1: Authentication succeeded (publickey).
Authenticated to <gcloud_ip> ([<gcloud_ip>]:22).
debug2: fd 5 setting O_NONBLOCK
debug2: fd 7 setting O_NONBLOCK
debug1: channel 0: new [client-session]
debug3: ssh_session2_open: channel_new: 0
debug2: channel 0: send open
debug3: send packet: type 90
debug1: Requesting no-more-sessions@openssh.com
debug3: send packet: type 80
debug1: Entering interactive session.
debug1: pledge: network
debug2: client_check_window_change: changed
debug3: receive packet: type 80
debug1: client_input_global_request: rtype hostkeys-00@openssh.com want_reply 0
debug3: receive packet: type 91
debug2: channel_input_open_confirmation: channel 0: callback start
debug2: fd 4 setting TCP_NODELAY
debug3: ssh_packet_set_tos: set IP_TOS 0x20
debug2: client_session2_setup: id 0
debug1: Sending environment.
debug1: Sending env XMODIFIERS = @im=ibus
debug2: channel 0: request env confirm 0
debug3: send packet: type 98
debug1: Sending env LANG = en_US.UTF-8
debug2: channel 0: request env confirm 0
debug3: send packet: type 98
debug2: channel 0: request shell confirm 1
debug3: send packet: type 98
debug2: channel_input_open_confirmation: channel 0: callback done
debug2: channel 0: open confirm rwindow 0 rmax 32768
debug2: channel 0: rcvd adjust 2097152
debug3: receive packet: type 99
debug2: channel_input_status_confirm: type 99 id 0
debug2: shell request accepted on channel 0
debug2: channel 0: rcvd ext data 59
-bash: line 1: $'SSH-2.0-OpenSSH_8.0\r': command not found
debug2: channel 0: written 59 to efd 8

As for jumping (my longer-term goal), I can connect to the node with:

ssh -J me@<gcloud_ip> -p <port> me@<node_ip>

but I would like to encapsulate this in my config so I can say ssh node.

shortcipher3
  • 192
  • 10

2 Answers2

3

I figured out working syntax, I can connect directly to the gcloud compute instance using the name by adding to my ssh config:

Host gcloud
    User me
    ProxyCommand gcloud compute --project "myproject" ssh --zone "myzone" me@gcloud --command="nc 0.0.0.0 22"

Now I can say ssh gcloud

To use it as a jumpbox I can add to my config

Host *.gc
    User me
    IdentityFile myIdentityFile
    ProxyCommand gcloud compute --project "myproject" ssh --zone "myzone" me@gcloud --command="nc $(basename %h .gc) %p"

This allows me to run ssh <instance_ip>.gc using the gcloud compute instance as a jumpbox.

shortcipher3
  • 192
  • 10
2

To proxy ssh traffic through a bastion/jumpbox, you need -W %h:% in your ProxyCommand line. I've provided an example ~/.ssh/config below.

Host *
ForwardAgent yes
AddKeysToAgent yes

# Bastion/jumpbox
Host gcloud
StrictHostKeyChecking no
UserKnownHostsFile=/dev/null

# Target instance
Host compute.* 10.1.2.*
User me
IdentityFile ~/.ssh/mykey.pem
ProxyCommand ssh -q -W %h:%p me@gcloud
StrictHostKeyChecking no
UserKnownHostsFile=/dev/null
nickdew
  • 303
  • I am able to connect to the Bastion/jumpbox with these instructions, but for the target instance I get channel 0: open failed: administratively prohibited: open failed stdio forwarding failed, maybe it is some setting on my sshd? I can use ssh -J me@<gcloud_ip> -p <port> me@<node_ip> to jump, but I prefer to use the config. Also I prefer to use the instance name instead of ip (which is why my example uses the gcloud command), in case the ip changes. – shortcipher3 Jun 05 '20 at 02:38
  • Added a Host * block to the config example. Try that first, but you might need to change sshd config (Troubleshooting thread: https://unix.stackexchange.com/questions/14160/ssh-tunneling-error-channel-1-open-failed-administratively-prohibited-open). I provided hostname and IP in the example for completeness. – nickdew Jun 05 '20 at 17:38