SSH 터널링과 바스천 서버, 그리고 안전한 서비스 공개 방법


기업 환경이나 클라우드 아키텍처에서 외부와 내부망을 안전하게 연결하는 것은 필수적인 보안 요소다. 특히 내부망에 존재하는 서비스는 직접적으로 인터넷에 노출되는 순간부터 공격 표면이 급격히 넓어지기 때문에, 이를 어떻게 설계하느냐가 보안과 안정성의 핵심이 된다. 여기서는 SSH 터널링바스천(Bastion) 서버를 활용하여 안전하게 서비스를 외부에 공개하는 방법을 정리한다.


1. 바스천 서버의 개념과 역할

**바스천 서버(Bastion Host)**는 외부에서 내부망으로 진입하기 위한 유일한 관문 역할을 수행한다. 일반적으로 다음과 같은 특징을 가진다.

  • 이중 네트워크 연결: 외부망(인터넷)과 내부망(사설 네트워크) 모두에 접근 가능한 네트워크 인터페이스를 가진다.
  • 최소 서비스 운영: 불필요한 포트를 닫고, 관리 및 접속에 필요한 서비스만 구동한다.
  • 접속 기록 관리: 모든 접속 시도를 로깅하고, 권한을 세밀하게 관리한다.

바스천 서버는 종종 **점프 서버(Jump Server)**라는 용어로도 불린다. 점프 서버는 단어 그대로 내부망으로 ‘점프’하기 위해 거치는 중간 서버라는 의미를 가진다. 두 용어는 기술적 구현 측면에서는 거의 동일하지만, 보안 아키텍처 설계에서는 ‘바스천’이라는 표현이 더 자주 사용된다.


2. SSH 터널링의 원리

SSH(Secure Shell)는 기본적으로 원격 서버에 안전하게 접속하기 위한 프로토콜이지만, 이를 이용하면 포트 포워딩(port forwarding) 기능을 통해 내부망의 서비스에 안전하게 접근할 수 있다.

로컬 포워딩(Local Port Forwarding, -L)

  • 형식: ssh -i <키파일> -p <포트> -L [바인드주소:]로컬포트:대상호스트:대상포트 사용자@중간서버
  • 동작: 로컬 머신에서 지정한 포트로 들어오는 트래픽을 SSH 연결을 통해 대상 호스트와 포트로 전달한다.
  • 활용 예시: 개발자가 로컬에서 127.0.0.1:8001로 접속하면 내부망의 172.16.x.x:8001 서비스로 연결.

리버스 포워딩(Remote Port Forwarding, -R)

  • 형식: ssh -R 원격포트:대상호스트:대상포트 사용자@중간서버
  • 동작: 원격 서버의 포트를 로컬 또는 제3의 서버로 연결.
  • 활용 예시: 로컬에서 구동 중인 개발 서버를 외부 테스트 서버에서 접근하도록 할 때.

동적 포워딩(Dynamic Port Forwarding, -D)

  • SOCKS 프록시를 생성하여 다중 호스트로의 유연한 트래픽 라우팅이 가능.

3. 터널링만으로는 부족한 이유

로컬 포워딩을 이용하면 로컬에서 내부망 서비스에 안전하게 접근할 수 있지만, **일반 사용자가 브라우저로 바로 접속할 수 있는 형태의 ‘공개 서비스’**로 만들기에는 한계가 있다.

  • 로컬 바인드 주소가 기본적으로 127.0.0.1이므로 외부에서는 접근 불가
  • SSH 키를 소유한 사용자만 연결 가능
  • HTTPS 인증서가 적용되지 않음

4. 안전한 서비스 공개를 위한 아키텍처

1) 바스천 서버 + Nginx 리버스 프록시

가장 보편적이고 안전한 방식은 바스천 서버에서 Nginx를 실행하여 외부 도메인을 HTTPS로 받고, 내부망 서비스로 프록시 패스하는 구조다.

[클라이언트 브라우저] → (HTTPS) → [바스천 Nginx] → (내부망) → [서비스 서버]

장점

  • HTTPS 적용 가능 (TLS 인증서)
  • 외부에는 바스천 IP와 도메인만 노출
  • 내부 서버는 여전히 사설망에서 보호

예시 설정

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    location / {
        proxy_pass http://172.16.9.71:8001;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
    }
}

2) HTTPS 인증서 발급

HTTPS를 위해서는 TLS 인증서프라이빗 키가 필요하다.
이는 SSH 키와 전혀 다른 것이며, 브라우저 통신 암호화에 사용된다.

  • 무료 발급: Let’s Encrypt + Certbot
  • 유료 발급: 공인 인증기관(CA)에서 구입

3) 방화벽 및 보안그룹 설정

  • 외부에서 바스천의 80/443 포트만 개방
  • SSH 포트는 특정 IP만 접근 가능하도록 제한
  • 내부망 서비스 포트는 외부에서 접근 불가하게 설정

5. 운영 팁

  • KeepAlive: SSH 터널링 연결이 유지되도록 ServerAliveInterval, ServerAliveCountMax 설정
  • 자동 재연결: autossh 또는 systemd를 활용하여 터널 끊김 시 자동 복구
  • 접속 기록 로깅: 모든 요청과 접속을 기록하여 감사 추적 가능하게 구성
  • 접근 제어: 필요 시 Nginx에서 IP 화이트리스트, 인증, 속도 제한 적용

6. 결론

바스천 서버와 SSH 터널링은 내부망 자원을 외부로 안전하게 연결하는 강력한 수단이다. 그러나 단순 터널링만으로는 공개 서비스 운영 요건을 충족하기 어렵다.
외부 사용자를 대상으로 하는 서비스라면, 바스천 서버에 HTTPS 리버스 프록시를 구성하여 트래픽을 내부망 서비스로 전달하는 방식이 보안성과 편의성을 동시에 충족시킬 수 있다.


코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다