Sun Java System Messaging Server 6.3 管理指南

第 19 章 使用 MeterMaid 執行內送連線的節流

MeterMaid 是可提供連線和作業事件的集中式測量和管理的服務,包含透過監視 IP 位址 SMTP 訊息封位址。在功能上,MeterMaid 可用來限制特定 IP 位址能夠連線至 MTA 的頻率。根據特定 IP 位址限制連線對於防止拒絕服務攻擊中使用的過度連線非常有用。MeterMaid 可取代 conn_throttle.so,所提供的功能與先前類似,但進一步將其延伸至 Messaging Server 安裝中。目前未規劃 conn_throttle.so 的任何新增強功能,而 MeterMaid 是更有效的替代方案。

本節包含以下小節:

19.1 技術簡介

conn_throttle.so 是一個共用程式庫,可做為使用內送連線記憶體中表格之 MTA 對映表的呼叫,以判定特定 IP 位址最近是否連線過於頻繁,而應暫停使用。雖然使用記憶體中表格有助於提升效能,但每部伺服器上的每個處理程序皆需維護其本身的表格,是很麻煩的。

在多數情況下,conn_throttle.so 呼叫均可在派送程式所存取的 PORT_ACCESS 對映中完成,如此每個系統只需執行一個處理程序。唯一的代價就是每部伺服器各需一個表格。

MeterMaid 最主要的進展在於,它保有一個可供 Messaging Server 環境內所有系統與處理程序存取的單一節流資訊儲存庫。它延續了可儲存這項資料的記憶體中資料庫,儘可能地提升了效能。重新啟動 MeterMaid 會失去先前所儲存的所有資訊,但實際上這項資料的有效期限非常短,因此重新啟動 (不常執行) 的損失極低。

19.2 作業原理

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 旗標。

19.3 MeterMaid 的 Configutil 參數

MeterMaid 的配置儲存於 msg.conf 中,由 configutil 維護。以下是 MeterMaid 目前支援的設定。預設值位在括號中。如需 MeterMaid 參數的完整清單,請參閱「Sun Java System Messaging Server 6.3 Administration Reference」中的「configutil Parameters」

這些設定由 check_metermaid 用戶端使用:

最後,節流表也定義於此處顯示的 msg.conf 中。每個配置參數中的 * 代表所定義之特定表格的名稱。以名為內部的表格為例,第一個參數將是 metermaid.table.internal.data_type

19.4 使用 Metermaid 限制過多的 IP 位址連線 — 範例

此範例會使用 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 參數。下面對此範例進行說明。

  1. 定義其中一個系統成為 MeterMaid 伺服器主機。

    在此系統上,設定下列 configutil 參數:


    local.metermaid.enable -v TRUE 

    設定認證密碼,用來驗證用戶端和 MeterMaid 伺服器之間的通訊:


    configutil -o metermaid.config.secret -v password
    
  2. 定義節流表。

    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 為配額 (連線限制)。

  3. 在 MeterMaid 系統上,啟動 MeterMaid。


    # start-msg metermaid
  4. 在 MTA 將使用 MeterMaid 進行節流的系統上,指定 MeterMaid 主機和密碼

    以下為必要項目:


    configutil -o metermaid.config.secret -v MeterMaid_Password
    configutil -o metermaid.config.serverhost -v name_or_ipaddress_of_MetermaidHost
    
  5. 設定 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 對映表

19.4.1 其他有用的 MeterMaid 選項

另外有兩個配置選項在某些狀況下相當有用。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 的表格中進行計數,以保持足夠的資訊可提供有效率的節流。