
게이트웨이를 통해 EC2 인스턴스에 연결하려고 합니다.
게이트웨이에 연결하면
local> ssh gateway
그런 다음 비밀번호 없이 EC2에 연결할 수 있습니다.
gateway> ssh ec2 # works
그러나 프록시를 통해 연결을 시도하려면 indentity 파일이 필요한 것 같습니다.
Host gateway
HostName <gateway>
Host ec2
HostName ec2-<ec2>.compute.amazonaws.com
ProxyCommand ssh gateway -W %h:%p
local> ssh ec2
Permission denied (publickey).
저는 ProxyCommand가 기본적으로 게이트웨이에 로그인한 다음 최종 대상에 로그인한다고 생각했습니다. 그렇다면 게이트웨이가 공개 키를 요구하지 않도록 설정되어 있는데 왜 공개 키를 요구합니까? 게이트웨이에 ssh를 연결한 다음 ec2에 ssh를 연결하는 것과 같은 방식으로 ec2 인스턴스에 연결하려면 어떻게 해야 합니까?
편집: rsync가 정상적으로 작동합니다(키 파일을 요청하지 않음)
rsync -pthrvz --rsync-path=/usr/bin/rsync --rsh='ssh gateway ssh' . ec2:/path
ssh -v 출력gateway> ssh ec2
gateway> ssh -v ec2
OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: Connecting to ec2 port 22.
debug1: Connection established.
debug1: identity file <snip> type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_6.2
debug1: match: OpenSSH_6.2 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.3
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Host 'ec2' is known and matches the RSA host key.
debug1: Found key in ~/.ssh/known_hosts:63
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Trying private key: ~/.ssh/identity
debug1: Offering public key: ~/.ssh/id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 277
debug1: read PEM private key done: type RSA
debug1: Authentication succeeded (publickey).
debug1: channel 0: new [client-session]
debug1: Requesting [email protected]
debug1: Entering interactive session.
debug1: Sending environment.
ssh -v 프록시를 통한 연결 시도의 출력
local$ ssh -v ec2
OpenSSH_6.7p1 Ubuntu-5ubuntu1.3, OpenSSL 1.0.1f 6 Jan 2014
debug1: Reading configuration data /home/matt/.ssh/config
debug1: /home/matt/.ssh/config line 9: Applying options for ec2
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug1: Hostname has changed; re-reading configuration
debug1: Reading configuration data /home/matt/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug1: Executing proxy command: exec ssh gateway -W ec2:22
debug1: permanently_drop_suid: 1000
debug1: identity file /home/matt/.ssh/id_rsa type 1
debug1: key_load_public: No such file or directory
debug1: identity file /home/matt/.ssh/id_rsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/matt/.ssh/id_dsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/matt/.ssh/id_dsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/matt/.ssh/id_ecdsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/matt/.ssh/id_ecdsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/matt/.ssh/id_ed25519 type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/matt/.ssh/id_ed25519-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.7p1 Ubuntu-5ubuntu1.3
debug1: Remote protocol version 2.0, remote software version OpenSSH_6.2
debug1: match: OpenSSH_6.2 pat OpenSSH* compat 0x04000000
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr [email protected] none
debug1: kex: client->server aes128-ctr [email protected] none
debug1: sending SSH2_MSG_KEX_ECDH_INIT
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: Server host key: ECDSA 73:<snip>:0c
debug1: Host 'ec2.compute.amazonaws.com' is known and matches the ECDSA host key.
debug1: Found key in /home/matt/.ssh/known_hosts:11
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: Roaming not allowed by server
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /home/matt/.ssh/id_rsa
debug1: Authentications that can continue: publickey
debug1: Trying private key: /home/matt/.ssh/id_dsa
debug1: Trying private key: /home/matt/.ssh/id_ecdsa
debug1: Trying private key: /home/matt/.ssh/id_ed25519
debug1: No more authentication methods to try.
Permission denied (publickey).
문제는 게이트웨이 시스템에서 키를 가져오는 대신 내 시스템에서 키를 찾으려고 한다는 것입니다.
답변1
ProxyCommand는 생각한 대로 작동하지 않습니다. 지정된 명령은 게이트웨이 시스템에서 실행되지 않습니다. 오히려 연결 머신에서 실행됩니다.
따라서 실행 흐름은 다음과 같습니다.
ProxyCommand "ssh Gateway -W %h:%p"는 "로컬" 시스템에서 실행됩니다. 이렇게 하면 로컬 상자의 RSA ID를 사용하여 게이트웨이에 대한 SSH 세션이 설정됩니다. -W 플래그는 stdin 및 stdout이 최종 목적지에 대한 게이트웨이의 TCP 세션 시작에 연결되도록 지정합니다.
프록시 세션이 설정되면 로컬 상자의 ssh는 다시 해당 세션을 사용하여 로컬 자격 증명을 사용하여 원격 SSH 서버에 인증합니다.
다소 혼란스럽기는 하지만 ProxyCommand를 단순히 로컬 SSH 클라이언트와 최종 목적지인 SSH 서버 사이에 "파이프"를 설정하는 것으로 생각하십시오. 그런 다음 해당 멍청한 파이프는 로컬 SSH 클라이언트에서 최종 대상의 SSH 서비스와 통신하는 데 사용됩니다.
핵심은 그러므로둘로컬 상자에서 실행되는 SSH 인스턴스 중 하나는 ProxyCommand이고 다른 하나는 설정하려는 실제 SSH 연결입니다! 로컬 박스에서 "ps aux" 출력을 보면 이를 확인할 수 있습니다.
그러면 인증을 위해 게이트웨이가 아닌 로컬 상자에서 키 자료를 사용하려는 이유가 설명됩니다. :-)
rsync가 작동하는 이유는 실제로 --rsh 명령으로 "ssh Gateway ssh"를 수행하고 있기 때문입니다. 이 명령은 실제로 로컬 상자에서 ssh를 한 번 실행하여 게이트웨이에 연결한 다음 원격 상자에서 다시 한 번 실행합니다. 그런 다음 원격 키 자료를 사용하십시오.
도움이 되었기를 바랍니다.