顯示具有 FreeBSD 標籤的文章。 顯示所有文章
顯示具有 FreeBSD 標籤的文章。 顯示所有文章

網管人雜誌

本文刊載於 網管人雜誌第 131 期 - 2016 年 12 月 1 日出刊,NetAdmin 網管人雜誌 為一本介紹 Trend Learning 趨勢觀念、Solution Learning 解決方案、Technology Learning 技術應用的雜誌,下列筆記為本站投稿網管人雜誌獲得刊登的文章,網管人雜誌於每月份 1 日出刊您可於各大書店中看到它或透過下列圖示連結至博客來網路書店訂閱它。





文章目錄

前言
在 Hyper-V 虛擬化平台上運作 Unix-Like
什麼是 Hyper-V 整合服務?
Unix-Like虛擬主機整合服務
          CentOS 虛擬主機安裝整合服務
          FreeBSD 虛擬主機安裝整合服務
結語





前言

談到微軟作業系統,某些 IT 人員便認為在作業系統的部分一定是只有 Windows。雖然,Windows 偶爾有推出與開放源始碼整合的相關服務,但使用者通常仍覺得整合程度有限,但是這樣的狀況自從微軟 CEO Satya Nadella 上任並喊出 Microsoft Love Linux 之後便一一被打破,甚至最新推出的 Windows Server 2016 作業系統,還能夠原生執行 Container 容器技術。

同時,不光是地面上企業及組織的相關技術支援 Linux,就連微軟公有雲 Azure 也支援 Linux 作業系統的 VM 虛擬主機及相關服務,根據微軟的內部統計目前在 Azure 公有雲的 VM 虛擬主機工作負載當中,有 1/3 是運作 Linux 作業系統另外 2/3 才是運作 Windows 作業系統。

同時在 2016 年 3 月,微軟已經釋出 SQL Server on Linux 的封閉預覽測試版本,並宣佈預定於2017 年 Q2 將正式推出。屆時,在 Linux 作業系統中也可以安裝 Microsoft ODBC Driver for SQL Server,以便 Linux 作業系統能夠順利存取 SQL Server 資料庫服務。

圖 1、SQL Server on Linux 的封閉預覽測試版本

2016 年 4 月,微軟在 Build 開發者大會上正式宣佈,從 Windows 10(Build 14316)作業系統版本開始,將在 Windows 作業系統核心中加入子系統(Windows Subsystem for Linux),以便在 Windows 作業系統中能夠原生支援 Linux 使用者模式,這與舊有透過 Cygwin 模擬的方式完全不同。現在,你可以直接在 Windows 作業系統中原生執行 Ubuntu Bash、apt-get、git……等。

圖 2、運作 Ubuntu 原生 Bash 指令碼環境在 Windows 作業系統中

2016 年 8 月,微軟也宣佈自家的 PowerShell 指令碼工具正式 Open Sourced。現在,可以在多種 Linux 作業系統(例如,Ubuntu 14.04、Ubuntu 16.04、CentOS 7、OS X 10.11……等)中,直接透過 GitHub 下載安裝後運作 PowerShell 指令碼環境。

圖 3、在 CentOS 作業系統中運作 PowerShell 指令碼環境





在 Hyper-V 虛擬化平台上運作 Unix-Like

在 Hyper-V 虛擬化平台上運作 VM 虛擬主機,倘若客體作業系統採用 Windows 時相信 IT 管理人員應該不陌生,舉例來說,在 Windows Server 的部分支援 SBS 2011、2008 SP2、2008 R2、2012、2012 R2 以及最新版本的 Window Server 2016,至於 Desktop 的部分則支援 Vista SP2、7 SP1、8.1 及最新版本的 Windows 10。

那麼,倘若在 Hyper-V 虛擬化平台中要運作 Unix-Like 作業系統(例如,Linux 及 FreeBSD)時,哪些 Unix-Like 版本才有支援?倘若採用不支援的 Unix-Like 作業系統時是否無法運作在 Hyper-V 虛擬化平台上?Hyper-V 虛擬化平台能否運作 Unix(例如,AIX、HP-UX)或者是 Max OS X?

簡單歸納來說,Hyper-V 虛擬化平台無法運作 Unix 及 Max OS X。同時,當採用未支援的 Unix-Like 作業系統版本時,將會因為無法安裝「整合服務」(Integration Service),除了導致運作於 VM 虛擬主機當中的 Unix-Like 作業系統,無法針對相關虛擬硬體裝置安裝驅動程式與 Hyper-V 虛擬化平台進階功能整合之外,也將會影響 VM 虛擬主機的運作效能。

圖 4、Hyper-V 虛擬化平台是否能運作 Unix 及 Unix-Like 作業系統判斷流程示意圖





什麼是 Hyper-V 整合服務?

事實上,不管採用哪一種虛擬化平台都會需要幫其上運作的 VM 虛擬主機安裝適當的 Tools,以使其上運作的 VM 虛擬主機能夠與虛擬化平台進行最緊密的結合(例如,虛擬裝置驅動程式最佳化……等),舉例來說,倘若採用 VMware vSphere 虛擬化平台便需要幫 VM 虛擬主機安裝 VMware Tools,而 Citrix XenServer 虛擬化平台便需要幫 VM 虛擬主機安裝 Xen Tools。

在 Microsoft Hyper-V 虛擬化平台上,則是需要幫其上運作的 VM 虛擬主機安裝「整合服務」(Integration Services),安裝整合服務完畢後在驅動程式部份將會針對 IDE、SCSI、網路 、視訊 、滑鼠 …… 等方面進行最佳化,而在客體服務方面則會整合作業系統關閉(Shutdown)、時間同步化(Time Synchronization)、資料交換(Key/Value Exchange)、活動訊號(Heartbeat)、線上備份(Volume Shadow copy Service,VSS)……等機制,以期 VM 虛擬主機與 Microsoft Hyper-V 虛擬化平台不管是在效能運作上,或者是虛擬裝置驅動程式最佳化方面都能進行完美的結合。

圖 5、Hyper-V運作元件架構示意圖





Unix-Like 虛擬主機整合服務

倘若,您的 VM 虛擬主機安裝「Windows作業系統」的話,那麼在VM虛擬主機的Console視窗中可以直接執行插入整合服務安裝光碟的動作。當安裝「Linux 作業系統」如 RHEL / CentOS 時,Hyper-V 虛擬化平台雖然也支援「Emulated / Specific」2 種虛擬裝置,但是若需要發揮 Linux 作業系統最佳效能,建議您使用 Hyper-V Specific Devices 並配合安裝「LIS(Linux Integration Services)」,也就是專供 Linux 使用的整合服務映像檔並進行安裝才能達到效能最佳化。

專供 Linux 作業系統使用的 LIS 整合服務映像檔,目前最新版本為 4.1 您可至 Microsoft Download Center 下載「Linux Integration Services Version 4.1 for Hyper-V」,所下載整合服務映像檔名稱為「LinuxIC-4.1.2-2.iso」。

圖 6、下載專供 Linux 作業系統使用的 LIS 整合服務映像檔

LIS 4.1 for Hyper-V 整合服務,支援的 Linux 版本以 RHEL / CentOS 為例的話是 5.2 ~ 5.11、6.0 ~ 6.8、7.0 ~ 7.2,並且可以應用在多種Hyper-V虛擬化平台版本上,例如,Hyper-V 2.0(Windows Server 2008 R2)、Hyper-V 3.0(Windows 8 / 8.1 Pro、Windows Server 2012 / 2012 R2)以及最新的 Windows 10 和 Windows Server 2016。

最新的 LIS 4.1 版本中,除了原有整合服務的特色功能之外還支援下列 5 項新增功能:
  • Hyper-V Sockets。
  • 記憶體熱新增及移除。
  • SCSI WWN。
  • lsvmbus 指令。
  • 反安裝 LIS 整合服務指令碼。

安裝整合服務後的Linux虛擬主機,將具備核心(Core)、網路(Networking)、儲存(Storage)、記憶體(Memory)、視訊(Video)、其它(Miscellaneous)……等特色功能或最佳化效能:

核心(Core)

  • 整合式關機: 透過此功能,在開啟的VM Console視窗中便能為客體作業系統執行關機的動作,而無須登入至客體作業系統手動進行關機。
  • 時間同步處理: 確保VM虛擬主機能夠與Hyper-V主機保持時間同步。
  • 準確時間: 整合 Windows Server 2016 準確時間功能,改善主應用程式與時間同步處理的精確度,能夠將時間誤差值縮短在 1 毫秒的範圍內。
  • 多處理器支援: 支援組態配置 VM 虛擬主機多顆 vCPU 虛擬處理器,達到真正使用 Hyper-V主機多顆 CPU 處理器進行 SMP 平行運算。
  • 活動訊號: 以便 Hyper-V 虛擬化平台能夠偵測及追蹤 VM 虛擬主機運作狀態。
  • 整合式滑鼠支援: 滑鼠功能將可正常運作於 VM 虛擬主機的 Console 視窗中,以及自動在Hyper-V 虛擬化平台中正常切換。
  • Hyper-V 特定儲存裝置: 使 VM 虛擬主機擁有高效能及最佳化的 IDE/SCSI 儲存介面卡,有效提升工作負載能力。
  • Hyper-V 特定網路裝置: 使 VM 虛擬主機擁有高效能及最佳化的 Network Controller 介面卡,有效提升工作負載能力。

網路(Networking)

  • Jumbo Frame: 可設定 MTU 數值大於 1500 bytes 以增加網路效能。
  • VLAN Tagging 及 Trunking: 支援單一 VLAN ID 或多個 VLAN ID Trunking 網路環境。
  • 即時遷移: 讓 VM 虛擬主機支援即時遷移(Live Migration)、無共用儲存即時遷移(Shared Nothing Live Migration)、Hyper-V複本(Hyper-V Replica)…… 等進階功能。
  • 靜態 IP 導入: 當 Hyper-V 主機執行複本容錯移轉之後,因為已經複寫 VM 虛擬主機靜態 IP 位址,所以能夠確保網路工作負載能在發生容錯移轉事件後無縫繼續運作。
  • vRSS 虛擬接收端調整: 將 VM 虛擬主機虛擬網路卡的工作負載,平均分散到 VM 虛擬主機中的多個 vCPU 虛擬處理器。
  • TCP 分割和總和檢查碼卸載: 在傳輸網路數據時,從 VM 虛擬主機的 vCPU 虛擬處理器到 Hyper-V 主機的 vSwitch 虛擬網路交換器之間,進行資料分割及總和檢查碼的動作。
  • LRO 大型接收卸載: 透過將多個封包彙總為更大的緩衝區,以便提升高網路頻寬流入的傳輸量,進而降低 CPU 運算資源的開銷。

