회사에서는 aws를 통해 서비스를 배포 운영하고 있는데, 실제 서비스들은 외부에서 접근이 불가능한 private subnet에 위치해있다. 그리고 외부에서 이 서비스를 접근하기 위해서 반드시 거쳐가야 하는 일종의 게이트웨이 역할을 하는 서버가 있는데 바로 베스천 서버이다.
베스천 서버는 public subnet에 위치하며, 여러 보안적인 이슈를 담당한다. 특정 IP만 특정 subnet에 접근가능하도록 강제를 하거나, 서버 접근 이력 정보를 남기는 등 보안적으로 많은 이점이 있다.
베스천 서버를 통해 실제 서버로 접속을 하려면 ssh 터널링을 통해 로컬 호스트에 포트를 띄우고 해당 포트로 접근을 해야했다.
ssh -fnNT -L <로컬에 띄울 프록시 포트>:<private subnet에 위치한 서버 IP>:22 <SSH 접속 계정>@<베스천 서버 IP> -i <인증서 키파일>
위와 같이 타겟 서버에 맞게 입력을 해보면
아래와 같이 성공적으로 ssh 프록시 포트가 열린 것을 확인할 수 있다.
이제 해당 포트로 ssh 접속을 하면 private net에 위치한 서버를 베스천 서버를 통해 접근하게 된다.
ssh <SSH 접속 계정>@localhost -p <프록시 포트> -i <인증 키 파일>
이렇게 하면 ssh 명령어를 통해 베스천 서버를 통해 private subnet에 위치한 서버로 ssh 연결을 할 수 있다.
하지만 단점이 있는데, 접근할 일이 있을 때마다 터널링 포트를 띄우고, 해당 포트로 ssh 연결을 해야 한다는 점이다.
이러한 점은 ~/.ssh/config 파일을 적극 활용하면 해결할 수 있다.
가장 먼저 ssh 연결 시 사용했던 인증 키파일을 ~/.ssh/하위에 옮긴다.
cp <ssh 접속 키파일> ~/.ssh
그다음 아래 명령어를 통해 ~/.ssh/config 파일을 열자. 없다면 만들어도 좋다.
vim ~/.ssh/config
그 다음 아래와 같이 입력한다.
Host bastion
HostName <bastion 서버 IP>
User <SSH 접속 계정>
ForwardAgent yes
IdentityFile <베스천 서버 접속 ssh 키파일 절대 경로>
Host staging <ssh 접속 호스트 명, 임의대로 지정해도 좋다>
HostName <private subnet에 위치한 타겟 서버 IP>
User <SSH 접속 계정>
IdentityFile <베스천 서버 접속 ssh 키파일 절대 경로>
ProxyCommand ssh bastion -W %h:%p
위와 같이 작성한 다음 저장한 후, 아래와 같이 명령어를 실행하면 된다.
ssh staging
이전에는 접속하기 위해 터널링 포트를 띄우고 다시 해당 포트로 ssh 연결하던 단계가 ssh 명령어 하나로 줄어들었다.
실제로 명령어를 실행하면 다음과 같다.
해당 명령어를 실행하면, 베스천 서버로 연결한 뒤에 다시 private subnet에 위치한 서버로 proxy된다. 나 같은 경우 접속 인증 키파일에 passphrase가 설정되어있어서 베스천 한번, 타겟 서버 한번 이렇게 총 두 번 비밀번호를 입력을 해야 한다.
하지만 너무 간편해졌다. 동일한 비밀번호를 두 번 정도 입력하는 거야 큰 부담이 되진 않았다.
몇 달을 처음 제시한 방법처럼 터널링 포트를 띄우고 접속을 했었는데, 지금은 퇴사하신 시니어 서버 개발자님의 도움으로 꿀팁을 전수받았다. 나와 같은 고통을 겪는 사람들에게 많은 도움이 되었으면 좋겠다.
'Programming > Server' 카테고리의 다른 글
[Vim] 여러 줄 복사 붙여넣기 (0) | 2021.01.22 |
---|---|
[PowerShell] Response Content 전부 확인하기 (2) | 2020.12.20 |
[Shell Script] Ctrl + 방향키 (Left or Right) 가 안먹힐 때 (0) | 2020.11.23 |
[Shell Script] SSH 연결 시 Bad Permission Key (0) | 2020.11.17 |
[Shell Script] Docker 컨테이너별 이름과 Docker IP 리스트 출력 (0) | 2020.11.17 |