Next Previous Contents

11. 關於設計封包過濾的建議

在電腦安全戰場上最明智之舉莫過於先擋掉一切﹐然後開放必需的。有一句至理名言是﹕`非請勿進'。我建議您牢記於心﹐假如您最注重安全的話。

不要跑那些您用不到的服務﹐不管您是否以為已經將之擋下來了。

如果您要建立一個指定式防火牆(dedicated firewall)﹐開始不要跑任何東西﹐同時擋掉所有封包﹐然後增加服務以及讓所需的封包通過。

我特別強調安全性﹕結合 tcp-wrappers(對於封包過濾本身的連接)、服務代理(對於通過封包過濾的連接)、路由驗證、以及封包過濾等手段。路由驗證是指﹐那些來自未預期界面的封包就會被丟棄﹕舉例說﹐如果您的內部網路有一段 10.1.1.0/24 的地址﹐同時有一個來自該地址的封包卻從 部界面進入﹐那它就會被丟棄掉。它可以為一個界面(如 ppp0) 設起來﹐如﹕

# echo 1 > /proc/sys/net/ipv4/conf/ppp0/rp_filter
#

或是全部現有及將有的界面﹐如﹕

# for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
#     echo 1 > $f
# done
# 

Debian 在可能之下預設就會如此了。如果您有不對稱路由(例如﹐您預期封包會從其它方向進入)﹐您應該在那些界面上關閉此一過濾。

設定防火牆的時候﹐假如有某些東西不工作的話﹐記錄功能就顯得很有用了﹔但在一個實際運作的防火牆上﹐任何時候都要將它結合 `limit' 比對來一起使用﹐以避免有人灌爆您的記錄檔。

我強烈建議對安全系統做連線追蹤﹕它雖然會引致一些負擔(因為所有連線都要追蹤)﹐但對於貴網路的連接控制卻很有用。如果您的核心不會自動載入模組的話﹐您或許需要載入`ip_conntrack.o' 模組。假如您要精確追蹤複雜的協定﹐您還需要載入合適的 helper 模組(如﹐`ip_conntrack_ftp.o' )。

# iptables -N no-conns-from-ppp0
# iptables -A no-conns-from-ppp0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A no-conns-from-ppp0 -m state --state NEW -i ! ppp0 -j ACCEPT
# iptables -A no-conns-from-ppp0 -i ppp0 -m limit -j LOG --log-prefix "Bad packet from ppp0:"
# iptables -A no-conns-from-ppp0 -i ! ppp0 -m limit -j LOG --log-prefix "Bad packet not from ppp0:"
# iptables -A no-conns-from-ppp0 -j DROP

# iptables -A INPUT -j no-conns-from-ppp0
# iptables -A FORWARD -j no-conns-from-ppp0

建置一個良好的防火牆已經超出這個 HOWTO 的範圍了﹐但我的建議是﹕ `一切從嚴(always be minimalist)'。對於在您機器上進行測試與探索的更多資料﹐就要參考 Security HOWTO 了。


Next Previous Contents