JumpHost (특정 서버를 경유해 SSH 사용하기)
다른 서버를 이용해 최종 서버에 SSH 연결을 하기 위해 SSH proxy/tunneling을 사용한다.
이러한 방법을 Jump Host라고 부르는데
1. 목적 서버가 접근 IP를 제한할 때
2. 목적 서버가 방화벽/공유기 뒤에 있을 때
3. IPv4 전용 네트워크/머신에서 IPv6 전용 서버로 접속하고 싶을 때
이 경우들은 종류가 다르지만 결국 경유 서버를 이용한다면 같은 문제로 분류할 수 있어 해결책이 같다.
경유 서버를 jump_server 목적 서버를 remote_server라고 하면 jump_server은 클라이언트에서 ssh로 접속이 가능하며 jump_server는 remote_server에 네트워크 접속이 가능해야 한다.
✔︎ 해결 방법
1. Pseudo Terminal
jump server에 ssh 로그인한 뒤, remote server에 다시 ssh로 접근하기
이 명령은 ssh로 jump_server에 접속한 후 jump_server에서 로긴쉘이 아니라 ssh remote_server를 실행하는 것이다.
ssh -tt jumb_server ssh remote_server
# 위, 아래 모두 동일하게 작동한다.
ssh jump_server
(jump_server) ssh remote_server
-tt 는 ssh로 로긴셸을 실행하지 않고 명시적으로 명령어를 실행할 때 명령어가 터미널을 필요로 할 경우 Pseudo terminal을 사용할 것을알려줘야 하기 때문에 필요한 옵션이다.
한두번 접속한다면 좋은 방법이나 다음과 같은 단점이 있다.
SSH key 인증을 사용하기 까다롭다.
jump server까지는 사용할 수 있지만 remote server에 접속하기 위해서는 jump server에 private 키를 두고 있어야 한다.
이는 위험할 뿐더러 관리하기 힘들다.
SSH config를 사용하기 까다롭다.
SSH key 인증과 마찬가지로 jump server에 따로 config를 설정해야 합니다. 누가 바꿔놓을 가능성이 있어 위험하고, 관리도 번거롭다.
scp를 사용하기 까다롭다.
파일을 jump server에 노출해야한다. 마찬가지로 파일이 노출되는 문제가 있다.
2. ssh -J 옵션 사용하기
J 옵션은 위와 같은 경우를 위해 마련된 옵션이다.
ssh -J
위 명령어로 jump server를 경유해 remote server에 바로 접근할 수 있다.
ssh server만 작동하고 있다면 간편한 기능을 사용할 수 있다. (단 ssh 서버 측 설정으로 제한 가능)
3. ssh config로 간편하게 설정하기
config에는 ProxyJump를 사용해 설정할 수 있다.
# ~/.ssh/config
Host jump-server
HostName jump_hostname
User user1
Host remote-server
HostName remote_hostname
User user2
ProxyJump jump-server
ssh remote-server
IdentityFile 도 훌륭하게 작동한다.
즉 ssh에 key를 쓰고 싶다면, config에 IdentityFile 옵션을 추가하면 된다.
# ~/.ssh/config
Host jump-server
HostName jump_hostname
User user1
IdentityFile ~/.ssh/id_jump_server_key
Host remote-server
HostName remote_hostname
User user2
IdentityFile ~/.ssh/id_remote_server_key
ProxyJump jump-server
이렇게 세팅을 완료하면 scp도 간편하게 사용할 수 있게 된다.
scp ~/my_file remote-server:/home/user2/my_file
위의 명령은 jump-server를 경유해 remote-server에 파일을 보낸다.
참고