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
      • 실무 이야기
  • 블로그 메뉴

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

    • 깃허브
  • 공지사항

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

  • 태그

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

  • 최근 글

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

티스토리툴바