Radius

FreeRADIUS 3 - 丟棄某些記帳類型

  • May 10, 2018

我在 CentOS 7 伺服器上使用 FreeRADIUS 3.0.13 來記錄來自電話設備的數據,我們想簡單地刪除某些記錄類型 - 具體來說,對於這個應用程序,我只想記錄停止消息。

我們專門寫入詳細日誌,然後使用 bufferedsql 模組從該日誌中讀取,並寫入數據庫伺服器。一切正常,直到我得到一個記錄,例如記帳或開始。我通過將不需要的記錄寫入數據庫來解決其中的一些問題,該數據庫只是被清除,但我更喜歡更優雅的解決方案。

我在文件中看到的一件事是將查詢替換為SELECT TRUE;,但由於這不會更新記錄,FreeRADIUS 似乎對此感到窒息。它報告“No response to request”並將記錄保存在詳細文件中,每 30 秒嘗試重新處理一次。

當我執行時radiusd -X,我看到類似於以下的輸出。此輸出來自收到的 Accounting-On 數據包,我只想丟棄該消息:

(22)   accounting {
(22) sql: EXPAND %{tolower:type.%{Acct-Status-Type}.query}
(22) sql:    --> type.accounting-on.query
(22) sql: Using query template 'query'
rlm_sql (sql): Reserved connection (0)
(22) sql: EXPAND %{User-Name}
(22) sql:    -->
(22) sql: SQL-User-Name set to ''
(22) sql: EXPAND SELECT TRUE;
(22) sql:    --> SELECT TRUE;
(22) sql: Executing query: SELECT TRUE;
(22) sql: SQL query returned: success
(22) sql: -1 record(s) updated
(22) sql: No additional queries configured
rlm_sql (sql): Released connection (0)
(22)     [sql] = noop
(22)   } # accounting = noop
(22) detail (/var/log/radius/radacct/detail-ca-fallback/detail-ca-fallback-log): No response to request.  Will retry in 30 seconds
(22) Finished request
(22) Cleaning up request packet ID 0 with timestamp +660
Ready to process requests

如何配置我的 dialup.conf 以簡單地刪除這些類型的記帳記錄?生成計費數據的設備不支持任何僅發送特定計費消息的配置。

這是我的自定義 dialup.conf 文件的相關部分:

accounting {
   reference = "%{tolower:type.%{Acct-Status-Type}.query}"

   type {
       accounting-on {
           # This is a no-op. We don't log this anywhere. 
           query = "SELECT TRUE;"
       }

       accounting-off {
           # This is a no-op. We don't log this anywhere. 
           query = "SELECT TRUE;"
       }

       start {
           # This is a no-op. We don't log this anywhere. 
           query = "INSERT INTO blackhole \
(<snip - fields>) \
VALUES (<snip - values>)"
       }

       interim-update {
           # This is a no-op. We don't log this anywhere. 
           uery = "INSERT INTO blackhole \
(<snip - fields>) \
VALUES (<snip - values>)"
       }

       stop {
           query = "INSERT INTO  ${....acct_table1} \
(<fields>) \
VALUES (<values>)"
       }

       #
       #  No Acct-Status-Type == ignore the packet
       #
       none {
            query = "SELECT true"
       }
   }
}

註釋掉(或刪除)這些部分,以使維護您的配置的其他人清楚您沒有處理這些消息類型。然後,如果 Acct-Status-Type 值與您要處理的類型之一匹配,則在會計部分中僅呼叫 SQL 模組。

在您的範例中,您似乎忽略了所有不是非常有用的類型。這是一個僅處理開始和停​​止的範例。

accounting {
   switch "%{Acct-Status-Type}" {
       case 'Start' {
           sql
       }
       case 'Stop' {
           sql
       }
       # Do nothing for other types
   }
}

參見man unlang政策語言文件。

引用自:https://unix.stackexchange.com/questions/442403