본문 바로가기

네트워크

서버 IP를 변경했는데도 특정 서버가 구 IP로 접속하는 이유

상황
레거시 환경, 특히 JVM 8 이하 환경에서 서버 배포를 마무리한 뒤 서버 IP를 변경했다.
DNS 레코드도 수정했고 TTL도 300초로 낮췄다
dig 명령어로 확인했을 때도 새 IP가 정상적으로 조회되었다
하지만 시간이 충분이 지난 뒤에도 특정 서버에서만 여전히 구 IP로 호출되는 로그가 발견되었다

 

이 경우 단순히 DNS 레코드 문제라고 보기 어렵다

OS 또는 애플리케이션 레벨의 캐시를 의심해야 한다

 

원인
가장 유력한 원인은 JVM DNS 캐시다
Java 애플리케이션은 InetAddress를 통해 도메인을 IP로 변환한다
이때 JVM은 DNS 조회 결과를 내부적으로 캐싱한다
문제는 Java 8 이하 환경에서 JVM DNS 캐시 정책이 예상보다 길게 유지될 수 있다는 점이다
특히 보안 매니저 설정이나 java.security 설정에 따라 DNS 결과를 무기한 캐싱할 수도 있다
그래서 OS나 dig에서는 새 IP가 보이더라도, 이미 실행 중인 Java 애플리케이션은 예전에 조회했던 구 IP를 계속 사용할 수 있다

 

 

즉, 다음과 같은 상황이 발생한다

DNS 서버    -> 새 IP 반환
dig/nslookup -> 새 IP 확인
실행 중인 JVM  -> 캐시된 구 IP 사용

 

직접 실습으로 확인하기

실습은 로컬 PC에서 진행할 수 있다

별도의 서버가 없어도 /etc/hosts를 이용하면 DNS 변견 상황을 재현할 수 있다

 

실습 환경

  • macOS 또는 Linux
  • JDK 설피 필요
  • /etc/hosts 수정 권한 필요

 

1. 테스트용 Java 코드 작성 

DnsCacheTest.java 파일을 만든다

import java.net.InetAddress;
import java.time.LocalTime;

public class DnsCacheTest {
    public static void main(String[] args) throws Exception {
        while (true) {
            InetAddress address = InetAddress.getByName("test-api.local");
            System.out.println(LocalTime.now() + " -> " + address.getHostAddress());
            Thread.sleep(3000);
        }
    }
}

이 코드는 3초마다 test-api.local 도메인의 IP를 조회해서 출력한다

 

2. /etc/hosts에 테스트 도메인 등록

sudo nano /etc/hosts

아래 내용을 추가한다

 

127.0.0.1 test-api.local

 

3. Java 코드 컴파일

javac DnsCacheTest.java

 

4. JVM DNS 캐시를 무기한으로 설정하고 실행

java -Dsun.net.inetadr.ttl=-1 DnsCacheTest

 

 

5. JVM이 기존 IP를 계속 사용하는 현상 확인

Java 실행 결과는 계속 127.0.0.1을 출력했다

6. 이 상태에서 /etc/hosts를 다음처럼 변경했다

 

OS 레벨에서 조회해보면 새 IP가 정상적으로 보인다 

OS 레벨에서는 test-api.local이 127.0.0.2로 정상 조회된다

 

 

하지만 Java 프로세스는 여전히 127.0.0.1 을 출력했다.

즉, OS는 새 IP을 알고 있지만 실행 중인 JVM은 캐시된 구 IP를 계속 사용하고 있었다

 

7. JVM DNS TTL 설정으로 해결 확인

이번에는 Java 프로그램을 종료한 뒤, JVM DNS 캐시 TTL을 5초로 설정해서 다시 실행했다

java -Dsun.net.inetaddr.ttl=5 DnsCacheTest

 

처음에는 현재 /etc/hosts 값인 127.0.0.0가 출력되었다

그 다음 /etc/hosts를 다시 아래처럼 변경했다

127.0.0.1 test-api.local

 

잠시 후 Java 프로세스도 새 IP를 반영헀다

JVM DNS 캐시 TTL을 5초로 설정하자, 실행 중인 Java 프로세스도 변경된 IP를 다시 조회해서 반영한다

 

 

결론

 

이번 실습으로 확인한 내용은 다음과 같다

-Dsun.net.inetaddr.ttl=-1

 

JVM이 DNS 결과를 계속 캐싱하여 기존 IP를 사용했다

 

-Dsun.net.inetaddr.ttl=5

JVM이 일정 시간이 지난 뒤 DNS를 다시 조회하여 변경된 IP를 반영했다

따라서 서버 IP를 변경했는데도 특정 Java 애플리케이션만 구 IP로 접속한다면, 다음 항목을 확인해야 한다

  • DNS 레코드 변경 여부
  • TTL 설정
  • OS DNS 캐시
  • JVM DNS 캐시 TTL
  • 애플리케이션 재시작 여부
  • HTTP connection pool, kee-alive, gRPC, Netty 등의 기존 커넥션 유지 여부

핵심

DNS가 변경되었다고 해서 실행 중인 Java 애플리케이션이 반드시 즉시 새 IP를 사용하는 것은 아니다. JVM DNS 캐시와 커넥션 풀 설정까지 함께 확인해야 함

 

'네트워크' 카테고리의 다른 글

Socket 통신과 Client-Server 구조 이해하기  (0) 2026.07.16