https://www.powerdns.com
DB연동(mysql)으로 DNS 를 관리할수 있다 ‘ㅅ’a.
1. 설치법
1 2 3 4 5 |
~]# yum -y install pdns pdns-backend-mysql pdns-recursor libtool boost-devel ~]# mysql -uroot -p mysql mysql> CREATE DATABASE pdns; mysql> GRANT ALL PRIVILEGES ON `pdns`.* to `pdns`@`%` IDENTIFIED BY 'databasePASSWORD' WITH GRANT OPTION; |
2. pdns 테이블 생성 (sql 문으로 저장하여 import 하거나 mysql 콘솔에서 직접 입력을 해도 된다.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
CREATE TABLE `comments` ( `id` int(11) NOT NULL AUTO_INCREMENT, `domain_id` int(11) NOT NULL, `name` varchar(255) NOT NULL, `type` varchar(10) NOT NULL, `modified_at` int(11) NOT NULL, `account` varchar(40) NOT NULL, `comment` mediumtext NOT NULL, PRIMARY KEY (`id`), KEY `comments_domain_id_idx` (`domain_id`), KEY `comments_name_type_idx` (`name`,`type`), KEY `comments_order_idx` (`domain_id`,`modified_at`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE `cryptokeys` ( `id` int(11) NOT NULL AUTO_INCREMENT, `domain_id` int(11) NOT NULL, `flags` int(11) NOT NULL, `active` tinyint(1) DEFAULT NULL, `content` text, PRIMARY KEY (`id`), KEY `domainidindex` (`domain_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE `domainmetadata` ( `id` int(11) NOT NULL AUTO_INCREMENT, `domain_id` int(11) NOT NULL, `kind` varchar(32) DEFAULT NULL, `content` text, PRIMARY KEY (`id`), KEY `domainmetadata_idx` (`domain_id`,`kind`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE `domains` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `master` varchar(128) DEFAULT NULL, `last_check` int(11) DEFAULT NULL, `type` varchar(6) NOT NULL, `notified_serial` int(11) DEFAULT NULL, `account` varchar(40) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `name_index` (`name`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE `records` ( `id` int(11) NOT NULL AUTO_INCREMENT, `domain_id` int(11) DEFAULT NULL, `name` varchar(255) DEFAULT NULL, `type` varchar(10) DEFAULT NULL, `content` mediumtext, `ttl` int(11) DEFAULT NULL, `prio` int(11) DEFAULT NULL, `change_date` int(11) DEFAULT NULL, `disabled` tinyint(1) DEFAULT '0', `ordername` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, `auth` tinyint(1) DEFAULT '1', PRIMARY KEY (`id`), KEY `nametype_index` (`name`,`type`), KEY `domain_id` (`domain_id`), KEY `recordorder` (`domain_id`,`ordername`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE `supermasters` ( `ip` varchar(64) NOT NULL, `nameserver` varchar(255) NOT NULL, `account` varchar(40) NOT NULL, PRIMARY KEY (`ip`,`nameserver`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE `tsigkeys` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `algorithm` varchar(50) DEFAULT NULL, `secret` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `namealgoindex` (`name`,`algorithm`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; |
3. /etc/pdns/pdns.conf 편집
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
# pdns 설정은 영어 실력 미달로 내가 이해한대로 써놔서 부정확 할수 있다 'ㅅ'a - 장수환 # 궁금하면 메뉴얼을 보자 : https://doc.powerdns.com/md/authoritative/settings # pdns의 마스터 / 슬레이브를 설정한다. master=yes slave=no # axfr 허용할 IP를 지정한다 ( 도메인 추가/레코드 변경시 노티피와 관련된다. ) disable-axfr=no allow-axfr-ips=[슬레이브서버IP] # dns-recursion 허용 아이피를 설정한다. 개방형DNS 의 경우 모두 허용해야 하지만 IP만으로 제한 하는게 공격 방어에 좋다. allow-recursion=127.0.0.1, [마스터서버IP], [슬레이브서버IP] recursor=127.0.0.1:54 # yes 일경우 Any, RRSIG(dnssec) 쿼리를 TCP로 변경한다. 리플렉션 공격 방어에 효과적. any-to-tcp=yes # 기타 잡설정. version-string=powerdns local-port=53 daemon=yes setuid=pdns setgid=pdns guardian=yes config-dir=/etc/pdns module-dir=/usr/lib64/pdns socket-dir=/var/run #log-dns-details=on #log-failed-updates=on #loglevel=3 launch=gmysql gmysql-dnssec gmysql-host=localhost gmysql-user=pdns gmysql-password=[databasePASSWORD] gmysql-dbname=pdns gmysql-port=3306 gmysql-socket=/tmp/mysql.sock |
4. /etc/pdns-recursor/recursor.conf 수정
1 2 3 4 5 6 7 8 9 10 |
setuid=pdns-recursor setgid=pdns-recursor config-dir=/etc/pdns-recursor/ daemon=yes local-port=54 socket-dir=/var/run/ version-string=PDNS allow-from=0.0.0.0/0 local-address=127.0.0.1 quiet=yes |
5. chkconfig 등록 및 pdns 서비스 시작.
1 2 3 4 |
~]# /etc/init.d/pdns start; ~]# /etc/init.d/pdns-recursor start ~]# chkconfig --level 2345 pdns on ~]# chkconfig --level 2345 pdns-recursor on |
6. 도메인 등록 및 레코드 등록 쿼리 예제.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 도메인 등록 쿼리 INSERT INTO domains (name, type, notified_serial) VALUES ('enteroa.kr', 'MASTER', 1); # 레코드 등록 쿼리 INSERT INTO records (domain_id, name, type, content, ttl, prio, change_date) VALUES (1, 'enteroa.kr', 'SOA', 'ns1.enteroa.kr root.ns1.enteroa.kr 2015042217 7200 1800 1209600 300', 300, 0, UNIX_TIMESTAMP(NOW())); INSERT INTO records (domain_id, name, type, content, ttl, prio, change_date) VALUES (1, 'enteroa.kr', 'NS', 'ns1.enteroa.kr', 300, 0, UNIX_TIMESTAMP(NOW())); INSERT INTO records (domain_id, name, type, content, ttl, prio, change_date) VALUES (1, 'enteroa.kr', 'NS', 'ns2.enteroa.kr', 300, 0, UNIX_TIMESTAMP(NOW())); INSERT INTO records (domain_id, name, type, content, ttl, prio, change_date) VALUES (1, 'enteroa.kr', 'MX', 'aspmx1.naver.com', 300, 10, UNIX_TIMESTAMP(NOW())); INSERT INTO records (domain_id, name, type, content, ttl, prio, change_date) VALUES (1, 'enteroa.kr', 'MX', 'aspmx2.naver.com', 300, 20, UNIX_TIMESTAMP(NOW())); INSERT INTO records (domain_id, name, type, content, ttl, prio, change_date) VALUES (1, 'enteroa.kr', 'A', '123.123.123.125', 300, 0, UNIX_TIMESTAMP(NOW())); INSERT INTO records (domain_id, name, type, content, ttl, prio, change_date) VALUES (1, '*.enteroa.kr', 'CNAME', 'enteroa.kr', 300, 0, UNIX_TIMESTAMP(NOW())); INSERT INTO records (domain_id, name, type, content, ttl, prio, change_date) VALUES (1, 'ns1.enteroa.kr', 'A', '123.123.123.123', 300, 0, UNIX_TIMESTAMP(NOW())); INSERT INTO records (domain_id, name, type, content, ttl, prio, change_date) VALUES (1, 'ns1.enteroa.kr', 'A', '123.123.123.124', 300, 0, UNIX_TIMESTAMP(NOW())); |
PS. master/slave 구성시. 아래와 같은 부분을 추가 한다. (master / pdns.conf 의 disable-axfr 값은 yes->no로 변경)
1 2 3 4 5 6 7 |
마스터 서버 ~]# vi /etc/pdns/pdns.conf disable-axfr=no allow-axfr-ips=슬레이브서버IP master=yes 슬레이브서버 ~]# vi /etc/pdns/pdns.conf slave=yes |
또한 슈퍼 마스터를 추가 해서 리플리케이션을 구성한다.
1 |
INSERT INTO supermasters ('[마스터서버IP]','[마스터서버이름]','admin'); |
리플리 케이션이 되는 조건은 슈퍼마스터설정, axfr 설정, 등록된 도메인의 정상적인 SOA 설정 및 업데이트, 그리고 각 도메인의 NS 레코드에 리플리케이션 구성될수 있는 네임서버 선언이 필요로 한다.
LAST. 확인방법
1 2 |
C:\> nslookup -q=any 도메인명 [네임서버IP혹은호스트이름] C:\> nslookup -q=any enteroa.kr ns1.enteroa.kr |