架設 public news server (以 inn 為例) 需要注意的事項

架設 public server (不論是不是 news server) 時一定要假設世界上壞人很多,所以:

firewall 平常一定要是可以用的狀態 (在 FreeBSD 裡面可以用 options IPFIREWALL,隨時準備拿 ipfw 出來擋,不要用 kernel module,出事的時候說不定連 memory 都用完了。而 Linux 上可以用 iptables 擋),然後絕對要熟悉怎麼使用 ipfw/iptables。

再來是講 inn 2.4.1,在 configure 時我通常一定會使用這幾個參數:–with-prefix=/home/news (這是我個人的習慣,我覺得 ports 裡的 inn 做的鳥鳥的)、–with-perl (裝 Cleanfeed 會用到)、–with-berkeleydb (overview 用 ovdb)。

其中 Perl 最好用 ports 裝目前大家常用的新版本 (以 #elixus 為例,目前是 5.8.5),然後裝 Cleanfeed 時注意一下他需要哪些 modules,在 ports 裡面都有。而 BerkeleyDB 不建議用 4.x 版 (主要的問題是發展的情況很混亂,目錄結構到處跑),所以裝 ports 裡面的 db3 就很夠用了。

跑完 configure 以後記得修改 Makefile.global,把 -g -O2 改成 -g -O2 -pipe -march=pentium3 -mfpmath=sse 再 make。(其中 -march=pentium3 要在 gcc3 才有支援,舊版本可以用 -march=i686。而 -mfpmath=sse 則是在 gcc 3.4 之後的版本才支援。你可以用 gcc -v 看一下版本,或是直接裝 gcc34 然後把上面的 CC = gcc 改成 gcc34)

裝完以後把 inn.conf 裡面的 port: 119 改成 433 (nnsp port),把 noreader: false 改成 true,把 reader 的工作交給 nnrpd 做 (用 root 跑 nnrpd -D)。這樣比以前好的地方是:以前用 user 連到 port 119 後,innd 會先 fork + exec nnrpd,所以 user 一多,code segment 也會很多,而且 loading 較大。現在 user 一連進來,nnrpd 直接 fork 就可以服務 user,而且共用 code segment,loading 會小很多。

最後,用 firewall 防止有 user 想惡搞我們:用 ipfw 的 limit src-addr 限制單一 IP 同一時間只能有四個 connections 進來。(iptables 的作法我不知道,需要的人自己研究…)