儲存(Storage)

  • VHDX 調整大小: 系統管理員可以隨時因應需求,線上調整 VM 虛擬主機的 VHDX 磁碟空間。
  • vHBA 虛擬光纖通道: 讓 VM 虛擬主機能夠感知原生光纖通道裝置,進而支援及使用虛擬光纖通道功能。
  • VM 虛擬主機即時備份: 讓 VM 虛擬主機能夠在運作中的情況下進行備份作業。
  • TRIM: 當應用程式不再需要磁碟空間時,協助執行磁碟空間回收的動作。
  • SCSI WWN: Storvsc 驅動程式將會擷取連接埠和連接至 VM 虛擬主機的全球名稱(WWN),以便建立適當的 sysfs 檔案。

記憶體(Memory)

  • PAE 核心支援: 在 Linux 作業系統中透過 PAE 技術,可以讓 32 位元核心存取超過 4 GB 的記憶體位址空間。舉例來說,舊版的 RHEL 5.x 必須個別在核心中啟用 PAE 功能,而較新版的 RHEL 6.x 則核心已經預先啟用 PAE 功能。
  • MMIO: 協助 JeOS(Just Enough Operating Systems)與 Hyper-V 主機實體記憶體區塊進行對應的動作。
  • 記憶體熱新增及移除: 提供 VM 虛擬主機在運作狀態中,線上動態增加及移除記憶體空間的機制。
  • Ballooning: 活化 Hyper-V 主機記憶體空間,以便渡過記憶體空間暫時不足的因應機制。

視訊(Video)

  • 特定視訊裝置: 提供 VM 虛擬主機高效能及高解析的視訊介面卡,但是此裝置並不提供增強的工作階段模式及 RemoteFX 功能。

其它(Miscellaneous)

  • KVP(Key-Value Pair)Exchange: 取得 VM 虛擬主機在資料方面讀取(Read)/ 寫入(Write)等資訊。
  • NMI 非遮罩式插斷: 協助 VM 虛擬主機當中的客體作業系統,因為應用程式漏洞而發生的崩潰情況,再主機重新啟動後有機會分析導致系統發生崩潰的原因。
  • 客體與主機進行檔案複製: 透過客體服務讓 VM 虛擬主機與 Hyper-V 主機之間,在進行檔案複製作業時無須透過網路介面卡進行傳輸。
  • lsvmbus 指令: 透過此指令可以獲得 Vmbus 的相關資訊。
  • Hyper-V Sockets: 透過載入 Hyper-V Sockets 核心模組,讓 VM 虛擬主機與 Hyper-V 主機之間建立專屬的通訊通道。
  • PCI Passthrough: 將安裝於 Windows Server 2016 主機上的 PCI Express 裝置,例如,網路介面卡、GPU 顯示卡……等,以直接傳遞的方式指派給 VM 虛擬主機使用。

那麼在 Hyper-V 虛擬化平台上所運作的 Linux 作業系統,哪種發行套件及版本分別支援上述說明的功能呢,舉例來說,採用新版 CentOS 7.0 雖然核心中已經支援 Hyper-V 裝置最佳化,但是仍無法使用 vRSS 功能,必須要採用更新的 CentOS 7.1 或 7.2 版本才支援,在 Ubuntu Server 也是一樣的情況,你會發現 Ubuntu 12.04 並不支援 vRSS 功能,必須使用新版本的 Ubuntu 14.04、16.04 或 16.10 才支援。

為了避免不必要的篇幅,在此便不將 Hyper-V 虛擬化平台所支援 Linux 發行套件及版本其所對應的功能逐一說明,有興趣的讀者不妨直接瀏覽 Microsoft 官方網站查詢及核對所支援的特色功能項目:
圖 7、RHEL / CentOS 版本及特色功能對應表



CentOS 虛擬主機安裝整合服務

當管理人員為 VM 虛擬主機,安裝舊版 RHEL / CentOS「5.2 ~ 5.8、6.0 ~ 6.3(32 或 64 位元)」時,那麼必須要為 RHEL/CentOS 客體作業系統安裝「Linux Integration Services Version 4.1 for Hyper-V」整合服務。

其它較新版本 RHEL / CentOS「5.9 ~ 5.11、6.4 ~ 6.8、7.0 ~ 7.2(32 或 64 位元)」,因為官方已經直接在該版本的 Linux 核心當中,直接內嵌 Hyper-V 相關虛擬裝置驅動程式。

因此,當 VM 虛擬主機安裝這些新版本的 RHEL/CentOS 客體作業系統版本後,其實可以無須再額外安裝 LIS 4.1 整合服務。除非,你希望使用 LIS 4.1 整合服務所提供的新增功能,例如,在預設情況下 CentOS 7.2 版本內建的整合服務,並未支援 SCSI WWN、lsvmbus 指令、Hyper-V Sockets 等功能。

那麼,當我們為 VM 虛擬主機安裝新版 CentOS 7.2 客體作業系統後,登入 CentOS 客體作業系統鍵入相關指令「uname -a、cat /etc/redhat-release、cat /var/log/dmesg | grep Vmbus」,便可以看到目前採用的 Linux 核心版本為「3.10.0-327.e17.x86_64」,採用的 CentOS 版本為「7.2.1511」,至於 Hyper-V 整合服務所使用的 hv_vmbus 版本則為「3.0」

圖 8、CentOS 7.2 客體作業系統版本資訊,以及內建的 Hyper-V LIS 整合服務資訊

接著,我們從 Hyper-V 虛擬化平台方面,透過 Hyper-V 管理員來驗證此台 VM 虛擬主機是否真的已經支援整合服務了。首先,點選安裝 CentOS 7.2 的 VM 虛擬主機後,在下方 Hyper-V 管理員「摘要」頁籤中,可以看到活動訊號欄位的顯示結果為「良好(無應用程式資料)」,表示 Hyper-V 虛擬化平台可以正確偵測到VM虛擬主機運作狀態。

切換到「記憶體」頁籤後,您可以看到記憶體需求及記憶體狀態欄位為「1036 MB、確定」,表示 Hyper-V 虛擬化平台的動態記憶體功能,與目前 CentOS 客體作業系統已經順利協同運作了。
請注意! 倘若採用舊版 Windows Server 2012 虛擬化平台版本的話,則「尚未」支援 Linux 作業系統動態記憶體功能,必須採用 Windows Server 2012 R2 或新版 Windows Server 2016 虛擬化平台版本,才正式支援動態記憶體功能。

切換到「網路功能」頁籤中,你會看到在狀態欄位的部分顯示結果為「良好(VMQ 作用中)」,表示 CentOS 客體作業系統已經採用內建的整合服務,為 VM 虛擬主機所指派使用的虛擬網路介面卡,安裝好虛擬網路卡驅動程式並進行裝置最佳化的動作。

圖 9、新版 CentOS 7.2 已經內建 LIS 整合服務

倘若,你希望測試新版 LIS 4.1 整合服務中 lsvmbus 指令及 Hyper-V Sockets 功能的話,那麼便需要為 CentOS 7.2 安裝 LIS 4.1 整合服務。請為 VM 虛擬主機掛載剛才下載的 Linux Integration Services Version 4.1 for Hyper-V 整合服務映像檔 LinuxIC-4.1.2-2.iso,準備為 CentOS 7.2 作業系統安裝整合服務。

圖 10、為 VM 虛擬主機掛載 LIS 整合服務映像檔

順利掛載 LIS 整合服務映像檔之後,回到 CentOS 7.2 虛擬主機 Console 畫面,請依序鍵入指令「mount /dev/cdrom /media、cd /media/CentOS72、./install.sh」,執行掛載光碟機資源、切換到適合安裝的整合服務 CentOS 版本路徑、安裝整合服務等動作。

圖 11、為 CentOS 7.2 安裝新版 LIS 4.1 整合服務

當新版 LIS 4.1 整合服務安裝完畢後,請將 CentOS 7.2 客體作業系統重新啟動並卸載 LIS 整合服務映像檔。當 CentOS 7.2 客體作業系統重新啟動完畢後,便可以透過「/sbin/modinfo hv_vmbus」指令查看 hv_vmbus 版本,可以從指令執行結果中看到已經採用最新「4.1.2-2」版本。此外,如同剛才所說明的我們可以使用新版 LIS 4.1 整合服務中的「lsvmbus」指令,來查看相關虛擬裝置的 Vmbus ID 資訊。

圖 12、確認 CentOS 客體作業系統,是否採用最新的 hv_vmbs 4.1.2-2 版本
目前有個已知問題值得注意,倘若安裝 CentOS 客體作業系統的 VM 虛擬主機有啟用「安全開機」功能的話,那麼在安裝新版 LIS 4.1 整合服務後必須將安全開機功能「停用」,否則將會發現 CentOS 客體作業系統無法正常啟動或啟動後直接進入安全模式。



FreeBSD 虛擬主機安裝整合服務

雖然,FreeBSD 也是 Unix-Like 作業系統,但是 FreeBSD 的系統核心與 Linux 完全不同。同樣的,微軟官方也採用與 LIS 整合服務同樣的方式,讓運作於 Hyper-V 虛擬化平台中的 FreeBSD 虛擬主機,能夠支援及使用 Hyper-V Specific Devices 高效能虛擬裝置機制,此機制稱之為「BIS(BSD Integration Services)」

圖 13、微軟開發人員協同 FreeBSD 團隊開發 BIS 整合服務,讓系統核心支援 Hyper-V 虛擬化平台

