1. 简介 这篇文章假设你知道有关IP地址、网络地址、网络掩码、选路和DNS。如果不知道,我建议你先阅读网络概念的HowTo(Network Concepts HOWTO)。 这篇HOWTO并非一个简要的介绍(会让你发热、发毛,没有安全感),也非一个xx的原始的披露(最吃苦耐劳的人也会被搅晕,不过必定会有所斩获)。 你的网络并不安全。问题在于,必须获取快速、简洁的通讯,但又必须限于良好的、无恶意的行为,就如同在嘈杂的大戏院里,你可以高谈阔论,但是绝不能大喊:着火了!。这篇HOWTO不能解决这种问题。 (译者:所有安全都只是相对的,否则根本不会产生这种东西了) 因此,你只能决定在哪方面妥协。我想帮助你使用一些可用的工具和一些通常需要注意的漏洞,希望你将它们用在好的一面,而不是出于恶意的目的 -- 另一个同样重要的问题。 (C) 2000 Paul `Rusty' Russell. Licenced under the GNU GPL. -------------------------------------------------------------------------------- 2、 官方站点及邮件列表位置 这里有三个官方站点: o Thanks to Filewatcher http://netfilter.filewatcher.org. o Thanks to The Samba Team and SGI http://netfilter.samba.org. o Thanks to Harald Welte http://netfilter.gnumonks.org. 你可以通过以下站点访问全部相关站点。 http://www.netfilter.org and http://www.iptables.org 以下是netfilter官方邮件列表 http://www.netfilter.org/contact.html#list. -------------------------------------------------------------------------------- 3.那么,什么是包过滤器? 包过滤器是这样一种软件:它检查通过的每个包的头部,然后决定如何处置它们。可以这样对待它们:丢弃(也就是说,如果这个包从未被接受,那么丢弃它),通过(也就是说,让包通过),或者更复杂的(操作)。 Linux下,包过滤内建在内核中(内核模块,或者内建),而且我们还有处理包的一些技巧,不过检查头部和处理包的一般性原则仍在这里。 -------------------------------------------------------------------------------- 3.1 我为何要包过滤? 控制、安全、警戒。 控制: 当你用你的Linux服务器把你的内部网和另一个网络(就是Internet吧)连起来,你可以决定哪些通信是允许的,哪些不允许。例如,包头部包含了包的目标地址,你可以阻碍包发送到(你)确定的几个外部网络,另一个例子,我用NetScape连接到Dilbert archives。页面上有来自doubleclick.net的广告,然后NetScape浪费了我的时间愉快的下载他们。 告诉包过滤器禁止任何来自或者发往doubleclick.net地址的包,问题就解决了。(当然有更好的办法,见Junkbuster)。 安全: 当Linux服务器是混乱的Internet和你良好的、有序的网络之间{wy}的东西时, 你{zh0}能知道哪些东西可以进入你的大门。例如,你可以允许所有(包)从你的网络 发出,不过你可能会为来自外部的xx的“Ping of Death”而焦急。另一个例子,你不希望 外人telnet到你的Linux服务器,尽管所有账户都有密码。或许你只想(像绝大多数人)成为 Internet的旁观者,而非它的服务器(也可能愿意是吧)。简单的不允许任何人接入,设置 包过滤器拒绝所有进入的包(是不错的办法)。 警戒: 有时,本地网络上错误配置的机器可能会向外部喷射出大量的包。{zh0}是当(网络中)出现任何不正常现象时,让包过滤器告诉你。这样你可能可以做点什么,或者你天生就很好奇。 -------------------------------------------------------------------------------- 3.2 如何在Linux下进行包过滤? Linux内核在其1.1系列中就有了包过滤功能。{dy}代,由Alan Cox 1994年移植于BSD的ipfw。这在Linux 2.0中由Jos Vos和其他人进行了加强;用户空间工具'ipfwadm'可用来控制内核过滤规则。1998年中,我在Michael Neuling的帮助下,为Linux 2.2进行了重写,推出了用户空间工具'ipchains'。{zh1},1999年中,基于Linux 2.4的第四代工具,'iptables',和其他内核的改写正式推出。这就是这个iptables的HOWTO文档的所在。 译者:userspace根据台湾同胞的说法,是用来区别系统内存中的适用范围的,分为核心空间和使用者空间,不必深究) 你需要包含netfilter架构的内核。netfilter是Linux中的一个通用框架,也可以插入(plug in)其他内容(如iptables模块)。也就是说你需要2.3.15及以后版本,而且在配置内核时对CONFIG_NETFILTER回答'Y'。 iptables这个工具用来和内核交互并告诉它哪些包应该过滤。除非你是程序员或者 特别好奇,否则这就是你用来控制包过滤的了。 -------------------------------------------------------------------------------- 3.2.1. iptables iptables工具向内核的包过滤表中插入和删除规则。这就意味着无论怎样设置,启动后信息都会丢失;请参看“制定{yj}性规则”(Making Rules Permanent)来确定如何保证下次启动这些规则能被恢复。 iptables是ipfwadm和ipchains的替代品。如果你是它们的使用者,请参看 “使用ipchains和ipfwadm”,如何轻松使用iptables。 -------------------------------------------------------------------------------- 3.2.2 创建{yj}性规则 你当前的防火墙设置保存在内核中,所以重启后就会丢失。你可以试着用iptables-save和iptables-restore脚本来保存他们,并由一个文件恢复。 -------------------------------------------------------------------------------- 4. 你算老几,凭什么玩弄我的内核? 我是Rusty Russell。Linux IP防火墙的维护者,也是一个适当的时候出现在适当的地方的coder。我写了ipchains(参见“如何在Linux下进行包过滤?”看看实际的工作其实由哪些人完成),并希望能学到足够的东西修正这次的包过滤。 WatchGuard,一个非常出色的防火墙公司,总之一堆广告,此处省略一千字…… 在此,我想澄清一个误解:我不是内核专家,我了解它,是因为我的核心工作让我接触了他们:David S. Miller, Alexey Kuznetsov, Andi Kleen, Alan Cox。无论如何,他们做了最深层的工作,轮到我时,已经非常安全和容易了。 -------------------------------------------------------------------------------- 5. Rusty的真正的包过滤快速指南 绝大部分人只有一个PPP连接到Internet,而且不希望有人由此进入他们的网络或者防火墙: # 插入connection-tracking模块(如国内建在内核中就不需要) # insmod ip_conntrack # insmod ip_conntrack_ftp # 对创建大量新的连接创建一个链,除非这些连接来自内部。 # iptables -N block # iptables -A block -m state --state ESTABLISHED,RELATED -j ACCEPT # iptables -A block -m state --state NEW -i ! ppp0 -j ACCEPT # iptables -A block -j DROP # 由INPUT和FORWARD链跳往(刚刚创建的)那条链。 # iptables -A INPUT -j block # iptables -A FORWARD -j block -------------------------------------------------------------------------------- 6. 包是如何穿过过滤器的 内核由'filter'表中的以下三个规则开始。这些被称为防火墙链或就叫链。这三个链分别是 INPUT、OUTPUT和FORWARD。 对于ASCII艺术迷来说,链好象这样:(注意:这与2.0和2.2内核非常不同) 译者:ASCII艺术,这里指的是利用纯ASCII文本作图 _____ Incoming / \ Outgoing -->;[Routing ]--->;|FORWARD|------->; [Decision] \_____/ ^ | | v ____ ___ / \ / \ |OUTPUT| |INPUT| \____/ \___/ ^ | | ---->; Local Process ---- 三个圈代表上面说的三个链。当包到达图中的一个圈,那个链就检查并确定包的命运。 如果链决定DROP包,包在那里就被杀死。但是如果链决定让包ACCEPT,包就继续在图中前进。 一个链是规则的列表。每个规则都会说:'如果包头看上去像这个的话,那么就这样处理'。 如果规则和包不匹配,由链中的下一个规则处理。{zh1},如果再也没有要进行处理的规则了, 内核就根据链的原则(policy,有时称为默认规则)来决定应当如何做。在一个注重安全的 系统中,原则通常是让内核丢弃这个包。 1. 当一个包进入时(就是由以太网卡),内核首先检查包的目的地。这被称作“选路”。 2. 如果它就是进入本机的,包会向图中的下方移动,到达INPUT链。如果到了这里,任何等待这个包的进程都会收到它。 3. 否则,如果内核未被允许转发,或者不知道该如何转发这个包,它会被丢弃。如果允许转发,而且包的目的地是另一个网络接口(如果你有另一个的话),那么包向我们图中的右边行进,到达FORWARD链。如果允许通过(ACCEPT),它就被送了出去。 4. {zh1},服务器上运行的程序可以发送网络包。这些包马上通过OUTPUT链。如果被允(ACCEPT),那么包继续向可以到达它的目的地的网络接口发送。 -------------------------------------------------------------------------------- |