SSH 터널링 + hosts 파일을 이용한 로컬 개발 도메인 라우팅

2025. 12. 10. 21:39·Network
반응형

새로운 개발 건이 들어왔는데, 고객사 내부 네트워크 시스템에 접근해야 했다.

편하게 외부 컴포넌트라고 부르겠다.

 

그러나 본인 로컬에서는 고객사 내부 네트워크에 접근할 수 없었다.

대신 개발 서버는 고객사 내부 네트워크와 통신이 가능하므로 테스트가 가능하다.

그럼 외부 컴포넌트는 개발 서버에 배포하고만 테스트가 가능한걸까..?

 

오늘은 이에 관한 얘기를 해보고자 한다.

SSH 터널링 + hosts 파일을 이용한 로컬 개발 도메인 라우팅

현재 네트워크 구조를 보면 아래와 같다.

로컬(AWS VPN 접속) -> 개발 서버 (AWS VPC 개발 네트워크) -> 외부 컴포넌트(고객사 내부 네트워크)

 

또한 외부 컴포넌트는 443 포트만 허용한다.

 

이제 로컬에서 외부 컴포넌트에 접속할 수 있는 구조를 만드는 과정을 설명해보겠다.

 

1. Hosts 파일 : 도메인 -> 로컬 주소 (127.0.0.1)로 우회

브라우저, 애플리케이션은 DNS 쿼리보다 hosts 파일을 우선 참고한다.

본인은 mac 이라 /etc/hosts 파일에 아래와 같이 작성했다.

127.0.0.1  internal-component.example.com

 

이렇게 작성하면 로컬 PC가 internal-component.example.com에 접근할 때 DNS에 쿼리하지 않고 로컬 127.0.0.1로 요청을 보낸다.

2. SSH 로컬 포워딩: 로컬 포트 -> 원격 서버로 터널 생성

SSH 로컬 포워딩은 다음 원리로 동작한다.

  1. 로컬 특정 포트 (예시: 9999)에 들어온 트래픽을 SSH를 통해 암호화된 터널로 전송하고
  2. 개발 서버를 거쳐
  3. 외부 컴포넌트 특정 포트(필자의 경우 443)로 전달한다.

이를 통해 로컬의 127.0.0.1:9999 가 internal-component.example.com:443 동일해진다.

 

예시 명령어는 아래와 같다.

ssh -L 127.0.0.1:9999:internal-component.example.com:443 user@bastion-host

// 흐름
[로컬 PC]
  ↓ (1) hosts 파일: internal-component.example.com → 127.0.0.1:9999
[127.0.0.1:9999]
  ↓ (2) SSH 터널
[개발 서버]
  ↓ (3) 실제 요청
[고객사 내부 네트워크: internal-component.example.com:443]

 

 

필자는 .pem 키를 바인딩해야하고 여러 번 사용할 거 같아 Termius라는 소프트웨어를 사용했다.

 

https://termius.com/index.html

 

Termius - Modern SSH Client

Termius is a modern SSH client for Mac, Windows, Linux, iOS and Android. Connect with one click from any device.

termius.com

 

그럼 필자의 요청을 단순화하면 아래와 같다.

curl https://internal-component.example.com:9999

 

마지막으로 핵심 개념을 정리했다.

  • AWS VPN: AWS VPC 내 개발 서버 접근
  • SSH 터널링: 개발 서버를 경유지로 활용
  • hosts 파일: SSL 인증서 검증 통과

주의할 부분

만약 1번을 진행하지 SSH 터널링만 진행하면 아래와 같은 에러들이 나올 것이다. 

  • SSL certificate problem: unable to get local issuer certificate
  • SSL: no alternative certificate subject name matches target host name

 

브라우저나 애플리케이션은 도메인 이름을 사용하여 SSL 연결을 시도하는데, /etc/hosts 파일을 설정하지 않으면 internal-component.example.com이 로컬 IP(127.0.0.1)로 직접 연결된다.

그러나, 이 IP 주소로 접속하면 SSL 인증서에 해당 도메인 이름이 포함되어 있지 않기 때문에, "호스트 이름 불일치" 오류가 발생한다.

 

SSL 인증서는 도메인 이름(예: internal-component.example.com)과 IP 주소를 비교하는데, 이때 IP 주소로만 연결되면 인증서의 도메인 이름과 일치하지 않아서 오류가 발생하는 것이다.

 

 

 

이상으로 포스팅을 마칩니다. 감사합니다.

 

반응형
'Network' 카테고리의 다른 글
  • 5GHz Wi-Fi가 보이지 않아요
  • 성공과 실패를 결정하는 1%의 네트워크 원리 6장: 여행의 끝
  • 성공과 실패를 결정하는 1%의 네트워크 원리 5장: 방화벽과 캐시 서버
  • 성공과 실패를 결정하는 1%의 네트워크 원리 4장: 액세스 회선과 프로바이더의 탐험
Debin
Debin
공부 기록을 남기며 게시글 리팩토링을 진행하는 블로그입니다.
  • Debin
    리팩토링하는 블로그
    Debin
  • 전체
    오늘
    어제
    • 분류 전체보기
      • DB
        • DB 기초
        • MySQL
        • SQL 튜닝
      • OS
      • Network
      • Git
      • 디지털콘텐츠기획
      • 소프트웨어공학
      • 코딩테스트
        • 프로그래머스
        • 백준
        • 인프런
      • 공부 일지
      • 독서
        • 클린코드
        • 일상 속 사물이 알려주는 웹 API 디자인
        • 토비의 스프링
        • 객체지향의 사실과 오해
        • 자바 잘 읽는 법
      • 기록 및 회고
      • Cloud
        • AWS
      • 개발
        • Java
        • Spring Core
        • Spring MVC
        • Spring DB
        • Spring Boot
        • Spring Security
        • Spring Batch
        • JPA
        • Test
        • Android
      • 대외활동
        • UMC SERVER
        • 카엔프 SW 아카데미
      • 프로젝트
      • Docker
      • Gradle
      • ELK
      • 실무 이야기
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

    • 본인 깃허브입니다!
  • 인기 글

  • 태그

    토비의 스프링
    운영체제
    JPA
    AWS
    트랜잭션
    ORM
    spring
    도커
    SQL
    spring boot
    redis
    객체지향
    인덱스
    container
    spring mvc
    객체
    docker
    자바
    AOP
    mysql
    리눅스
    프록시
    스프링 부트
    test
    컨테이너
    innodb
    Java
    코딩 #개발자 #노마드북클럽 #노개북
    스프링
    데이터베이스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
Debin
SSH 터널링 + hosts 파일을 이용한 로컬 개발 도메인 라우팅
상단으로

티스토리툴바