MeterMaid 是可提供連線和作業事件的集中式測量和管理的服務,包含透過監視 IP 位址 SMTP 訊息封位址。在功能上,MeterMaid 可用來限制特定 IP 位址能夠連線至 MTA 的頻率。根據特定 IP 位址限制連線對於防止拒絕服務攻擊中使用的過度連線非常有用。MeterMaid 可取代 conn_throttle.so,所提供的功能與先前類似,但進一步將其延伸至 Messaging Server 安裝中。目前未規劃 conn_throttle.so 的任何新增強功能,而 MeterMaid 是更有效的替代方案。
本節包含以下小節:
conn_throttle.so 是一個共用程式庫,可做為使用內送連線記憶體中表格之 MTA 對映表的呼叫,以判定特定 IP 位址最近是否連線過於頻繁,而應暫停使用。雖然使用記憶體中表格有助於提升效能,但每部伺服器上的每個處理程序皆需維護其本身的表格,是很麻煩的。
在多數情況下,conn_throttle.so 呼叫均可在派送程式所存取的 PORT_ACCESS 對映中完成,如此每個系統只需執行一個處理程序。唯一的代價就是每部伺服器各需一個表格。
MeterMaid 最主要的進展在於,它保有一個可供 Messaging Server 環境內所有系統與處理程序存取的單一節流資訊儲存庫。它延續了可儲存這項資料的記憶體中資料庫,儘可能地提升了效能。重新啟動 MeterMaid 會失去先前所儲存的所有資訊,但實際上這項資料的有效期限非常短,因此重新啟動 (不常執行) 的損失極低。
MeterMaid 的配置儲存於 msg.conf 中,由 configutil 維護。
您可以使用 check_metermaid.so 透過對映表呼叫,從 MTA 存取 MeterMaid。從任何 *_ACCESS 表均可加以呼叫。從 PORT_ACCESS 表加以呼叫時,MeterMaid 將可根據連線的 IP 位址檢查限制;這在捨棄舊有的 conn_throttle.so 而改用 MeterMaid 時,是最常見的實作方式。若從其他 *_ACCESS 表加以呼叫,MeterMaid 亦可用以建立訊息封寄件者或訊息封收件者位址與 IP 位址等其他資料的限制。
check_metermaid.so 中只會定義一個進入點。throttle 常式可連絡 MeterMaid,而提供兩個以逗號分隔的後續引數。第一個是據以檢查資料的表格名稱,第二個是要檢查的資料。
若探測的結果指出,接受檢查的特定資料超出它在該表格中的配額,check_metermaid.so 即會傳回「成功」,使對映引擎繼續處理此項目。接著將使用其餘項目處理此超出配額的連線。
PORT_ACCESS *|*|*|*|* $C$|INTERNAL_IP;$3|$Y$E *|*|*|*|* $C$:A$[/opt/SUNWmsgsr/lib/check_metermaid.so,throttle,tablename,$3]$N421$ \ Connection$ declined$ at$ this$ time$E * $YEXTERNAL |
請先記下對映表項目中的 $:A 旗標測試,再呼叫 check_metermaid.so。如此可確保我們只會在派送程式檢查 PORT_ACCESS 時執行 MeterMaid 探測,因為 MeterMaid 會為其探測設定 A 旗標。
MeterMaid 的配置儲存於 msg.conf 中,由 configutil 維護。以下是 MeterMaid 目前支援的設定。預設值位在括號中。如需 MeterMaid 參數的完整清單,請參閱「Sun Java System Messaging Server 6.3 Administration Reference」中的「configutil Parameters」。
local.metermaid.enable 在即將執行 MeterMaid 常駐程式的系統上,此設定必須設為 yes,使 Watcher 能夠啟動和控制 MeterMaid。
logfile.metermaid.* 這些設定與 IMAP、POP 與其他服務所使用的設定相同。依預設,MeterMaid 會將其記錄檔寫入 msg-svr-base/data/log/metermaid 中
metermaid.config.listenaddr (INADDR_ANY ) MeterMaid 應連結的位址。在大部分的系統上均無需變更預設值,但在負載平衡或 HA 系統上,則建議您指定適當的位址。
metermaid.config.maxthreads (20) MeterMaid 伺服器是多重執行緒的伺服器,其中具有可進行作業排程的執行緒處理區。此值可設定 MeterMaid 所能使用的執行緒數上限。在 CPU 數量超過 4 個的系統上增加此值,可提升整體的流量。
metermaid.config.port (63837) 此為 MeterMaid 偵聽連線及 MeterMaid 用戶端所將連接的連接埠。
metermaid.config.secret (無預設值;必須提供其值) 為認證內送的連線,MeterMaid 會使用用戶端在連線至 MeterMaid 時所傳送的共用機密。
metermaid.config.serverhost (無預設值;必須提供其值) 此為用戶端將連線的主機名稱或 IP 位址。此值可能與 metermaid.config.listenaddr 相同,但通常會具有特定值將用戶端導向 Messaging Server 環境中的某個特定系統。
這些設定由 check_metermaid 用戶端使用:
metermaid.mtaclient.connectfrequency (15) 會每隔 connectfrequency 秒嘗試進行連線。當用戶端需要連線至 MeterMaid 時,會使用此設定作為內部節流,以避免 MeterMaid 無法使用時仍持續嘗試連線。用戶端無法與 MeterMaid 通訊時,會將「失敗」狀態傳回至 MTA 對映引擎,指出 MeterMaid 未封鎖此連線。
例如,如果 check_metermaid.so 嘗試連線至 MeterMaid,但是因為某些原因而失敗,則在 metermaid.mtaclient.connectfrequency 指定的下一次 N 秒期間,不會再進行任何嘗試。這可避免 check_metermaid.so 過度頻繁嘗試連線至沒有作用的 MeterMaid。
metermaid.mtaclient.connectwait (5) 用戶端等待連線至 MeterMaid 時 (初始連線或重複使用其他已建立的連線),會在等待 connectwait 秒後,才傳回失敗狀態,並允許此連線繼續進行。
metermaid.mtaclient.debug (否) 若啟用此選項,即會將用戶端的除錯資訊列印至伺服器或 SMTP 伺服器的執行緒特定記錄檔。
metermaid.mtaclient.maxconns (3) 為支援多重執行緒伺服器,用戶端可維護 MeterMaid 連線的處理區。透過此作業將可提升通訊期間的同步運作性。但由於 MeterMaid 所執行的內部鎖定,對特定表格的存取將限定為一次一個請求,因此單一處理程序的多重連線只能提供有限度的好處。
metermaid.mtaclient.readwait (10) 在與 MeterMaid 進行通訊時,用戶端將等候 readwait 秒,才會傳回失敗狀態,並允許此連線繼續進行。
最後,節流表也定義於此處顯示的 msg.conf 中。每個配置參數中的 * 代表所定義之特定表格的名稱。以名為內部的表格為例,第一個參數將是 metermaid.table.internal.data_type。
metermaid.table.*.data_type (字串) MeterMaid 在其表格中支援兩種資料類型,即字串與 ipv4。字串資料限定為每個項目 255 個位元組,並且可使用區分大小寫或不區分大小寫的函數進行比較 (請參閱下方的 metermaid.table.*.options)。
metermaid.table.*.max_entries (1000) MeterMaid 初始化每個表格時,皆會預先配置此數量的項目。MeterMaid 會自動回收舊項目,即使尚未過期亦然。接收到新連線時,MeterMaid 會重複使用最舊的已存取項目。站點應指定足夠高的值,以快取在 quota_time 期間所接收的連線。
metermaid.table.*.options 是以逗號分隔的關鍵字清單,用以定義表格的運作方式或特性。有效的關鍵字包括:
nocase — 使用資料時,會以不區分大小寫的比較函數執行所有比較。(此選項僅適用於字串資料。)
penalize — 在 quota_time 秒後,節流通常會將連線計數重設為 0,若已啟用減額選項,節流即會依配額降低連線計數 (但不低於 0),使其他連線嘗試減少之後的 quota_time 期限。例如,若配額為 5,quota_time 為 60,而系統在第一分鐘接收到 12 個連線嘗試,則會接受前 5 個連線,而拒絕接下來的 7 個連線。經過 60 秒後,針對特定位址所計算的連線數將會降低為 7,仍將其維持在配額以上,而拒絕連線嘗試。假設後續又有其他連線嘗試產生,則在接下來的 60 秒期限後,連線數將進一步降低為 2,此時 MeterMaid 將再次允許連線嘗試。
metermaid.table.*.quota (100) 接收到的連線會依據配額進行計數。若在 quota_time 秒內接收到的連線數超過此值,MeterMaid 即會拒絕連線。(內送連線所受到的實際影響由對映表所控制,此影響所產生的結果可能是進一步的審查、延遲或拒絕連線。)
metermaid.table.*.quota_time (60) 可指定依據 quota 計算連線數的秒數。經過此秒數後,針對內送位址計算的連線數將根據此表格的 type 降低。
metermaid.table.*storage (雜湊) MeterMaid 可使用兩種不同的儲存方法,即雜湊與延伸。建議使用預設的雜湊表方法,但在特定情況下,延伸樹狀結構或許可提供較快的查詢。
metermaid.table.*.type (throttle) 目前 MeterMaid 唯一支援的表格類型為 throttle。此類型的表格可追蹤資料 (通常為 IP 位址),並會在 quota_time 秒期間內將內送的連線節流為 quota 個連線。
此範例會使用 MeterMaid 將 IP 位址節流在每分鐘 10 個連線。如需參照,對映檔案中等效的 conn_throttle.so 設定如下所示:
PORT_ACCESS *|*|*|*|* $C$|INTERNAL_IP;$3|$Y$E *|*|*|*|* $C$[/opt/SUNWmsgsr/lib/conn_throttle.so,throttle,$3,10]\ $N421$ Connection$ declined$ at$ this$ time$E * $YEXTERNAL |
此 PORT_ACCESS 對映表會實作 conn_throttle.so,以便針對非內部連線將連線限制在不超過每分鐘 10 個連線。
兩種技術之間基本的差異在於 MeterMaid 不是在對映表中直接配置速率限制進行節流的詳細資訊,而是針對這些設定使用 configutil 參數。下面對此範例進行說明。
定義其中一個系統成為 MeterMaid 伺服器主機。
在此系統上,設定下列 configutil 參數:
local.metermaid.enable -v TRUE |
設定認證密碼,用來驗證用戶端和 MeterMaid 伺服器之間的通訊:
configutil -o metermaid.config.secret -v password |
定義節流表。
MeterMaid 的節流運作方式是由定義操作特性的已命名節流表使用方式所決定。若要定義節流速率為每分鐘 10 個連線的節流表,請設定下列參數:
configutil -o metermaid.table.ext_throttle.data_type -v ipv4 configutil -o metermaid.table.ext_throttle.quota -v 10 |
ext_throttle 是節流表的名稱。ipv4 表示資料類型「網際網路協定第 4 版」位址。10 為配額 (連線限制)。
在 MeterMaid 系統上,啟動 MeterMaid。
# start-msg metermaid |
在 MTA 將使用 MeterMaid 進行節流的系統上,指定 MeterMaid 主機和密碼。
以下為必要項目:
configutil -o metermaid.config.secret -v MeterMaid_Password configutil -o metermaid.config.serverhost -v name_or_ipaddress_of_MetermaidHost |
設定 MeterMaid PORT_ACCESS 表。
此表類似於等效的 conn_throttle.so 設定:
PORT_ACCESS *|*|*|*|* $C$|INTERNAL_IP;$3|$Y$E *|*|*|*|* $C$:A$[/opt/SUNWmsgsr/lib/check_metermaid.so,throttle,\ ext_throttle,$3] $N421$ Connection$ declined$ at$ this$ time$E * $YEXTERNAL |
第一行會檢查嘗試進行連線的 IP 位址是否為內部連線。如果是,則允許連線。第二行會透過 MeterMaid 執行 IP 位址,如果連線過於頻繁,則會拒絕連線。第三行會允許其他任何連線通過,但是會標記為 EXTERNAL。
請注意,這個對於 check_metermaid.so 的呼叫相當類似於對於 conn_throttle.so 的呼叫。check_metermaid.so 的功能相同。throttle 及其引數指示表格名稱,是使用 metermaid.table.tablename 和所需檢查的 IP 位址 ($3) 所配置。和 conn_throttle.so 一樣,此功能會在到達限制 (如 metermaid.table.ext_throttle.quota 中所指定) 時傳回 success。這可允許處理剩餘的對映項目行,如此會傳送訊息 (421 SMTP 代碼 (暫時性的訊息處理錯誤) 和此次連線未被接受訊息) 至遠端 SMTP 用戶端,並通知派送程序關閉連線。
另請注意 $:A 會確保只有在從派送程序呼叫時才處理這一行。如果沒有這一項,對於 check_metermaid.so 的呼叫也會發生在探測 PORT_ACCESS 對映表的 tcp_smtp_server 程序環境中。這會造成 MeterMaid 計算兩次各個內送連線。
這是設定 MeterMaid 成為 conn_throttle.so 替代的基本配置。如需這些主題的資訊,請參閱10.3.2 對映作業和18.3.4 PORT_ACCESS 對映表。
另外有兩個配置選項在某些狀況下相當有用。conn_throttle.so 共用程式庫也具有 throttle_p 功能,在連線超過連續 60 秒的一段長時間時,連線會受到限制。MeterMaid 也提供這個相同的運作方式,方法是在 MeterMaid 伺服器系統上配置下列選項:
configutil -o metermaid.table.ext_throttle.options -v penalize |
這會變更 ext_throttle 表的運作方式,因此,在連線嘗試超過針對 metermaid.table.ext_throttle.quota 所設定的值時,連線會受到限制。
另一個選項與接收大量連線的系統相關聯。由於 MeterMaid 能夠追蹤整個分散式 MTA 環境的連線,因此,對於整個 MTA 環境的流量而言,MeterMaid 內部記憶體資料庫中保留的連線數量限制可能不足。預設值是每個表格 1000 個項目,但是,如果您預期整個 MTA 環境每分鐘會超過 1000 個連線,則您可以透過配置選項增加這個數目:
configutil -o metermaid.table.ext_throttle.max_entries -v max_entries |
請注意,如果在 60 秒內達到 max_entries,MeterMaid 也會自動捨棄最舊且最不常使用的項目。因此,最常連線的系統會保留在 MeterMaid 的表格中進行計數,以保持足夠的資訊可提供有效率的節流。