顯示具有 資訊網路 標籤的文章。 顯示所有文章
顯示具有 資訊網路 標籤的文章。 顯示所有文章

2010年1月15日

把 SFTP 關起來 (CHROOTED)

前言

為了提供少量的檔案共享但又不願意特地去設定 FTP 服務的話,通常第一個想到的會是附屬在 SSH 服務下的 SFTP 傳輸模式,事實上 SFTP 這個服務雖然因為加密的關係會導致傳輸時間略長,但卻一直是格揆我作為檔案傳輸的唯一方式。但這方式雖方便卻有個大問題:登入的使用者可以看到所有的檔案目錄甚至直接下載檔案內容。這在多人使用的環境下顯然會有資安上面的困擾,有沒有辦法把 SFTP 服務關在某個指定的目錄下呢?

格揆經由 Google 大神的協助並多方測試後終於實作出可行方案,就... 再貢獻回給大神吧... XD

設定步驟

※ 本文以 OpenSSH 5.2_p1-r3 為設定環境!

  1. 選定封鎖目錄:如果對像是單一個人時即為該用戶登入 SFTP 時的根目錄;如果對像是一個群組時則該目錄為這群使用者目錄的根目錄。
  2. 在 /etc/ssh/sshd_config 中啟用 sftp subsystem:特別注意要啟用的是 internal-sftp 這個 Subsystem。
    # override default of no subsystems
    #Subsystem      sftp    /usr/lib64/misc/sftp-server               # 系統中原來的設定
    Subsystem       sftp    internal-sftp                                       # 改用 internal-sftp 
    
  3. 一樣在 sshd_config 中指定需要被關起來的使用者資訊及要關到什麼地方去,請在前述修改處之後加上以下設定:
    Match User ada                                 # 要被關起來的使用者,如果是群組的話則將 User 改為 Group 再接群組名稱
                                                              # 例如: Match Group rootedSFTP
    ChrootDirectory /chroot                    # 要關在什麼地方,如果對像是個群組且群組內的每個人有個別目錄設定時,
                                                              # 可以加上 PATTERNS (man ssh_config) 做區隔,如 /chroot/%u ,
                                                              # /chroot 為這群使用者目錄的根目錄。
    ForceCommand internal-sftp            # 一樣要使用 internal-sftp 這個 Subsystem
    
  4. 設定 Chroot 目錄權限:錯誤的目錄權限設定會導致在 log 中出現 "fatal: bad ownership or modes for chroot directory XXXXXX" 的訊息。根據 openssh 5.1 chrootdirectory permissions issue 這篇文章的資訊顯示,目錄的權限設定有兩個要點:
    • 由 ChrootDirectory 指定的目錄開始一直往上到系統根目錄為止的目錄擁有者都只能是 root
    • 由 ChrootDirectory 指定的目錄開始一直往上到系統根目錄為止都不可以具有群組寫入權限
  5. 重新載入 sshd 後即可透過 FileZilla 等支援 SFTP 的軟體測試有無被關起來了...

2008年6月26日

網路詐騙手段又一例

收到一封信件告訴我說有個網域名稱被釋出,因為我是 adahsu.net 的持有人,也許我也會想要取得 adahsu.com 這個域名,而且強調只會通知這麼一次,錯過之後就再無機會了。

其實個人是蠻排斥 .com 網域名稱的,但是我還是很白爛的給他點了 連結 ,看看他們想要幹嘛?

先不管那個 US$49.95 的轉讓價格,真正讓我感興趣的是頁面下方的 Recent Feedback 區塊,第一眼的感覺就像啞拍上那些洗帳號自我評價的詐騙手段,所以開始懷疑這個頁面恐怕有問題。

先來個 whois 吧,似乎是真的被釋出了?

ada@www ~ $ whois adahsu.com

Whois Server Version 2.0

Domain names in the .com and .net domains can now be registered with many different competing registrars. Go to http://www.internic.net for detailed information.

No match for "ADAHSU.COM". >>> Last update of whois database: Wed, 25 Jun 2008 23:22:53 EDT <<<

即然被釋出了,那麼各大域商應該也可以直接註冊吧?即然如此,我幹嘛花 5 倍(Yahoo!GoDaddy 都是一年 US$10 有找)的費用在這個身份不明的網站呢?於是靈機一動 換個域名 查查看,馬上露餡了。

我才不相信 Google.com 這個域名只值 US$49.95 啦,再說 Google 怎麼可能會賣掉它呢?

2006年1月13日

PCHOME 的垃圾電子報伺服器清單

老實說,我看到這串列表時只有一種反應:直接擋下 PCHOME 這一整段的伺服器 IP 吧!而且馬上就加上去!

PCHOME 的垃圾電子報伺服器清單

2004年6月20日

使用 SNMP 查詢 ADSL Router (ATU-R) 狀態


使用 SNMP 查詢 ADSL Router (ATU-R) 狀態

補充說明:
  1. 一個使用 SNMP 查詢網路設備狀態的範例
  2. 與 ADSL 相關的 MIB 參考:ADSL-LINE-MIB
我目前使用的網路是由 HiNET 所提供,硬體設施則是使用由中華電信出借的 Alcatel SPEEDTOUCH 340 這顆 ATU-R。
由於在系統中裝了 snmpd 服務,加上知道 Alcatel SPEEDTOUCH 340 也有提供 SNMP 代理服務 (必須使用 telnet 設定方式才能看到,若用 Web 設定界面是看不到的 ),所以就試著透過 SNMP 來看看這顆 ATU-R 有啥特殊資訊。

確認主機與 ATU-R 同網段

