在电脑安全战场上最明智之举莫过于先挡掉一切﹐然后开放必须的。有一句至理名言是﹕`非请勿进'。我建议您牢记于心﹐假如您最注重安全的话。
不要跑哪些您用不到的服务﹐不管您是否以为已经将之挡下来了。
如果您要建立一个指定式防火墙(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 了。