0. 들어가면서
앞의 방법에서는 fetchmail 데몬모드로 띄워서 접속을 유지시키고,
바뀐 ip 주소는 메일로 보내면 그 메일을 가지고 dyndns에 수동으로 등록시켜야 했습니다.
그런데 fetchmail이 중간에 죽는 일이 자꾸 생겨서 접속이 끊기는 일이 많았고,
수동으로 dyndns 에 등록 시키는 일도 아주 귀찮은 일이더군요.

앞의 글에서 고칠점 두 가지를 남겨 두었었는데, 그걸 이번에 다 고치도록 했습니다.

    개선된 부분
  • ppp 접속이 끊긴 것 확인을 ifconfig ppp0 해서 확인하는데, 이걸 ping 으로 확인하도록 하고
    ping 실패하면 pppoed 에 kill signal 보내서 없앤 후 새로 실행시키도록 함

  • dyndns.org 에 ip 갱신 하도록 메일을 보내는 것 보다 직접 ip 갱신을 시키고 네임서버에 등록될 때까지 기다린 후 아파치 재 실행까지 되도록 했습니다.
* 쉘스크립트와 여러 가지를 채윤기 님의 홈페이지 자료에서 얻어왔습니다. 감사,,,

* 그리고 ADSL 접속 방법(pppoed를 이용한)에 관해서는 [리눅스 작업물] 중 [리눅스 박스 만들기]를 참고하세요.

1. cron 사용
접속 유지와 도메인 네임 유지는 각각 쉘 스크립트를 만들어서 cron 을 이용해서 일정 시간 간격으로 실행시켜 줍니다.

/etc/crontab




SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=pedham@kornet.net
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
*/2 * * * * root /root/start/keep_ppp
*/15 * * * * root /root/start/dynip.sh


*/15 이렇게 하면 15분마다 실행되는 것을 몰라서 저번에는 0,15,30,45 이렇게 썼었네요. 부끄러~
keep_ppp 가 2분 마다 실행되는 ppp 접속 유지 스크립트이고,
dynip.sh 이 15분 마다 실행되는 dynamic domain 유지 관련 스크립트입니다.
crontab 의 내용을 고쳐준 후 crond 를 restart 시켜야 되는 것 맞지요 ? ..

2. 접속 유지
ifconfig ppp0 로 확인해서 ppp0가 살아있더라도 접속이 안 되는 경우가 있기 때문에 ping을 써서 제일 만만한 주소(여기서는 ns.kornet.net)로 접속 확인을 하는 방법을 병용합니다.
그렇게 하기 위해서 채윤기님이 만든 pingtest란 스크립트를 쓰기로 합니다.

/root/start/pingtest




#!/bin/sh
if [ x$1 = x ]; then
echo pingtest ip
exit 1
fi
ping -c 1 $1 > /dev/null &
sleep 1
pingpid=`ps ax | grep "ping -c 1 $1" | grep -v grep | awk '{print $1}'`
if [ "x$pingpid" = "x" ]; then
exit 0
else
kill -9 $pingpid 2>&3 /dev/null
exit 1
fi


keep_ppp 는 while loop를 써서 무한루프로 돌릴 수도 있지만,
저는 cron에 등록시켜서 2분에 한 번씩 실행하고 있습니다.

/root/start/keep_ppp




#!/bin/sh
ifconfig | grep -q ^ppp0
if [ $? -eq 1 ]
then
pppoed -I eth1 >/dev/null
exit 0
fi

/root/start/pingtest 168.126.63.1
if [ $? -eq 0 ]
then
exit 0
else
kill `pidof pppd`
pppoed -I eth1 >/dev/null
fi


3. dyndns 등록 유지
원래는 채윤기님의 소스처럼 nslookup을 이용해서 얻은 자신의 dynamic domain의 IP와 ifconfig ppp0 로 얻은 실제 리눅스박스의 ip 주소를 비교해서 다르면 새로 등록시키기로 했었는데,
그렇게 하니까 nslookup쪽의 문제가 있어서 매번 두 IP 가 다른 것처럼 나와서 밤새도록 새로 등록하더군요.(제 경우에는 ADSL 회선상태가 별로 안 좋거든요.)
결국 dyndns.org 에서 abuse 라고 block 당하기도 했습니다.
그래서 예전과 같이 한 번 받아둔 IP를 파일로 저장해서 그 파일과 다를 경우에만 새 접속인 것으로 판단하도록 해 두었습니다.
* dynip.sh 에는 접속 유지 부분이 들어있지 않습니다. 접속이 안 된상태라면 그냥 나가버리도록 했습니다.
* dyndns.org에 IP를 등록시켜주는 클라이언트로서 ddup란 프로그램을 사용했습니다. 소스를 받아서 컴파일 해 주시면 되는데 간단합니다. 받으셔서 압축을 풀고 ./install 해 주시고 화면에 나오는 데로 따라가면 됩니다. 저는 그냥 /usr/local/ddup 에 설치를 했습니다.

/root/start/dynip.sh




#!/bin/sh

# Script by Yongdae Ham
# My address : hamyd.homeip.net

# ---------- declaration part ---------------

# global variables used in this script

pppip=""
oldip=""
INTERFACE="ppp0" #what interface is your network connection on?
ipfile="/root/start/ip.hamyd"
MYHOST1="hamyd.homeip.net"
MYHOST2="drham.homeip.net"
MYHOST3="drpeds.homeip.net"

# functions used in this script

getpppip () {
pppip=`ifconfig $INTERFACE | grep inet | cut -d ' ' -f 12 | cut -d ':' -f 2`
}

getoldip () {
if [ -n "`ls $ipfile`" ]
then
read oldip < $ipfile
else
oldip=""
fi
}

registerip () {
# 새 접속이 된 상태를 기록하고 메일로 보낸다.
# 아파치 버추얼 호스팅 설정을 수정하고 아파치를 재실행 시킨다.

echo "New ADSL ppp IP address:" $pppip
echo $pppip>$ipfile

echo
echo "Registering New IP of $MYHOST1"
/usr/local/ddup/ddup --host $MYHOST1 --ip $pppip --wildcard
echo
echo "Registering New IP of $MYHOST2"
/usr/local/ddup/ddup --host $MYHOST2 --ip $pppip --wildcard
echo
echo "Registering New IP of $MYHOST3"
/usr/local/ddup/ddup --host $MYHOST3 --ip $pppip --wildcard

echo
echo "Waiting for Registering DNS …"
sleep 10m # DNS 가 등록될 때까지 기다린다.
echo "….."
echo "restarting Apache …"
echo
echo "NameVirtualHost "$pppip>/usr/local/apache/conf/myip.conf
/usr/local/apache/bin/apachectl restart

python /root/start/dynsendip.py $pppip
}

# ------------- run part ----------------

# 접속이 안 된 상태라면 그냥 나간다.

ifconfig | grep -q ^ppp0
if [ $? -eq 1 ]
then
# 접속이 안 된 상태라면 나간다.
echo "No connection 1"
exit 1
fi

/root/start/pingtest 168.126.63.1
if [ $? -eq 1 ]
then
# 접속이 안 된 상태라면 나간다.
echo "No connection 2"
exit 1
fi

# 접속이 된 상태라면 dns 유지 작업
getpppip
getoldip
if [ -n "$pppip" ]
then
{
# 접속 되어 있는 상태라면 ip 가 바뀐 건 아닌지 확인한다.
if [ "$pppip" != "$oldip" ]
then
registerip
fi
}
fi


dunip.sh

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다