Linux, 工作, 生活, 家人

Gentoo, Network, Software, UNIX

自幹 dyndns

之前好像免費的 dyndns 都收的差不多了, 好像很久沒有人提了.
今天心情還不錯, 就來架設自己的 dyndns.
主要可以參考這二篇

[分享] 用 BIND 架設 DDNS Server 提供 DDNS 服務
動態 DNS 設定技巧

上網看了一下, 大家寫的非常長, 不過如果架過 DNS, 其實也沒有這麼難, 實作上還算簡單的.
至少比想像中簡單許多
1. 在 /var/bind/pri/named.domain.com 中加入你想要做 dyndns 的 domain name

ex:
test A 0.0.0.0

別忘了改 serial number

2. 到 /var/bind/dyn 下產生 key

# dnssec-keygen -a HMAC-MD5 -b 512 -n USER test.domain.name.
會產生二個檔案, 內容產不多

3. 將 key 內容 copy 到 bind 去

將其中的 Ktest.domain.name.+123+45678.key 內的

“test.domain.name. IN KEY 0 3 157 WH3pLphbwFlc/F8C1tbFcdzWRfcDdYWu00KBM5l2OE0rAVHzXFO+dahU SRrPKC0AMcbO6mwV4oVK94G9J5u9aw==
放到 /etc/bind/named.conf 內,

key test.domain.name. {
algorithm HMAC-MD5;
secret “WH3pLphbwFlc/F8C1tbFcdzWRfcDdYWu00KBM5l2OE0rAVHzXFO+dahU SRrPKC0AMcbO6mwV4oVK94G9J5u9aw==”;
};

4. 修改 zone 的設定

zone “domain.name” in {
type master;
file “pri/named.domain”;
allow-query{ any; };

update-policy {
grant test.domain.name. name test.domain.name. A;
};
};

5. Restart bind

# /etc/init.d/named restart

6. 測試 Update 是否成功
使用 nsupdate 工具向 Primary DNS 做更新動作:

$ nsupdate -k Ktest.domain.name.+123+45678.key
> server ns.domain.name // 指定 Primary DNS
> update delete test.domain.name A // 先刪除舊資料
> update add test.domain.name 0 A 1.1.1.1 // 再新增資料
> send // 送出到 Primary DNS
$ dig @ns.domain.name test.domain.name
;; ANSWER SECTION:
test.domain.name. 0 IN A 1.1.1.1

如果不成功, 可以看一下 /var/log , 然後看看是不是少了 /var/bind/pri/named.domain.com.jnl, 這個權限要加上去
如果重啟之後, 出現 “response to SOA query was unsuccessful”, 那個 .jnl 的檔案砍了再重來就可以了, 好像是改了 SOA 就會錯亂.

這樣算完成一半, 上面第二個 Link 內有 Linux Update 的範例, 不過 Windows 怎麼辦呢? 像中華電信每幾天會換一次 IP, 所以自動更新的功能只好自己硬幹了. 而且 Windows PPPoE Disconnect/connected 時都不會有 event 可以呼叫 script 去執行, 所以就每一陣子執行一次 script 更新一下 DNS 資料, 不重要的 Service 這樣做還好, 重要的話可能就不行, 但是重要的也不會放 PPPoE 上吧 XD

自己硬幹有幾個選擇

[X] DOS BASH : 這個很差, 可能抓不到 IP
[X] Cygwin : 這個在我的 Windows XP 上根本跑不起來, 被防毒軟體擋到不能用 :<
[O] Python : 這個好, 什麼地方都可以用, 只要跑簡單的程式的話, 還是 python 安定.

所以就自己寫了一個小程式
1. 程式碼放到 github , 存成 update.py
https://github.com/richliu/dnsupdate

2. 產生 template file, script.txt 內容如下

server ns.domain.name
update delete test.domain.name A
update add test.domain.name 0 A SERVER_NEW_IP
send

3. 產生一個空的 ip.dat 檔案. (懶得檢查了, 所以就自己動手最快)

4. 寫一個 run.bat 內容是

cd C:\TEST\
C:\Python27\python.exe update.py

5. 下載 bind 執行檔 for windows 32bit

  http://www.isc.org/downloads/bind/

解出所有的 .dll 檔, 和 dig 及 nsupdate 丟到同一個目錄, 如果是 windows 32 bit, 別忘了執行一下程式內的 vcredist_x86.exe, 這是 visual c++ 2005 dll .

6. 定時執行

如果 IP 有變的話就會更新 dyndns, 因為用 windows, 所以採用的是 schtasks.
相關的說明可以上 Microsoft Schtasks 網站看
用下面這個指令就可以讓 script 每 5 分鐘執行一次
# schtasks /create /tn “Check IP” /tr c:\TEST\run.bat /sc minute /mo 5

大.功.告.成.

 

發佈留言