動態 DNS 申請
如果你常常在台灣上網路的話,應該都知道奇摩站的網址為 www.kimo.com.tw 吧!所以你在瀏覽器的網址列上打入 http://www.kimo.com.tw 就可以連上 奇摩站 了!好啦,那我們知道其實 Internet 上面用來認識你的電腦的門牌都是使用 IP 來進行的,例如 奇摩站 的 IP 其實是 202.1.237.21,所以如果你在網址列打上 http://202.1.237.21 同樣也可以連上 奇摩站 的!雖然使用 IP 即可連上主機,但是由於 IP 是一堆數字的集合,很難記憶,所以才會有 DNS 這種網址列的出現,這樣一來,只要你記得 kimo 就大概可以知道他的網址列,而不用死記一堆 IP 數字了!舉個簡單的例子,你知道教育的英文吧(education),另外我們也知道 WWW 為一般的網頁主機開頭,所以如果你要登入台灣的教育部首頁,直接在網址列打上 www.edu.tw 就可以啦,那你就不用去記 IP 了!所以,簡單的來說,DNS只是要幫我們記憶一些名稱以對應相對的 IP 的一個系統。
那網址列的名稱有沒有什麼意義呢?其實是有的,網址列的最後幾個字母代表的意義如下:
名稱 代表意義 com 公司、行號、企業 org 組織、機構 edu 教育單位 gov 政府單位 net 網路、通訊 mil 軍事單位 我對 DNS 的瞭解也不是很深,大概有的只是一些概念而已,如果你想要對 DNS 有更深一層的瞭解,建議到 study-area 來看看!
好了,既然知道了 DNS 系統了,那什麼叫 動態DNS 呢?這是由於近年來撥接網路的盛行,而撥接網路所分給你的 IP 並非固定的,例如以 seednet 為例,你每次重新開機而 seednet 給你的 IP 大致上是分佈在 211.74.XXX.XXX 這一個 IP !所以你每次撥接上網的 IP 是隨機分配的!那就會產生一個問題,如果你架設了一個網站,但是你的 IP 卻一直變來變去,那用戶端如何跟你連線呢?這時就有所謂的動態 DNS 出現了,他的運作原理是這樣:你每次開機的時候,寫一個小程式去向這個 動態DNS主機 要求更改你的 IP ,這個主機會將你申請的名稱與 IP 重新作一個調整,因此,只要別人知道你的主機名稱,不論你的 IP 為何,他一定可以連上你的主機(因為 IP 跟著你的主機而變!)這對於我們這種使用動態 IP 的人是很有幫助的!
目前就我所知,台灣地區有一個試驗性的免費動態 IP 系統,由於是試驗性的,所以他並不保證完全可以讓你的DNS永遠沒有問題!不過,如果你有心去架設一個網站的話,可以去申請需要付費的動態DNS系統!那應該會比較好一些!至於申請的方式,你可以到底下的網址去看看,這裡就不多作介紹了!
免費動態 DNS :當然還有很多的動態DNS系統,你可以多多比較了!不過,目前我所申請的是免費的 DNS 系統,你可以上去看看囉。台灣地區免費動態DNS系統付費動態 DNS 系統:荻恩斯科技
申請了 動態DNS系統 當然是希望在每次重新連線的時候可以自動將你的 IP 送上主機去更改了,這時你就需要用到 crontab 這種例行性檢查的服務了!crontab:
在 Linux 系統當中,由於有些服務是必須在某些時刻開啟的,因此就有 crontab 服務的產生, crontab 可以讓你在固定的時候執行某些動作!關於系統的 crontab 你可以到 /etc/crontab 這個檔案去看看, RedHat 6.1 預設的 crontab 有點像這樣:
上面的說明是這樣的:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/# run-parts
01-59/3 * * * * root run-parts /etc/cron.min <= 我加上的一行
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.monthlyMAILTO:如果底下執行的動作發生了一些訊息,這些訊息應該傳給誰?由於 root 沒有辦法在其他的機器上登入以取得郵件,因此這一行我都會改成我的 ID帳號 !另外,在 run-parts 部分,(注意: # 後面接的是註解,並不會被執行)共有五個數字(如果沒有數字的話,必須以 * 來代替),這五個數字的意義是:例如 01 * * * * root run-parts /etc/cron.hourly 表示每個小時的 1 分鐘執行 /etc/cron.hourly 這個目錄中的所有執行檔,而 42 4 1 * * root run-parts /etc/cron.monthly 則表示每個月的一號的4點42分執行 /etc/cron.montly 這個目錄下的所有執行檔,然後我通常會在run-parts 當中加入如上表中黃色顯示的那一行,那一行表示:在每隔三分鐘之後執行 /etc/cron.min 這個目錄下的所有執行檔!因此,我必須在 /etc 中先建立一個名為 cron.min 的目錄: mkdir /etc/cron.min,然後將我所需要的例行性執行檔寫在這個目錄中!
1 2 3 4 5 分鐘(0-59) 小時(0-23) 每月的第幾天 月份(1-12) 星期幾(0-6) 一個範例:
以下是我寫的一個小程式,你可以看看:
上面這個批次檔你可以在這裡下載,並請注意,上面黃色的字的地方是你需要修改的東西,ETH0IP為你的內部網路的通訊閘的 IP ,其他的項目則是你在 www.adsldns.org 申請的時候所附上的資訊!請填寫這些東西就可以了,然後將這個檔案放置到你剛剛建立的 /etc/cron.min 這個目錄中,然後修改他的屬性成為: chmod 744 /etc/cron.min/ping_net_card.sh,如此一來,則每三分鐘系統會去偵測你的網路是否存在,若不存在則會重新啟動你的撥接程式,並且在撥接之後將會直接更新你在 www.adsldns.org 的 DNS 囉!
#!/bin/sh
# 這個小批次檔將可以讓你的 DNS 更改你目前的 IP ,
# 並請注意,這個批次檔是在 seednet 的網域中寫的,
# 在 hinet 或其他的 ISP 中我還不能肯定是否可以執行!
# 我的系統是 Redhat 6.1,核心是 2.2.18 ,
# 另外,我的 eth0 是內部網路的接線, eth1 是連接到 ATU-R 上的!
# 我使用的撥接程式是 rp-pppoe-2.6.1 這一個!
# 所以我的撥接執行檔在 /usr/sbin/adsl-start !# VBird 2001/08/18
# ============== 請輸入必要的參數 ==========================
# 1. 請輸入你的 eth0 這張網路卡的 IP (虛擬 IP )
# 以我為例,我是使用 192.168.1.2 這一個 IP ,請依你的設定來寫!
ETH0IP=192.168.1.2
PASSWD=xxxxxx
EMAIL=xxx@xxx.xxx.xxx
HOSTNAME=xxx.adsldns.org
# ===========================================================
PATH=$PATH:/sbin# 建立搜尋檔案!
Base=`pwd`
CardFile="no"
[ -f ${Base}/card1 ] && CardFile="yes"
if [ "$CardFile" = "no" ]; then
echo card1 > ${Base}/card1
else
qq=qq
fi# 搜尋你目前主機上的 IP
IP1=`/sbin/ifconfig eth0|grep 'inet' |awk '{print $2}' |sed -e "s/addr\://"`
IP2=`/sbin/ifconfig eth1|grep 'inet' |awk '{print $2}' |sed -e "s/addr\://"`
IP3=`/sbin/ifconfig ppp0|grep 'inet' |awk '{print $2}' |sed -e "s/addr\://"`
IP11=`echo $IP1 |awk -F '.' '{print $1}'`
IP21=`echo $IP2 |awk -F '.' '{print $1}'`
IP31=`echo $IP3 |awk -F '.' '{print $1}'`
workIP=`ifconfig ppp0|grep 'inet' |awk '{print $2}' |sed -e "s/addr\://"`
LANIP=`ifconfig eth0|grep 'inet' |awk '{print $2}' |sed -e "s/addr\://"`# 你上一次登入的 IP 為何?
CARDIP=`cat ${Base}/card1`# 1. 沒有任何的撥接網路被啟動
if [ "$IP3" = "" ]; then
ifdown eth1
/usr/sbin/adsl-stop
/usr/sbin/adsl-start
IP3=`/sbin/ifconfig ppp0|grep 'inet' |awk '{print $2}' |sed -e "s/addr\://"`
fi
if [ "$IP3" = " " ]; then
ifdown eth1
/usr/sbin/adsl-stop
/usr/sbin/adsl-start
IP3=`/sbin/ifconfig ppp0|grep 'inet' |awk '{print $2}' |sed -e "s/addr\://"`
fi# 2. 舊的登錄 IP 是錯的!
if [ "$CARDIP" = " " ]; then
ifdown eth1
/usr/sbin/adsl-stop
/usr/sbin/adsl-start
IP3=`/sbin/ifconfig ppp0|grep 'inet' |awk '{print $2}' |sed -e "s/addr\://"`
fi
if [ "$CARDIP" = "" ]; then
ifdown eth1
/usr/sbin/adsl-stop
/usr/sbin/adsl-start
IP3=`/sbin/ifconfig ppp0|grep 'inet' |awk '{print $2}' |sed -e "s/addr\://"`
fi# 3. 是否需要重新修改你的 IP ?
if [ "$IP3" = "$CARDIP" ]; then
exit 1
else
IP3=`/sbin/ifconfig ppp0|grep 'inet' |awk '{print $2}' |sed -e "s/addr\://"`
# send your IP to kevin.adsldns.org
echo 'passwd='$PASSWD'&email='$EMAIL'&hostname='$HOSTNAME'&debug=1&forceip='$IP3'' | lynx http://www.adsldns.org/clientupdate.php -post_data
# repleas your card1 file
echo $IP3 > ${Base}/card1
fi