DDNS 구축하기 (PDNS 사용자)

리눅스/DNS|2015. 1. 26. 17:36
반응형

PDNS 에 DDNS 기능이 있는것 같은데, 아직 개발 단계에 있다는 말도 있고..

SSH 키를 이용해 인증하는것 같아 제 나름의 방법대로 구축 방법을 기술하였습니다.



1. Client 설정


Client 서버에서 네임서버로 IP 정보를 전송해야 하므로, Client 서버에 아래와 같은 명령을 이용하여 주기적으로 IP를 체크업데이트 할 수 있도록 해야합니다.

아래 인증 방법 두 가지 중 하나를 이용하면 됩니다.



인증 방법1

# lynx -source -auth=아이디:패스워드 'http://ns1.sysdocu.com/update.php?도메인'


인증 방법2

# wget -O - --http-user=아이디 --http-passwd=패스워드 'http://ns1.sysdocu.com/update.php?도메인'



위 스크립트가 5분마다 자동 실행될 수 있도록 자동 스케쥴러에 등록해 놓습니다.

아래 예에서는 아이디 및 패스워드갱신할 도메인 sysdocu.com 을 실제로 입력하였습니다.


# crontab -e


*/5 * * * * wget -O - --http-user=sysdocu --http-passwd=PassW0rD 'http://ns1.sysdocu.com/update.php?sysdocu.com'



2. Server 설정


네임서버에서는 Client 서버의 IP 정보를 수시로(1분 마다체크 하고 있다가 변경되어질 때업데이트 합니다.


그래서 Client 서버에서 보내오는 신호를 체크하고 DB에 저장된 IP값과 비교, IP 값이 다를 경우 업데이트 하는 스크립트를 만들어야 합니다.


우선 pdns DB에 users 테이블을 추가합니다. 아이디로 검색해 본인이 사용하는 도메인이 맞는지 확인하기 위해 사용됩니다.


# vi users.sql


CREATE TABLE users (

no INT PRIMARY KEY AUTO_INCREMENT,

id varchar(255),

domain varchar(255)

) Engine=InnoDB;


# mysql -p pdns < users.sql

Enter password:  (패스워드 입력)


추후에 사용할때는 users 테이블에 실제 사용하는 아이디랑 도메인이 들어가 있어야 작동을 합니다.

예) user1    sysdocu.com

      user1    www.sysdocu.com

      user2    system.sysdocu.com


# touch /usr/local/apache/htdocs/update.php    // ns1.sysdocu.com 의 기본 디렉토리 안에 빈페이지를 생성합니다.


# vi /root/ipcheck.sh


#!/bin/bash


cat /usr/local/apache/logs/ns1.sysdocu.com-access_log |grep 'update.php' |grep '200 -' |awk {'print $1" "$3" "$7'} |sed -e 's/\/update.php?//' > temp.txt

cat /dev/null > /usr/local/apache/logs/ns1.sysdocu.com-access_log


while read newIP USER Host trash

do


접속계정과 호스트를 이용해 DB의 저장값을 불러옵니다.

authuser=`mysql -updns -p12345678 pdns -e "SELECT COUNT(*) FROM users WHERE id='$USER' AND domain='$Host'" |tail -n 1`


저장값이 있으면 아이피값이 같은지 비교다를경우 업데이트합니다.

if [ "$authuser" = "1" ]; then

oldIP=`mysql -updns -p12345678 pdns -e "select content from records where name='$Host' and type='A'" |tail -n 1`


if [ "$oldIP" != "$newIP" ]; then

mysql -mysql -updns -p12345678 pdns -e "UPDATE records SET content='$newIP' where name='$Host' and type='A'"

fi


else

echo ""

fi


done < temp.txt


rm -f temp.txt



이제 위 스크립트가 1분마다 자동으로 실행될 수 있도록 자동 스케쥴러에 등록해 놓습니다.


# crontab -e


* * * * * sh /root/ipcheck.sh



또한 인증 받은 사람만(아이디패스워드로 확인업데이트가 가능하도록 아파치 웹인증 암호를 걸어 놓습니다.


# cd /usr/local/apache/htdocs    // ns1.sysdocu.com 의 기본 디렉토리


# vi .htaccess


AuthName "User Authorization"

AuthType Basic

AuthUserFile /usr/local/apache/htdocs/.htpasswd

AuthGroupFile /dev/null

<Limit GET>

require valid-user

</Limit>



# /usr/local/apache/bin/htpasswd -c .htpasswd sysdocu

New password : ********

Re-type new password : ********


위와 같이 아이디 sysdocu 와 그에 해당하는 패스워드를 설정했습니다이제 생성한 아이디패스워드 사용자만 update.php 파일에 접근이 가능합니다.


여기에 아이디패스워드를 추가 할때는 -c 옵션을 빼고 동일하게 명령을 수행하면 됩니다.

그리고 .htpasswd 파일의 위치를 잘 입력해주어야 합니다현재 디렉토리에서는 파일명만 적되다른 디렉토리에 위치한 상태에서 명령을 내릴 때는 절대경로또는 상대경로를 이용하여 위치를 정확히 입력합니다.


# /usr/local/apache/bin/htpasswd .htpasswd UserID


-c 옵션은 초기 사용자를 생성 할때만 사용됩니다여러개의 아이디를 만든 후 -c 옵션을 잘못 주었다면 기존의 아이디가 모두 사라져버리므로 주의를 해야 합니다. (주기적으로 인증 파일 백업 권장)


참고 이용자 삭제

# /usr/local/apache/bin/htpasswd -D .htpassd UserID


반응형

댓글()