본문 바로가기

엔지니어/Linux

DNS서버(bind9)를 MySQL로 관리하기

728x90
반응형

DNS서버(bind9)를 MySQL로 관리하기 

DNS서버를 mysql로 손쉽게 관리해 보자~

장점은
네임서버를 손쉽게 관리 할 수 있고, 데몬을 재시작 안해도 바로 적용 된다는점~
굳이 서버에 안드가고..  웹에서 dns관리가 가능한점...

단점은
리소스랑 퍼포먼스가.. 좀 구리다는점..
하지만 관리하는 dns가 많이 없으니깐 장점이 더 좋다!


2일동안... 무척 애먹었는데..
일단 세팅해보자~



Step1. BIND 받아서 설치하기
cd /usr/local/src
tar zxvf bind-9.7.0-P1.tar.gz
작업하기 쉽게 디렉토리명을 바꿔주자
mv bind-9.7.0-P1 bind9


Step2. MySQL BIND SDB 드라이버
cd /usr/local/src
tar -xvzf mysql-bind-0-1.gz

여기서 mysqldb.c와 mysqldb.h를 bind에 복사 (정확한 위치를 몰라 몽땅 복사해 버리자!)
잘못 복사하면 make시에 오류 뱉어냄!
cp /usr/local/src/mysql-bind-0-1/mysqldb.c /usr/local/src/bind9/bin
cp /usr/local/src/mysql-bind-0-1/mysqldb.c /usr/local/src/bind9/bin/named
cp /usr/local/src/mysql-bind-0-1/mysqldb.c /usr/local/src/bind9/bin/named/include
cp /usr/local/src/mysql-bind-0-1/mysqldb.h /usr/local/src/bind9/bin
cp /usr/local/src/mysql-bind-0-1/mysqldb.h /usr/local/src/bind9/bin/named
cp /usr/local/src/mysql-bind-0-1/mysqldb.h /usr/local/src/bind9/bin/named/include


Step3. MySQL 라이브러리 주소
/usr/local/mysql/bin/mysql_config

Options:
--cflags         [-I/usr/local/mysql/include/mysql]
--include        [-I/usr/local/mysql/include/mysql]
--libs           [-L/usr/local/mysql/lib/mysql -lmysqlclient -lz -lcrypt -lnsl -lm]
--libs_r         [-L/usr/local/mysql/lib/mysql -lmysqlclient_r -lz -lpthread -lcrypt -lnsl -lm -lpthread]
--socket         [/tmp/mysql.sock]
--port           [3306]
--version        [5.0.37]
--libmysqld-libs [-L/usr/local/mysql/lib/mysql -lmysqld -lz -lpthread -lcrypt -lnsl -lm -lpthread -lrt]
여기서 나온 cflags와 libs를 기록해 두자


Step4. bind9 make 소스 수정
vim /usr/local/src/bind9/bin/named/Makefile.in

DBDRIVER_INCLUDES에 위에서 나온 cflags
DBDRIVER_LIBS에 libs를 적어주고
DBDRIVER_OBJS와 DBDRIVER_SRCS는 아래처럼 수정
#---------------------------------
#
# Add database drivers here.
#
DBDRIVER_OBJS = mysqldb.c
DBDRIVER_SRCS = mysqldb.@O@
DBDRIVER_INCLUDES = -I/usr/local/mysql/include/mysql
DBDRIVER_LIBS = -L/usr/local/mysql/lib/mysql -lmysqlclient -lz -lcrypt -lnsl -lm
#---------------------------------

Step5. bind9 main.c 소스 수정
vim /usr/local/src/bind9/bin/named/main.c
상단에 #include "mysqldb.h" 추가
setup() 내부에 mysqldb_init() 추가 (ns_server_create(ns_g_mctx, &ns_g_server) 앞에 있어야 함)
cleanup()에 mysqldb_clear() 추가


Step6. bind9 컴파일/설치
./configure --with-dlz-mysql
make
make install

configure때 나오는 OPENSSL 경고는 무시해주자~


