BIND 동적 업데이트 하기
리눅스/설치외부에서 DHCP로 변경되는 IP를 BIND에 동적으로 업데이트 해 주기
기본적인 문서는 아래를 참조
http://bind.cslab.kr/dynamic-update
외부 업데이트를 위해서 TSIG (Transaction Signature)를 이용함
1. 서버측 TSIG 설정
TSIG 키 생성
- -a hmac-md5 : 알고리즘 종류
- -b 128 : 키 길이(128 bit) / 최대값 : 512 bits
- -n HOST : 키 종류(HOST)
# dnssec-keygen -a hmac-md5 -b 128 -n HOST test.com.
- 생성파일 확인 : 다음 2개의 파일이 생성됨
K{name}.+157.+{random}.key
K{name}.+157.+{random}.private
K{name}.+157.+{random}.private
{name}은 저 위에서 HOST 에 지정한 도메인(test.com) 명임
- named.conf 수정
zone “test.com" {
type master;
file “test.com.external.zone.db";
// TSIG Key Based Access Control
allow-update { key test.com.; };
};
type master;
file “test.com.external.zone.db";
// TSIG Key Based Access Control
allow-update { key test.com.; };
};
key "test.com." {
algorithm hmac-md5;
secret "XXXXXXXXXXXXXXXXXXXX";
};
algorithm hmac-md5;
secret "XXXXXXXXXXXXXXXXXXXX";
};
named.conf 의 해당 도메인(test.com)에 allow-update 부분에 key로 업데이트 하도록 추가
아래쪽 XXXXX 부분에는 위에서 생성한 .private 파일안의 Key: 이후에 나오는 문자열을 복사해 넣는다.
named.conf 는 다수의 사람에게 공개될 수 있으므로, 위의 key 부분은 별도의 파일로 만들어 주는 것이 좋다
이럴 경우에는 예를 들면 tsig.key 라는 파일에 위 구문을 저장한 후 named.conf 에는
include "/etc/tsig.key";
를 추가해서 Key 파일을 읽어 들이도록 한다.- 파일권한설정
chown named named;
2. 클라이언트 측 스크립트
원격지 DNS를 동적으로 업데이트할 때는 nsupdate를 이용한다.
서버에서 만든 2개의 키파일을 복사해 온다.
#!/bin/sh
# Update the name server with our info
HOSTNAME=host.domain.com
PREV_FILE=/root/prev_ip
PREV_IP=`cat $PREV_FILE`
CUR_IP=`/sbin/ifconfig eth0 | head -2 | tail -1 | awk '{ printf("%s\n", $2); }' | sed "s/addr://"`
if [ "$PREV_IP" != "$CUR_IP" ]
then
/usr/bin/nsupdate -d -k /root/keys/Kdomain.com.+157+59903.key <<-EOF
prereq yxdomain $HOSTNAME
update delete $HOSTNAME A
update add $HOSTNAME 60 A $CUR_IP
send
EOF
echo $CUR_IP > $PREV_FILE
fi
exit 0
다음 명령으로 nsupdate를 실행
nsupdate -d -k K{name}.+157.+{random}.private
>prereq nxdomain <호스트명>.
>prereq yxdomain <호스트명>.
>
위에서 보듯이 prereq 로 호스트명을 지정한다.>prereq nxdomain <호스트명>.
>prereq yxdomain <호스트명>.
>
이때 호스트명이 이미 존재할 경우 yxdomain 을 없을 경우 nxdomain 을 입력해 주어야 한다..
자세한 건 BIND 문서를 참조
호스트를 추가 하거나 삭제 하는 명령어를 실행하고 최종적으로 send 명령어로 명령을 전송한다.
nsupdate -d -k Ktest.com.+157.+12345.private
>prereq yxdomain new.test.com.
>update delete new.test.com.
>update add new.test.com. 60 IN A 192.168.0.5
>show
>send
>prereq yxdomain new.test.com.
>update delete new.test.com.
>update add new.test.com. 60 IN A 192.168.0.5
>show
>send
아래는 자동으로 IP를 업데이트 하는 스크립트이다.
#!/bin/sh
# Update the name server with our info
HOSTNAME=host.domain.com
PREV_FILE=/root/prev_ip
PREV_IP=`cat $PREV_FILE`
CUR_IP=`/sbin/ifconfig eth0 | head -2 | tail -1 | awk '{ printf("%s\n", $2); }' | sed "s/addr://"`
if [ "$PREV_IP" != "$CUR_IP" ]
then
/usr/bin/nsupdate -d -k /root/keys/Kdomain.com.+157+59903.key <<-EOF
prereq yxdomain $HOSTNAME
update delete $HOSTNAME A
update add $HOSTNAME 60 A $CUR_IP
send
EOF
echo $CUR_IP > $PREV_FILE
fi
exit 0
# Update the name server with our info
HOSTNAME=host.domain.com
PREV_FILE=/root/prev_ip
PREV_IP=`cat $PREV_FILE`
CUR_IP=`/sbin/ifconfig eth0 | head -2 | tail -1 | awk '{ printf("%s\n", $2); }' | sed "s/addr://"`
if [ "$PREV_IP" != "$CUR_IP" ]
then
/usr/bin/nsupdate -d -k /root/keys/Kdomain.com.+157+59903.key <<-EOF
prereq yxdomain $HOSTNAME
update delete $HOSTNAME A
update add $HOSTNAME 60 A $CUR_IP
send
EOF
echo $CUR_IP > $PREV_FILE
fi
exit 0
위 스크립트를 crontab 에 등록해서 5분마다 실행하게 할 경우 IP 변경시에 자동으로 업데이트 한다.