본문 바로가기
Server

MSA 고군분투기 — (1) JAVA의 DNS Cache 이슈 해결기

by YangsDev 2020. 1. 6.

 

내가 만든 서비스는 기본적으로 DNS 기반으로 서비스를 다 하고 있다. account.yangs.internal , search.yangs.internal, mariadb.yangs.internal 등등..

서비스중에 문제가 생기거나 구성 변경으로 인하여 혹은 아마존 내부의 이슈가 생기면 DNS에 IP를 스위칭해서 HA하는 형태로 운영중이었다.

어느날은 DB에 장애가 발생하여, 자동으로 IP가 변경되었는데 Application 레벨에서 전환이 진행이 안되어서 재기동으로 해결 한 기억이 있다.

DNS 서버 설정 문제인가 봤는데, DNS서버의 문제가 아닌 JAVA 클라이언트 의 DNS Cache 정책으로 인하여 발생한 이슈였다.

오늘은 그 이야기를 해보려고 한다.

DNS 공격을 방지하기 위한 JAVA의 정책

JVM의 버전에 따라 다르긴 하지만 1.6 이전의 경우는 Default로 Forever 1.6 이후 버전에 대해서는 30초 DNS Cache 정책이 들어간다고 한다.

그 이유로는 DNS 공격을 막기 위해서 라고 이야기 한다.

사실 예전에는 IP가 잘 바뀌는일이 없었으니 별로 문제가 없었을것같지만 요즘 같은 상황에서는 조금 문제가 있는 정책이 아닌가 싶다.

Google의 reCAPTCH 문서에서도 JAVA Application을 통해 개발 할때 DNS Cache에 대한 문제를 언급하고 있다.

 

Using reCAPTCHA with Java/JSP  |  Google Developers

Important: Version 1.0 of the reCAPTCHA API is no longer supported, please upgrade to Version 2.0. Learn more The reCAPTCHA Java Library provides a simple way to place a CAPTCHA on your Java-based website, helping you stop bots from abusing it. The library

developers.google.com

JAVA의 DNS Cache 정책

서론에서 간단하게 JAVA의 DNS Cache 정책에 대해서 이야기 했지만, 한번 더 짚고 가는 느낌으로 정리해본다.

SecurityManager의 존재 여부로 조금씩 달라지는데 SecurityManager가 존재 할 경우는 보안상의 이유로 Application이 켜진동안 Cache를 만료시키지 않고, SecurityManager가 존재하지 않을경우, 30초간 Cache하는게 기본값이다.

이 Cache 정책 변경 할 수 없는가?

당연히 방법은 있다. JAVA에서는 아래와 같이 2가지 방법을 제시한다

  1. Java 설정 파일에서 내용 변경

$JAVA_HOME/jre/lib/security/java.security 에 파일을 열어 networkaddress.cache.ttl 라는 키를 수정 해주면 된다.

변경을 원하는 경우 주석을 풀고 원하는 시간을 입력해주면 된다 기준 시간은 sec이다.

networkaddress.cache.ttl=0

2. SecurityManager를 통한 설정

사실 1번 정책으로 전체 변경을 해주면 되긴하지만, 여러가지 사정으로 인하여 특정어플리케이션만 수정해줘야 하는 경우가 있다.

그 경우에는 Application initialize 과정에 아래와 같이 설정 해주도록 하자

java.security.Security.setProperty(“networkaddress.cache.ttl” , “60”);

나의 경우는 우리 DNS 서버를 믿긴했지만.. 혹시 모르는 상황에 대비하여 60초로 지정하여 사용중이다.

마치며

Cloud 형태의 IP가 자주 변경되는 서버가 많아지고, MSA와 같은 상황에서 여러 서버로 쪼개지면서 IP가 아닌 DNS 기반 요청이 많아지면 한번쯤은 겪는 이슈 일 것 이다.

다른 사람들은 이런 이슈가 생겼을때 이글을 보고 덜 멘붕하기를 바라며 이 글을 마친다.

부록1. Python에서는 어떻게 하고있지?

 

[입 개발] I don’t know DNS Caching

흐음, 입 개발 전문가 CharSyam  입니다. 나름 입 개발을 오래해보긴 하고, DNS 프로토콜도 직접 구현해보고, Dynamic DNS를 Zookeeper 기반으로 만들어보기도 해서 잘 안다고(이렇게 적고 실제로는 일도 모른다고 읽으시면 됩니다.) 생각했는데… 제 상식을 깨는 일이 발생했습니다.(다른 분들의 상식이 아니라 제 상식이니 …

charsyam.wordpress.com

이 이슈를 마무리 하던 시점에 과연 다른언어들은 어떤식으로 하고 있을까 생각이 들었고, 요즘 핫하다고 하는 Python은 어떻게 처리하는지 찾아보았다.

 

살짝 충격이었다. 언어 Level에서 아예 DNS Cache를 아예 하지 않는다는 의미다. 물론 지금 JAVA DNS Cache이슈에 대해 이야기 하면서 급 태세전환을 해서 이런 이야기를 하면 안되긴하지만 그냥 조금 충격이다.

결론적으로 보면 요청 건 마다 DNS Lookup 하는 시간동안의 레이턴시는 깔고간다는 뜻이다. 이런건 리눅스 NSCD 같은 데몬을 깔아서 해결 할 수 있긴 하지만 조금 충격이긴했다.

참고 문헌

'Server' 카테고리의 다른 글

MSA 고군분투기 — (1) JAVA의 DNS Cache 이슈 해결기  (0) 2020.01.06

댓글0