Step7. DNS관리 DB 추가
-- DB생성
CREATE database dns;
-- 사용자 등록
GRANT ALL PRIVILEGES ON dns.* to dns@localhost IDENTIFIED BY '비밀번호';
-- 테이블 생성
CREATE TABLE IF NOT EXISTS `dns_records` (
 `id` int(11) NOT NULL auto_increment,
 `zone` varchar(64) default NULL,
 `host` varchar(64) default NULL,
 `type` varchar(8) default NULL,
 `data` varchar(64) default NULL,
 `ttl` int(11) NOT NULL default '3600',
 `mx_priority` int(11) default NULL,
 `refresh` int(11) NOT NULL default '3600',
 `retry` int(11) NOT NULL default '3600',
 `expire` int(11) NOT NULL default '86400',
 `minimum` int(11) NOT NULL default '3600',
 `serial` bigint(20) NOT NULL default '2008082700',
 `resp_person` varchar(64) NOT NULL default 'resp.person.email',
 `primary_ns` varchar(64) NOT NULL default 'ns1.yourdns.here',
 `data_count` int(11) NOT NULL default '0',
 PRIMARY KEY  (`id`),
 KEY `host` (`host`),
 KEY `zone` (`zone`),
 KEY `type` (`type`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=14 ;

-- 테스트할 데이터 삽입
INSERT INTO `dns_records` (`id`, `zone`, `host`, `type`, `data`, `ttl`, `mx_priority`, `refresh`, `retry`, `expire`, `minimum`, `serial`, `resp_person`, `primary_ns`, `data_count`) VALUES
(1, 'test.com', '@', 'soa', 'ns', 50, NULL, 28800, 14400, 3600000, 86400, 1997022700, 'root', 'ns.test.com.', 0),
(2, 'test.com', '@', 'NS', 'ns.test.com.', 50, NULL, 0, 0, 0, 0, 0, '', '', 0),
(3, 'test.com', '@', 'mx', 'mail.test.com.', 50, 10, 0, 0, 0, 0, 0, '', '', 0),
(4, 'test.com', '@', 'txt', 'v=spf1 ip4:3.3.3.3 ~all', 50, NULL, 0, 0, 0, 0, 0, '', '', 0),
(5, 'test.com', 'ns', 'A', '3.3.3.3', 50, NULL, 0, 0, 0, 0, 0, '', '', 0),
(6, 'test.com', '@', 'A', '4.4.4.4', 50, NULL, 0, 0, 0, 0, 0, '', '', 0),
(7, 'test.com', 'ftp', 'A', '4.4.4.4', 50, NULL, 0, 0, 0, 0, 0, '', '', 0),
(8, 'test.com', 'www', 'CNAME', 'ftp', 50, NULL, 0, 0, 0, 0, 0, '', '', 0),
(9, 'test.com', 'mail', 'A', '3.3.3.3', 50, NULL, 0, 0, 0, 0, 0, '', '', 0)


Step8. named.conf 수정
vim /etc/named.caching-nameserver.conf

아래의 내용을 추가해주자
view localhost_resolver {
match-clients { localhost; };
match-destinations { localhost; };
recursion yes;
include "/etc/named.rfc1912.zones";

dlz "Mysql zone" {
database "mysql
{host=127.0.0.1 dbname=dns user=dns pass=암호}
{select zone from dns_records where zone = '$zone$'}
{select ttl, type, mx_priority, case when lower(type)='txt' then concat('\"', data, '\"') when lower(type) = 'soa' then concat_ws(' ', data, resp_person, serial, refresh, retry, expire, minimum) else data end from dns_records where zone = '$zone$' and host = '$record$'}";
};
};
여기서 간혹 에러 뜬다.. zone어쩌고.. 구글링을 해보면 간혹 %zone% 로 써논곳들 있는데.. 그게 오류란다..
message에서 zone이 어쩌고 하면 $zone$ 로 바꾸는거 잊지말자!!


Step9. bind9 재시작 후 로그 확인
/etc/init.d/named restart
vim /var/log/message


Final. 최종 테스트
nslooup -type=a test.com localhost
Server: localhost
Address: 172.0.0.1#53
Name: ns.test.com
Address: 3.3.3.3


오케이 성공!!




트러블들...
격었던 트러블들은..
make때 mysqldb.c랑 mysqldb.h가 없다고.. 에러 뱉던것들..
복사를 잘못해서 그랬고;;;
%zone% 에서 오류.. $zone$로 해결

도움된 사이트들


반응형

'엔지니어 > Linux' 카테고리의 다른 글

Howto install GlusterFS 3.5.1 on CentOS 6.5  (1) 2016.05.27
Iptable QoS(DSCP)  (0) 2016.05.27
리눅스 상세 H/W정보 - dmidecode  (0) 2016.05.27
vpopmail + 스팸필터링  (0) 2016.05.27
GeoDNS BIND patch  (0) 2016.05.27