除非使用的是固定多 IP 制的連線模式,否則 ATU-R 會使用 bridge 模式來代轉使用者的網路連線。這通常給使用者一個 ATU-R 本身沒有 IP 的假象。
只要是網路設備必然會有一個 IP 來代表( HUB沒有就是了 :p),ATU-R 也不例外。它的預設 IP 是 192.168.1.1,只要系統能有一個 IP 與 ATU-R 的預設 IP 同一網段時即可存取 ATU-R 上的資訊,至少我們可以透過 telnet , web 或者是 snmp 方式向 ATU-R 進行存取作業。
我的系統中內建有 5 個網路界面,因此指定其中一個網路界面的 IP 為 192.168.1.2,當然你也可以透過 alias IP 的方式讓同一張網卡擁有兩個以上的 IP ,設定完畢後先 ping ping 看是否可以連上 ATU-R。

確認已安裝 snmp utility

在 Linux 環境下,只要安裝 net-snmp 套件後即可;若是 Windows 系統則請自己看著辦。
Gentoo Linux 中可以使用以下方式檢查是否安裝 net-snmp 套件。

www tmp # emerge -s net-snmp
Searching…
[ Results for search key : net-snmp ]
[ Applications found : 2 ]
* dev-perl/Net-SNMP Latest version available: 4.1.2 Latest version installed: [ Not Installed ] Size of downloaded files: 70 kB Homepage: http://www.cpan.org/modules/by-module/Net/Net-SNMP-4.1.2.readme Description: A SNMP Perl Module License: Artistic
* net-analyzer/net-snmp Latest version available: 5.0.9-r1 Latest version installed: 5.0.9-r1 Size of downloaded files: 2,290 kB Homepage: http://net-snmp.sourceforge.net/ Description: Software for generating and retrieving SNMP data. License: as-is

開始查詢 ATU-R 系統資訊


www tmp # snmpwalk 192.168.1.1 -c public -v 1 1.3.6.1.2.1.1
SNMPv2-MIB::sysDescr.0 = STRING: Alcatel SPEEDTOUCH 340 version 7.1.0.31 (patch) (25 April 2001) T60L280.01/H2.3.1.5.01/1.4.8
Copyright (c) 2001
SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.4684
SNMPv2-MIB::sysUpTime.0 = Timeticks: (83557662) 9 days, 16:06:16.62
SNMPv2-MIB::sysContact.0 = STRING:
SNMPv2-MIB::sysName.0 = STRING:
SNMPv2-MIB::sysLocation.0 = STRING:
SNMPv2-MIB::sysServices.0 = INTEGER: 6
從以上可知 ATU-R 的產品名稱、版本編號、開機時間等,其他像連絡人資訊、系統名稱、系統位置則沒有設定。

查詢 ATU-R 網路設備資訊

www tmp # snmpwalk 192.168.1.1 -c public -v 1 1.3.6.1.2.1.2
資料很多,所以可以改查詢網路設備的型別。
www tmp # snmpwalk 192.168.1.1 -c public -v 1 1.3.6.1.2.1.2.2.1.2
IF-MIB::ifType.1 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.2 = INTEGER: ppp(23)
IF-MIB::ifType.3 = INTEGER: ppp(23)
IF-MIB::ifType.4 = INTEGER: ppp(23)
IF-MIB::ifType.5 = INTEGER: ppp(23)
IF-MIB::ifType.6 = INTEGER: ppp(23)
IF-MIB::ifType.7 = INTEGER: ppp(23)
IF-MIB::ifType.8 = INTEGER: ppp(23)
IF-MIB::ifType.9 = INTEGER: ppp(23)
IF-MIB::ifType.10 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.11 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.12 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.13 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.14 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.15 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.16 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.17 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.18 = INTEGER: other(1)
IF-MIB::ifType.19 = INTEGER: adsl(94)
IF-MIB::ifType.20 = INTEGER: fast(125)
IF-MIB::ifType.21 = INTEGER: interleave(124)
不過因為數字型式的 OID 難以記憶,通常會使用文字式代名。
www tmp # snmpwalk 192.168.1.1 -c public -v 1 interfaces.ifTable.ifEntry.ifType
IF-MIB::ifType.1 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.2 = INTEGER: ppp(23)
IF-MIB::ifType.3 = INTEGER: ppp(23)
IF-MIB::ifType.4 = INTEGER: ppp(23)
IF-MIB::ifType.5 = INTEGER: ppp(23)
IF-MIB::ifType.6 = INTEGER: ppp(23)
IF-MIB::ifType.7 = INTEGER: ppp(23)
IF-MIB::ifType.8 = INTEGER: ppp(23)
IF-MIB::ifType.9 = INTEGER: ppp(23)
IF-MIB::ifType.10 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.11 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.12 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.13 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.14 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.15 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.16 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.17 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.18 = INTEGER: other(1)
IF-MIB::ifType.19 = INTEGER: adsl(94)
IF-MIB::ifType.20 = INTEGER: fast(125)
IF-MIB::ifType.21 = INTEGER: interleave(124)
配合每一個界面的描述,大致上可以得知這 21 個界面的用途。
www tmp # snmpwalk 192.168.1.1 -c public -v 1 interfaces.ifTable.ifEntry.ifDescr
IF-MIB::ifDescr.1 = STRING: ethernet
IF-MIB::ifDescr.2 = STRING: ppp channel 1
IF-MIB::ifDescr.3 = STRING: ppp channel 2
IF-MIB::ifDescr.4 = STRING: ppp channel 3
IF-MIB::ifDescr.5 = STRING: ppp channel 4
IF-MIB::ifDescr.6 = STRING: ppp channel 5
IF-MIB::ifDescr.7 = STRING: ppp channel 6
IF-MIB::ifDescr.8 = STRING: ppp channel 7
IF-MIB::ifDescr.9 = STRING: ppp channel 8
IF-MIB::ifDescr.10 = STRING: ppp1
IF-MIB::ifDescr.11 = STRING: ppp2
IF-MIB::ifDescr.12 = STRING: ppp3
IF-MIB::ifDescr.13 = STRING: ppp4
IF-MIB::ifDescr.14 = STRING: ppp5
IF-MIB::ifDescr.15 = STRING: ppp6
IF-MIB::ifDescr.16 = STRING: ppp7
IF-MIB::ifDescr.17 = STRING: ppp8
IF-MIB::ifDescr.18 = STRING: bridge
IF-MIB::ifDescr.19 = STRING: ADSL physical interface
IF-MIB::ifDescr.20 = STRING: ADSL fast channel
IF-MIB::ifDescr.21 = STRING: ADSL interleaved channel
比對過 ifType 和 ifDescr 後,可以判定第 1 個網路界面是 ethernet,也就是接到內部網路的那個界面;第 18 個網路界面是 bridge, 若使用 bridge 模式時會在這個網路界面上產生 I/O;第 19 個網路界面是 adsl, 也就是 ADSL 實體線路,當線路異常時會在這個界面上產生反應。