倘若運作舊版 FreeBSD 8.4、9.1 ~ 9.3 的話,必須透過 FreeBSD Ports 套件管理機制,安裝「/head/emulators/hyperv-is」套件即可。在 2012 年 5 月 10 日時,Microsoft TechNet Blog發表一篇 FreeBSD Support on Windows Server Hyper-V 文章,內容便說明 Microsoft 以及合作夥伴 NetApp、Citrix 將在 BSDCan 2012 大會上,正式發表 FreeBSD 核心支援 Hyper-V 虛擬裝置驅動程式。

因此,倘若採用的是 FreeBSD 10.x 或最新版本的 FreeBSD 11,因為在 FreeBSD 核心中已經支援 BIS 整合服務,所以便無須再透過 FreeBSD Ports 套件管理機制進行安裝作業。
請注意,目前 Hyper-V 虛擬化平台中的 FreeBSD,仍無法採用「第二世代」格式的 VM 虛擬主機,同時 BIS 整合服務功能性的部分與 LIS 整合服務相較之下較少,舉例來說,動態記憶體功能尚未完全支援運作。

同樣的,在建立第一世代格式的 VM 虛擬主機並安裝最新版本 FreeBSD 11 之後,我們可以切換到 Hyper-V 管理員視窗中,確認 FreeBSD 虛擬主機的 BIS 整合服務是否順利運作。首先,切換到「摘要」頁籤中,可以看到活動訊號欄位的顯示結果為「良好(無應用程式資料)」,表示Hyper-V虛擬化平台可以正確偵測到VM虛擬主機運作狀態。

切換到「記憶體」頁籤中,您可以看到記憶體需求及記憶體狀態欄位為「空白」,這是因為BIS 整合服務機制尚未支援 Hyper-V 虛擬化平台的動態記憶體功能所致。切換到「網路功能」頁籤中,你會看到在狀態欄位的部分顯示結果為「良好(VMQ 作用中)」,表示 FreeBSD 客體作業系統已經透過 BIS 整合服務,為 VM 虛擬主機所指派使用的虛擬網路介面卡,安裝好虛擬網路卡驅動程式並進行裝置最佳化的動作。

圖 14、新版 FreeBSD 11 已經內建 BIS 整合服務

順利登入 FreeBSD 11 系統後,可以發現系統已經順利辨識到網路介面卡(代號為 hn0),查看系統開機訊息可知 hn0 網路卡為「Hyper-V Network Interface」,也就是已經採用最佳化效能的 Hyper-V Specific Network Adapter,接著鍵入指令「ls /boot/kernel | grep hv」查看 FreeBSD 模組存放資料夾內容可知,協同 Hyper-V 虛擬化平台運作的相關模組檔案也已經存在。
倘若,VM 虛擬主機組態配置傳統網路介面卡時,將網路介面卡代號將為「de0」並模擬「Digital 21140A Fast Ethernet 100 Mbps」網路卡。
圖 15、順利辨識並載入 Hyper-V Specific Network 網路介面卡及相關模組

鍵入指令「dmesg | grep vmbus0」查詢 FreeBSD 開機訊息內容,你會看到 FreeBSD 透過內建的 BIS 整合服務,已經順利載入 Hyper-V 虛擬化平台協同運作的相關服務,例如,Heartbeat、KVP、Shutdown、Time Synch……等服務。

圖 16、FreeBSD 透過內建的 BIS 整合服務載入 Hyper-V 相關客體服務





結語

透過本文的說明及實作演練,當企業及組織的 IT 管理人員需要在 Hyper-V 虛擬化平台上運作 Unix-Like 作業系統時,便能夠正確為 Unix-Like 作業系統採用 LIS / BIS 整合服務,以便確保運作於 Hyper-V 虛擬化平台上的 Unix-Like 作業系統,能夠擁有最佳的工作負載及最大化的運作效能。

活動影片及講義 (2016/9/14 更新)

本次活動的錄影已經陸續上線,當天沒空參加的朋友可以補一下進度了。


此次活動另一個難忘的經驗,是接受由美國 Channel 9 團隊來訪並邀約採訪,與主持人全程英文隨性問答聊天 :)



活動簡介

