[EC2] NAT 루핑(헤어핀) 오류

이정빈·2024년 7월 14일
1

트러블슈팅

목록 보기
7/7
post-thumbnail

CI/CD를 구축하면서 계속 문제가 발생했다.

사...살려줘....


오류 상황

오류 내용

내 프로젝트는 간단하게 그리면 위 그림처럼 구성되어있다.
설명해보자면 하나의 EC2안에 MySQL 서버를 설치하여 3306포트로 구동 중이고, 도커 컨테이너 안에 스프링 서버가 있다.

그런데 스프링 서버를 실행하면 아래와 같이 DB에 연결할 수 없다는 오류가 계속 발생했다.

Cannot invoke "org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(java.sql.SQLException, String)" because the return value of "org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.sqlExceptionHelper()" is null

이상한 점은 로컬 PC에서 EC2의 MYSQL에 연결하여 스프링 부트를 돌리는 것은 잘 돌아간다는 것이다 😓

오류 코드

이 상황에서 스프링 서버에서 application.yml을 통해 MySQL과 연결을 할 때 public IP 주소를 입력했더니 계속 오류가 발생했다.

spring:
  datasource:
    url: jdbc:mysql://{public IP 주소}:3306/{DB 이름}
    username: {유저이름}
    password: {비밀번호}
    driver-class-name: com.mysql.cj.jdbc.Driver

예상 원인

인바운드 규칙 설정 및 방화벽 설정

그런데 저번 게시물에서 이미 인바운드 규칙과 방화벽 설정을 통해 MySQL Workbench로 서버에 접속하였다.

그래서 예상원인을 찾기 어려워서 하루동안 고민했다.


실제 해결 방법

public IP 주소가 아닌 private IP 주소를 사용하기

AWS 콘솔에 접속하여 사진의 주황색 부분에 있는 프라이빗 ip 주소를 application.yml에 적어주면 된다.

spring:
  datasource:
    url: jdbc:mysql://{priavte IP 주소}:3306/{DB 이름}
    username: {유저이름}
    password: {비밀번호}
    driver-class-name: com.mysql.cj.jdbc.Driver

의외로 간단한 해결방안이다.

그런데 왜 이렇게 해야할까? 왜 public IP 주소를 사용하면 안될까??


NAT 루핑(헤어핀) 문제

NAT란

NAT는 Network Address Translation의 약자로 내부 네트워크의 여러 장치가 하나의 공인 IP 주소를 공유하여 인터넷에 접속할 수 있도록 해주는 기술이다. 일반적으로 라우터에서 실행된다.

NAT 루핑(헤어핀) 문제란

NAT 루핑(헤어핀) 문제는 동일한 네트워크 내의 장치가 자신의 외부 IP 주소를 통해 통신하려고 할 때 발생하는 문제이다.
헤어핀 문제라고 불리는 이유는 네트워크 트래픽이 내부 네트워크를 떠나 외부로 나갔다가 다시 내부로 돌아오는 경로가 마치 머리핀(Hairpin)처럼 구부러져 있는 모양을 닮았기 때문이다.

나의 상황으로 예를 들어보자.

주어진 상황

하나의 EC2 인스턴스가 있고, 인스턴스에는 MySQL 서버가 설치되어 있으며 Docker 컨테이너 안에서 Spring Boot 애플리케이션이 실행되고 있다.
인스턴스의 프라이빗 IP 주소는 10.0.0.1이고, 퍼블릭 IP 주소는 203.0.113.1이다.

통신 시도 상황

Docker 컨테이너 안의 Spring Boot 애플리케이션이 MySQL 서버에 접속하려고 할 때, 퍼블릭 IP 주소 203.0.113.1을 사용하여 연결을 시도한다.

라우팅 과정

1. Spring Boot 애플리케이션에서 203.0.113.1로 패킷을 보낸다.
2. 이 패킷은 NAT 라우터를 통해 외부로 나가야 하지만, 결국에는 동일한 인스턴스 내로 다시 들어오게 된다.
3. NAT 라우터는 이 패킷을 처리하는 과정에서 루핑(Loopback)이 발생하고, 이를 처리할 수 없는 네트워크 설정에서 연결이 실패한다.

루핑(헤어핀) 문제의 원인

라우터의 제한

대부분의 NAT 라우터는 내부 네트워크의 트래픽을 외부로 내보내고 다시 내부로 받아들이는 헤어핀 트래픽을 처리하는 기능을 갖추고 있지 않다. 이는 보안 상의 이유이기도 하며, 일반적인 네트워크 사용 패턴에서는 필요 없는 기능이기 때문이다.

불필요한 트래픽 증가

동일한 네트워크 내의 통신이 외부 네트워크를 경유하게 되어 네트워크 성능이 저하될 수 있다.

복잡한 네트워크 설정

헤어핀 NAT 문제를 해결하기 위해 추가적인 네트워크 설정이 필요할 수 있다.

루칭(헤어핀) 문제의 해결방법

프라이빗 IP 사용

내부 네트워크 내에서 통신할 때는 프라이빗 IP 주소를 사용하여 직접 통신하면 된다.

간단하긴 한데 'Private IP와 Public IP가 뭐가 다르길래 이게 해결방안이지?' 싶을 수 있다.

프라이빗 IP를 사용하면 헤어핀 NAT 문제를 해결할 수 있는 이유는 내부 네트워크 내에서 직접 통신할 수 있기 때문이다. 프라이빗 IP를 사용하는 방식은 NAT 라우터를 통하지 않으므로, 트래픽이 외부 네트워크로 나갔다가 다시 내부 네트워크로 돌아올 필요가 없다. 따라서 루핑 문제가 발생하지 않는 것이다.

하루동안 삽질했지만, 그래도 생각지도 못한 문제를 해결했고, 네트워크개론에서 배웠던 NAT도 오랜만에 다시 공부할 수 있어서 좋았다.

참고

profile
사용자의 입장에서 생각하며 문제를 해결하는 백엔드 개발자입니다✍

0개의 댓글

관련 채용 정보