範例:檢查網路是否斷線

透過 interfaces.ifTable.ifEntry.ifOperStatus.xx 可以查詢指定界面的連線狀態,如:

www tmp # snmpwalk 192.168.1.1 -c public -v 1 interfaces.ifTable.ifEntry.ifOperStatus.1
IF-MIB::ifOperStatus.1 = INTEGER: up(1)
www tmp # snmpwalk 192.168.1.1 -c public -v 1 interfaces.ifTable.ifEntry.ifOperStatus.18
IF-MIB::ifOperStatus.18 = INTEGER: up(1)
www tmp # snmpwalk 192.168.1.1 -c public -v 1 interfaces.ifTable.ifEntry.ifOperStatus.19
IF-MIB::ifOperStatus.19 = INTEGER: up(1)

查詢某個 OID 的意義

當查詢某個裝置的資訊時,發現有無法明確辨識的 SNMP 標籤時其實可以透過 net-snmp 套件所提供的轉譯工具,將標籤轉成較為明確的說明,如 ATU-R 中有這個一個標籤 IF-MIB::ifLastChange,他的實際意義可以這樣查詢:

www tmp # snmptranslate -Td -OS IF-MIB::ifLastChange
IF-MIB::ifLastChange
ifLastChange OBJECT-TYPE
  -- FROM       IF-MIB, RFC1213-MIB
  SYNTAX        TimeTicks
  MAX-ACCESS    read-only
  STATUS        current
  DESCRIPTION   "The value of sysUpTime at the time the interface entered
            its current operational state.  If the current state was
            entered prior to the last re-initialization of the local
            network management subsystem, then this object contains a
            zero value." 
::= { iso(1) org(3) dod(6) internet(1) mgmt(2) mib-2(1) interfaces(2) ifTable(2) ifEntry(1) 9 }
也可以查詢 IF-MIB::ifOperStatus 的完整說明。
www tmp # snmptranslate -Td -OS IF-MIB::ifOperStatus
IF-MIB::ifOperStatus
ifOperStatus OBJECT-TYPE
  -- FROM       IF-MIB, RFC1213-MIB
  SYNTAX        INTEGER { up(1), down(2), testing(3), unknown(4), dormant(5), notPresent(6), lowerLayerDown(7) }
  MAX-ACCESS    read-only
  STATUS        current
  DESCRIPTION   "The current operational state of the interface.  The
            testing(3) state indicates that no operational packets can
            be passed.  If ifAdminStatus is down(2) then ifOperStatus
            should be down(2).  If ifAdminStatus is changed to up(1)
            then ifOperStatus should change to up(1) if the interface is
            ready to transmit and receive network traffic; it should
            change to dormant(5) if the interface is waiting for
            external actions (such as a serial line waiting for an
            incoming connection); it should remain in the down(2) state
            if and only if there is a fault that prevents it from going
            to the up(1) state; it should remain in the notPresent(6)
            state if the interface has missing (typically, hardware)
            components."
::= { iso(1) org(3) dod(6) internet(1) mgmt(2) mib-2(1) interfaces(2) ifTable(2) ifEntry(1) 8 }

應用

當我們知道如何查詢指定硬體的 SNMP 資訊後,即可加以整理作為系統效能的參考依據或是錯誤警示等,或者透過 MRTG 等其他工具將數據資訊以圖示方式顯示出來。這部份就是個人的創意問題了。

2004年6月18日

Thunderbird 0.7 正式推出

嘩… 前幾天才剛釋出 Firefox 0.9 ,沒想到才幾天而以連 ThunderBird 0.7 也更著釋出,真是令人欣喜。您可以到Mozilla 正體中文網站去下載中文版本,也可以到Mozilla Thunderbird去瞭解一些相關的特色。

簡單介紹一下,ThunderBird 是一套獨立的郵件客戶端軟體,也可以用來讀取新聞伺服器上的新聞資訊,功能上差不多和微軟的 Outlook Express 相當。

不過 ThunderBird 內建有垃圾郵件偵測器,可以協助過濾日益煩人的垃圾郵件的侵擾,這個功能目前是 Outlook Express 遠遠所不及的。更重要的是,使用這個郵件客戶端軟體的話可以不必擔心那些針對 IE/OE 漏洞的惡意信件所帶來的困擾,因為 Thunderbird 不會,也不能執行那些惡意信件所使用的 Script 語言。當然,若你手賤去執行信件的附檔的話,那就不是 Thunderbird 能夠負責任的事了… :p

不過有時候 Thunderbird 比較容易 Crash ,一般只要重新啟動 Thunderbird 即可。若還有使用上的問題的話,可以到Mozilla Thunderbird 特區尋求其他使用者的協助。

2004年6月2日

使用 RRDTool 整合系統狀態

RRDTool手册(簡)

