ssh scp proxy

ssh scp

필자는 jenkins를 주로 사용하며 빌드는 nodejs 기반의 서버를 배포시에는 ssh 와 scp 를 주로사용한다 .
ssh와 scp를 사용하는데에 있어 최종 서버에 접근하기까지 중간에 bridge( jump host )와 같은 host가 존재할때가 있다 .
물론 접근하고자하는 서버의 ip를 모두 public 으로 개방하면 쉽게 접근이가능하나 관리가 어려워질뿐만아니라 보안적으로도 좋지않기때문에 public host가 proxy host가 되어 내부 서버로 접근해야한다.
필자는 jenkins로 빌드할때 이런 상황이 있었으며 정리를하며 기록으로 남기기위해 글을써보려 한다 .


사전준비

필자는 기본적으로 jenkins 를 사용하여 원격지에 배포하므로 원격서버 접속시 jenkins 에게 비밀번호를 요구하지 않도록 rsa 암호화통신을 위한 사전 설정한다 .

jenkins

1
$ cat ~/.ssh/id_rsa.pub


proxy host

1
$ vi ~/.ssh/authorized_keys


destination host

1
$ vi ~/.ssh/authorized_keys


jenkins 에서 cat 명령어로 출력된 id_rsa.pub ( public key ) 를 proxy host 와 최종 접속할 destination host 의 ~/.ssh/authorized_keys 에 붙여넣기한다.
작업을 마치게되면 jenkins는 proxy host를 거쳐 destination host 에 비밀번호없이 직접적으로 접근이 가능해졌다.


ssh scp 일반적인 사용

기본적으로 proxy host를 사용하지않고 단일 remote host ssh 와 scp 는 다음과같다.

1
$ ssh <계정>@<remote host ip>

1
$ scp -r <전송할 파일/폴더> <계정>@<remote host ip>:<remote host에 전송받을 경로>

이제 proxy host를 경유하여 destination host에 ssh scp 사용법을 알아보자 .



ssh

필자의 접속 정보는 다음과 같다 . (예시)
proxy host : 121.140.166.90
destination host : 10.10.200.3

manual proxy

기본적인방법

1
$ ssh -tt jaehunpark@121.140.166.90 ssh root@10.10.200.3

아주 간단하게 쓸수있는방법이다 .
단순히 -tt 옵션과 ssh 명령어를 두번적어주면된다.
하지만 추가적인 설정이 필요하다. 위의 명령어는 proxy host( 121.140.166.90 )로 접속후 proxy host가 destincation host( 10.10.200.3 ) 로 접속을 시도하므로 proxy host의 id_rsa.pub (public key)가 destination host 의 ~/.ssh/authorized_keys 에 존재해야 호출하는 머신에서 direct로 접근가능하다.
결론적으로 destination host의 authorized_keys 에는 jenkins host의 id_rsa.pub 와 proxy host id_rsa.pub 두개가 존재해야한다 .
( jenkins를 사용하지않고 일반적으로 접속하시는것이라면 그냥 비밀번호 치셔도 됩니다 )


proxycommand 사용

1
$ ssh -o ProxyCommand="ssh -W %h:%p jaehunpark@121.140.166.90" root@10.10.200.3

proxy host를 통하여 직접적으로 접근하는 proxycommand를 사용한 방법이다

proxy after configuration

1
$ ssh server-node-1

하단의 configuration 탭의 설정을 마친후 proxy host를 거쳐 destination host에 접근하는 명령어이다.
설정만 잘 해놓는다면 정말 간단하게 접근할수있다.


scp

manual proxy

첫번째방법

1
$ scp -r -o ProxyCommand="ssh jaehunpark@121.140.166.90 nc 10.10.200.3 22" /root/.jenkins/workspace/nodejs-skeletone-v2 root@10.10.200.3:/root


두번째방법

1
$ scp -r -o ProxyCommand="ssh -W %h:%p jaehunpark@121.140.166.90" /root/.jenkins/workspace/nodejs-skeletone-v2 root@10.10.200.3:/root

첫번째방법과 두번째방법 scp 역시 ssh와 비슷하게 proxycommand 를 사용하여 파일을 전송한다. 명령어가 길다보니 조금은 지저분한 느낌이다 . 아래와같이 간단하게 사용할수있다

proxy after configuration

1
$ scp -r nodejs-skeletone-v2 server-node-1:/root

ssh와 마찬가지로 configuration 탭의 설정을 마친후 proxy host 를 거쳐 destination host 로 파일을 전송한다


configuration

1
$ vi ~/.ssh/config
1
2
3
4
5
Host server-node-1
HostName 10.10.200.3
User root
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh -W 10.10.200.3:22 jaehunpark@121.140.166.90



참고

proxy host 를 거쳐 destination host 로 ssh 나 scp 를 최초사용시에는 아래와같은 문구를 만나게될것이다.

1
2
3
4
5
root@467c66252dcd:~/.ssh# ssh server-node-1
Warning: Permanently added '121.140.166.90' (ECDSA) to the list of known hosts.
The authenticity of host '10.10.200.3 (<no hostip for proxy command>)' can't be established.
ECDSA key fingerprint is 88:65:92:d8:f8:75:b4:99:1a:f1:52:e8:b2:03:0e:a6.
Are you sure you want to continue connecting (yes/no)?

최초 접속시에는 ~/.ssh/known_hosts 접속 정보가 존재하지 않기 때문에 연결여부를 물어본후 ‘yes’ 를 입력하게되면 ~/.ssh/known_hosts 에 등록하게된다 .
개발자가 배포설정을 마치고 jenkins에게 빌드를 시작할때 jenkins는 최초접속이므로 접속정보가 존재하지않아 위의 문구를 만나게되면 가차없이 build fail이 떨어질것이다 .
또한 현재 세팅상태로는 proxy host와 destination host 두개의 host 정보가 등록되지않아 두번 요구하게될것이다 .
사전에 다음과같이 해결할수있다 .

jenkins

1
$ ssh-keyscan -H 121.140.166.90 >> ~/.ssh/known_hosts

proxy host ip를 known_hosts를 등록한후


1
$ vi ~/.ssh/config

1
2
3
4
5
6
Host server-node-1
StrictHostKeyChecking no
HostName 10.10.200.3
User root
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh -W 10.10.200.3:22 jaehunpark@121.140.166.90

StrictHostKeyChecking no 를 추가하여 destination host ( 10.10.200.3 ) 의 접속여부를 무시한다 . ( auto yes )


1
$ ssh server-node-1

최초접속이라도 어떠한 요구도 묻지않고 proxy host를 거쳐 destination host로 접속할수있다 . ( 위의 설정을 마치고나게되면 known_hosts 에 등록되게된다 )