배스천 호스트를 이용하여 서버를 접속하는 방법(OS별)

배스천 호스트를 경유하여 내부 서버에 접근하는 방법을 설명한 블로그입니다.
2021.11.23

안녕하세요 클래스메소드의 수재입니다.
내부 서버로의 직접적인 접속을 제한하기 위해 배스천 호스트(bastion host)를 이용하는 것은 다양한 안건에서 요구되는 사항입니다.
이번 글에서는 배스천 호스트를 이용하여 내부 서버에 접속하는 방법을 알아봅니다.

배스천 호스트란?

내부 서버나 중요 리소스를 보호하기 위해 접근이 허락된 호스트이며 퍼블릭 환경에서 접근 가능한 네트워크위에 구축됩니다.
배스천 호스트의 정보는 일반 유저들에게 공개하지 않으며 접근 또한 제한된 소스로부터의 요청만 허용합니다.

AWS에서 제공하고 있는 배스천 호스트 배포 가이드는 다음을 참고해주세요.
AWS 기반 Linux 배스천 호스트

이어서 Mac에서 Linux / Windows 배스천 호스트를 경유하여 내부 호스트에 접근하는 방법을 알아보도록 하겠습니다.
연결할 대상은 다음과 같습니다.

  • 배스천 호스트 : 52.69.183.110(퍼블릭, 리눅스)
  • 내부 서버(프라이빗)
    • 189.0.30.243(윈도우)
    • 189.0.30.245(리눅스)

Linux - Linux/Windows

Linux 배스천 호스트를 경유하여 내부 서버로 접속할 때는 SSH 커맨드를 이용하여 접속합니다.
SSH를 이용한 방법은 여러가지가 있습니다. 배스천 호스트에 SSH 접속한 후 해당 터미널에서 내부 서버로 다시 접속할 수 도 있지만
이 글에선 제가 자주 사용하는 로컬 포트포워딩을 예로 들어 설명하겠습니다.

커맨드는 다음과 같습니다.

ssh -L {로컬에서 접속할 포트}:{내부 서버 IP}:{내부 서버에 접속할 포트} -i {배스천 호스트 접속에 필요한 키페어} {유저명}@{내부서버 IP}

내부 서버가 Windows 인 경우

다음의 커맨드를 실행합니다.

ssh -L 13389:189.0.30.243:3389 -i publicTestKey.pem ec2-user@52.69.183.110

성공적으로 연결한 후 SSH 세션 창을 닫지 말고 아래와 같이 RDP 접속 소프트웨어를 이용하여 커맨드에서 설정한 로컬에서 접속할 포트(13389)와 localhost로 접속을 하면 내부 서버로 RDP 접속이 가능합니다.

(접속 성공!)

내부 서버가 Linux 인 경우

둘 다 SSH 연결이기 때문에 굳이 포트포워딩 할 필요없이 배스천 호스트에 SSH 접속 후 해당 터미널에서 내부 서버로 SSH 연결을 합니다.
물론 윈도우와 마찬가지로 포트포워딩도 가능합니다.

# 포트포워딩
ssh -L 11122:189.0.30.245:22 -i publicTestKey.pem ec2-user@52.69.183.110

# 다른 터미널에서 로컬호스트로 연결
ssh -p 11122 -i test.pem ec2-user@localhost

Windows - Linux/Windows

Windows를 이용하고 있는 배스천 호스트에서 SSH를 지원한다면 위의 설명과 똑같이 SSH 를 이용한 포트 포워딩으로 접속하시면 됩니다.
만약 SSH 접속이 불가능 하다면 Microsoft Remote Desktop 이나 Parallels Client 등의 프로그램을 이용하여 배스천 호스트로 RDP 접속을 합니다.
해당 글에선 Parallels Client 를 이용하여 접속하겠습니다.

내부 서버가 Windows 인 경우

배스천 호스트가 Windows인 경우 기본으로 내장되어 있는 Remote Desktop을 이용하거나 별도의 소프트웨어를 도입합니다.

내부 서버가 Linux 인 경우

OpenSSH를 설치하여 커맨드로 내부 서버에 SSH 접속을 합니다.
내부 서버에는 이미 SSH가 있으니 배스천 호스트에만 Client로 OpenSSH를 설치하면 됩니다.

# OpenSSH 지원 확인
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'

# 설치되지 않았다면 다음과 같은 결과
Name  : OpenSSH.Client~~~~0.0.1.0
State : NotPresent

Name  : OpenSSH.Server~~~~0.0.1.0
State : NotPresent

# -----
# OpenSSH Client 설치
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

# 설치 후 ssh로 내부 서버 접속
ssh -i test.pem ec2-user@189.0.30.245

혹은 putty, mobaXterm, tera term, XShell 등 SSH 접속을 지원하는 소프트웨어를 설치하여 접속합니다.

OpenSSH 설치도 외부 소프트웨어 도입도 할 수 없는 경우

배스천 호스트가 Windows이고 내부 서버가 Linux인데 OpenSSH 설치도 외부 소프트웨어 도입도 할 수 없는 경우에는
윈도우 2000 부터 유틸리티에 내장되어 있는 netsh를 이용하여 포트포워딩을 설정합니다.
커맨드는 다음과 같습니다.

# netsh interface portproxy add v4tov4 listenport={입력 받을 포트} listenaddress={배스천 호스트의 프라이빗 IP} connectport=22 connectaddress={내부 서버 IP}
netsh interface portproxy add v4tov4 listenport=22 listenaddress=189.0.20.202 connectport=22 connectaddress=189.0.30.245

이후 포트포워딩이 제대로 설정되었는지 확인하기 위해 다음 커맨드를 실행합니다.

netsh interface portproxy show v4tov4

그리고 방화벽에서 포트 포워딩으로 들어오는 포트를 개방 합니다.

이후 Mac 에서 배스천 호스트의 IP와 listenport 에 지정한 포트 번호로 접속을 시도하면 내부 서버의 22번 포트로 접속이 가능합니다.

# ssh -i {내부 서버 키페어} {내부 서버 유저}@{배스천 호스트 퍼블릭 IP}
ssh -i test.pem ec2-user@52.69.183.110

포트 포워딩 해제는 다음과 같습니다.

# netsh interface portproxy delete v4tov4 listenport={입력 받던 포트} listenaddress={배스천 호스트의 프라이빗 IP}
netsh interface portproxy delete v4tov4 listenport=22 listenaddress=189.0.20.202

마치며

여기에 소개된 방법 이외에도 배스천 호스트를 이용하여 내부 서버에 접근하는 방법이 있지만 이 글에서 설명한 방법이면 대부분 대응할 수 있습니다.

긴 글 읽어주셔서 감사합니다.
오탈자 및 내용 피드백은 언제나 환영합니다. must01940지메일 로 보내주시면 감사합니다.