RRDTool 和 MRTG 一樣都是將某些狀態的數值變化以圖形方式加以顯現的工具,其中最大的差別在於 RRDTool 可以在同一個圖示中整合多種看似無關的數據資料在同一個時間流之下,例如網頁存取次數與網路流量、CPU 使用率、以及記憶體使用率之間的關係。可以提供管理人員作為判別之用。

這份文件是參考 abelyang 在 酷!學園 討論區中標題為 [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略 的內容後所做的實際測試,同時依個人的領悟狀況加上個人的解釋。

安裝 rrdtool

在 Gentoo 下,直接以 emerge -v rrdtool 即可安裝,portage 機制可以會自行處理相依性問題。事實上 rrdtool 須要的套件主要是 libgd (RedHat 叫 gd) 這個套件,通常在安裝 libgd 前會先安裝 libpng 及 freetype2 兩個套件。若使用中文修改版的 rrdtool 則還必須另外安裝 libiconv 套件,目前 Gentoo 中 libiconv 這個套件是 Masked 的。

使用 RRDTool 的基本步驟

使用 RRDTool 的基本步驟有三:

  1. 建立RRD資料記錄檔:也就是真正儲放資料的地方,基本上是要求 RRDTool 必須記錄多少項資訊,以及這些資訊的儲存規則。
  2. 擷取資料、寫入資料記錄檔:透過各種方式將當成圖示條件的資料寫入RRD記錄檔中,作為晝面顯示的依據。
  3. 繪出圖示:將已記錄下的資料依指定格式輸出成圖形檔,提供管理人員分析研判。

練習目標

由於我的 Server 上有提供 WEB 及 Mail Server 兩種服務,因此打算以這兩種服務的流量表作為這次練習的目標,依照前述的三步驟逐一建立。

同時,由於是追蹤流量的改變,因此必須使用 tcpdump 輔助工具協助擷取 TCP 封包資訊,不過這部份的使用不在此次介紹之列。其他像是 Shell Script, sed/awk, 或 Regular Expression 等使用也必須瞭解熟悉。

建立 RRD 記錄檔

建立 RRD 記錄檔的方式是透過 rrdtool create 方式達成,以下是完整的語法結構。

rrdtool create filename                 # filename 一般會以 .rrd 作結尾,方便辨視
[--start|-b start time]                 # 記錄起始時間, 為自1970-01-01 00:00:00迄今之秒數
[--step|-s step]                        # 每兩次記錄之間的時間間隔
[DS:ds-name:DST:heartbeat:min:max]      # 資料源,同一記錄檔中可有多個資料源
[RRA:CF:xff:steps:rows]                 # 資料保存方式

記錄起始時間用於標示該記錄檔有效起始時間,未指定時以建檔當時時間為預設值。

時間間隔則用於標示前後筆資料的相差時間(秒數)。

資料集合(DataSource, DS, 或稱為資料源):

  1. ds-name: 用來指定這個資料集合的名稱
  2. DST: 用來說明這個資料集合的型別為何,總共有四種:GAUGE、COUNTER、DERIVE及ABSOLUTE。GAUGE 是指前後兩個數據各自獨立,沒有關連的記錄方式;COUNTER 則是前後項資料之間有累計的性質。使用 COUNTER 會影響到圖示輸出的方式,其輸出的值則是兩數據之間的差。其他待查。
  3. heartbeat: 有效值,這是指多久時間之內若沒有取得資料時先用內插法取得欠缺的資料,但若超過這個限定時間長度的話則直接以 UNKNOW (UN) 表示。例如:假設step設為300, heartbeat 設為 600,某一個時間軸中的一點為t1,t2為t1+300秒,t3為t1+600秒, t4為t1+900秒。當t1有值、t3有值,但t2無資料時,會因為 t3 - t1 <= heartbeat 而由 rrdtool 自行將 t1 + t3 的值除以 2 作為 t2 的值;但若 t1 有值,t2, t3無值而t4有值,則因為 t4 - t1 >= heartbeat 所以 t2, t3 都會變成 UN,表示無資料。
  4. min: 可接受的最小值。
  5. max: 可接受的最大值。
資料保存方式 (RRA):
  1. CF: 資料使用方式,共有AVERAGE,MIN,MAX,LAST四種,分別表示在指定的區間(steps)內的所有數據的『平均值』、『最小值』、『最大值』、『最後值』 。
  2. xff: 用途不明,其值限定在 0 到 1 之間,我試過填入 0 或填入 0.5 似乎都沒差。
  3. steps: 指出這個保存方式橫跨幾個step, step表示多長時間則由建檔時指定。
  4. rows: 在指定的steps間隔下,必須保留最新的多少筆資料。例如若step=300,steps=1,rows=800即表示5分鐘間隔的記錄要存800筆;step=300,steps=6,row=300表示30分鐘間隔的記錄要存300筆。
經由以上的說明,可以使用以下的命令建立符合練習目標的rrd記錄檔。

# 指令請自行串接成一行
rrdtool create ~/tcpdump.rrd
-s 300
DS:smtp:GAUGE:600:0:U
DS:http:GAUGE:600:0:U
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

上述指令的完整意思說明如下:

  1. 建立一個叫 tcpdump.rrd 的rrd記錄檔。
  2. tcpdump.rrd的資料計算區間為300秒。
  3. 有一個叫smtp的資料集,單一數值記錄,最長有效時間為600秒,最小值為0,最大值無限制。
  4. 有一個叫http的資料集,單一數值記錄,最長有效時間為600秒,最小值為0,最大值無限制。
  5. 資料保存時必須記錄5分鐘的資料平均值603筆。
  6. 資料保存時必須記錄30分鐘的資料平均值603筆。
  7. 資料保存時必須記錄2小時的資料平均值603筆。
  8. 資料保存時必須記錄一天的資料平均值800筆。
  9. 資料保存時必須記錄5分鐘的資料最大值603筆。
  10. 資料保存時必須記錄30分鐘的資料最大值603筆。
  11. 資料保存時必須記錄2小時的資料最大值603筆。
  12. 資料保存時必須記錄1天的資料最大值800筆。

更新RRD記錄檔

要更新RRD記錄檔必須透過 rrdtool update 方式進行,以下是指令的架構:

rrdtool update filename                # 欲更新的RRD檔檔名 
[--template|-t ds-name[:ds-name]...]   # 指定要更新的資料源順序,未輸入時以建立時的順序為預設值
N|timestamp:value[:value...]           # 記錄時間及相關數據
  1. --template|-t: 用於標示後續的資料要依何種順序寫入RRD記錄檔中,若有多個資料源則以 : 加以區隔。
  2. N|timestamp: 用於標示此筆資料的建立時間,若記錄的時間是目前的時間時,可以用 N 表示。這個數值的單位是秒,在 bash 下可以使用如下方式取得:
    NOW=$(date +%s)
  3. value: 實際欲寫入的數據,必須和 template 指定的項數建檔時的資料集合項數 符合。
簡單的說,更新RRD記錄檔的方式就是將須填入的資料準備好,再依指令規定的格式串接即可透過指令寫入記錄檔中。

寫入新資料時,必須注意rrdtool在繪出圖檔時似乎是以 08:00 + step 設定的秒數 UTC +0000 為時間軸的參考點(所以實際的起始時間必須配合 TimeZone 來確認,如 Taipei 時區就變成 08:00 為起始點),因此在實際繪出圖形時若發現預期外的小數點輸出時,請修改寫入記錄檔時所設定的 timestampe ,使之配合 0 + step 的週期即可。

以下是此次測試使用的資料擷取程式片段,我採用 crontab 方式執行。

#!/bin/bash
# tcpdump.sh, 產生 smtp 及 http 兩個 port 上的流量表並寫入 rrd 記錄檔
RRD_PATH="/root/tcpdump.rrd"
image_path="/root"
sec=300
# 此段用於產生新的 tcpdump 記錄檔
killall tcpdump
mv /root/ip.packet /root/ip.packet.1
/usr/sbin/tcpdump -w /root/ip.packet tcp &
# 指定要計算的 port 列表
scan_port="25 80"
rrd_data=""
# 開始擷取相關資料,算出來的流量單位是 5 分鐘內的平均 bytes 數
# 請注意:這邊對流量的計算方式僅適用於 Gentoo 下的 tcpdump v3.8.3 版,
#        這是因為 tcpdump 輸出格式似乎有依套件及版本別不同而有不同的格式。
for sport in $scan_port
do
        port=$(/usr/sbin/tcpdump -r /root/ip.packet.1 port $sport -v | sed -e 's/.*, length: ([^)]*)) .*$/1/g' | tr 'n' '+')
        port=$(echo ${port}0| bc)
        port=$(expr $port / $sec)
        rrd_data="$rrd_data$port:"
done
# 濾掉前一個迴圈中額外產生的 : 符號
rrd_data=$(echo $rrd_data | sed -e 's/:$//')
# 將指令寫入 tcpdump.cmd 中,若須重建 rrd 資料庫時可以重覆利用
echo "rrdtool update $RRD_PATH N:$rrd_data" >> /root/tcpdump.cmd
rrdtool update $RRD_PATH N:$rrd_data

輸出圖形

RRDTool 的繪圖指令格式

rrdtool graph filename                      # filename 圖檔名稱
[-s|--start seconds]                        # 起始時間,自1970年1月1日起以秒為單位,預設為24小時前
[-e|--end seconds]                          # 結束時間,規則同起始時間,預設為繪圖當時之時間
[-x|--x-grid x-axis grid and label] 
[-y|--y-grid y-axis grid and label] 
[-Y|--alt-y-grid] 
[-R|--alt-y-mrtg] 
[-A|--alt-autoscale] 
[-M|--alt-autoscale-max] 
[-N|--no-minor]                             # 不要繪出副隔線 
[-X|--units-exponent] value]> 
[-L|--units-length] value]> 
[-v|--vertical-label text]                  # Y 軸上的說明
[-w|--width pixels]                         # 圖檔寬度
[-h|--height pixels]                        # 圖檔高度
[-i|--interlaced] 
[-f|--imginfo formatstring] 
[-a|--imgformat GIF|PNG|GD]                 # 圖檔格式,預設為 GIF 格式
[-B|--background value] 
[-O|--overlay value] 
[-U|--unit value] 
[-z|--lazy] 
[-o|--logarithmic] 
[-u|--upper-limit value]                    # 設定 Y 軸上最高顯示範圍
[-l|--lower-limit value]                    # 設定 Y 軸上最低顯示範圍
[-g|--no-legend] 
[-j|--only-graph]                           # 關閉說明列 
[-F|--force-rules-legend] 
[-r|--rigid] 
[-S|--step value]                           
[-b|--base value] 
[-c|--color COLORTAG#rrggbb]                # 指定物件(COLORTAG)顏色 
[-t|--title title]                          # 圖形抬頭
[DEF:vname=rrd:ds-name:CF]                  # 定義rrd檔中的資料集合對應之變數名稱
[CDEF:vname=rpn-expression]                 # 定義經計算過後之變數名稱
[PRINT:vname:CF:format]                     # 格式化字串
[GPRINT:vname:CF:format]                    # 格式化字串
[COMMENT:text]                              # 註解訊息
[HRULE:value#rrggbb[:legend]]  
[VRULE:time#rrggbb[:legend]] 
[LINE{1|2|3}:vname[#rrggbb[:legend]]]       # 設定線條格式(有寬、中、細三種,分別為LINE3, LINE2, LINE1) 
[AREA:vname[#rrggbb[:legend]]]              # 設定區塊格式
[STACK:vname[#rrggbb[:legend]]]
  • RRDTool 其實是不支援中文的,以下附的中文範例其實是因為使用了 abelyang 修改過的版本,請注意這項不同。
以下僅就範例所需解釋各參數的意義:
  1. -s|--start : 繪圖的起始時間點,以1970年1月1日0時0分0秒開始計算所經的秒數。預設值為 1 天前。
  2. -e|--end : 繪圖的結束時間點,以1970年1月1日0時0分0秒開始計算所經的秒數,預設值為現在。
  3. -N|--no-minor : 不要繪出副格線,在長時段下若繪出副格線有時會顯的凌亂不已。
  4. -v|--vertical-label : Y 軸上的說明文字。
  5. -w|--width : 資料輸出的有效寬度,單位是點。實際輸出寬度會因 Y 軸上的說明文字所佔用空間及兩側空白之故而略寬。
  6. -h|--height : 資料輸出的有效高度,單位是點。實際輸時會因為線條的說明文字及上下兩端空白之故而略高。
  7. -a|--imgformat GIF|PNG|GD : 指定圖形檔輸出格式,預設值是GIF,並不因為指定的圖檔副檔名而自動調整。
  8. -u|--upper-limit : 指定Y軸上的最高數據值,這個值一定大於或等於指定時間區段中的資料最大值。
  9. -l|--lower-limit : 指定Y軸上的最低數據值,這個值一定小於或等於指定時間區段中的資料最小值。
  10. -c|--color COLORTAG#rrggbb : 設定圖形輸出色彩值,COLORTAG中指定設定的項目,rrggbb是實際顏色值。COLORTAG共有BACK, CANVAS, SHADEA, GRID, MGRID, FONT, FRAME, ARROW 8種,詳細用途請自行參考 RRD TOOL -- RRD GRAPH 說明。
  11. -t|--title : 圖形抬頭。
  12. DEF:vname=rrd:ds-name:CF : 定義來自RRD資料檔的資料源對應,簡單的說就是要將某變數(vname)定義成資料檔(rrd)中的那一個資料源(ds-name)的那一種型別(CF)。例如:
    DEF:v1=/root/tcpdump.rrd:smtp:MAX
    表示將tcpdump.rrd記錄檔中的smtp資料源中記錄的最大值命名為v1這個變數。
  13. CDEF:vname=rpn-expression : 定義運算公式 (rpn-expression),並賦予公式名稱 (vname)。通常在原始資料不一定適合直接顯示在畫面上,此時可透過運算公式對原始資料進行處理。整個公式的表示採用後序方式表示,也就是必須將運算子擺到尾巴的方式。如果想要更清楚的瞭解公式的表達方式可以參考官方網站 CDE TutorialRPN Tutorial 網頁說明。
  14. GPRINT:vname:CF:format : 將指定的變數(vname),種類(CF)依規範的格式化字串(format)格式輸出到圖形的說明區中。
  15. COMMENT:text : 註解訊息,可在字串末端加上 LF 符號表示換行。
  16. LINE{1|2|3}:vname[#rrggbb[:legend]] : 線段設定,將指定變數(vname)的數據內容以指定的顏色(#rrggbb)及寬度(LINE3最粗,LINE1最細)繪出。legend用於說明該顏色/變數所代表的意義。
  17. AREA:vname[#rrggbb[:legend]] : 區塊設定,指將指定變數(vname)的數據內容以指定的顏色(#rrggbb)繪出。legend用於說明該顏色/變數所代表的意義。
RRD_FILE=/root/tcpdump.rrd
NOW_STR=$(date +"%Y-%m-%d %H:%M:%S")

# 以下指令請自行串接為一行,\\n 因 SnipSnap 限制,其意是換行符號 LF。 rrdtool graph /home/blog/ada/flowrate.png --title "伺服器網路服務流量表 - 最近 2 小時內" DEF:d1=$RRD_FILE:smtp:MAX DEF:d2=$RRD_FILE:http:MAX COMMENT:"服務別 --- 最大值 -- 平均值 -- 最小值 -- 現值 -- \\n" LINE3:d1#0000ff:"SMTP: " GPRINT:d1:MAX:"%10.0lf" GPRINT:d1:AVERAGE:"%11.0lf" GPRINT:d1:MIN:"%11.0lf" GPRINT:d1:LAST:"%9.0lf \\n" LINE3:d2#ff0000:"HTTP: " GPRINT:d2:MAX:"%10.0lf" GPRINT:d2:AVERAGE:"%11.0lf" GPRINT:d2:MIN:"%11.0lf" GPRINT:d2:LAST:"%9.0lf \\n" --no-minor -h 200 -w 320 -s `date -d "-2 hour" +%s` COMMENT:" 最後更新: $NOW_STR"

上述指令的說明如下:

  1. 定義一個叫 d1 的變數,其資料來源是 RRD 檔中的 smtp 資料集合中的 MAX 類型之資料。
  2. 定義一個叫 d2 的變數,其資料來源是 RRD 檔中的 http 資料集合中的 MAX 類型之資料。
  3. 使用 LINE3 線段繪出 d1 的變動情形,此時線段使用的顏色是紅色,同時附帶一個簡短的訊息文字,內容是 "SMTP:"。
  4. 格式化輸出 d1 的各種狀態的值。
  5. 使用 LINE3 線段繪出 d2 的變動情形,此時線段使用的顏色是藍色,同時附帶一個簡短的訊息文字,內容是 "HTTP:"。
  6. 格式化輸出 d2 的各種狀態的值。
  7. 不要顯示副格線。
  8. 有效高度是 200 畫素。
  9. 有效寬度是 320 畫素。
  10. 起時日期是 2 小時前。
  11. 輸出最後更新時間為 $NOW_STR。
圖檔輸出範例:
example

中文版本安裝 - 使用 Gentoo Linux

※目前 rrdtool 應已內建輸出 UTF-8 字元之能力!

若打算在 Gentoo 上使用 abelyang 所修改的 rrdtool 套件,必須完成以下作業:

  1. 自行建立 gnroff 的 soft link。
    ln -s /usr/bin/nroff /usr/bin/gnroff
  2. make 前要修改 perl-piped 及 perl-shared 目錄下的 Makefile, 將 perl 版本別改為系統上的狀態。例如在 vim 下執行下述指令可以完成修改作業。
    :1,$s/5.8.0/5.8.2/g
  3. make 前要修改 perl-piped 及 perl-shared 目錄下的 Makefile, 將 i386-linux-thread-multi 改為系統上的狀態。在 vim 下執行以下指令可完成修改作業。
    :1,$s/i386-linux-thread-multi/i686-linux/g
  4. 安裝中文字形檔 media-fonts/arphicfonts。
  5. 修改 gd1.3/gd.c 中字型檔位置
    gdImageStringTTF(im,&brect[0], color, "/usr/share/fonts/ttf/zh_TW/bkai00mp.ttf",12,0.0,x-2,y+13,UTF8_String((char *)s));
  6. 最後安裝 rrdtool 時不要使用 configure, 直接 make clean; make; make install 即可。

中文版本安裝 - 使用 RedHat Linux

若打算在 Redhat 上使用 abelyang 所修改的 rrdtool 套件,必須完成以下作業:

  1. 安裝 libpng, libjpeg, freetype2 的函式標頭檔。
  2. 安裝 gd 套件,可以先找找 rpm 套件包,也別忘記安裝函式標頭檔。同樣的,若 rrdtool 無法 make 成功時,請考慮自行編譯 gd ,同時指定 --prefix=/usr/local 。最後在 ./configure 後必須檢查是否已開啟 freetype, libpng, libjpeg 等支援。
  3. 安裝 libiconv 套件,可以先試著找找看有無 rpm 套件包(記得安裝函式標頭檔),若找不到的話就下載原始程式檔自行編譯安裝。安裝時記得要在 configure 時設定 --prefix=/usr/local ,否則可能 rrdtool 會 make 失敗。另外若發現已確實安裝 libiconv 卻仍然無法成功 make 時,可以試著更改 libiconv 的版本,如 libiconv v1.8 版。
  4. 若有更新過 Perl 時,必須要和 Gentoo 一樣去修改 rrdtool 目錄下的 perl-piped 及 perl-shared 中的 Makefile,將路徑修正成系統的實際設定。
  5. 記得安裝中文字形檔 ttfonts-zh_TW-2.11-19.noarch.rpm 。
  6. 安裝 rrdtool 時不要使用 configure, 直接 make clean; make; make install 即可。

中文版本安裝 - 使用 GB2312 編碼

  1. 請先完成套件本身有關之相依性設定。
  2. 修改 gd1.3/gd.c 中的設定,將
    cd=iconv_open("UTF-8","BIG5");
    修改為
    cd=iconv_open("UTF-8","GB2312");
  3. 開始禱告我的猜測是正確的… :p
  4. 安裝 rrdtool 時不要使用 configure, 直接 make clean; make; make install 即可。

2004年5月25日

RRDTool 好好玩

這兩天在玩RRDTool, 發覺果然有趣極了!

會弄這個,其實是因為公司某台 Server 原本是汰除設備,但因為專案不想花錢所以就又裝了回去。現在我想知道這台 Server 在運作中有沒有什麼高負載的情形,以及當高負載出現時是那種服務所造成的。

為了這個目的先研究了一下SNMP的設定和用法(順便還去看了看ATU-R的狀態… :p), 再來本想試MRTG這個工具,不過不小心看到RRDTool的介紹,遂決定研究這個工具再說。

現在已可以讀出EMAIL和WEB的流量,再來應該要處理一下公司 Server 真正要輸出的資訊後,才回頭把自己的機器搞定!

2004年5月19日

SNMP 服務設定

這篇是個人在 Gentoo Linux 1.4 上設定 snmp 服務的記錄。

安裝 snmp 服務套件

www snmp # emerge -pv net-snmp

These are the packages that I would merge, in order:

Calculating dependencies ...done! [ebuild N ] net-analyzer/net-snmp-5.0.9-r1 -ipv6 +ssl +tcpd 0 kB

Total size of downloads: 0 kB

www snmp # emerge -v net-snmp

透過公用程式 snmpconf 完成 snmpd.conf 設定檔設定作業

www snmp # snmpconf

I can create the following types of configuration files for you. Select the file type you wish to create: (you can create more than one as you run this program)

1: snmpd.conf 2: snmp.conf 3: snmptrapd.conf

Other options: quit

Select File: 1

逐一設定 snmpd.conf 各內容:

The configuration information which can be put into snmpd.conf is divided
into sections.  Select a configuration section for snmpd.conf
that you wish to create:

1: Access Control Setup 2: Trap Destinations 3: Monitor Various Aspects of the Running Host 4: Agent Operating Mode 5: System Information Setup 6: Extending the Agent

Other options: finished

Select section: 5

System Information Setup 內容:

Section: System Information Setup
Description:
  This section defines some of the information reported in
  the "system" mib group in the mibII tree.

Select from:

1: The [typically physical] location of the system. 2: The contact information for the administrator 3: The proper value for the sysServices object.

Other options: finished, list

Select section:

* The [typically physical] location of the system:

請填入系統所在的地理位置作為識別,一般應該會以設備名稱 + 部門、樓層等為識別字串。

Configuring: syslocation
Description:
  The [typically physical] location of the system.
    Note that setting this value here means that when trying to
    perform an snmp SET operation to the sysLocation.0 variable will make
    the agent return the "notWritable" error code.  IE, including
    this token in the snmpd.conf file will disable write access to
    the variable.
    arguments:  location_string

The location of the system: room

* The contact information for the administrator

請填入聯絡人資訊,可以輸入電話或郵件地址等。

Configuring: syscontact
Description:
  The contact information for the administrator
    Note that setting this value here means that when trying to
    perform an snmp SET operation to the sysContact.0 variable will make
    the agent return the "notWritable" error code.  IE, including
    this token in the snmpd.conf file will disable write access to
    the variable.
    arguments:  contact_string

The contact information: Ada Hsu

* The proper value for the sysServices object.

使用 0 (否) 或 1 (是) 回答相關問題,由系統算出 sysServices 的值。

Configuring: sysservices
Description:
  The proper value for the sysServices object.
    arguments:  sysservices_number

does this host offer physical services (eg, like a repeater) [answer 0 or 1]: 0 does this host offer datalink/subnetwork services (eg, like a bridge): 0 does this host offer internet services (eg, supports IP): 1 does this host offer end-to-end services (eg, supports TCP): 1 does this host offer application services (eg, supports SMTP): 1

Finished Output: sysservices 0*1 + 0*2 + 1*4 + 1*8 + 1*64

輸入 finished 後結束 System Information Setup 設定回主選單

Select section: finished

The configuration information which can be put into snmpd.conf is divided into sections. Select a configuration section for snmpd.conf that you wish to create:

1: Access Control Setup 2: Trap Destinations 3: Monitor Various Aspects of the Running Host 4: Agent Operating Mode 5: System Information Setup 6: Extending the Agent

Other options: finished

Select section: 1

進行存取控制設定 Access Control Setup

Section: Access Control Setup
Description:
  This section defines who is allowed to talk to your running
  snmp agent.

Select from:

1: a SNMPv3 read-write user 2: a SNMPv3 read-only user 3: a SNMPv1/SNMPv2c read-only access community name 4: a SNMPv1/SNMPv2c read-write access community name

Other options: finished, list

Select section:

* a SNMPv1/SNMPv2c read-only access community name

這是指定用來讀取 SNMP 訊息用的群組帳號名稱,大部份的 SNMP 代理者多以 public 為其預設的名稱,但建議要另行設定較好。設定完畢後請輸入 finished 回到主選單中。

Configuring: rocommunity
Description:
  a SNMPv1/SNMPv2c read-only access community name
    arguments:  community [default|hostname|network/bits] [oid]

The community name to add read-only access for: snmpmgr The hostname or network address to accept this community name from [RETURN for all]: The OID that this community should be restricted to [RETURN for no-restriction]:

Finished Output: rocommunity snmpmgr

啟動 snmpd 服務

當完成上述設定後即可在主選單中輸入 finished 結束 snmpd.conf 設定作業,最後輸入 quit 離開 snmpconf 設定工具。

I can create the following types of configuration files for you.
Select the file type you wish to create:
(you can create more than one as you run this program)

1: snmpd.conf 2: snmp.conf 3: snmptrapd.conf

Other options: quit

Select File: quit

The following files were created:

snmpd.conf

These files should be moved to /usr/share/snmp/ if you want them used by everyone on the system. In the future, if you add the -i option to the command line I'll copy them there automatically for you.

Or, if you want them for your personal use only, copy them to /root/.snmp . In the future, if you add the -p option to the command line I'll copy them there automatically for you.

上述的說明似乎有點不正確,snmpd.conf 在 Gentoo 中應該要放入 /etc/snmp/ 下,否則 snmpd 是無法正確啟動的。當將 snmpd.conf 複製到 /etc/snmp/ 下後即可啟動 snmpd 服務。

www root # cp snmpd.conf /etc/snmp/
www root # /etc/init.d/snmpd start
 * Starting net-snmpd…                                                  [ ok ]
www root # ps -ef | grep snmp
root     18048     1  0 15:12 ?        00:00:00 /usr/sbin/snmpd -P /var/run/snmpd.pid -a -s -l /dev/null
root     18053 10326  0 15:13 pts/15   00:00:00 grep snmp

使用 snmpwalk 對本機進行訪談,snmpwalk 中要指定在 Access Control Setup 中所設定的帳號名稱,如範例。若 snmpd.conf 設定正確應可看到畫面輸出一長串好幾十頁的訊息。

www root # snmpwalk localhost -c snmpmgr -v 1

若想查看先前在 System Information Setup 所做的設定,可以使用以下方式達成。有關 1.3.6.1.2.1.1 所代表的意義表示為該 SNMP 代理者所記錄的系統資訊,詳細請參閱 SNMP 中有關 OID 的說明。

www root # snmpwalk localhost -c snmpmgr -v 1 1.3.6.1.2.1.1

你可能會發現主機名稱不是完整的領域名稱(FQDN),這可以透過修改 /etc/snmp/snmpd.conf 重新設定,只要加上 sysname 參數即可。但是請注意: 當使用 snmpconf 重新設定 snmpd.conf 內容時,sysname 的設定可能會遺失。

sysname "www.t-times.net"

重啟 snmpd 後重新查詢即可確定設定是否正確。

www root # snmpwalk localhost -c snmpmgr -v 1 1.3.6.1.2.1.1.sysName.0
SNMPv2-MIB::sysName.0 = STRING: "www.t-times.net"

snmp 中提供不少系統的各項資訊,如 1.3.6.1.2.1.2 中記載了系統各種網路界面的資訊,同樣可以使用 snmpwalk 進行查詢。

完成以上動作後,snmpd 即完成設定,最後記得將 snmpd 設定為開機後自動啟動。

www root # rc-update add snmpd default

2004年4月12日

死廣告信...

馬的… 竟然有人在試我的郵件主機帳號… -.-

全部 Block 掉… 讓連線無法建立… 看怎麼試… >"<