동기
dev.servername.com 같은 주소 사용하기 싫어서
목업 환경에 기기 한대밖에 없다면 모를까 /etc/hosts 혹은 Windows/system32/drivers/etc/hosts 수정은 한계가 있다.
소스코드를 수정할 수 없는 프로그램들에게 훼이크 먹이기 위해.
해결책
포터블한 적당한 오픈소스 DNS를 구한다. 나는 아무래도 Java 가 제일 편해서 dnsjava 를 사용하기로 했다. 지금 이 글을 쓰는 시점 최신버전은 2011년 10월 24일에 릴리즈된 2.1.3 이다.
압축을 풀면 살짝 머리가 아프다. 루트 디렉토리에 jnamed 란 클래스가 있다. 이녀석은 jnamed.conf 파일을 필요로 하는데 예제 파일이 존재하지 않는다. jnamed.java 소스를 보면 되는데 이것 역시 귀찮은 사람들은 아래와 같이 한 줄 적어주시면 되겠다.
primary 도메인명 zone파일명
도메인명이 service.com 이고 zone 파일 이름이 service.com.zone 이라면
primary service.com service.com.zone
zone 파일은 ISC BIND 의 zone 파일을 그대로 사용할 수 있으니 추가 설명은 생략한다.
한가지 문제. dnsjava 는 forward 기능을 제공하지 않는 것만 같다. 즉, 이 dns 에 등록되지 않은 룩업이 생기면 NXDOMAIN (Non-Existent Domain) 을 리턴하게 된다. 지극히 정상적인 행동이지만 목업 환경에는 어울리지 않는 모습이다. 오픈소스이기도 하니 성급히 고치는 전략을 택한다.
일단 org.xbill.DNS.Message.java 에 아래와 같은 메소드를 꾸겨 넣는다.
public boolean didFind() {
boolean found = false;
for (List section : sections) {
if (section == null)
continue;
for (Object aSection : section) {
Record record = (Record) aSection;
if (!(record instanceof EmptyRecord)) {
found = true;
break;
}
}
}
return found;
}
레코드를 찾았는지 못찾았는지 확인하는 메소드를 만들어봤다. 이제 jnamed.java 의 generateReply 메서드 마지막에 방금 만든 didFind()를 꾸겨넣자. canonical name 을 무시하는 어이없음은 귀엽게 봐주시길.
response.setTSIG(tsig, Rcode.NOERROR, queryTSIG);
if( !response.didFind() ) {
Record[] run = new Lookup(queryRecord.getName(), queryRecord.getType()).run();
if( run!=null ) {
for (Record record : run) {
response.addRecord(record.withName(queryRecord.getName()), Section.ANSWER);
}
}
}
return response.toWire(maxLength);
이제 네트워크 환경설정에서 DNS 서버를 하나 추가하자. 주소는 127.0.0.1. 이렇게되면 Forward Query 를 보낼 DNS 서버 주소가 localhost 가 되서 쿼리가 뺑이치게 된다. 이를 방지하기 위해 jnamed.java 의 main 메서드 맨 위에 아래와 같은 코드를 넣어준다.
Lookup.setDefaultResolver(new ExtendedResolver(new String[]{"8.8.8.8", "168.126.63.1"}));
300KB 짜리 목업 DNS 서버 구축 끝.
Comments
1 thoughts shared
ruseel
이 글 덕분에, 처음으로 직접 바로 바로 고칠 수 있는 DNS를 써 보았네요. Android에서 웹을 만들고 있는데 제 컴퓨터로 접속하기 위해서 dns만 올려주신 것 처럼 띄우고 잘 쓰고 있습니다. 감사합니다~
Continue Reading
Discover more thoughts and insights
의사소통은 어렵다.
타인과 함께 일하면서 시너지를 얻는 경우는 많지 않다. 의사소통에 많은 시간을 쏟아부어야 하기 때문이다. 각자 알고 있는 것을 상대방에게 잘 설명해줘야 한다. 의사소통 능력이 절대적으로 높은 사람이 존재한다면
착한 사람이 조직을 망치는 방법
착한 사람들은 시스템의 문제나 조직의 문제를 보고, 그것을 지적하고 프로세스를 개선하는 길을 선택하는 대신, 책임감 중독에 빠져 스스로를 희생하여 조직의 문제를 자신이 커버해야 된다고 생각한 뒤, 이 생각을
한 주를 시작하며
한 주를 시작하며 기분전환을 위해 타자방 '성격장애' 범주 문구들 몇개 옮겨본다. 어떤 사람과 관계가 안 좋은 것은 나의 대인관계에 문제가 있다 혹은 모든 사람들이 나를 좋아하지 않는다로 과도하게 일반화되어