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 |