安裝clean feed
簡介
在常見的 usenet 討論區之中,廣告或垃圾文章的流竄是一直另人困擾的一個問題,該如何去面對或是解決這樣的問題是大多數 news  server的管理者都想要得到的答案,我們暫且不論有關這方面的政策性問題,單從技術方面來看,在這裡提供一些有關從 news server 反制 spam 的作法與小小的心得給大家參考。

一般來說在處理 spam 常採用的方法有兩種,一種是發現 spam 的情況後再發出 cancel message 去刪除存在 server 上的文章,雖然這樣做能夠減少某些的 spam,但是運用這種作法而產生的流量增加和硬碟的儲存也是可以預見的,因為一旦發現一篇 spam 之後, 我們就得發出一篇  cancel message,這個 cancel message 在網路上必然會傳送經過某些區域,也會被某些的server儲存下來,當spam的情況越來越多,我們所需要發出的 cancel message 也跟著增多,當這些 cancel  message 加起來所製造的流量將也是一筆可觀的數字。

目前,則有一種較有效率的做法,簡單的來說就是從 news  server 部份過濾掉我們認為是 spam 的文章,這些文章將會如同掉如無底洞一般,既不會儲存下來也不會送給其他的 server,這樣的作法除了減少流量之外,所有的處理均在 memory 中處理完畢,以減少 disk   I/O 的次數,這些好處是對單一的 server 而言,另外,更重要的是如果能夠從 news server 上做這樣的處理,對整個網路和其他的 server 也是有幫助的;有了news server在第一線的處理,不但減輕自己的負擔,也降低網路資源的浪費,底下將以 inn-1.7.2/insync1.1d 配合 clean   feed 0.95.3 來介紹詳細的作法。

首先先提一下 filter 的運作原理,目前inn提供的 filter 可以用 perl 和 tcl兩種語言來寫﹝不過我沒試過 tcl﹞;inn 利用 perl 附的 library 製造出一個 associative array 來供給 filter 使用,利用這個 array 就可以將每篇文章的 header 資料傳給 filter 處理,因此,innd 在收到每篇文章時就把這些資料傳給 filter,讓 filter 判斷,並按照 filter 傳回的值來決定是否要收下這篇文章;目前 inn 提供了 innd 和 nnrpd 的 filter,這些 filter 都已經有現成的範例可看,當然也可以配合自己的情況來設計 filter。﹝現成的範例在安裝inn時就有,它是放在 inn-1.7.2/samples/filter_innd.pl﹞

相關資料
  1. 參考資料
  2. 適用的 news server
    • INN
    • NNTPRELAY
    • HIGHWIND(Cyclone...etc)
  3. clean feed自從0.95.3之後,一套程式就可適用在上面三種的 news server 上
  4. cleanfeed 主程式是由 perl script 組成,如果了解 perl 的語法會有很大的幫助。
需求
  1. 取得cleanfeed(目前板本0.95.5a)

    WB01514_.gif (256 bytes)download clean feed 0.95.5a
    http://www.exit109.com/~jeremy/news/antispam.html

  2. 安裝 perl 5.004_04
  3. inn 板本 1.5以上,最好為inn-1.7.x 或 insync﹝強烈建議﹞

    inn: http://www.isc.org/inn.html
    insync: http://www.insync.net/~aos/inn.html

