你擁有一台dns server,他的ip是1.2.3.4
你也去註冊了一個自已的domain:example.com
在dns server(1.2.3.4)裡,已經安裝好了BIND8+,並且在named.conf中有example.com的設定
- 代碼: 選擇全部
zone "example.com" {
type master;
file "record_db_file_of_example_dot_com";
};
在Study-Area的學習Linux Servers 第五章 架設DNS中,網中人兄及LEO兄已經展示了非常詳盡的,針對已知的client的解決方案。這裡實作的是以CGI方式的實做,達成近似於no-ip、dyndns等的效果。
第一個是較簡易,不考慮安全性的做法:
在named.conf的相關設定中給予本機update的權限
- 代碼: 選擇全部
allow-update{ localhost; };
撰寫CGI script(以PHP為例)
- 代碼: 選擇全部
<?php
function showerror(){
echo "Error";
}
function userauth($u, $p){
if($u=="somename" and $p=="somepass")
return true;
return false;
}
if(!isset($_REQUEST['user']) or !isset($_REQUEST['pass'])){
showerror();
exit;
}
$user=$_REQUEST['user'];
$pass=$_REQUEST['pass'];
if(!userauth($user, $pass)){
showerror();
exit;
}
$ip=$_SERVER['REMOTE_ADDR'];
$qs="server 127.0.0.1
update delete " . $user . ".example.com A
update add " . $user . ".example.com 0 A " . $ip . "
send
";
shell_exec ( "echo \"" . $qs . "\"|/path/to/nsupdate -v");
?>
那麼只要開啟
- 代碼: 選擇全部
http://1.2.3.4/path/to/update.script.php?user=username&pass=password
就可以自動更新dns記錄了
如果有需要,也可以寫一個client來做這件事
接下來是針對安全性做了一點點的強化的版本
考慮到也許你的dns server上會有些其他的使用者
用localhost的話,可能會被其他使用者亂改你的dns記錄
所以改用key的認證方式
方法也很簡單
首先參照先前所提LEO兄的文章(或是參照dnssec-keygen的man page)產生key pair,將key file放到一般service無法access的地方(如自行開啟一個專屬的目錄),然後將相關的權限設為600、owner與group設為正確的user
修改named.conf
- 代碼: 選擇全部
allow-update{ key ddnskeyname; };
修改上面的script
- 代碼: 選擇全部
find: shell_exec ( "echo \"" . $qs . "\"|/path/to/nsupdate -v");
replace: shell_exec ( "echo \"" . $qs . "\"|/path/to/nsupdate -v -k /path/to/key.file");
附帶一提,nsupdate有win32版,包在bind win32裡,可以在BIND9.NET下載,若想採用網中人兄與LEO兄提出的解決方案,也不需擔心Win32平台適用性的問題。
寫的不是很有系統,請見諒。