iT邦幫忙

11

簡單建置自用的 動態 DNS、Dynamic DNS

參照了 wordsmith 的 和雲端的第一次接觸-使用Amazon EC2
順利地有了第一次的EC2的經驗後,
碰上了需用 Dynamic DNS 類似功能,
動態來綁 IP 及 DNS。
不求甚解
自己用網路的環境都是固定IP,
管理的Server更是固定IP,
所以對ddns的猜測了解,
大概只知道 ddns 的原理可能是:
去註冊個帳號、主機名稱,
然後在自己的電腦裝個什麼軟體,
開機後就會去告知 ddns 自己的IP是什麼,
然後 ddns 就透過 script 來把你的IP及所註冊的主機名稱,
寫到 /var/named 裡的 DNS 的設定檔,
這樣就會動態更新 DNS 上的 IP 了…
所以在想,那 script 要怎麼寫才能自動更新那 DNS 的記錄。

使用需求
在 EC2 上的使用,從外部來看,
都是以 public IP 連入,
但內部是用 private IP 給各個虛擬主機,
而且是動態地分配,
所以一陣子後才開機的話,
獲得的IP會與之前的不同,
就需要上網站查自己server的IP為何,
然後才 ssh 進 EC2 的虛擬機器。

自己有個 Bind 的 DNS,
也已有自己申請的 Domain,
當然就要建個自用的 Dynamic DNS。
以為要花力氣寫修改 /var/named 下檔案的 script,
找方案的過程才知道:
Linux的client端早就內建有 nsupdate 的工具,
來做動態IP的更新。
而在 Bind 上也要做個簡單的設定就完工。

簡單實作
參考舊舊文 動態 DNS 設定技巧 上的作法,
大致的步驟都有效,
只有一些要配合成自己的環境,
在此把所進行的步驟記錄一下:
(與上述的文章的作法,幾乎一樣,
只有一些改為適合 ec2 的環境)

0.環境假設
自己 DNS server 的主機名稱為 ns、 IP 為 1.2.3.4
所管理的 Domain Name 為 abc.com
在EC2上的 IP 不詳,但希望在網路上能用 ec2.abc.com 來綁其動態IP。

1.製作 DNS 的 key
在 ec2 或 ns 上製作皆可:

$ dnssec-keygen -a HMAC-MD5 -b 128 -n HOST ec2
Kmail.+157+44587

結果會產生了檔名類似 Kmail.+157+44587.key 與 Kmail.+157+44587.private 兩個檔案。
這兩檔要放在 ec2 上,
因更新的時候要用到 .key 這檔。
.key 的內容類似像這樣:

ec2. IN KEY 512 3 157 BJ7y6dzxchy3u0B4hRLksQ==

那串編過的碼就是 key。

2.修改 DNS 的設定
在 ns 的 /etc/named.con 上

options {
....
};

key "ec2" {
algorithm hmac-md5;
secret "BJ7y6dzxchy3u0B4hRLksQ==";
};

zone "abc.com" {
type master;
file "named.example";

update-policy {
grant ec2 name ec2.abc.com. A;
};
};

再重新啟動 named 就生效。

3.EC2 上的 client 設定
依該文提供的 script 來設成適自己的環境,
在 /home/USER/Keys 目錄下放 .key, .private 的檔案,
以及下列的檔案:
tmp.txt 的 內容:
server 1.2.3.4
zone abc.com
update delete ec2.abc.com. A
update add ec2.abc.com. 86400 A SERVER_NEW_IP
send

newip.sh 的內容:
#!/bin/sh
exe_path=/home/USER/Keys
#new_IP=/sbin/ifconfig eth0 | grep 'inet addr' | cut -d: -f 2 | cut -d' ' -f1
new_IP=curl http://showmyip.abc.com/whatismyip
/bin/cat $exe_path/tmp.txt | sed s/SERVER_NEW_IP/$new_IP/g > $exe_path/update.txt
/usr/bin/nsupdate -k $exe_path/Kmail.+157+44587.key -v $exe_path/update.txt

不用上述的原始第3行,
是因為 EC2 裡 ifconfig 所獲得的 IP 為 private IP,
所以只能 query 外部的網頁來獲知自己的 IP為何,
而改用第4行來獲取自己的public IP的資訊。
然後在 /etc/rc.local 上執行 /home/USER/Keys/newip.sh,
這樣每次開機就會更新 IP 的資訊。

4.偵測query的IP
上述第四行 http://showmyip.abc.com/whatismyip
所query的結果,就只是出現一串IP。
在 rails 上的程式碼是:

def whatismyip
    render :text => request.env['HTTP_X_FORWARDED_FOR']
    #render :text => request.env.inspect
end

由於我是rails + nginx,
來query相關的IP變數各不同,
可先利用第3行列出所有HTTP的環境變數,
再觀察要用哪個變數。
其他程式環境也很容易建出這顯示IP的功能。


1 則留言

0
隨風奶爸
iT邦好手 1 級 ‧ 2011-01-19 12:02:27

EC2中申請一個固定IP,只要IP有掛機器,目前不收錢啊!但是,申請一個固定IP卻未掛到任一台機器上,嘿嘿,每小時收0.01美金喔~

我要留言

立即登入留言