安裝
  1. 將原始檔案解開已後可發現這些檔案

    CHANGES--板本變遷
    README--說明文件,請仔細閱讀
    cleanfeed--cleanfeed主程式
    cleanfeed.8--manual page for cleanfeed
    cleanfeed.conf--cleanfeed設定檔
    cleanfeed.man--manual page for cleanfeed
    dynamic-1.5.1.patch--使用inn-1.5.1需安裝
    dynamic-load.patch--使用inn-1.7.x需安裝
    filter.patch--非inn-1.7.2.insync1.1d需安裝
    upgrade.patch--尚未安裝cleanfeed 0.95.3以後者需安裝

  1. 請先替 perl 裝上 md5 module
    1. 取回MD5-1.7.tar.gz
    2. 解開以後放在 perl source底下的 ext/
    3. 執行 perl Makefile.PL;make;make install
    4. 詳細資料請看內附的文件
  2. 如果使用的是 inn-1.7.2.insync1.1d,請跳到 step 5
  3. 如你使用的是 inn-1.7.x 的,你需要替 inn加上 dynamic-load.patch以及 filter.patch,若是inn-1.5.1或其他的,請用dynamic-1.5.1.patch以及filter.patch
  4. 安裝 patch 的方法

    cp filter.patch (inn src)/innd
    cd (inn src)/innd;patch<filter.patch
    cp dynamic-load.patch (inn src)/lib
    (或是 cp dynamic-1.5.1.patch (inn src)/lib )
    cd (inn src)/innd;patch<dynamic-load.patch

  5. 使用 inn-1.7.2.insync1.1d的人只需要upgrade.patch就行了

    cp upgrade.patch (inn src)/innd
    cd (inn src)/innd;patch<upgrade.patch

  6. 設定config.data
    1. 執行 perl -MExtUtils::Embed -e ldopts
    2. 將上面輸出的結果放到 config.data  PERL_LIB 之後
    3. 另外 PERL_INC 也要設定正確,例
      PERL_INC    -I/usr/local/lib/perl5/sun4-solaris/5.00404/CORE
      不同的機器會有不同的路徑
  7. 重新 compile 並安裝

    停下 innd
    cd (inn src);make;make update
    重新起動innd

  8. clean feed自從0.95.4之後就將設定檔與script分開,將source解開之後可發現cleanfeed以及cleanfeed.conf兩個檔案,將cleanfeed的檔名修改成filter_innd.pl(如果你是用INN的話)
  9. 將 filter_innd.pl 及 cleanfeed.conf 放到 /usr/local/news/bin/control/ 下
  10. 編輯 filter_innd.pl ,找到其中一行

    $config_dir = "/usr/local/news/bin/control";
    將路徑設定為放置cleanfeed.conf的目錄名稱

  11. 其他相關的設定將列在後面
  12. perl -cw filter_innd.pl 檢查語法看是否有誤
  13. perl -cw cleanfeed.conf 檢查語法看是否有誤
  14. 若沒有任何問題  ctlinnd reload filter.perl "upgrade filter"
  15. tail -f /var/log/news/news.notice 可以觀查你的成果
變數及設定
以下將 cleanfeed.conf 中常用的幾個設定變數說明:
  • aggressive
    設為 0 可比把一些一文章內容為主的過濾方式關掉
  • do_md5
    建議打開這項功能,可以對文章內容做 md5 check
  • md5maxmultiposts
    當發現 md5 checksum相同的文章超過此一上限時,再遇到 md5 checksum 相同的就開始reject
  • MD5History
    儲存 md5 cheksum 的 entry 數目
  • do_phl
    設定是否要做 PH/L EMP filter,cleanfeed會將每篇文章的NNTP-Posting-Host/Lines 這兩個 header 做為 key 來判斷是否為同一篇文章
  • do_fsl
    同上,不過是以 From/Subject/Lines 做為 key
  • maxmultiposts
    符合 ph/l 或是 f/s/l 的文章超過次一上限就開始reject
  • ArticleHistory
    設定 f/s/l ph/l記錄文章 entry 的數目,設定越大就會抓住越多的 spam ,當然,對於用bbslink送出文章的bbs site,所產生的影響也越大
  • EMPHistSize
    當一篇文章被f/s/l ph/l視為 EMP(spam) 時,它的 key 就會放進這個hash table,這可以設定這個 table 的 entry 數目
  • maxgroups
    一篇文章最多不可 crosspost 超過此一上限
  • tfjmaxgroups
    特別針對 test forsale job 等 group 設定crosspost上限
  • block_binaries
    設定是否要過濾掉含有 binary 的文章
  • block_mime_html
  • block_html
    以上兩個設定是否要過濾掉html
  • block_late_cancels
    如果某篇文章已被 filter reject,但又收到要 cancel 此篇文章的 cancel message,cleanfeed可過濾出這樣的cancel message
  • verbose
    設定是否要在news.notice看到更詳細的資訊
  • statfile
    指定一個檔案路徑,cleanfeed 會將相關的資料記錄在這個位址
  • bin_allowed
    指定某些 newsgroup 不受 block_binaries 的限制,可用 regular expression
  • poison_groups
    可設定 regexp ,凡是 Newsgroups header 中出現的 group 如果 match 這個 regexp,就會被 reject
  • md5exclude
    可設定 regexp,凡是文章中 Newsgroups header 符合這個 regexp 的,就會跳過 md5 checksum
  • allexclude
    可設定一 regexp, 凡是文章中 Newsgroups header 符合這個 regexp 的,就會跳過所有的檢查
  • badguys
    這是一個 regexp,可將要拒絕的 spammer 的domain放在這個地方
  • exempt
    這是一個 regexp,凡是文章中NNTP-Posting-Host header與這個 regexp 符合的話,就會跳過檢查
備註

本文件更新時間為1998/04/14 22:48

Contact:usenet@news-peer.nctu.edu.tw