Community Open Camp 由微軟 MVP 以及 Docker 、Laravel 台灣、R 、Python 等社群高手,即將於 2016 年 8 月 27 日星期六於中央研究院學術活動中心及人文社會科學館,帶給您一整天的實戰經驗分享。這次將由 22 位身經百戰的專家主講最熱門的技術議題與實戰的案例分享,包括從 Ansible 到 Docker、企業導入 Docker 經驗分享、給 PHP 開發者的 Visual Studio Code 指南、用 Python + Azure 做出你的聊天機器人、DevOps In OpenSource、利用微軟 IoT 打造專屬的環控機器人、Xamarin 跨平台原生 App 開發介紹,等等精彩的課程內容不但提升自己的技術競爭力,同時掌握最新的科技趨勢,歡迎您來參加 Community Open Camp


    活動資訊




    活動內容




    1、前言

    RRDTool 為 MRTG 進階版,原 MRTG 作者覺得 MRTG 有缺點 (例如 無法一個流量圖集合所有相關要統計的數據) 所以便又著手開發 RRDTool,RRDTool 一樣為利用 SNMP 協定,去偵測有提供 SNMP 資訊的設備來畫出數據統計流量圖,原 RRDTool 1.0.x 版本時時是利用 GD 來畫出數據統計流量圖,在 RRDTool 1.2.x 版本之後作者為了使數據統計流量圖能匯出 PDF 文件格式,因此便改為使用 libart 及 freetype 來畫出數據統計流量圖 (雖然效率慢很多),但因為 RRDTool 語法必須要深入研究因此有人利用 PHP 寫出 Cacti 這個套件使您比較容易控制 RRDTool,同時也有許多的 Cacti Plug-ins 可以使用。(請尊重 Weithenn 的辛勞!!)

    文章目錄

    1、前言
    2、實作環境
    3、安裝及設定
              步驟1.安裝 net-snmp、rrdtool、cacti 套件
              步驟2.設定 SNMP 設定檔 (snmpd.conf)
              步驟3.啟動 SNMP 服務
              步驟4.設定 Cacti 相關事宜
              步驟5.初始化 Cacti
    4、安裝 Cacti plugins - monitor v0.7
              步驟1.下載 Cacti plugins - monitor v0.7
              步驟2.執行 Cacti plugins - monitor v0.7
    5、參考
    6、Me FAQ
              Q1.登入到 cacti 管理介面後看不到圖?
              Q2.為何新增要監控的對象狀態總是 Unknown?
              Q3.無法將 cacti.sql 匯入資料庫當中?
              Q4.CMDPHP: Poller0 ERROR: SQL Assoc Failed!, Error:'1017'?
              Q5.CMDPHP: Poller0 ERROR: A DB Exec Failed!, Error:'1062'?

    2、實作環境

    • FreeBSD 8.2-RELEASE
    • cacti-0.8.7g
    • net-snmp-5.5_4 (請尊重 Weithenn 的辛勞!!)
    • rrdtool-1.2.30_1
    • plugins-monitor 0.7

    3、安裝及設定

    步驟1.安裝 net-snmp、rrdtool、cacti 套件

    安裝 net-snmp (使本機器能吐出 SNMP Information) 及相關套件
    #cd /usr/ports/net-mgmt/net-snmp      //切換至安裝路徑
    #make install clean                   //安裝套件並清除暫存檔案

    安裝 rrdtool (收集 SNMP Information 後統計收集數據畫出圖表)
    #cd /usr/ports/net/rrdtool            //切換至安裝路徑
    #make install clean                   //安裝套件並清除暫存檔案

    安裝 cacti (網頁介面方便設定 rrdtool)
    #cd /usr/ports/net-mgmt/cacti         //切換至安裝路徑
    #make install clean                   //安裝套件並清除暫存檔案


    步驟2.設定 SNMP 設定檔 (snmpd.conf)

    設定 SNMP 設定檔 snmpd.conf 內容如下(請尊重 Weithenn 的辛勞!!)
    #cd /usr/local/share/snmp           //切換至 snmp 目錄
    #vi  snmpd.conf                        //自行建立-內容如下
     rocommunity   mrtg                    //community name (read-only)
     syslocation   Taipei 7F               //主機所在位置(說明)
     syscontact    weithenn@weithenn.org   //管理者 Email


    步驟3.啟動 SNMP 服務

    修改 /etc/rc.conf 檔以便系統重新開機時能自動啟動 SNMP 服務
    #vi /etc/rc.conf                   //編輯 rc.conf
     snmpd_enable="YES"                  //重開機時自動啟動 SNMP 服務

    啟動 SNMP 服務
    #/usr/local/etc/rc.d/snmpd start     //啟動 snmp 服務
     Starting snmpd.

    檢查本機是否可吐出 SNMP Information
    #snmpwalk -c mrtg -v 1 localhost     //檢查是否可吐出 SNMPv1 資訊
    #snmpwalk -c mrtg -v 2c localhost    //檢查是否可吐出 SNMPv2c 資訊
     SNMPv2-MIB::sysDescr.0 = STRING: FreeBSD cacti.weithenn.idv.tw 6.2-RELEASE-p5 FreeBSD 6.2-RELEASE-p5
     root@cacti.weithenn.idv.tw:/usr/obj/usr/src/sys/cacti-Monitor i386
     SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.8
     DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (17596) 0:02:55.96
     SNMPv2-MIB::sysContact.0 = STRING: weithenn <weithenn@weithenn.idv.tw>
     SNMPv2-MIB::sysName.0 = STRING: cacti-monitor.weithenn.idv.tw
     ...略...

    檢查 SNMP Log 可看到本機自行連結自已的 SNMP 要求
    #tail /var/log/snmpd.log
     Connection from UDP: 127.0.0.1:56682


    步驟4.設定 Cacti 相關事宜

    步驟4-1.建立給 cacti 用的 mysql 資料庫

    建立一個名為 cacti 的 MySQL 資料庫,已便到時放置 Cacti 相關設定及資料
    #mysqladmin -u root -p create cacti  //利用 MySQL Admin 來新增資料庫
     Enter password:                     //輸入您的 MySQL Admin Password


    步驟4-2.設定管理 cacti 資料庫帳戶

    建立一個專門用來存取 cacti 資料庫的使用者帳號 cactiuser 及密碼 cacti123(請尊重 Weithenn 的辛勞!!)
    #mysql -u root -p              //利用 MySQL Admin 登入 MySQL
     Enter password:               //輸入您的 MySQL Admin Password
     Welcome to the MySQL monitor.  Commands end with ; or \g.
     Your MySQL connection id is 90253
     Server version: 5.1.19-beta FreeBSD port: mysql-server-5.1.19
     Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
     mysql> GRANT ALL ON cacti.* TO cactiuser@localhost IDENTIFIED BY 'cacti123'; 
     Query OK, 0 rows affected (0.00 sec)
     mysql> FLUSH PRIVILEGES;     //使剛才的變更生效
     Query OK, 0 rows affected (0.00 sec)
     mysql> quit                  //離開 MySQL
     Bye


    步驟4-3.匯入 cacti 預設資料庫

    利用剛才新增的 MySQL 使用者 cactiuser 來匯入 cacti 預設的資料庫 cacti.sql 檔案 (內含一些建好的 Table ...等)。
    #mysql -u cactiuser -p cacti < /usr/local/share/cacti/cacti.sql
     Enter password:              //輸入 cactiuser 的密碼


    步驟4-4.修改連接資料庫設定檔

    修改 cacti 用來連接 MySQL 資料庫的 PHP 設定檔 db-settings.php
    #vi /usr/local/share/cacti/include/db-settings.php
     <?php
     /* make sure these values refect your actual database/host/user/password */
     $database_type = "mysql";            //指定資料庫類型
     $database_default = "cacti";         //指定資料庫名稱
     $database_hostname = "localhost";    //指定資料庫主機
     $database_username = "cactiuser";    //指定存取資料庫使用者名稱
     $database_password = "cacti123";     //指定存取資料庫使用者密碼
     $database_port = "3306";             //指定存取資料庫的通訊埠
     ?>


    步驟4-5.使用 cacti 使用者來編輯排程

    因為安裝 cacti 套件時會順便新增 cacti 這個系統帳號及郡組 (別跟 mysql 使用者 cactiuser 搞混了) 所以這時要利用系統帳號 cacti 這個使用者帳號來建立排程,以便屆時可定期來執行 poller.php 這個檔案。
    #crontab -e -u cacti              //切換為 cacti 身份編輯排程
     */5 * * * * /usr/local/bin/php /usr/local/share/cacti/poller.php > /dev/null 2>&1

    上述排程設定為每 5 分鐘利用 cacti 這個系統帳號去執行 poller.php 這個 php 檔案,接下來我們查看排程 Log 確定該排程是由 cacti 這個系統帳號去執行的。
    #tail /var/log/cron |grep cacti   //確認排程是 cacti 這個 user 執行
     Jun 26 16:35:00 vivatv-monitor /usr/sbin/cron47986: (cacti) CMD
     (/usr/local/bin/php /usr/local/share/cacti/poller.php > /dev/null 2>&1)

    同時檢查一下這二個目錄權限是不是已經換為 cacti 這個系統帳號擁有 (裝 cacti 時會自動作好這個動作,不過檢查一下比較好以確定到時 cacti 能寫入資料)。
     drwxr-xr-x  2 cacti  cacti     512  6 28 11:02 log  //cacti 執行時 log 放置處
     drwxr-xr-x  2 cacti  cacti     512  6 28 11:10 rra  //cacti 統計數據圖資料存放處


    步驟4-6.修改 Apache 設定檔

    修改 Apache 設定檔 httpd.conf 加入 alias cacti 目錄內容如下,修改後記得重啟 Apache 服務設定才會生效哦。
    #vi /usr/local/etc/apache/httpd.conf
     <Directory "/usr/local/share/cacti/">
            Options None
            AllowOverride None
            Order allow,deny
            Allow from all       //或改為你允許的網段
     </Directory>


    步驟4-7.修改 Cacti 設定檔

    修改 Cacti 設定檔 config.php 內容如下,指定的 URL Path 為相對路徑,也就是相對於您網站根目錄的相對路徑 (設定錯誤將造成 cacti 控制介面發生找不到圖片的狀況)。(請尊重 Weithenn 的辛勞!!)
    #vi /usr/local/share/cacti/include/config.php
     $config"url_path" = '/';         //預設值
     $config"url_path" = '/cacti/';   //修改後 http://www.weithenn.org/cacti


    步驟5.初始化 Cacti

    鍵入網址 http://www.weithenn.org/cacti/index.php 連結到您的 cacti 控制頁面,按下 Next 準備初始化 cacti。

    出現下拉式選擇,詢問您是新安裝 cacti 還是要升級 cacti,本次實作為選擇新安裝 (New Install) 確定後按下 Next 繼續初始化 cacti。

    檢查相關執行檔及套件版本 (SNMP、RRDTool) 是否符合,確定後按下 Next 繼續初始化 cacti 初始化完成。

    出現 cacti 管理介面登入視窗,預設的管理者帳號為 admin 管理者密碼為 admin。

    登入 cacti 後系統會請您更新原管理者密碼,請輸入新的管理者密碼。

    4、安裝 Cacti plugins - monitor v0.7

    本次實作為安裝 Monitor Plugin 其功用為在 cacti 管理介面加入一個監控主機的外掛,當設定監控的主機狀態變成 Down 時可發出聲音通知管理者。

    步驟1.下載 Cacti plugins - monitor v0.7

    切換至 Cacti 存放 Plugins 資料夾後下載 Monitor Plugins。(請尊重 Weithenn 的辛勞!!)
    #cd /usr/local/share/cacti/plugins ; mkdir monitor
    #fetch http://download.cactiusers.org/downloads/monitor.zip //下載 monitor plugin
     monitor.zip                            100% of  232 kB 6684 kBps
    #unzip monitor.zip         //解壓 monitor plugin
     Archive:  monitor.zip
      inflating: images/orange.gif
      inflating: images/blue.gif
      inflating: images/button_nosound.gif
      inflating: images/green.gif
      inflating: images/index.php
      inflating: images/red.gif
      inflating: images/tab_monitor.gif
      inflating: fast_poller.php
      inflating: fast_poller_cmd.php
      inflating: index.php
      inflating: LICENSE
      inflating: monitor.php
      inflating: README
      inflating: setup.php
      inflating: wz_tooltip.js
      inflating: sounds/attn-noc.wav
      inflating: sounds/index.php


    步驟2.執行 Cacti plugins - monitor v0.7

    在未執行 fast_poller.php 之前您的 cacti 控制介面應該如下圖所示。

    請鍵入如下指令來執行 fast_poller.php,執行完 fast_poller.php 後應該會看到 monitor plugins 的選項。
    #sudo -u cacti php fast_poller.php      //這樣 monitor plugins 的選項就出現


    當然若是要定期去檢查監控的主機也需要把 fast_poller.php 利用 cacti 身份加入排程內
    #crontab -e -u cacti        //切換為 cacti 身份編輯排程
     */1 * * * * /usr/local/bin/php /usr/local/share/cacti/plugins/monitor/fast_poller.php > /dev/null 2>&1

    後續操作 Cacti plugins - monitor v0.7 可在 cacti 管理介面內找到,下圖為啟用 Monitor Plugins
     Console >> Devices >> (Edit)       //可調整是否對該主機開啟監控
     Console >> Cacti Settings >> Misc  //可變換聲音檔及圖檔


    5、參考


    6、Me FAQ

    Q1.登入到 cacti 管理介面後看不到圖?

    Error Message:
    當登入到 cacti 管理介面後圖檔的位置都顯示為 xx?

    Ans:
    修改 Cacti 設定檔 config.php 內容如下,指定的 URL Path 為相對路徑,也就是相對於您網站根目錄的相對路徑。
    #vi /usr/local/share/cacti/include/config.php
     $config"url_path" = '/';         //預設值
     $config"url_path" = '/cacti/';   //修改後 http://www.weithenn.org/cacti


    Q2.為何新增要監控的對象狀態總是 Unknown?

    Error Message:
    新增監控對象後狀態總是 Unknown 但 cacti 確定有抓到 SNMP Information 了?

    Ans:
    問題點在於不夠了解 cacti 的運作方式,雖然新增監控對象並且也抓得到該主機的 SNMP Information 但是因為沒有設定監控的項目及新增到 graphs 項目,因此狀態當然是 Unknown (等於還沒開始監控),以下是在 #bsdchat ychsiao 長輩指點內容。
     16:46 * weithenn 怪,現在又變成 localhost 是 up 其它的還是 Unknown...Orz
     16:48 * weithenn cacti沒那麼難吧?為何我搞不定...丁丁化中....
     16:56 <@ychsiao> cacti很簡單啊orz
     17:00 <@weithenn> ychsiao:但我裝好只要新增的 device status 都是 Unknown
     17:01 * weithenn snmpd.conf 有要特地設定什麼嗎?
     17:07 <@weithenn> ychsiao:新增的 device 內是可以看到 snmp information 的但 status 都是 Unknown
     17:14 * weithenn 當我點選至新增的 device 內同時去看該機器的 snmpd.log 也都有看到那台 cacti 在抓我的 snmp 訊息.
     17:40 <@ychsiao> Associated Data Queries 有 snmp-interface stats ?
     17:41 <@ychsiao> host-type generic snmp-enabled host..
     17:46 <@weithenn> ychsiao:Associated Data Queries 有 snmp-interface stats--> Success 12 Items, 6 Rows
     17:48 <@weithenn> ychsiao:Host Template 從 None 改成 generic snmp-enabled host,還是一樣 Status Unknown
     17:49 * weithenn 補充一下,改完後有跑 poller.php
     18:01 <@ychsiao> status unknown 是指 ping 不到之類的吧... 你圖表有出來嗎?
     18:06 <@weithenn> ychsiao:出來了,剛打開 debug mode,是說找不到 rrd 檔,然後在執行一次 poller.php 就可以了,現在 status 也變成 up 了


    Q3.無法將 cacti.sql 匯入資料庫當中?

    Error Message:
    當執行匯入 cacti.sql 預設資料庫結構時出現如下錯誤訊息且無法匯入?
    #mysql -u dfnoc -p cacti < /usr/local/share/cacti/cacti.sql
      Enter password:
      ERROR 1064 (42000) at line 5: You have an error in your SQL syntax; check the manual that corresponds to your
      MySQL server version for the right syntax to  use near 'TYPE=MyISAM' at line 6

    Ans:
    請將 cacti.sql 內的 TYPE=MyISAM 改為 ENGINE=MyISAM 即可匯入成功。
    #sed -i -e 's/TYPE=/ENGINE=/g' cacti.sql
    #mysql -u cactiuser -p cacti < /usr/local/share/cacti/cacti.sql
     Enter password:


    Q4.CMDPHP: Poller0 ERROR: SQL Assoc Failed!, Error:'1017'?

    Error Message:
    Cacti 雖然 Realtime 有流量,但是在 graphs 當中的圖都沒有更新 (當然 .rrd 圖檔也未更新),並且查看 /var/www/html/log/cacti.log 發現如下錯誤訊息。
     02/02/2013 09:50:26 PM - CMDPHP: Poller0 ERROR: SQL Assoc Failed!, Error:'1017', SQL:"select  poller_output.output,
     poller_output.time,  poller_output.local_data_id,  poller_item.rrd_path,  poller_item.rrd_name,  poller_item.rrd_num  f
     rom (poller_output,poller_item)  where (poller_output.local_data_id=poller_item.local_data_id and poller_output.rrd_nam
     e=poller_item.rrd_name)"

    Ans:
    原因在於 poller_output Table 有問題,使用 truncate table poller_output; 指令即可修復,操作步驟如下:
    #mysql -u root -p         //登入 MySQL Database
     Enter password:
      Welcome to the MySQL monitor.  Commands end with ; or \g.
      Your MySQL connection id is 19069
      Server version: 5.0.68 Source distribution
      Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
     mysql> show databases;   //顯示資料庫
      +--------------------+
      | Database           |
      +--------------------+
      | information_schema |
      | cacti              |
      | mysql              |
      | syslog             |
      | test               |
      +--------------------+
      5 rows in set (0.00 sec)
     mysql> use cacti        //選擇 cacti 資料庫
      Reading table information for completion of table and column names
      You can turn off this feature to get a quicker startup with -A
      Database changed
     mysql> select count(*) from poller_output;  //查看 poller_output table
      ERROR 1017 (HY000): Can't find file: 'poller_output' (errno: 2)
     mysql> truncate table poller_output;        //進行修復
      Query OK, 0 rows affected (0.00 sec)
     mysql> select count(*) from poller_output;  //再次查看 poller_output table
      +----------+
      | count(*) |
      +----------+
      |        0 |
      +----------+
      1 row in set (0.00 sec)
     mysql>exit
      Bye


    Q5.CMDPHP: Poller0 ERROR: A DB Exec Failed!, Error:'1062'?

    Error Message:
    查看 /var/www/html/log/cacti.log 發現如下錯誤訊息。
     02/02/2013 09:56:02 PM - CMDPHP: Poller0 ERROR: A DB Exec Failed!, Error:'1062',
                              SQL:"insert into settings values  ('syslog_last_incoming','18801752')'

    Ans:
    原因在於 syslog_last_incoming 有問題,解決操作步驟如下:
    #mysql -u root -p        //登入 MySQL Database
     Enter password:
      Welcome to the MySQL monitor.  Commands end with ; or \g.
      Your MySQL connection id is 19069
      Server version: 5.0.68 Source distribution
      Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
     mysql> show databases;   //顯示資料庫
      +--------------------+
      | Database           |
      +--------------------+
      | information_schema |
      | cacti              |
      | mysql              |
      | syslog             |
      | test               |
      +--------------------+
      5 rows in set (0.00 sec)
     mysql> use cacti        //選擇 cacti 資料庫
      Reading table information for completion of table and column names
      You can turn off this feature to get a quicker startup with -A
      Database changed
     mysql> delete from settings where name = 'syslog_last_incoming' ;  //刪除該值
      Query OK, 1 row affected (0.00 sec)
     mysql> exit             //離開資料庫
      Bye

    前言

    在不得已的原因之下要把一台 Dell 1950 實體備份 (備份成映像檔) 轉移到另外一台 Dell 1950 機器上,但是二台主機雖然機型相同但是 RAID Card 不同 (代號不同),所以就開不起來了。(請尊重 Weithenn 的辛勞!!)

    實作環境

    • FreeBSD 6.2-RELEASE (請尊重 Weithenn 的辛勞!!)
    • 主機硬體型號:Dell PowerEdge 1950
    • 硬碟規格: SAS HDD 73 G * 2 (Build RAID-1)
    • 磁碟陣列卡型號: 原機 (RAID 代號 mfid0)、轉移機 (RAID 代號 da0)

    錯誤訊息

    開機後因為原機的 /etc/fstab 設定掛載點為 mfid0,而轉移機因為 RAID Card 不同導致代號不同,因此開機流程到要載入 File System Table 時因為發現不同而導致無法繼續。 (請尊重 Weithenn 的辛勞!!)
    Trying to mount root from ufs:/dev/mfid0s1a
    ROOT MOUNT ERROR:
    If you have invalid mount options, reboot, and first try the following from the loader prompt:
    set vfs.root.mountfrom.options=rw
    and then remove invalid mount options from /etc/fstab.
    Loader variables:
    vfs.root.mountfrom=ufs:/dev/mfid0s1a
    vfs.root.mountfrom.options=rw
    Manual root filesystem specification:
    <fstype>:<device> Mount <device> using filesystem <fstype>
    eg. ufs:/dev/da0s1a
    eg. cd9660:/dev/acd0
    This is equivalent to: mount -t cd9660 /dev/acd0 /
    ? List valid disk boot devices
    <empty line> Abort manual input
    mountroot>


    解決步驟

    首先鍵入【?】確認目前偵測到的代號確定為 da0
    mountroot> ? //鍵入 ?
    List of GEOM managed disk devices:
    ufsid/4b5574a4a3705e66 ufsid/4b5574a49ac2ca11 ufsid/4b5574a58b956406
    ufsid/4b5574a979b1ea da0s1f da0s1e da0s1d da0s1b da0s1a da0s1 da0 acd0
    Loader variables:
    vfs.root.mountfrom=ufs:/dev/mfid0s1a
    vfs.root.mountfrom.options=rw
    Manual root filesystem specification:
    <fstype>:<device> Mount <device> using filesystem <fstype>
    eg. ufs:/dev/da0s1a
    eg. cd9660:/dev/acd0
    This is equivalent to: mount -t cd9660 /dev/acd0 /
    ? List valid disk boot devices
    <empty line> Abort manual input
    mountroot>

    確認代號為 da0 之後將請伺服器重新啟動,在 FreeBSD 開機畫面時鍵入數字 6 選擇 「6. Escape to loader prompt」 項目,接著輸入下列二行準備稍後手動載入
    Type '?' for a list of commands, 'help' for....
    OK set vfs.root.mountfrom.options=rw //輸入此行
    OK set vfs.root.mountfrom=ufs:/dev/da0s1a //輸入此行
    OK show //確認上述二行是否載入
    OK boot //繼續開機流程
    Enter full pathname of shell or RETURN for /bin/sh: //進入 Single User Mode,請按下 Enter
    #mount //查看目前檔案系統掛載情況
    /dev/da0s1a on / (ufs, local, read-only)
    devfs on /dev (devfs, local, multilabel)
    #mount -o rw /dev/da0s1a //再次掛載根目錄 (允許可以讀寫)
    #mount
    /dev/da0s1a on / (ufs, local) //確認根目錄可以讀寫
    devfs on /dev (devfs, local, multilabel)
    #mount -t ufs /dev/da0s1f /usr //參考原機設定知道 f 為 /usr 掛載點
    #mount
    /dev/da0s1a on / (ufs, local)
    devfs on /dev (devfs, local, multilabel)
    /dev/da0s1f on /usr (ufs, local, soft-updates) //成功將 /usr 掛載
    #/usr/bin/vi /etc/fstab //修改 /etc/fstab,將 mfid0 改成 da0 後存檔離開
     #Device Mountpoint FStype Options Dump Pass#
     /dev/mfid0s1b none swap sw 0 0 //將 mfid0 改成 da0
     /dev/mfid0s1a / ufs rw 1 1 //將 mfid0 改成 da0
     /dev/mfid0s1e /tmp ufs rw 2 2 //將 mfid0 改成 da0
     /dev/mfid0s1f /usr ufs rw 2 2 //將 mfid0 改成 da0
     /dev/mfid0s1d /var ufs rw 2 2 //將 mfid0 改成 da0
    #reboot //重新啟動主機

    依照上述步驟修改好 /etc/fstab 中將 mfid0 改成 da0 後,應該就可以順利開機並且掛載 File System 了!!

    Q.如何使 FreeBSD 退出光碟機?

    Ans:
    由於機房 FreeBSD 機器太多(又都想同型號),加上當時主機上又沒有貼標籤也沒有 IPMI 機制,所以無法辨識到底是哪一台主機要維運。突然想到在 Windows 主機時,可以執行退出光碟機的機制來協助判斷,那麼在 FreeBSD 上該怎麼執行指令退出光碟機?(請尊重 Weithenn 的辛勞!!)

    ATA (IDE/EIDE) CD-ROM
    cdcontrol -f /dev/acd0 eject
    SCSI CD-ROM
    cdcontrol -f /dev/cd0 eject

    1、前言

    DHCP,Dynamic Host Configuration Protocol,簡單說就是讓 Lan User 只要將網路線接上網卡後發出 DHCP Request 需求而區網內的 DHCP Server 便會將 IP Address、DNS、Gateway...等分配給 DHCP Client,並配合 NAT 讓 Lan User 只要一插上網路線便能連到 Internet 省去網管人員一台一台設定的麻煩。關於 DHCP 如何運作可參考本站文章 DHCP 伺服器的原理與運作流程(請尊重 Weithenn 的辛勞!!)

    文章目錄

    1、前言
    2、實作環境
    3、安裝及設定
              步驟1.安裝 DHCP Server 套件
              步驟2.建立 DHCP 設定檔 (dhcpd.conf)
              步驟3.修改 /etc/syslog.conf
              步驟4.修改 /etc/rc.conf
              步驟5.啟動 DHCP 服務
              步驟6.查看用戶租約檔及 Log 檔
    4、參考
    5、Me FAQ
              Q1.dhcpd: DHCPDISCOVER from 00:1e:c9:45:00:9b via 192.168.1.254: network 192.168.1/24: no free leases?
              Q2.dhcpd: DHCPINFORM from 192.168.1.3 via bce1: not authoritative for subnet 192.168.1.0?
              Q3.想要在 DHCP Client Range 中某些 IP 位址不分配在內該如何設定?

    2、實作環境

    • FreeBSD 8.2-RELEASE-p2
    • isc-dhcp41-server-4.1.e,2 (請尊重 Weithenn 的辛勞!!)

    3、安裝及設定

    步驟1.安裝 DHCP Server 套件

    切換到 ports tree 路徑安裝 dhcp server 套件。
    #cd  /usr/ports/net/isc-dhcp41-server  //切換到安裝路徑
    #make install clean                    //安裝並清除暫存檔案


    步驟2.建立 DHCP 設定檔 (dhcpd.conf)

    建立 DHCP 設定檔 /usr/local/etc/dhcpd.conf (可複製範例檔 dhcpd.conf.sample 後再修改),修改內容如下:
     #vi /usr/local/etc/dhcpd.conf        //修改 dhcpd.conf 設定檔
     option domain-name "weithenn.org";   //DNS 尾碼 (通常為公司網域名稱)
     option domain-name-servers 8.8.8.8, 168.95.192.1;  //DNS Server 資訊
     option time-offset 28800;    //本地主機時間與格林威治的時間差 (快八小時)
     default-lease-time 7200;     //預設 DHCP Client 的租用時間 (單位為秒)
     max-lease-time 86400;        //DHCP Client 的最大租用時間 (單位為秒)
     ddns-update-style none;      //關閉動態 DNS 功能
     log-facility local7;         //開啟 DHCP Log 功能
     authoritative;               //表示此台 DHCP 伺服器為區域中的官方伺服器
     ###IT Room
     subnet 192.168.1.0 netmask 255.255.255.0 {
      range 192.168.1.100 10.0.0.200;      //指定 DHCP Client IP 位址為 100 ~ 200
      option routers 192.168.1.254;
     }
     ###固定 IP 位址 For MAC Address
     host passacaglia {
     hardware ethernet 00:50:FC:8E:D2:3D;  //指定分配給此 MAC Address 的固定 IP
     fixed-address 192.168.1.78;           //指定分配固定 IP 位址
     }


    步驟3.修改 /etc/syslog.conf

    修改 /etc/syslog.conf 設定檔使得屆時的 DHCP 訊息能寫入指定的 Log 檔案內。
    #vi /etc/syslog.conf
     local7.*              /var/log/dhcpd    //加上此行

    修改完成後建立 /var/log/dhcpd 空檔以便屆時 DHCP 訊息能寫入檔案內。
    #touch /var/log/dhcpd
    完成建立空檔案後就重新載入 syslogd 服務即可。
    #/etc/rc.d/syslogd reload

    步驟4.修改 /etc/rc.conf

    修改 /etc/rc.conf 設定檔,內容如下 (請尊重 Weithenn 的辛勞!!)
    #vi /etc/rc.conf
     dhcpd_enable="YES"       //加入此行以便開機自動帶起 DHCP 服務
     dhcpd_flags="-q"         //啟動 DHCP 服務時加上此參數
     dhcpd_conf="/usr/local/etc/dhcpd.conf"   //DHCP 服務讀取的設定檔路徑
     dhcpd_ifaces="bce1"      //當有多片網卡時,可指定 Listen DHCP Service 網卡
     dhcpd_withumask="022"


    步驟5.啟動 DHCP 服務

    執行如下指令以啟動 DHCP 服務
    #/usr/local/etc/rc.d/isc-dhcpd start   //啟動 DHCP 服務

    步驟6.查看用戶租約檔及 Log 檔

    可查看 /var/db/dhcpd/dhcpd.leases 了解 DHCP Client 的租約情況。
    #tail /var/db/dhcpd/dhcpd.leases     //DHCP 記錄檔以便查看 Client 租約內容
     }
     lease 192.168.1.3 {
       starts 4 2011/07/21 08:40:56;
       ends 4 2011/07/21 10:40:56;
       tstp 4 2011/07/21 10:40:56;
       cltt 4 2011/07/21 08:40:56;
       binding state free;
       hardware ethernet 00:1d:72:85:41:3b;
       uid "\001\000\035r\206@\233";
     }

    也可查看 DHCP Log 也可看到詳細的 DHCP Server 及 Client 取得 IP 位址的流程。
    #tail /var/log/dhcpd
     Jul 13 09:47:33 nat dhcpd: DHCPDISCOVER from 00:1d:72:85:41:3b (Weithenn-PC) via bce1
     Jul 13 09:47:34 nat dhcpd: DHCPOFFER on 192.168.1.3 to 00:1d:72:85:41:3b (Weithenn-PC) via bce1
     Jul 13 09:47:34 nat dhcpd: DHCPREQUEST for 192.168.1.3 (192.168.1.254) from 00:1d:72:85:41:3b (Weithenn-PC) via bce1
     Jul 13 09:47:34 nat dhcpd: DHCPACK on 192.168.1.3 to 00:1d:72:85:41:3b (Weithenn-PC) via bce1


    4、參考


    5、Me FAQ

    Q1.dhcpd: DHCPDISCOVER from 00:1e:c9:45:00:9b via 192.168.1.254: network 192.168.1/24: no free leases?

    Error Message:
    使用者無法抓到 DHCP IP (169.254.x.x) 查看 /var/log/messages 出現如下錯誤訊息
    Dec 27 10:21:29 dhcp dhcpd: DHCPDISCOVER from 00:1e:c9:45:00:9b via 192.168.1.254: network 192.168.1/24: no free leases
    Ans:
    從字義上 no free leases 可知是 DHCP IP 發完不夠了所產生的訊息,由於當初定義的 DHCP Client 數量太少所導致,將 DHCP IP Range 開大後 DHCP Client 即可順利抓到 IP 了。

    Q2.dhcpd: DHCPINFORM from 192.168.1.3 via bce1: not authoritative for subnet 192.168.1.0?

    Error Message:
    查看 DHCP Log 內容時每隔一段時間就會出現如下訊息
    #tail /var/log/dhcpd
     Jul 13 09:22:14 nat dhcpd: DHCPINFORM from 192.168.1.3 via bce1: not authoritative for subnet 192.168.1.0
     Jul 13 09:22:17 nat dhcpd: DHCPINFORM from 192.168.1.4 via bce1: not authoritative for subnet 192.168.1.0
     Jul 13 09:23:04 nat dhcpd: DHCPINFORM from 192.168.1.7 via bce1: not authoritative for subnet 192.168.1.0
     Jul 13 09:23:07 nat dhcpd: DHCPINFORM from 192.168.1.9 via bce1: not authoritative for subnet 192.168.1.0

    Ans:
    請在 DHCP 設定檔 (/usr/local/etc/dhcpd.conf) 內加上 authoritative; 後,重新啟動 DHCP 服務即可解決此一問題。

    Q3.想要在 DHCP Client Range 中某些 IP 位址不分配在內該如何設定?

    Error Message:
    原來設定檔中指定 DHCP Client IP 位址為 100 ~ 200,想要排除 151 ~ 160 該如何設定?
    subnet 192.168.1.0 netmask 255.255.255.0 {
      range 192.168.1.100 10.0.0.200;                   //指定 DHCP Client IP 位址為 100 ~ 200
      option routers 192.168.1.254;
    }   

    Ans:
    將設定內容改成如下即可:
    subnet 192.168.1.0 netmask 255.255.255.0 {
      range 192.168.1.100 10.0.0.150;   //指定 DHCP Client IP 位址為 100 ~ 150
      range 192.168.1.161 10.0.0.200;   //指定 DHCP Client IP 位址為 161 ~ 200
      option routers 192.168.1.254;
    }   

    1、前言

    在 FreeBSD Ports Collection 中有二套 iSCSi Target 套件比較主流,分別是來至 NetBSDiscsi-target (/usr/ports/net/iscsi-target),以及目前搭配內建於 FreeNASistgt (/usr/ports/net/istgt),並且在 FreeBSD 8 內建已經有 iSCSI initiator,而本篇內容將以 istgt 套件進行 iSCSI Targe 實作。(請尊重 Weithenn 的辛勞!!)

    文章目錄

    1、前言
    2、實作環境
    3、安裝及設定
              步驟1.安裝 istgt 套件
              步驟2.修改 istgt 設定檔
              步驟3.建立 iSCSI Target Disk File
              步驟4.設定開機時自動執行 istgt 服務
              步驟5.啟動 istgt 服務
    4、參考
    5、Me FAQ
              Q1.啟動 istgt 服務時出現錯誤訊息?

    2、實作環境

    • FreeBSD 8.2 RELEASE-p4
    • istgt-20111008 (請尊重 Weithenn 的辛勞!!)

    3、安裝及設定

    步驟1.安裝 istgt 套件

    #cd /usr/ports/net/istgt       //切換至安裝路徑
    #make install clean            //安裝套件並清除暫存檔案


    步驟2.修改 istgt 設定檔

    由於實作環境當中並未採用 CHAP 機制,在設定檔中只會採用 iSCSI Initiator 的 IQN 以及網段進行限制,所以只需要修改主要設定檔 istgt.conf 即可,若需要 CHAP 機制請配合修改 auth.conf、istgtcontrol.conf,以下為此次實作的 istgt.conf 設定檔內容:
    #cat /usr/local/etc/istgt/istgt.conf
     Global
      Comment "Global section"
      NodeBase "iqn.2012-05.org.weithenn.istgt"  //iSCSI Target IQN
      PidFile /var/run/istgt.pid
      MediaDirectory /var/istgt
      LogFacility "local7"
      Timeout 30
      NopInInterval 20
      DiscoveryAuthMethod Auto
      MaxSessions 16
      MaxConnections 4
      MaxR2T 32
      MaxOutstandingR2T 16
      DefaultTime2Wait 2
      DefaultTime2Retain 60
      FirstBurstLength 262144
      MaxBurstLength 1048576
      MaxRecvDataSegmentLength 262144
      InitialR2T Yes
      ImmediateData Yes
      DataPDUInOrder Yes
      DataSequenceInOrder Yes
      ErrorRecoveryLevel 0
     UnitControl
      Comment "Internal Logical Unit Controller"
      AuthMethod Auto
      Portal UC1 127.0.0.1:3261
      Netmask 127.0.0.1
     PortalGroup1
      Comment "Portal Group"
      Portal DA1 192.168.1.250:3260    //iSCSI Target Listen IP 及 Port 號
     InitiatorGroup1
      Comment "Initiator Group1"
      InitiatorName "iqn.1998-01.com.vmware:vm1-2985561d" //允許此 iSCSI Initiator IQN 可連接
      InitiatorName "iqn.1998-01.com.vmware:vm2-63bd9cf4" //允許此 iSCSI Initiator IQN 可連接
      Netmask 192.168.1.0/24          //允許此網段的 iSCSI Initiator 可連接
     LogicalUnit1
      Comment "iSCSI Hard Disk"
      TargetName disk1
      TargetAlias "iSCSI Data Disk1"
      Mapping PortalGroup1 InitiatorGroup1
      AuthMethod Auto
      UseDigest Auto
      UnitType Disk
      LUN0 Storage /home/backup/VM/istgt-disk1 300GB    //iSCSI Target 空間


    步驟3.建立 iSCSI Target Disk File

    使用如下指令建立 iSCSI Target Disk File,請注意!! 設定檔中設定為 300 GB 而下列指令其單位為 MB
    #dd if=/dev/zero of=/home/backup/VM/istgt-disk1 bs=`expr 1024 \* 1024` count=300000

    步驟4.設定開機時自動執行 istgt 服務

    修改 rc.conf 設定檔,以便下次機器重新開機時能自動啟動 istgt 服務。
    #vi /etc/rc.conf           //修改 rc.conf 設定檔
     istgt_enable="YES"        //加入此行


    步驟5.啟動 istgt 服務

    相關完成後我們鍵入以下指令來啟動 istgt 服務。 (請尊重 Weithenn 的辛勞!!)
    #/usr/local/etc/rc.d/istgt start
     Starting istgt.
     istgt version 0.4 (20111008)
     normal mode
     LU1 HDD UNIT
     LU1: LUN0 file=/home/backup/VM/istgt-disk1, size=322122547200
     LU1: LUN0 629145600 blocks, 512 bytes/block
     LU1: LUN0 300.0GB storage for iqn.2012-05.org.weithenn.istgt:disk1
     LU1: LUN0 serial 10000001
     LU1: LUN0 read cache enabled, write cache enabled
     LU1: LUN0 command queuing enabled, depth 32

    檢查執行序 (process) 是否已有 istgt 服務
    #ps aux |grep istgt         //查看 istgt 執行序是否運作
     root  58558  0.0  0.8 37680 16848  ??  Ss   12:31下午   2:49.80 /usr/local/bin/istgt -c /usr/local/etc/istgt/istgt.conf

    檢查相關 Port 號是否 Listen
    #sockstat |grep istgt
     root     istgt      58558 3  dgram  -> /var/run/logpriv
     root     istgt      58558 6  tcp4   127.0.0.1:3261        *:*
     root     istgt      58558 7  tcp4   10.10.25.250:3260     *:*


    4、參考


    5、Me FAQ

    Q1.啟動 istgt 服務時出現錯誤訊息?

    Error Message:
    啟動 istgt 服務時出現錯誤訊息?
    #/usr/local/etc/rc.d/istgt start
     Starting istgt.
     istgt version 0.4 (20111008)
     normal mode
     istgt_lu_ctl.c:1483:istgt_init_uctl: ***ERROR*** find_cf_section failed()
     istgt.c:1104:istgt_init: ***ERROR*** istgt_init_uctl() failed
     istgt.c:1659:main: ***ERROR*** istgt_init() failed
     /usr/local/etc/rc.d/istgt: WARNING: failed to start istgt

    Ans:
    此次我的狀況是在 istgt.conf 設定檔中,對於 UnitControl 部份沒有設定好所造成,修改為如下設定內容後運作正常。
     [UnitControl]
      Comment "Internal Logical Unit Controller"
      AuthMethod Auto
      Portal UC1 127.0.0.1:3261
      Netmask 127.0.0.1

      1、前言

      DNS,Domain Name Service 主要目地為解決 Domain Name 與 IP Address 之間相互的對應問題,在網路世界間中的溝通其實就是使用 IP Address 來溝通 (就像是人類使用的身份證),但一連串的數字這樣對人類來說太過於麻煩,因此便出現 Domain Name Service 服務來將 IP Address 轉換成人類可方便閱讀的 Domain Name,簡單來說就是例如: 您輸入的 Yahoo 網址 http://tw.yahoo.com 轉成 IP Address 以便連結到 Yahoo 的網頁伺服器,關於網域名稱服務可參考站內文章 DNS 伺服器的原理與運作流程(請尊重 Weithenn 的辛勞!!)

      從 FreeBSD 5.3-RELEASE 起內建 Bind9 不但安全性相對提高,並也把 Chroot 功能給加了進來,比較不習慣的可能就是設定檔的路徑
       /etc/namedb/               //原本設定檔實際路徑
       /var/named/etc/namedb/     //Bind 9 設定檔的實際路徑


      文章目錄

      1、前言
      2、實作環境
      3、安裝及設定
                步驟1.本機反解範例檔案 (localhost.rev)
                步驟2.修改 DNS 設定檔 (named.conf)
                步驟3.建立 named.weithenn.for 檔案 (Forward)
                步驟4.修改服務設定檔 (rc.conf)
                步驟5.修改本機 DNS 查詢設定檔 (resolv.conf)
                步驟6.啟動 DNS 服務
      4、安全性設定測試
                測試1.隱藏 BIND DNS 版本
                測試2.Zone Transfer 限制
      5、參考
      6、Me FAQ
                Q1.logging channel 'security_log' file '/var/log/named/dns-security.log': file not found?
                Q2.the working directory is not writable?
                Q3.connection timed out; no servers could be reached?
                Q4.failed while receiving responses: file not found?

      2、實作環境

      • FreeBSD 6.x-RELEASE
      • FreeBSD 5.x-RELEASE
      • BIND 9.3.x

      3、安裝及設定

      步驟1.本機反解範例檔案 (localhost.rev)

      執行下列指令產生本機反解範例檔案 localhost.rev,產生的範例檔案 (localhost.rev 及 localhost-v6.rev) 將產生於 /var/named/etc/namedb/master 目錄下。
      #cd /var/named/etc/namedb/       //切換路徑              
      #sh make-localhost               //產生範例檔


      步驟2.修改 DNS 設定檔 (named.conf)

      修改 DNS 設定檔 named.conf。(請尊重 Weithenn 的辛勞!!)
      #vi /var/named/etc/namedb/named.conf      //編輯 named.conf 內容

      步驟2-1.安全性設定 - 隱藏 BIND DNS 版本

      為何要隱藏您的 BIND DNS 版本呢? 原因在於有心人士可以透過先瞭解您 DNS 主機所運作的 BIND 版本來尋找相關漏洞攻擊程式,因此在 ISC BIND 建議下可透過設定來 隱藏  BIND 系統版本。
       options {
              directory       "/etc/namedb";
              pid-file        "/var/run/named/pid";
              dump-file       "/var/dump/named_dump.db";
              statistics-file "/var/stats/named.stats";
              version         "None of your business";


      步驟2-2.安全性設定 - 存取控制清單 ACLs

      我們可以利用設定 存取控制清單 (ACL,Access Control List) 功能來限制外來對 Domain 的查詢要求並且配合 Allow-Query 參數來限制所有或特定 Zone 的查詢要求。
       acl "dns1.weithenn.org" { 61.60.59.58; };
       acl "dns2.weithenn.org" { 61.60.59.57; };


      步驟2-3.限制來源查詢要求 (allow-query)

      DNS Server 僅回應列表中 IP Address 的查詢要求,這裡的 allow-query 限制為針對 DNS Server。
       options {
                allow-query { 168.95.192.1/32; 168.95.1.1/32; dns1.weithenn.org; dns2.weithenn.org; };
       };


      步驟2-4.限制來源查詢要求 (allow-recursion)

      允許哪些來源可以使用 DNS Server 進行遞迴查詢動作。簡單說就是透過這台 DNS 來查詢任何資料,包含不是該 DNS 主機負責的 Zone 也代為查詢,您應該不想讓別人用您的 DNS Server 去探查別人的 DNS 主機資訊吧?(請尊重 Weithenn 的辛勞!!)
       options {
                allow-recursion { 127.0.0.1/32; 61.60.59.58/32; };
       };


      步驟2-5.限制特定 Zone 查詢要求 (allow-query)

      DNS Server 僅回應列表中 IP Address 的查詢要求,這裡的 allow-query 限制為針對區域 (Zone),當您設定限制所有或特定 Zone 的查詢要求時,其特定 Zone 設定優先權將大為限制所有查詢要求。
       zone "weithenn.org" {
              type master;
              file "master/named.weithenn.for";
              allow-query { dns2.weithenn.org; };  //僅回應這個 IP 的查詢要求
       };


      步驟2-6.安全性設定 - Zone Transfer 限制

      DNS 架構下常需透過更新 Zone File 動作來更新 DNS Master 及 DNS Slave 間 Zone File 的資料,在信任網域下將 Zone File 資料列出是 OK 的,但若是能由外界進行查詢您 Zone 資料時將會演變為具有危險的行為,想想若有人知道您 Zone File 設定都一清二楚那他即可針對特定主機進行攻擊行為,因此限制您的 Zone Transfer 將更顯重要。比較常被忘記的部份為會記得設定 DNS Master 其 allow-transfer 對象為 DNS Slave,但別忘記了 DNS Slave 必須設定 allow-transfer { "none"; }; 避免您的 Zone File 從 DNS Slave 端被傳送出去這是比較容易被忘記的設定。
       zone "weithenn.org" {
              type master;
              file "master/named.weithenn.for";
              allow-transfer { 61.60.59.57; };        //僅此 IP 能 Zone Transfer 此 Zone File
              allow-transfer { dns2.weithenn.org; };  //可配合 ACLs 使用
       };


      步驟2-7.進階性設定 - 代詢伺服器機制

      代詢伺服器 (Forwarders) 機制為當您為您的站台指派代詢伺服器後,那麼所有對外的 DNS 查詢都會先送到您所指定的代詢伺服器,讓代詢伺服器利用快取資訊幫您快速回應 DNS 查詢,在台灣我們可設定全台最大的 DNS 快取伺服器其設定內容如下:
       forwarders {
                      168.95.192.1;
                      168.95.1.1;
       };

      設定好 named.conf 後可利用 BIND 9 新增加的指令 named-checkconf 來檢查 named.conf 設定檔語法是否正確,若語法正確則執行完指令後將不會有任何訊息,若語法有錯會顯示錯誤訊息及行數。
       /usr/sbin/named-checkconf     //檢查 named.conf 語法是否有錯
                                 -v  //顯示 named-checkconf 版本


      步驟3.建立 named.weithenn.for 檔案 (Forward)

      建議您可複製剛才建立的反解範例檔案 localhost.rev 再進行修改可避免 keyin 錯誤。

      SOA: 為標準區域中的第一筆記錄,之後括號 () 內為與次要 DNS 溝通的相關資訊,其數值單位為 (秒)
      • Serial: 區域版本編號
      • Refresh: 同步更新時間
      • Retry: 重試同步時間
      • Expire: 同步到期時間
      • Minimum: 最小快取存活時間
      #vi /var/named/etc/namedb/master/named.weithenn.for   //建立正解檔內容如下
       $TTL      86400
       @       IN      SOA     user.weithenn.org. hostmaster.weithenn.org. (
                                            2005042601 ; Serial
                                            28800      ; Refresh
                                            14400      ; Retry
                                            3600000    ; Expire
                                            86400 )    ; Minimum
                 IN      NS      gateway
                 IN      A       61.60.59.58
       gateway   IN      A       61.60.59.58
       www       IN      A       61.60.59.58
       mail      IN      A       61.60.59.58
       @         IN      MX  10  mail 

      設定好 named.weithenn.for 後可利用 BIND 9 新增加的指令 named-checkzone 來檢查 named.weithenn.for 設定檔語法是否正確,若語法正確則執行完指令後將不會有任何訊息,若語法有錯會顯示錯誤訊息及行數。
       /usr/sbin/named-checkzone weithenn.org named.weithenn.for     //檢查語法是否有錯
       /usr/sbin/named-checkzone -d weithenn.org named.weithenn.org  //開啟除錯功能
                                                 -v                  //顯示 named-checkconf 版本


      步驟4.修改服務設定檔 (rc.conf)

      修改 /etc/rc.conf 中加入下列的設定以便在系統重新開機時時會啟動 DNS 服務。
      #vi /etc/rc.conf         //編輯rc.conf內容如下
       named_enable="YES"        //啟動 named 服務
       named_flags="-u bind"     //採用 bind 這個帳號來啟動 DNS 服務 (安全性設定) 


      步驟5.修改本機 DNS 查詢設定檔 (resolv.conf)

      修改本機 DNS 查詢設定檔 /etc/resolv.conf 加上 Domain Name 及本機 IP Address,關於此設定檔詳細內容可參考站內文章 resolv.conf。
      #vi /etc/resolv.conf       //修改設定檔加入如下三行
       domain weithenn.org
       nameserver 127.0.0.1                                            
       nameserver 61.60.59.58 


      步驟6.啟動 DNS 服務

      請鍵入如下指令啟動 DNS 服務
      #/etc/rc.d/named start      //啟動 DNS 服務
                       stop          //停止 DNS 服務
                       restart       //重新啟動 DNS 服務
                       rcvar         //顯示應該填入 rc.conf 的內容
                       reload        //重新讀取 DNS 設定檔
                       status        //顯示目前 DNS 狀態


      4、安全性設定測試

      剛才上面的安全性設定完成後,我們測試一下剛才的安全性設定是否生效。

      測試1.隱藏 BIND DNS 版本

      透過下列指令來測試是否無法查詢到 BIND 版本 (DNS_Server就是您要測那一台的 domain name 或是 IP 也可以),不過隱藏 BIND DNS 版本不代表就絕對安全,只是讓攻擊者無法馬上得知您的 BIND DNS 版本 (好讓他方便找該版本漏洞)。
      #dig -t txt -c chaos VERSION.BIND DNS_Server
      若設定正確則可看到回應 VERSION.BIND 就是您填入的內容,若沒設定好當然版本就被順利查詢到啦。
       ;; ANSWER SECTION:
       VERSION.BIND.   0   CH   TXT     "None of your business" //隱藏版本成功
       VERSION.BIND.   0   CH   TXT     "9.3.0"                 //隱藏版本失敗


      測試2.Zone Transfer 限制

      檢測方式 (以 nslookup 為例 )
      #nslookup                         //進入 nslookup 交談模式
       >server weithenn.org           //指定以 weithenn.org 為 NS 做查詢
       Default Server: weithenn.org
       Address: 61.60.59.58  
       >ls -d weitenn.org             //檢查是否限制無法查尋 Zone File
       weithenn.org ***
        Can't list domain weitenn.org: Unspecified error


      5、參考


      6、Me FAQ

      Q1.logging channel 'security_log' file '/var/log/named/dns-security.log': file not found?

      Error Message:
      啟動 DNS 服務後,在系統訊息中看見如下錯誤訊息
      #tail /var/log/messages
       Jul 14 13:21:06 ms1 named59648: starting BIND 9.4.3-P2 -u bind -t /var/named -u bind
       Jul 14 13:21:06 ms1 named59648: command channel listening on 127.0.0.1#953
       Jul 14 13:21:06 ms1 named59648: the working directory is not writable
       Jul 14 13:21:06 ms1 named59648: logging channel 'default_log' file '/var/log/named/dns-default.log': file not found
       Jul 14 13:21:06 ms1 named59648: logging channel 'lamer_log' file '/var/log/named/dns-lamer.log': file not found
       Jul 14 13:21:06 ms1 named59648: logging channel 'query_log' file '/var/log/named/dns-query.log': file not found
       Jul 14 13:21:06 ms1 named59648: logging channel 'security_log' file '/var/log/named/dns-security.log': file not found
       Jul 14 13:21:06 ms1 named59648: isc_log_open '/var/log/named/dns-default.log' failed: file not found
       Jul 14 13:21:07 ms1 named59648: isc_log_open '/var/log/named/dns-query.log' failed: file not found
       Jul 14 13:21:13 ms1 named59648: isc_log_open '/var/log/named/dns-lamer.log' failed: file not found

      Ans:
      原因在於設定檔中指定的路徑並非實體路徑,而是相對於 Chroot 服務的相對路徑,可看到 DNS 執行序為 -t /var/named 配合 named.conf 中指定的相對路徑才是最後 Log 寫入路徑。
      #ps aux |grep named
       bind     59648  0.0  0.5 20724 16852  ??  Ss    1:21PM   0:00.12 /usr/sbin/named -u bind -t /var/named -u bind

      而 named.conf 設定檔中內容如下
       logging {
          category lame-servers { lamer_log; };  //在本DNS上查不到的記錄(遞迴查詢)
          category security{ security_log;};     //安全記錄
          category queries { query_log;};        //查詢記錄
          category default {default_log;};       //BIND啟動記錄
          channel default_log {
              file "/var/log/named/dns-default.log" versions 10 size 20m;  //預設值
              file "/var/log/dns-default.log" versions 10 size 20m;        //修改後
              severity info;
          };

      Q2.the working directory is not writable?

      Error Message:
      啟動 DNS 服務後,在系統訊息中看見如下錯誤訊息
      #tail /var/log/messages
       Jul 14 15:18:01 ms1 named64145: starting BIND 9.4.3-P2 -t /var/named -u bind
       Jul 14 15:18:01 ms1 named64145: command channel listening on 127.0.0.1#953
       Jul 14 15:18:01 ms1 named64145: the working directory is not writable

      Ans:
      若您確定在 /var/named 下權限設定正確 (owner bind) 後啟動 DNS 服務仍看到錯誤訊息,請依如下步驟進行修改後再重新啟動 DNS 服務即可解決。
      #vi /etc/mtree/BIND.chroot.dist
       /set type=dir uname=root gname=wheel mode=0755   //預設值
       /set type=dir uname=bind gname=wheel mode=0755   //修改後
      #/etc/rc.d/named restart                       //修改完成後重新啟動 DNS 服務


      Q3.connection timed out; no servers could be reached?

      Error Message:
      架設好 DNS 服務後使用 nslookup 去 Hinet DNS (168.95.1.1) 時回應如下錯誤訊息
       connection timed out; no servers could be reached
      Ans:
      此次的狀況為該網域 (Domain) 中設定的 DNS Server 指向不正確所造成,所以雖然 Bind 設定皆正確但找不到相對應的 Name Server,所以仍然無法正確查找到相關的 DNS Record,更改為 Domain 中正確的 Name Server 指向後運作即正常。

      Q4.failed while receiving responses: file not found?

      Error Message:
      設定好 DNS Slave 相關設定後,從 DNS Master 中有看到 DNS Slave 來進行 Zone Transfer 的動作 (資訊如下)
       client 61.60.59.58#45080: transfer of 'weithenn.org/IN': AXFR started
       client 61.60.59.58#45080: transfer of 'weithenn.org/IN': AXFR ended

      但是在 DNS Slave 中「/var/named/etc/namedb/slave」資料夾內就是沒有 Zone File,查看 Log 之後發現如下錯誤訊息:
       transfer of 'weithenn.org/IN' from 71.70.69.68#53: failed while receiving responses: file not found
      Ans:
      當然在「Firewall」以及「相關權限部份」我都已經檢查過沒問題,但是 Zone File 就是無法同步過來,後來在仔細檢查一下 named.conf 內容後,發現個問題照理來說應該是「directory "/etc/namedb";」 才對,但我新裝的 FreeBSD 8.3 其預設值居然是 「directory "/etc/namedb/working";」,沒錯!! 就是這個問題導致,經過修改後問題就解決了!!