fnhssap 发表于 2004-8-25 22:19:54

http://iptables-tutorial.frozentux.net/cn/...ABLE.TCPMATCHESIptables 指南 1.1.19Oskar Andreasson   oan@frozentux.net   Copyright ?2001-2003 by Oskar Andreasson本文在符合 GNU Free Documentation 许可版本1.1的条件下,可以拷贝、分发、更改,但必须保留绪言和所有的章节,如印刷成书,封面要包括“原著:Oskar Andreasson”,且书背不准有文字。本文附录有 “GNU Free Documentation License”的详细内容。文中的所有脚本均置于GNU General Public License版本2下,可以自由地分发、更改。 给出这些脚本是希望它们有所作用,但没有任何保证,也没有商业可用性或某些特殊用途的内在保证。参见GNU General Public License 本文附带一份GNU General Public License,在章节“GNU Free Documentation License”中,如没有,请联系the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111- 1307 USA ----------------------------------------------------------------------------------------------------------------------------------------------------------------献辞首先,我要把本文献给我那wonderful的女友Ninel(她给我的帮助远远胜过我给她的):希望我能让你幸福,就象你给我的。( 译者注:我没有想到合适的词能表达作者女友的wonderful,你就自己想去吧。还有,不知他们现在是否结婚了 ) 其次,我要把这篇文章献给所有Linux的开发者和维护者,就是他们完成了令人无法相信的艰难工作,使这么优秀的操作系统成为可能。 目录 译者序 关于作者 如何阅读 必备知识 本文约定 1. 序言 1.1. 为什么要写这个指南 1.2. 指南是如何写的 1.3. 文中出现的术语2. 准备阶段 2.1. 哪里能取得iptables 2.2. 内核配置 2.3. 编译与安装 2.3.1. 编译 2.3.2. 在Red Hat 7.1上安装3. 表和链 3.1. 概述 3.2. mangle 表 3.3. nat 表 3.4. Filter 表4. 状态机制 4.1. 概述 4.2. conntrack记录 4.3. 数据包在用户空间的状态 4.4. TCP 连接 4.5. UDP 连接 4.6. ICMP 连接 4.7. 缺省的连接操作 4.8. 复杂协议和连接跟踪5. 保存和恢复数据管理规则 5.1. 速度 5.2. restore的不足之处 5.3. iptables-save 5.4. iptables-restore6. 规则是如何练成的 6.1. 基础 6.2. Tables 6.3. Commands 6.4. Matches 6.4.1. 通用匹配 6.4.2. 隐含匹配 6.4.3. 显式匹配 6.4.4. 针对非正常包的匹配6.5. Targets/Jumps 6.5.1. ACCEPT target 6.5.2. DNAT target 6.5.3. DROP target 6.5.4. LOG target 6.5.5. MARK target 6.5.6. MASQUERADE target 6.5.7. MIRROR target 6.5.8. QUEUE target 6.5.9. REDIRECT target 6.5.10. REJECT target 6.5.11. RETURN target 6.5.12. SNAT target 6.5.13. TOS target 6.5.14. TTL target 6.5.15. ULOG target7. 防火墙配置实例 rc.firewall 7.1. 关于rc.firewall 7.2. rc.firewall详解 7.2.1. 参数配置 7.2.2. 外部模块的装载 7.2.3. proc的设置 7.2.4. 规则位置的优化 7.2.5. 缺省策略的设置 7.2.6. 自定义链的设置 7.2.7. INPUT链 7.2.8. FORWARD链 7.2.9. OUTPUT链 7.2.10. PREROUTING链 7.2.11. POSTROUTING链8. 例子简介 8.1. rc.firewall.txt脚本的结构 8.1.1. 脚本结构8.2. rc.firewall.txt 8.3. rc.DMZ.firewall.txt 8.4. rc.DHCP.firewall.txt 8.5. rc.UTIN.firewall.txt 8.6. rc.test-iptables.txt 8.7. rc.flush-iptables.txt 8.8. Limit-match.txt 8.9. Pid-owner.txt 8.10. Sid-owner.txt 8.11. Ttl-inc.txt 8.12. Iptables-save rulesetA. 常用命令详解 A.1. 查看当前规则集的命令 A.2. 修正和清空iptables的命令B. 常见问题于与解答 B.1. 模块装载问题 B.2. 未设置SYN的NEW状态包 B.3. NEW状态的SYN/ACK包 B.4. 使用私有IP地址的ISP B.5. 放行DHCP数据 B.6. 关于mIRC DCC的问题C. ICMP类型 D. 其他资源和链接 E. 鸣谢 F. History G. GNU Free Documentation License 0. PREAMBLE 1. APPLICABILITY AND DEFINITIONS 2. VERBATIM COPYING 3. COPYING IN QUANTITY 4. MODIFICATIONS 5. COMBINING DOCUMENTS 6. COLLECTIONS OF DOCUMENTS 7. AGGREGATION WITH INDEPENDENT WORKS 8. TRANSLATION 9. TERMINATION 10. FUTURE REVISIONS OF THIS LICENSE How to use this License for your documentsH. GNU General Public License 0. Preamble 1. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 2. How to Apply These Terms to Your New ProgramsI. 示例脚本的代码 I.1. rc.firewall脚本代码 I.2. rc.DMZ.firewall脚本代码 I.3. rc.UTIN.firewall脚本代码 I.4. rc.DHCP.firewall脚本代码 I.5. rc.flush-iptables脚本代码 I.6. rc.test-iptables脚本代码List of Tables 3-1. 以本地为目标(就是我们自己的机子了)的包 3-2. 以本地为源的包 3-3. 被转发的包 4-1. 数据包在用户空间的状态 4-2. 内部状态 6-1. Tables 6-2. Commands 6-3. Options 6-4. Generic matches 6-5. TCP matches 6-6. UDP matches 6-7. ICMP matches 6-8. Limit match options 6-9. MAC match options 6-10. Mark match options 6-11. Multiport match options 6-12. Owner match options 6-13. State matches 6-14. TOS matches 6-15. TTL matches 6-16. DNAT target 6-17. LOG target options 6-18. MARK target options 6-19. MASQUERADE target 6-20. REDIRECT target 6-21. REJECT target 6-22. SNAT target 6-23. TOS target 6-24. TTL target 6-25. ULOG target C-1. ICMP类型--------------------------------------------------------------------------------译者序译者sllscn是中国Linux公社里的“Linux 新鲜社员”,一个Linux爱好者,在实际工作中使用iptables构造防火墙时,发现有关iptables的中文资料太少,故而不得已参考英文版的材料。为了今后参考的方便,也为了广大使用者,不怕自己的英文水平太差,翻着字典翻译了本文。翻译只为了能看懂,达不到“好看”,勿怪!第一章序言部分除了第三小节介绍的术语要看看,其他都没什么。第二章对想要亲自编译iptables的兄弟们是有些帮助的。第三、第四两章可以使我们理解、掌握iptables工作方式和流程。第五章和第六章是iptables命令使用方法的详细介绍。第七章与第八章是实例讲解,对我们编写自己的规则很有指导意义的,强烈建议你看一看。附录里有一些资源链接是很好的,相信你一定会喜欢。因为术语的缘故,目录部分有一些未翻译,但正文的内容都翻译了。附录F是本文的更新历史,附录G是GNU Free Documentation License,附录H是GNU General Public License,它们对理解 iptables没有什么作用,故未翻译。在阅读本文时,你可能会发现有重复的地方,这不是原作者的水平不高,反而恰恰是他为我们考虑的结果。你可以把这篇文章的任何一章抽出来阅读,而不需要反复地参照其他章节。在此,再次向作者表示敬意!因译者水平有限,对原文的理解不敢保证完全正确,如有意见或建议,可以联系译者slcl@sohu.com郑重声明:翻译得到了原文作者Oskar Andreasson的许可。对于本文(不是原文),可自由使用、修改、传播、转载,但对以盈利为目的使用,保留所有权利。--------------------------------------------------------------------------------关于作者我的局域网里有很多“年老的”计算机,他们也想连接到Internet上,还要保证安全。做到这一点, iptables是的ipchains的一个很好的升级。使用ipchains你可以通过丢弃所有“目的端口不是特定端口” 的包来建立一个安全的网络。但这将导致一些服务出现问题,比如被动FTP,还有在IRC中流出的DCC。它们在服务器上分配端口,并告知客户端,然后再让客户连接。 但是,iptables的代码中也有一些小毛病,在某些方面我发现这些代码并没有为作为完整的产品发布做好准备,但我仍然建议使用ipchains或更老的 ipfwadm 的人们进行升级,除非他们对正在使用的代码满意,或它们足以满足他们的需要。--------------------------------------------------------------------------------如何阅读本文介绍了iptables,以便你可以领会iptables的精彩,文中不包含iptables或Netfilter在安全方面的 bug。如果你发现iptables(或其组成部分)任何bug或特殊的行为,请联系Netfilter mailing lists ,他们会告诉你那是否是bug或如何解决。iptables或Netfilter中几乎没有安全方面的bug,当然偶尔也会出些问题,它们能在Netfilter主页中找到。文中用到的脚本不能解决Netfilter内部的bug,给出它们,只是为了演示如何构造规则,以便我们能解决遇到的数据流管理问题。但本文没有包括象“如何关闭HTTP端口,因为Apache 1.2.12偶尔会被攻击” 这样的问题。本指南会告诉你如何通过iptables关闭HTTP端口,但不是因为Apache偶尔会被攻击。 本文适合于初学者,但也尽可能完善。因为有太多的targets或matches,所以没有完全收录。如果你需要这方面的信息,可以访问Netfilter主页。 --------------------------------------------------------------------------------必备知识阅读本文,要具备一些基础知识,如Linux/Unix,shell脚本编写,内核编译,最好还有一些简单的内核知识。 我尝试着尽可能使读者不需要这些知识也能完全弄懂这篇文章,但要理解扩展部分是不行的。所以还是要有点基础的--------------------------------------------------------------------------------本文约定以下的约定会在文中用到: 代码和命令输出使用定宽字体,命令用粗体。$ lsdefaulteth0lo$   所有的命令和程序名都用粗体。 所有的系统部件,如硬件、内核部件、loopback使用斜体。 计算机文本输出用 这种字体。 文件名和路径名象这样 /usr/local/bin/iptables 。 --------------------------------------------------------------------------------1. 序言1.1. 为什么要写这个指南我发现目前所有的HOWTO都缺乏Linux 2.4.x 内核中的Iptables和Netfilter 函数的信息,于是我试图回答一些问题,比如状态匹配。我会用插图和例子 rc.firewall.txt 加以说明,此处的例子可以在你的/etc/rc.d/使用。最初这篇文章是以HOWTO文档的形式书写的,因为许多人只接受HOWTO文档。还有一个小脚本rc.flush-iptables.txt,我写它只是为使你在配置它的时候能象我一样有成功的感觉。--------------------------------------------------------------------------------1.2. 指南是如何写的 我请教了Marc Boucher 及netfilter团队的其他核心成员。对他们的工作以及对我在为boingworld.com 书写这个指南时的帮助表示极大的谢意,现在这个指南在我自己的站点frozentux.net上进行维护。这个文档将一步一步教你setup过程,让你对iptables包有更多的了解。这大部分的东西都基于例子rc.firewall 文件,因为我发现这是学习iptables的一个好方法。我决定自顶向下地跟随rc.firewall 文件来学习 iptables。虽然这样会困难一些,但更有逻辑。当你碰到不懂的东西时再来查看这个文件。 --------------------------------------------------------------------------------1.3. 文中出现的术语文中包含了一些术语,你应该有所了解。这里有一些解释,并说明了本文中如何使用它们。DNAT - Destination Network Address Translation 目的网络地址转换。 DNAT是一种改变数据包目的 ip地址的技术,经常和SNAT联用,以使多台服务器能共享一个ip地址连入Internet,并且继续服务。通过对同一个ip地址分配不同的端口,来决定数据的流向。 Stream - 流 是指发送和接收的数据包和通信的双方都有关系的一种连接(译者注:本文中,作者把连接看作是单向的,流表示双向的连接)。一般的,这个词用于描述在两个方向上发送两个或三个数据包的连接。对于TCP,流意味着连接,它发送了一个SYN,然后又回复SYN/ACK。但也可能是指这样的连接,发送一个SYN,回复ICMP主机不可达信息。换句话说,我使用这个词很随意。SNAT - Source Network Address Translation源网络地址转换。这是一种改变数据包源ip地址的技术,经常用来使多台计算机分享一个Internet地址。这只在IPv4中使用,因为IPv4的地址已快用完了,IPv6将解决这个问题。State - 状态 指明数据包处于什么状态。状态在RFC 793 - Transmission Control Protocol中定义,或由用户在Netfilter/iptables中自定义。需要注意的是Netfilter设定了一些关于连接和数据包的状态,但没有完全使用使用RFC 793的定义。User space - 用户空间,指在内核外部或发生在内核外部的任何东西。例如,调用 iptables -h 发生在内核外部,但iptables -A FORWARD -p tcp -j ACCEPT (部分地)发生在内核内部,因为一条新的规则加入了规则集。 Kernel space - 内核空间 ,与用户空间相对,指那些发生在内核内部。Userland - 参见用户空间 target - 这个词在后文中有大量的应用,它表示对匹配的数据包所做的操作。--------------------------------------------------------------------------------2. 准备阶段这一章是学习iptables的开始,它将帮助你理解Netfilter和iptables在Linux中扮演的角色。它会告诉你如何配置、安装防火墙,你的经验也会随之增长。当然,要想达到你的目标,是要花费时间,还要有毅力。( 译者注:听起来很吓人的 )--------------------------------------------------------------------------------2.1. 哪里能取得iptables iptables 可以从www.netfilter.org 下载,网站中的FAQs也是很好的教程。iptables 也使用一些内核空间,可以在用make configure配置内核的过程中配置,下面会介绍必要的步骤。--------------------------------------------------------------------------------2.2. 内核配置 为了运行iptables,需要在内核配置期间,选择以下一些选项,不管你用make config或其他命令。 CONFIG_PACKET - 允许程序直接访问网络设备(译者注:最常用的就是网卡了),象tcpdump 和 snort就要使用这个功能。 严格地说,iptables并不需要CONFIG_PACKET,但是它有很多用处(译者注:其他程序需要),所以就选上了。当然,你不想要,不选就是了。(译者注:建议还是选的为好) CONFIG_NETFILTER - 允许计算机作为网关或防火墙。这个是必需的,因为整篇文章都要用到这个功能。我想你也需要这个,谁叫你学iptables呢当然,你要给网络设备安装正确的驱动程序,比如,Ethernet 网卡, PPP 还有 SLIP 。 上面的选项,只是在内核中建立了一个框架, iptables确实已经可以运行,但不能做任何实质性的工作。我们需要更多的选项。以下给出内核2.4.9的选项和简单的说明:CONFIG_IP_NF_CONNTRACK - 连接跟踪模块,用于 NAT(网络地址转换) 和 Masquerading(ip地址伪装),当然,还有其他应用。如果你想把LAN中的一台机子作为防火墙,这个模块你算选对了。脚本rc.firewall.txt 要想正常工作,就必需有它的存在。CONFIG_IP_NF_FTP - 这个选项提供针对FTP连接进行连接跟踪的功能。一般情况下,对FTP连接进行连接跟踪是很困难的,要做到这一点,需要一个名为helper的动态链接库。此选项就是用来编译helper的。如果没有这个功能,就无法穿越防火墙或网关使用FTP。CONFIG_IP_NF_IPTABLES - 有了它,你才能使用过滤、伪装、NAT。它为内核加入了iptables标识框架。没有它,iptables毫无作用。 CONFIG_IP_NF_MATCH_LIMIT - 此模块并不是十分必要,但我在例子rc.firewall.txt中用到了。它提供匹配LIMIT的功能,以便于使用一个适当的规则来控制每分钟要匹配的数据包的数量。比如, -m limit --limit 3/minute 的作用是每分钟最多匹配三个数据包。这个功能也可用来消除某种DoS攻击。CONFIG_IP_NF_MATCH_MAC - 选择这个模块,可以根据MAC地址匹配数据包。例如,我们想要阻塞使用了某些MAC地址的数据包,或阻塞某些计算机的通信,用这个很容易。因为每个Ethernet网卡都有它自己的MAC地址,且几乎从不会改变。但我在 rc.firewall.txt中没有用到这个功能,其他例子也未用到。(译者注:这又一次说明了学习是为将来打基础 ) CONFIG_IP_NF_MATCH_MARK - 这个选项用来标记数据包。对数据包做 MARK(标记)操作,我们就可以在后面的表中用这个标记来匹配数据包。后文有详细的说明。 CONFIG_IP_NF_MATCH_MULTIPORT - 选择这个模块我们可以使用端口范围来匹配数据包,没有它,是无法做到这一点的。 CONFIG_IP_NF_MATCH_TOS - 使我们可以设置数据包的TOS(Type Of Service 服务类型)。这个工作也可以用命令ip/tc完成,还可在mangle表中用某种规则设定。CONFIG_IP_NF_MATCH_TCPMSS - 可以基于MSS匹配TCP数据包。CONFIG_IP_NF_MATCH_STATE - 相比较ipchains 这是最大的更新,有了它,我们可以对数据包做状态匹配。比如,在某个TCP连接的两个方向上已有通信,则这个连接上的数据包就被看作ESTABLISHED(已建立连接)状态。在rc.firewall.txt 里大量使用了此模块的功能。 CONFIG_IP_NF_MATCH_UNCLEAN - 匹配那些不符合类型标准或无效的 P、TCP、UDP、ICMP数据包(译者注:之所以此模块名为UNCLEAN,可以这样理解,凡不是正确模式的包都是脏的。这有些象操作系统内存管理中的“脏页”,那这里就可以称作“脏包”了,自然也就UNCLEAN了)。我们一般丢弃这样的包,但不知这样做是否正确。另外要注意,这种匹配功能还在实验阶段,可能会有些问题。CONFIG_IP_NF_MATCH_OWNER - 根据套接字的拥有者匹配数据包。比如,我们只允许root访问Internet。在iptables中,这个模块最初只是用一个例子来说明它的功能。同样,这个模块也处于实验阶段,还无法使用。CONFIG_IP_NF_FILTER - 这个模块为iptables添加基本的过滤表,其中包含INPUT、FORWARD、OUTPUT链。通过过滤表可以做完全的IP过滤。只要想过滤数据包,不管是接收的还是发送的,也不管做何种过滤,都必需此模块。CONFIG_IP_NF_TARGET_REJECT - 这个操作使我们用ICMP错误信息来回应接收到的数据包,而不是简单地丢弃它。有些情况必须要有回应的,比如,相对于ICMP和UDP来说,要重置或拒绝TCP连接总是需要一个TCP RST包。 CONFIG_IP_NF_TARGET_MIRROR - 这个操作使数据包返回到发送它的计算机。例如,我们在INPUT链里对目的端口为HTTP的包设置了MIRROR操作,当有人访问HTTP时,包就被发送回原计算机,最后,他访问的可能是他自己的主页。(译者注:应该不难理解为什么叫做MIRROR了)CONFIG_IP_NF_NAT - 顾名思义,本模块提供NAT功能。这个选项使我们有权访问nat表。端口转发和伪装是必需此模块的。当然,如果你的LAN里的所有计算机都有唯一的有效的 IP地址,那在做防火墙或伪装时就无须这个选项了。rc.firewall.txt 是需要的CONFIG_IP_NF_TARGET_MASQUERADE - 提供MASQUERADE(伪装)操作。如果我们不知道连接Internet的IP,首选的方法就是使用MASQUERADE,而不是DNAT或SNAT。换句话说,就是如果我们使用PPP或SLIP等连入Internet,由DHCP或其他服务分配IP,使用这个比SNAT好。因为MASQUERADE 不需要预先知道连接Internet的IP,虽然对于计算机来说MASQUERADE要比NAT的负载稍微高一点。CONFIG_IP_NF_TARGET_REDIRECT - 这个操作和代理程序一起使用是很有用的。它不会让数据包直接通过,而是把包重新映射到本地主机,也就是完成透明代理。CONFIG_IP_NF_TARGET_LOG - 为iptables增加 LOG(日志)操作。通过它,可以使用系统日志服务记录某些数据包,这样我们就能了解在包上发生了什么。这对于我们做安全审查、调试脚本的帮助是无价的。CONFIG_IP_NF_TARGET_TCPMSS - 这个选项可以对付一些阻塞ICMP分段信息的ISP(服务提供商)或服务。没有ICMP分段信息,一些网页、大邮件无法通过,虽然小邮件可以,还有,在握手完成之后,ssh可以但scp不能工作。我们可以用TCPMSS解决这个问题,就是使MSS(Maximum Segment Size)被钳制于PMTU(Path Maximum Transmit Unit)。这个方法可以处理被Netfilter开发者们在内核配置帮助中称作“criminally brain-dead ISPs or servers”的问题。CONFIG_IP_NF_COMPAT_IPCHAINS - ipchains 的,这只是为内核从2.2转换到2.4而使用的,它会在2.6中删除。CONFIG_IP_NF_COMPAT_IPFWADM - 同上,这只是 ipfwadm的暂时使用的兼容模式。上面,我简要介绍了很多选项,但这只是内核2.4.9中的。要想看看更多的选项,建议你去Netfilter 看看patch-o-matic。在那里,有其他的一些选项。POM可能会被加到内核里,当然现在还没有。这有很多原因,比如,还不稳定,Linus Torvalds没打算或没坚持要把这些补丁放入主流的内核,因为它们还在实验。把以下选项编译进内核或编译成模块,rc.firewall.txt才能使用。CONFIG_PACKET CONFIG_NETFILTER CONFIG_IP_NF_CONNTRACK CONFIG_IP_NF_FTP CONFIG_IP_NF_IRC CONFIG_IP_NF_IPTABLES CONFIG_IP_NF_FILTER CONFIG_IP_NF_NAT CONFIG_IP_NF_MATCH_STATE CONFIG_IP_NF_TARGET_LOG CONFIG_IP_NF_MATCH_LIMIT CONFIG_IP_NF_TARGET_MASQUERADE 以上是为保证 rc.firewall.txt正常工作而需要的最少的选项。其他脚本需要的选项,在相应的章节里都有说明。目前,我们只需注意要学习的这个脚本。--------------------------------------------------------------------------------2.3. 编译与安装下面,我们来看看如何编译iptables。iptables很多组件的配置、编译是与内核的配置、编译相关联的,了解这一点是很重要的。某些Linux产品预装了iptables,比如Red Hat,但是它的缺省设置是不启用iptables的。后文我们会介绍如何启用它,也会介绍一下其他 Linux产品里的iptables情况。--------------------------------------------------------------------------------2.3.1. 编译首先要解压iptables包。这里,我用iptables 1.2.6a做例子(译者注:在我翻译时,最新版本已经是 1.2.9,其中又有了不少改进,修补了一些bug,增添了几个match和target。)。命令 bzip2 -cd iptables-1.2.6a.tar.bz2 | tar -xvf -(当然也可以用tar -xjvf iptables-1.2.6a.tar.bz2,但这个命令可能对一些老版的tar不适用 ) 将压缩包解压至目录iptables-1.2.6a,其中的INSTALL文件有很多对编译、运行有用的信息。这一步,你将配置、安装一些额外的模块,也可以为内核增加一些选项。我们这里只是检查、安装一些未被纳入内核的标准的补丁。当然,更多的在实验阶段的补丁,仅在进行其他某些操作时才会用到。 有一些补丁仅仅处在实验阶段,把它们也安装上不是一个好主意。这一步,你会遇到很多十分有趣的匹配和对数据包的操作,但它们还正在实验。为了完成这一步,我们要在iptables的目录内用到如下一些命令:make pending-patches KERNEL_DIR=/usr/src/linux/ 变量KERNEL_DIR指向内核原码的真实路径。一般情况下,都是/usr/src/linux/ ,但也会不一样,这要看你所用的Linux产品了。 总之,只有某些补丁会被询问是否加入内核,而Netfilter的开发者们有大量的补丁或附件想要加入内核,但还要再实验一阵子才能做到。如果你想安装这些东西,就用下面的命令: make most-of-pom KERNEL_DIR=/usr/src/linux/ 这个命令会安装部分patch-o-matic(netfilter世界对补丁的称呼),忽略掉的是非常极端的那一部分,它们可能会对内核造成严重的破坏。你要知道这个命令的作用,要了解它们对内核原码的影响,好在在你选用之前,会有所提示。下面的命令可以安装所有的patch-o-matic(译者注:一定要小心哦)。make patch-o-matic KERNEL_DIR=/usr/src/linux/ 要仔细的读读每一个补丁的帮助文件,因为有些patch-o-matic会损坏内核,而有些对其他补丁有破坏作用。 你要是不打算用patch-o-matic修补内核,以上的命令都用不着,它们不是必需的。不过,你可以用这些命令来看看有什么有趣的玩意儿,这不会影响任何东西。 安装好patch-o-matic,现在应该重新编译内核了,因为其中增加了一些补丁。但别忘了重新配置内核,现有的配置文件里可没有你增加的补丁的信息。当然,你也可以先编译iptables , 再来编译内核。接下来就该编译iptables了,用下面这个简单的命令:make KERNEL_DIR=/usr/src/linux/ iptables应该编译好了,如果不行,好好考虑考虑问题在哪儿,要么订阅 Netfilter mailing list,那里可能有人能帮助你。一切顺利的话,我们该安装iptables了,这几乎不会有什么问题的。我们用下面的命令来完成这一步: make install KERNEL_DIR=/usr/src/linux/ 现在大功告成了。如果你在前面没有重新编译、安装内核,现在就要做了,不然,你还是不能使用更新后的iptables。好好看看INSTALL吧,那里面有详细的安装信息。--------------------------------------------------------------------------------2.3.2. 在Red Hat 7.1上安装Red Hat 7.1使用2.4.x的内核,支持Netfilter和iptables。Red Hat包含了所有基本的程序和需要的配置文件,但缺省使用的是B class=COMMAND>ipchains。“iptables为什么不能用”是最常见的问题,下面就让我们就来说说如何关闭ipchains而起用iptables 。Red Hat 7.1预装的iptables版本有些老了,在使用之前,你可能想装个新的,再自己编译一下内核。 我们先要关闭ipchains,并且不想再让它运行起来,做到这一点,要更改目录/etc/rc.d/下的一些文件名。用以下命令完成: chkconfig --level 0123456 ipchains off 这个命令把所有指向/etc/rc.d/init.d/ipchains的软连接改名为 K92ipchains。以S开头表示,在启动时会由初始化脚本运行此脚本。改为K开头后,就表示终止服务,或以后在启动时不再运行。这样,ipchains以后不会再开机就运行了。要想终止正在运行的服务,要用service命令。终止ipchains 服务的命令是:service ipchains stop 现在,我们可以启动iptables服务了。首先,要确定在哪个运行层运行,一般是 2,3和5,这些层有不同的用处:2. 不带NFS的多用户环境,和层3的区别仅在于不带网络支持。3. 多用户环境,就是我们一般事用的层。 5. X11,图形界面。用下面的命令以使iptables能在这些层运行:chkconfig --level 235 iptables on 你也可以使用这个命令使iptables能在其他层运行。但没这个必要,因为层1是单用户模式,一般用在维修上;层4保留不用;层6用来关闭计算机。启动iptables用:service iptables start 在脚本iptables里还没有定义规则。在Red Hat 7.1中添加规则的方法有二:第一个方法是编辑/etc/rc.d/init.d/iptables,要注意在用RPM升级iptables时,已有的规则可能会被删除。另一个方法是先装载规则,然后用命令iptables-save把规则保存到文件中,再由目录rc.d下的脚本(/etc/rc.d/init.d/iptables)自动装载。我们先来说明如何利用“剪切粘贴大法”设置/etc/rc.d/init.d/iptables。为了能在计算机启动iptables时装载规则,可以把规则放在“start)”节或函数start()中。注意:如果把规则放在“start)”节里,则不要在“start)”节里运行start(),还要编辑“stop)”节,以便在关机时或进入一个不需要iptables的层时,脚本知道如何处理。还应检查“restart”节和“condrestart”节的设置。一定要注意,我们所做的改动在升级iptables时可能会被删除,而不管是通过Red Hat网络自动升级还是用 RPM升级。下面介绍第二种方法:先写一个规则的脚本,或直接用iptables命令生成规则。规则要适合自己的需要,别忘了实验一下是否有问题,确认正常之后,使用命令iptables-save来保存规则。一般用iptables-save > /etc/sysconfig/iptables生成保存规则的文件 /etc/sysconfig/iptables,也可以用service iptables save,它能把规则自动保存在/etc/sysconfig/iptables中。当计算机启动时,rc.d下的脚本将用命令iptables-restore调用这个文件,从而就自动恢复了规则。以上两种方法最好不要混用,以免用不同方法定义的规则互相影响,甚至使防火墙的设置无效。至此,可以删除预装的ipchains和iptables了,这样可以避免新旧版本的iptables之间的冲突。其实,只有当你从原码安装时,才需要这样做。但一般来说,也不会出现互相影响的问题,因为基于rpm的包不使用原码的缺省目录。删除用以下命令:rpm -e iptables 既然不用ipchains为什么要保留呢?删吧!命令如下:rpm -e ipchains 历经磨难,胜利终于到来了。你已经能够从源码安装iptables了。那些老版的东西就删掉吧。 --------------------------------------------------------------------------------Chapter 3. 表和链这一章我们来讨论数据包是以什么顺序、如何穿越不同的链和表的。稍后,在你自己写规则时,就会知道这个顺序是多么的重要。一些组件是iptables与内核共用的,比如,数据包路由的判断。了解到这一点是很重要的,尤其在你用iptables改变数据包的路由时。这会帮助你弄明白数据包是如何以及为什么被那样路由,一个好的例子是DNAT和SNAT,不要忘了TOS的作用。 --------------------------------------------------------------------------------3.1. 概述当数据包到达防火墙时,如果MAC地址符合,就会由内核里相应的驱动程序接收,然后会经过一系列操作,从而决定是发送给本地的程序,还是转发给其他机子,还是其他的什么。 我们先来看一个以本地为目的的数据包,它要经过以下步骤才能到达要接收它的程序:下文中有个词mangle,我实在没想到什么合适的词来表达这个意思,只因为我的英语太差!我只能把我理解的写出来。这个词表达的意思是,会对数据包的一些传输特性进行修改,在mangle表中允许的操作是 TOS、TTL、MARK。也就是说,今后只要我们见到这个词能理解它的作用就行了。Table 3-1. 以本地为目标(就是我们自己的机子了)的包Step(步骤) Table(表) Chain(链) Comment(注释) 1   在线路上传输(比如,Internet) 2   进入接口 (比如, eth0) 3 mangle PREROUTING 这个链用来mangle数据包,比如改变TOS等 4 nat PREROUTING 这个链主要用来做DNAT。不要在这个链做过虑操作,因为某些情况下包会溜过去。 5   路由判断,比如,包是发往本地的,还是要转发的。 6 mangle INPUT 在路由之后,被送往本地程序之前,mangle数据包。 7 filter INPUT 所有以本地为目的的包都要经过这个链,不管它们从哪儿来,对这些包的过滤条件就设在这里。8   到达本地程序了(比如,服务程序或客户程序) 注意,相比以前(译者注:就是指ipchain)现在数据包是由INPUT链过,而不是FORWARD链。这样更符合逻辑。刚看上去可能不太好理解,但仔细想想就会恍然大悟的。现在我们来看看源地址是本地器的包要经过哪些步骤:Table 3-2. 以本地为源的包Step Table Chain Comment 1   本地程序(比如,服务程序或客户程序) 2   路由判断,要使用源地址,外出接口,还有其他一些信息。3 mangle OUTPUT 在这儿可以mangle包。建议不要在这儿做过滤,可能有副作用哦。 4 nat OUTPUT 这个链对从防火墙本身发出的包进行DNAT操作。 5 filter OUTPUT 对本地发出的包过滤。 6 mangle POSTROUTING 这条链主要在包DNAT之后(译者注:作者把这一次DNAT称作实际的路由,虽然在前面有一次路由。对于本地的包,一旦它被生成,就必须经过路由代码的处理,但这个包具体到哪儿去,要由NAT代码处理之后才能确定。所以把这称作实际的路由。),离开本地之前,对包 mangle。有两种包会经过这里,防火墙所在机子本身产生的包,还有被转发的包。 7 nat POSTROUTING 在这里做SNAT。但不要在这里做过滤,因为有副作用,而且有些包是会溜过去的,即使你用了DROP策略。 8   离开接口(比如: eth0) 9   在线路上传输(比如,Internet) 在这个例子中,我们假设一个包的目的是另一个网络中的一台机子。让我们来看看这个包的旅程:Table 3-3. 被转发的包Step Table Chain Comment 1   在线路上传输(比如,Internet) 2   进入接口(比如, eth0) 3 mangle PREROUTING mangle数据包,,比如改变TOS等。 4 nat PREROUTING 这个链主要用来做DNAT。不要在这个链做过虑操作,因为某些情况下包会溜过去。稍后会做SNAT。 5   路由判断,比如,包是发往本地的,还是要转发的。 6 mangle FORWARD 包继续被发送至mangle表的FORWARD链,这是非常特殊的情况才会用到的。在这里,包被mangle(还记得mangle的意思吗)。这次mangle发生在最初的路由判断之后,在最后一次更改包的目的之前(译者注:就是下面的FORWARD链所做的,因其过滤功能,可能会改变一些包的目的地,如丢弃包)。 7 filter FORWARD 包继续被发送至这条FORWARD链。只有需要转发的包才会走到这里,并且针对这些包的所有过滤也在这里进行。注意,所有要转发的包都要经过这里,不管是外网到内网的还是内网到外网的。在你自己书写规则时,要考虑到这一点。8 mangle POSTROUTING 这个链也是针对一些特殊类型的包(译者注:参考第6步,我们可以发现,在转发包时,mangle表的两个链都用在特殊的应用上)。这一步mangle是在所有更改包的目的地址的操作完成之后做的,但这时包还在本地上。 9 nat POSTROUTING 这个链就是用来做SNAT的,当然也包括Masquerade(伪装)。但不要在这儿做过滤,因为某些包即使不满足条件也会通过。 10   离开接口(比如: eth0) 11   又在线路上传输了(比如,LAN)就如你所见的,包要经历很多步骤,而且它们可以被阻拦在任何一条链上,或者是任何有问题的地方。我们的主要兴趣是iptables的概貌。注意,对不同的接口,是没有什么特殊的链和表的。所有要经防火墙/ 路由器转发的包都要经过FORWARD链。在上面的情况里,不要在INPUT链上做过滤。INPUT是专门用来操作那些以我们的机子为目的地址的包的,它们不会被路由到其它地方的。 现在,我们来看看在以上三种情况下,用到了哪些不同的链。图示如下:要弄清楚上面的图,可以这样考虑。在第一个路由判断处,不是发往本地的包,我们会发送它穿过 FORWARD链。若包的目的地是本地监听的IP地址,我们就会发送这个包穿过INPUT链,最后到达本地。值得注意的是,在做NAT的过程中,发往本机的包的目的地址可能会在PREROUTING链里被改变。这个操作发生在第一次路由之前,所以在地址被改变之后,才能对包进行路由。注意,所有的包都会经过上图中的某一条路径。如果你把一个包DNAT回它原来的网络,这个包会继续走完相应路径上剩下的链,直到它被发送回原来的网络。想要更多的信息,可以看看rc.test-iptables.txt ,这个脚本包括了一些规则,它们会向你展示包是怎样通过各个表和链的。 --------------------------------------------------------------------------------3.2. mangle 表这个表主要用来mangle包,你可以使用mangle匹配来改变包的TOS等特性。 强烈建议你不要在这个表里做任何过滤,不管是DANT,SNAT或者Masquerade。以下是mangle表中仅有的几种操作:TOSTTLMARKTOS操作用来设置或改变数据包的服务类型域。这常用来设置网络上的数据包如何被路由等策略。注意这个操作并不完善,有时得不所愿。它在Internet上还不能使用,而且很多路由器不会注意到这个域值。换句话说,不要设置发往Internet的包,除非你打算依靠TOS来路由,比如用iproute2。TTL操作用来改变数据包的生存时间域,我们可以让所有数据包只有一个特殊的TTL。它的存在有一个很好的理由,那就是我们可以欺骗一些ISP。为什么要欺骗他们呢?因为他们不愿意让我们共享一个连接。那些ISP会查找一台单独的计算机是否使用不同的TTL,并且以此作为判断连接是否被共享的标志。MARK用来给包设置特殊的标记。iproute2能识别这些标记,并根据不同的标记(或没有标记)决定不同的路由。用这些标记我们可以做带宽限制和基于请求的分类。--------------------------------------------------------------------------------3.3. nat 表此表仅用于NAT,也就是转换包的源或目标地址。注意,就象我们前面说过的,只有流的第一个包会被这个链匹配,其后的包会自动被做相同的处理。实际的操作分为以下几类:DNATSNATMASQUERADEDNAT操作主要用在这样一种情况,你有一个合法的IP地址,要把对防火墙的访问重定向到其他的机子上(比如DMZ)。也就是说,我们改变的是目的地址,以使包能重路由到某台主机。 SNAT改变包的源地址,这在极大程度上可以隐藏你的本地网络或者DMZ等。一个很好的例子是我们知道防火墙的外部地址,但必须用这个地址替换本地网络地址。有了这个操作,防火墙就能自动地对包做SNAT和De-SNAT(就是反向的SNAT),以使LAN能连接到Internet。如果使用类似 192.168.0.0/24这样的地址,是不会从Internet得到任何回应的。因为IANA定义这些网络(还有其他的)为私有的,只能用于LAN内部。MASQUERADE的作用和MASQUERADE完全一样,只是计算机的负荷稍微多一点。因为对每个匹配的包,MASQUERADE都要查找可用的IP地址,而不象SNAT用的IP地址是配置好的。当然,这也有好处,就是我们可以使用通过PPP、 PPPOE、SLIP等拨号得到的地址,这些地址可是由ISP的DHCP随机分配的。--------------------------------------------------------------------------------3.4. Filter 表filter 表用来过滤数据包,我们可以在任何时候匹配包并过滤它们。我们就是在这里根据包的内容对包做DROP或ACCEPT的。当然,我们也可以预先在其他地方做些过滤,但是这个表才是设计用来过滤的。几乎所有的target都可以在这儿使用。大量具体的介绍在后面,现在你只要知道过滤工作主要是在这儿完成的就行了。--------------------------------------------------------------------------------Chapter 4. 状态机制本章将详细介绍状态机制。通读本章,你会对状态机制是如何工作的有一个全面的了解。我们用一些例子来进行说明状态机制。实践出真知嘛。--------------------------------------------------------------------------------4.1. 概述状态机制是iptables中特殊的一部分,其实它不应该叫状态机制,因为它只是一种连接跟踪机制。但是,很多人都认可状态机制这个名字。文中我也或多或或少地用这个名字来表示和连接跟踪相同的意思。这不应该引起什么混乱的。连接跟踪可以让Netfilter知道某个特定连接的状态。运行连接跟踪的防火墙称作带有状态机制的防火墙,以下简称为状态防火墙。状态防火墙比非状态防火墙要安全,因为它允许我们编写更严密的规则。在iptables里,包是和被跟踪连接的四种不同状态有关的。它们是NEW,ESTABLISHED,RELATED和INVALID。后面我们会深入地讨论每一个状态。使用--state匹配操作,我们能很容易地控制 “谁或什么能发起新的会话”。所有在内核中由Netfilter的特定框架做的连接跟踪称作conntrack(译者注:就是connection tracking 的首字母缩写)。conntrack可以作为模块安装,也可以作为内核的一部分。大部分情况下,我们想要,也需要更详细的连接跟踪,这是相比于缺省的conntrack而言。也因为此,conntrack中有许多用来处理TCP, UDP或ICMP协议的部件。这些模块从数据包中提取详细的、唯一的信息,因此能保持对每一个数据流的跟踪。这些信息也告知conntrack流当前的状态。例如,UDP流一般由他们的目的地址、源地址、目的端口和源端口唯一确定。在以前的内核里,我们可以打开或关闭重组功能。然而,自从iptables和Netfilter,尤其是连接跟踪被引入内核,这个选项就被取消了。因为没有包的重组,连接跟踪就不能正常工作。现在重组已经整合入 conntrack,并且在conntrack启动时自动启动。不要关闭重组功能,除非你要关闭连接跟踪。除了本地产生的包由OUTPUT链处理外,所有连接跟踪都是在PREROUTING链里进行处理的,意思就是, iptables会在PREROUTING链里从新计算所有的状态。如果我们发送一个流的初始化包,状态就会在OUTPUT链里被设置为NEW,当我们收到回应的包时,状态就会在PREROUTING链里被设置为ESTABLISHED。如果第一个包不是本地产生的,那就会在PREROUTING链里被设置为NEW状态。综上,所有状态的改变和计算都是在nat表中的PREROUTING链和OUTPUT链里完成的。--------------------------------------------------------------------------------4.2. conntrack记录我们先来看看怎样阅读/proc/net/ip_conntrack里的conntrack记录。这些记录表示的是当前被跟踪的连接。如果安装了ip_conntrack模块,cat /proc/net/ip_conntrack 的显示类似: tcp      6 117 SYN_SENT src=192.168.1.6 dst=192.168.1.9 sport=32775 \   dport=22 src=192.168.1.9 dst=192.168.1.6 sport=22 \   dport=32775 use=2   conntrack模块维护的所有信息都包含在这个例子中了,通过它们就可以知道某个特定的连接处于什么状态。首先显示的是协议,这里是tcp,接着是十进制的6(译者注:tcp的协议类型代码是6)。之后的117是这条conntrack记录的生存时间,它会有规律地被消耗,直到收到这个连接的更多的包。那时,这个值就会被设为当时那个状态的缺省值。接下来的是这个连接在当前时间点的状态。上面的例子说明这个包处在状态 SYN_SENT,这个值是iptables显示的,以便我们好理解,而内部用的值稍有不同。SYN_SENT说明我们正在观察的这个连接只在一个方向发送了一TCP SYN包。再下面是源地址、目的地址、源端口和目的端口。其中有个特殊的词UNREPLIED,说明这个连接还没有收到任何回应。最后,是希望接收的应答包的信息,他们的地址和端口和前面是相反的。连接跟踪记录的信息依据IP所包含的协议不同而不同,所有相应的值都是在头文件linux/include/netfilter-ipv4/ip_conntrack*.h中定义的。IP、TCP、UDP、ICMP协议的缺省值是在linux/include/netfilter-ipv4/ip_conntrack.h里定义的。具体的值可以查看相应的协议,但我们这里用不到它们,因为它们大都只在conntrack内部使用。随着状态的改变,生存时间也会改变。 最近patch-o-matic里有一个新的补丁,可以把上面提到的超时时间也作为系统变量,这样我们就能够在系统空闲时改变它们的值。以后,我们就不必为了改变这些值而重编译内核了。这些可通过/proc/sys/net/ipv4/netfilter下的一些特殊的系统调用来改变。仔细看看/proc/sys/net/ipv4/netfilter/ip_ct_*里的变量吧。 当一个连接在两个方向上都有传输时,conntrack记录就删除标志,然后重置。在末尾有 的记录说明两个方向已没有流量。这样的记录是确定的,在连接跟踪表满时,是不会被删除的,没有的记录就要被删除。连接跟踪表能容纳多少记录是被一个变量控制的,它可由内核中的ip- sysctl函数设置。默认值取决于你的内存大小,128MB可以包含8192条目录,256MB是16376条。你也可以在 /proc/sys/net/ipv4/ip_conntrack_max里查看、设置。--------------------------------------------------------------------------------4.3. 数据包在用户空间的状态就象前面说的,包的状态依据IP所包含的协议不同而不同,但在内核外部,也就是用户空间里,只有4种状态:NEW,ESTABLISHED,RELATED 和INVALID。它们主要是和状态匹配一起使用。下面就简要地介绍以下这几种状态: Table 4-1. 数据包在用户空间的状态State(状态) Explanation(注释) NEW NEW说明这个包是我们看到的第一个包。意思就是,这是conntrack模块看到的某个连接第一个包,它即将被匹配了。比如,我们看到一个SYN 包,是我们所留意的连接的第一个包,就要匹配它。第一个包也可能不是SYN包,但它仍会被认为是NEW状态。这样做有时会导致一些问题,但对某些情况是有非常大的帮助的。例如,在我们想恢复某条从其他的防火墙丢失的连接时,或者某个连接已经超时,但实际上并未关闭时。 ESTABLISHED ESTABLISHED已经注意到两个方向上的数据传输,而且会继续匹配这个连接的包。处于ESTABLISHED状态的连接是非常容易理解的。只要发送并接到应答,连接就是ESTABLISHED的了。一个连接要从NEW变为ESTABLISHED,只需要接到应答包即可,不管这个包是发往防火墙的,还是要由防火墙转发的。ICMP的错误和重定向等信息包也被看作是ESTABLISHED,只要它们是我们所发出的信息的应答。 RELATED RELATED是个比较麻烦的状态。当一个连接和某个已处于ESTABLISHED状态的连接有关系时,就被认为是RELATED的了。换句话说,一个连接要想是RELATED的,首先要有一个ESTABLISHED的连接。这个ESTABLISHED连接再产生一个主连接之外的连接,这个新的连接就是RELATED的了,当然前提是conntrack模块要能理解RELATED。ftp是个很好的例子,FTP-data 连接就是和FTP-control有RELATED的。还有其他的例子,比如,通过IRC的DCC连接。有了这个状态,ICMP应答、FTP传输、DCC等才能穿过防火墙正常工作。注意,大部分还有一些UDP协议都依赖这个机制。这些协议是很复杂的,它们把连接信息放在数据包里,并且要求这些信息能被正确理解。 INVALID INVALID说明数据包不能被识别属于哪个连接或没有任何状态。有几个原因可以产生这种情况,比如,内存溢出,收到不知属于哪个连接的ICMP 错误信息。一般地,我们DROP这个状态的任何东西。 这些状态可以一起使用,以便匹配数据包。这可以使我们的防火墙非常强壮和有效。以前,我们经常打开1024以上的所有端口来放行应答的数据。现在,有了状态机制,就不需再这样了。因为我们可以只开放那些有应答数据的端口,其他的都可以关闭。这样就安全多了。--------------------------------------------------------------------------------4.4. TCP 连接本节和下面的几节,我们来详细讨论这些状态,以及在TCP、UDP和ICMP这三种基本的协议里怎样操作它们。当然,也会讨论其他协议的情况。我们还是从TCP入手,因为它本身就是一个带状态的协议,并且具有很多关于iptables状态机制的详细信息。一个TCP连接是经过三次握手协商连接信息才建立起来的。整个会话由一个SYN包开始,然后是一个 SYN/ACK包,最后是一个ACK包,此时,会话才建立成功,能够发送数据。最大的问题在于连接跟踪怎样控制这个过程。其实非常简单。默认情况下,连接跟踪基本上对所有的连接类型做同样的操作。看看下面的图片,我们就能明白在连接的不同阶段,流是处于什么状态的。就如你看到的,连接跟踪的代码不是从用户的观点来看待TCP连接建立的流程的。连接跟踪一看到SYN包,就认为这个连接是NEW状态,一看到返回的SYN/ACK包,就认为连接是 ESTABLISHED状态。如果你仔细想想第二步,应该能理解为什么。有了这个特殊处理,NEW和ESTABLISHED包就可以发送出本地网络,且只有ESTABLISHED的连接才能有回应信息。如果把整个建立连接的过程中传输的数据包都看作NEW,那么三次握手所用的包都是NEW状态的,这样我们就不能阻塞从外部到本地网络的连接了。因为即使连接是从外向内的,但它使用的包也是NEW状态的,而且为了其他连接能正常传输,我们不得不允许NEW状态的包返回并进入防火墙。更复杂的是,针对TCP连接内核使用了很多内部状态,它们的定义在 RFC 793 - Transmission Control Protocol的21-23页。但好在我们在用户空间用不到。后面我们会详细地介绍这些内容。正如你看到的,以用户的观点来看,这是很简单的。但是,从内核的角度看这一块还有点困难的。我们来看一个例子。认真考虑一下在/proc/net/ip_conntrack里,连接的状态是如何改变的。tcp      6 117 SYN_SENT src=192.168.1.5 dst=192.168.1.35 sport=1031 \   dport=23 src=192.168.1.35 dst=192.168.1.5 sport=23 \   dport=1031 use=1   从上面的记录可以看出,SYN_SENT状态被设置了,这说明连接已经发出一个SYN包,但应答还没发送过来,这可从标志看出。tcp      6 57 SYN_RECV src=192.168.1.5 dst=192.168.1.35 sport=1031 \   dport=23 src=192.168.1.35 dst=192.168.1.5 sport=23 dport=1031 \   use=1   现在我们已经收到了相应的SYN/ACK包,状态也变为SYN_RECV,这说明最初发出的SYN包已正确传输,并且SYN/ACK包也到达了防火墙。 这就意味着在连接的两方都有数据传输,因此可以认为两个方向都有相应的回应。当然,这是假设的。tcp      6 431999 ESTABLISHED src=192.168.1.5 dst=192.168.1.35 \   sport=1031 dport=23 src=192.168.1.35 dst=192.168.1.5 \   sport=23 dport=1031 use=1   现在我们发出了三步握手的最后一个包,即ACK包,连接也就进入ESTABLISHED状态了。再传输几个数据包,连接就是的了。下面介绍TCP连接在关闭过程中的状态。如上图,在发出最后一个ACK包之前,连接(指两个方向)是不会关闭的。注意,这只是针对一般的情况。连接也可以通过发送关闭,这用在拒绝一个连接的时候。在RST包发送之后,要经过预先设定的一段时间,连接才能断掉。连接关闭后,进入TIME_WAIT状态,缺省时间是2分钟。之所以留这个时间,是为了让数据包能完全通过各种规则的检查,也是为了数据包能通过拥挤的路由器,从而到达目的地。如果连接是被RST包重置的,就直接变为CLOSE了。这意味着在关闭之前只有10秒的默认时间。RST包是不需要确认的,它会直接关闭连接。针对TCP连接,还有其他一些状态我们没有谈到。下面给出一个完整的状态列表和超时值。Table 4-2. 内部状态State Timeout value NONE 30 minutes ESTABLISHED 5 days SYN_SENT 2 minutes SYN_RECV 60 seconds FIN_WAIT 2 minutes TIME_WAIT 2 minutes CLOSE 10 seconds CLOSE_WAIT 12 hours LAST_ACK 30 seconds LISTEN> 2 minutes 这些值不是绝对的,可以随着内核的修订而变化,也可以通过/proc/sys/net/ipv4/netfilter/ip_ct_tcp_*的变量更改。这些默认值都是经过实践检验的。它们的单位是jiffies(百分之一秒),所以3000就代表30秒。 注意状态机制在用户空间里的部分不会查看TCP包的标志位(也就是说TCP标志对它而言是透明的)。如果我们想让NEW状态的包通过防火墙,就要指定NEW状态,我们理解的NEW状态的意思就是指SYN包,可是iptables又不查看这些标志位。这就是问题所在。有些没有设置SYN或ACK的包,也会被看作NEW状态的。这样的包可能会被冗余防火墙用到,但对只有一个防火墙的网络是很不利的(可能会被攻击哦)。那我们怎样才能不受这样的包的影响呢?你可以使用未设置SYN的NEW状态包 里的命令。还有一个办法,就是安装patch-o-matic里的tcp-window-tracking扩展功能,它可以使防火墙能根据TCP的一些标志位来进行状态跟踪。 --------------------------------------------------------------------------------4.5. UDP连接UDP连接是无状态的,因为它没有任何的连接建立和关闭过程,而且大部分是无序列号的。以某个顺序收到的两个数据包是无法确定它们的发出顺序的。但内核仍然可以对UDP连接设置状态。我们来看看是如何跟踪UDP连接的,以及conntrack的相关记录。从上图可以看出,以用户的角度考虑,UDP连接的建立几乎与TCP的一样。虽然conntrack信息看起来有点儿不同,但本质上是一样的。下面我们先来看看第一个UDP包发出后的conntrack记录。udp      17 20 src=192.168.1.2 dst=192.168.1.5 sport=137 dport=1025 \    src=192.168.1.5 dst=192.168.1.2 sport=1025 \   dport=137 use=1   从前两个值可知,这是一个UDP包。第一个是协议名称,第二个是协议号,第三个是此状态的生存时间,默认是30秒。接下来是包的源、目地址和端口,还有期待之中回应包的源、目地址和端口。标记说明还未收到回应。udp      17 170 src=192.168.1.2 dst=192.168.1.5 sport=137 \   dport=1025 src=192.168.1.5 dst=192.168.1.2 sport=1025 \   dport=137 use=1   一旦收到第一个包的回应,标记就会被删除,连接就被认为是ESTABLISHED的,但在记录里并不显示ESTABLISHED标记。相应地,状态的超时时间也变为180秒了。在本例中,只剩170秒了,10秒后,就会减少为160秒。有个东西是不可少的,虽然它可能会有些变化,就是前面提过的。要想变为 状态,连接上必须要再有些流量。udp      17 175 src=192.168.1.5 dst=195.22.79.2 sport=1025 \   dport=53 src=195.22.79.2 dst=192.168.1.5 sport=53 \   dport=1025 use=1   可以看出来,状态的记录和前面的没有多大差别,除了标记由变成。如果这个连接持续不了180秒,那就要被中断。180秒是短了点儿,但对大部分应用足够了。只要遇到这个连接的包穿过防火墙,超时值就会被重置为默认值,所有的状态都是这样的。--------------------------------------------------------------------------------4.6. ICMP 连接ICMP也是一种无状态协议,它只是用来控制而不是建立连接。ICMP包有很多类型,但只有四种类型有应答包,它们是回显请求和应答(Echo request and reply),时间戳请求和应答(Timestamp request and reply),信息请求和应答(Information request and reply),还有地址掩码请求和应答(Address mask request and reply),这些包有两种状态,NEW和ESTABLISHED 。时间戳请求和信息请求已经废除不用了,回显请求还是常用的,比如ping命令就用的到,地址掩码请求不太常用,但是可能有时很有用并且值得使用。看看下面的图,就可以大致了解ICMP连接的NEW和ESTABLISHED状态了。如图所示,主机向目标发送一个回显请求,防火墙就认为这个包处于NEW状态。目标回应一个回显应答,防火墙就认为包处于ESTABLISHED了。当回显请求被发送时,ip_conntrack里就有这样的记录了:icmp   1 25 src=192.168.1.6 dst=192.168.1.10 type=8 code=0 \   id=33029 src=192.168.1.10 dst=192.168.1.6 \   type=0 code=0 id=33029 use=1   可以看到,ICMP的记录和TCP、UDP的有点区别,协议名称、超时时间和源、目地址都一样,不同之处在于没有了端口,而新增了三个新的字段:type,code和id。字段type说明ICMP的类型。code说明ICMP的代码,这些代码在附录ICMP类型里有说明。id是ICMP包的ID。每个ICMP包被发送时都被分配一个ID,接受方把同样的ID 分配给应答包,这样发送方能认出是哪个请求的应答。的含义和前面一样,说明数的传输只发生在一个方向上,也就是说未收到应答。再往后,是应答包的源、目地址,还有相应的三个新字段,要注意的是type和code是随着应答包的不同而变化的,id和请求包的一样。和前面一样,应答包被认为是ESTABLISHED的。然而,在应答包之后,这个ICMP 连接就不再有数据传输了。所以,一旦应答包穿过防火墙,ICMP的连接跟踪记录就被销毁了。以上各种情况,请求被认为NEW,应答是ESTABLISHED。换句话说,就是当防火墙看到一个请求包时,就认为连接处于NEW状态,当有应答时,就是ESTABLISHED状态。 注意,应答包必须符合一定的标准,连接才能被认作established的,每个传输类型都是这样。ICMP的缺省超时是30秒,可以在/proc/sys/net/ipv4/netfilter/ip_ct_icmp_timeout中修改。这个值是比较合适的,适合于大多数情况。ICMP的另一个非常重要的作用是,告诉UDP、TCP连接或正在努力建立的连接发生了什么,这时ICMP应答被认为是RELATED的。主机不可达和网络不可达就是这样的例子。当试图连接某台机子不成功时(可能那台机子被关上了),数据包所到达的最后一台路由器就会返回以上的ICMP信息,它们就是RELATED的,如下图:我们发送了一个SYN包到某一地址,防火墙认为它的状态是NEW。但是,目标网络有问题不可达,路由器就会返回网络不可达的信息,这是RELATED的。连接跟踪会认出这个错误信息是哪个连接的,连接会中断,同时相应的记录删除会被删除。当UDP连接遇到问题时,同样会有相应的ICMP信息返回,当然它们的状态也是RELATED ,如下图:我们发送一个UDP包,当然它是NEW的。但是,目标网络被一些防火墙或路由器所禁止。我们的防火墙就会收到网络被禁止的信息。防火墙知道它是和哪个已打开的UDP连接相关的,并且把这个信息(状态是RELATED)发给它,同时,把相应的记录删除。客户机收到网络被禁止的信息,连接将被中断。--------------------------------------------------------------------------------4.7. 缺省的连接操作有时,conntrack机制并不知道如何处理某个特殊的协议,尤其是在它不了解这个协议或不知道协议如何工作时,比如,NETBLT,MUX还有EGP。这种情况下,conntrack使用缺省的操作。这种操作很象对UDP连接的操作,就是第一个包被认作NEW,其后的应答包等等数据都是 ESTABLISHED。使用缺省操作的包的超时值都是一样的,600秒,也就是10分钟。当然,这个值可以通过/proc/sys/net/ipv4/netfilter/ip_ct_generic_timeout更改,以便适应你的通信量,尤其是在耗时较多、流量巨大的情况下,比如使用卫星等。--------------------------------------------------------------------------------4.8. 复杂协议和连接跟踪有些协议比其他协议更复杂,这里复杂的意思是指连接跟踪机制很难正确地跟踪它们,比如,ICQ、IRC 和FTP,它们都在数据包的数据域里携带某些信息,这些信息用于建立其他的连接。因此,需要一些特殊的 helper来完成工作。下面以FTP作为例子。FTP协议先建立一个单独的连接??FTP控制会话。我们通过这个连接发布命令,其他的端口就会打开以便传输和这个命令相关的数据。这些连接的建立方法有两种:主动模式和被动模式。先看看主动模式,FTP客户端发送端口和IP地址信息给服务器端,然后,客户端打开这个端口,服务器端从它自己的20端口(FTP-Data端口号)建立与这个端口的连接,接着就可以使用这个连接发送数据了。问题在于防火墙不知道这些额外的连接(相对于控制会话而言),因为这些连接在建立时的磋商信息都在协议数据包的数据域内,而不是在可分析的协议头里。因此,防火墙就不知道是不是该放这些从服务器到客户机的连接过关。解决的办法是为连接跟踪模块增加一个特殊的helper,以便能检测到那些信息。这样,那些从FTP服务器到客户机的连接就可以被跟踪了,状态是RELATED,过程如下图所示:被动FTP工作方式下,data连接的建立过程和主动FTP的相反。客户机告诉服务器需要某些数据,服务器就把地址和端口发回给客户机,客户机据此建立连接接受数据。如果FTP服务器在防火墙后面,或你对用户限制的比较严格,只允许他们访问HTTP和FTP,而封闭了其他所有端口,为了让在Internet是的客户机能访问到FTP,也需要增加上面提到的helper。下面是被动模式下data连接的建立过程:有些conntrack helper已经包含在内核中,在写这篇文章时,FTP和IRC已有了相应的conntrack helper。如果在内核里没有你想要的helper,可以到iptables用户空间的patch-o-matic目录中看看,那里有很多的helper,比如针对ntalk或H.323协议的等等。如果没找到,还有几个选择:可以查查iptables的 CVS,或者联系Netfilter-devel问问有没有你要的。还不行的话,只有你自己写了,我可以给你介绍一篇好文章,Rusty Russell's Unreliable Netfilter Hacking HOW-TO,连接放在附录里其他资源和链接。Conntrack helper即可以被静态地编译进内核,也可以作为模块,但要用下面的命令装载: modprobe ip_conntrack_*   注意连接跟踪并不处理NAT,因此要对连接做NAT就需要增加相应的模块。比如,你想NAT并跟踪FTP连接,除了FTP的相应模块,还要有NAT的模块。所有的NAT helper名字都是以ip_nat_开头的,这是一个命名习惯:FTP NAT helper叫做ip_nat_ftp,IRC的相应模块就是ip_nat_irc。conntrack helper 的命名也遵循一样的习惯:针对IRC的conntrack helper叫ip_conntrack_irc,FTP的叫作ip_conntrack_ftp。--------------------------------------------------------------------------------Chapter 5. 规则的保存与恢复iptables提供了两个很有用的工具用来处理大规则集: iptables-save和iptables-restore,它们把规则存入一个与标准脚本代码只有细微查别的特殊格式的文件中,或从中恢复规则。--------------------------------------------------------------------------------5.1. 速度使用iptables-save和iptables-restore的一个最重要的原因是,它们能在相当程度上提高装载、保存规则的速度。使用脚本更改规则的问题是,改动每个规则都要调运命令iptables,而每一次调用iptables,它首先要把Netfilter内核空间中的整个规则集都提取出来,然后再插入或附加,或做其他的改动,最后,再把新的规则集从它的内存空间插入到内核空间中。这会花费很多时间。为了解决这个问题,可以使用命令iptables-save和restore 。 iptables-save用来把规则集保存到一个特殊格式的文本文件里,而iptables-restore是用来把这个文件重新装入内核空间的。这两个命令最好的地方在于一次调用就可以装载和保存规则集,而不象脚本中每个规则都要调用一次iptables。 iptables-save运行一次就可以把整个规则集从内核里提取出来,并保存到文件里,而iptables-restore每次装入一个规则表。换句话说,对于一个很大的规则集,如果用脚本来设置,那这些规则就会反反复复地被卸载、安装很多次,而我们现在可以把整个规则集一次就保存下来,安装时则是一次一个表,这可是节省了大量的时间。如果你的工作对象是一组巨大的规则,这两个工具是明显的选择。当然,它们也有不足之处,下面的章节会详细说明。--------------------------------------------------------------------------------5.2. restore的不足之处iptables-restore能替代所有的脚本来设置规则吗?不,到现在为止不行,很可能永远都不行。iptables-restore的主要不足是不能用来做复杂的规则集。例如,我们想在计算机启动时获取连接的动态分配的IP地址,然后用在脚本里。这一点,用iptables-restore来实现,或多或少是不可能的。一个可能的解决办法是写一个小脚本来获取那个IP地址,并在iptables-restore调用的配置文件中设置相应的关键字,然后用获取的IP值替换关键字。你可以把更改后的配置文件存到一个临时文件中,再由 iptables-restore使用它。然而这会带来很多问题,并且你不能用iptables-save来保存带关键字的配置文件。此法较笨。另一个办法是先装入iptables-restore文件,再运行一个特定的脚本把动态的规则装入。其实,这也是较笨的方法。iptables-restore并不适合于使用动态IP的场合,如果你想在配置文件里使用选项来实现不同的要求,iptables-restore也不适用。iptables-restore和iptables-save还有一个不足,就是功能不够齐全。因为使用的人不是太多,所以发现这个问题的人也不多,还有就是一些match和target被引用时考虑不细致,这可能会出现我们预期之外的行为。 尽管存在这些问题,我还是强烈建议你使用它们,因为它们对于大部分规则集工作的还是很好的,只要在规则中别包含那些新的都不知如何使用的match和target。--------------------------------------------------------------------------------5.3. iptables-saveiptables-save用来把当前的规则存入一个文件里以备iptables-restore使用。它的使用很简单,只有两个参数:iptables-save [-c] [-t table]参数-c的作用是保存包和字节计数器的值。这可以使我们在重启防火墙后不丢失对包和字节的统计。带-c参数的iptables-save命令使重启防火墙而不中断统计记数程序成为可能。这个参数默认是不使用的。参数-t指定要保存的表,默认是保存所有的表。下面给出未装载任何规则的情况下iptables-save的输出。# Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:17 2002*filter:INPUT ACCEPT :FORWARD ACCEPT :OUTPUT ACCEPT COMMIT# Completed on Wed Apr 24 10:19:17 2002# Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:17 2002*mangle:PREROUTING ACCEPT :INPUT ACCEPT :FORWARD ACCEPT :OUTPUT ACCEPT :POSTROUTING ACCEPT COMMIT# Completed on Wed Apr 24 10:19:17 2002# Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:17 2002*nat:PREROUTING ACCEPT :POSTROUTING ACCEPT :OUTPUT ACCEPT COMMIT# Completed on Wed Apr 24 10:19:17 2002我们来解释一下这个输出格式。#后面的是注释。表都以*开始,例如*mangle。每个表都包含链和规则,链的详细说明是:[:]。例如,链的名字是 PREROUTING,策略是ACCEPT,然后是包记数器和字节计数器,这两个计数器和iptables -L -v输出中用到的计数器一样。每个表的描述都以关键字COMMIT结束,它说明在这一点,就要把规则装入内核了。上面的例子是最基本的,我想用一个简短的例子说明会更好,其中包含一个非常小的规则集Iptables-save ruleset。iptables-save的输出如下:# Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:55 2002*filter:INPUT DROP :FORWARD DROP :OUTPUT DROP -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A FORWARD -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT -A FORWARD -i eth1 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT -A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT COMMIT# Completed on Wed Apr 24 10:19:55 2002# Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:55 2002*mangle:PREROUTING ACCEPT :INPUT ACCEPT :FORWARD ACCEPT :OUTPUT ACCEPT :POSTROUTING ACCEPT COMMIT# Completed on Wed Apr 24 10:19:55 2002# Generated by iptables-save v1.2.6a on Wed Apr 24 10:19:55 2002*nat:PREROUTING ACCEPT :POSTROUTING ACCEPT :OUTPUT ACCEPT -A POSTROUTING -o eth0 -j SNAT --to-source 195.233.192.1 COMMIT# Completed on Wed Apr 24 10:19:55 2002每个命令前都有包和字节计数器,这说明使用了-c参数。除了有计数器,其他的都和普通的脚本一样。现在的问题是怎么把输出保存到文件中。非常简单,既然使用linux,你应该早就知道了,用重定向啊:iptables-save -c > /etc/iptables-save 这就会把规则集保存到/etc/iptables-save中,而且还有计数器。--------------------------------------------------------------------------------5.4. iptables-restoreiptables-restore用来装载由iptables-save保存的规则集。不幸的是,它只能从标准输入接受输入,而不能从文件接受。下面是它的事方法:iptables-restore [-c] [-n]参数-c要求装入包和字节计数器。如果你用iptables-save保存了计数器,现在想重新装入,就必须用这个参数。它的另一种较长的形式是--counters。参数-n告诉iptables-restore不要覆盖已有的表或表内的规则。默认情况是清除所有已存的规则。这个参数的长形式是--noflush。用iptables-restore装载规则有好几种方法,我们来看看最简单、最一般的: 这样规则集应该正确地装入内核并正常工作了。如果有问题,你就要除措了。--------------------------------------------------------------------------------Chapter 6. 规则是如何练成的 本章将详细地讨论如何构件你自己的规则。规则就是指向标,在一条链上,对不同的连接和数据包阻塞或允许它们去向何处。插入链的每一行都是一条规则。我们也会讨论基本的matche及其用法,还有各种各样的target,以及如何建立我们自己的target(比如,一个新的子链)。--------------------------------------------------------------------------------6.1. 基础我们已经解释了什么是规则,在内核看来,规则就是决定如何处理一个包的语句。如果一个包符合所有的条件(就是符合matche语句),我们就运行target或jump指令。书写规则的语法格式是:iptables [-t table] command 对于这个句法没什么可说的,但注意target指令必须在最后。为了易读,我们一般用这种语法。总之,你将见到的大部分规则都是按这种语法写的。因此,如果你看到别人写的规则,你很可能会发现用的也是这种语法,当然就很容易理解那些规则了。如果你不想用标准的表,就要在处指定表名。一般情况下没有必要指定使用的表,因为iptables 默认使用filter表来执行所有的命令。也没有必要非得在这里指定表名,实际上几乎可在规则的任何地方。当然,把表名在开始处已经是约定俗成的标准。尽管命令总是放在开头,或者是直接放在表名后面,我们也要考虑考虑到底放在哪儿易读。command告诉程序该做什么,比如:插入一个规则,还是在链的末尾增加一个规则,还是删除一个规则,下面会仔细地介绍。match细致地描述了包的某个特点,以使这个包区别于其它所有的包。在这里,我们可以指定包的来源IP 地址,网络接口,端口,协议类型,或者其他什么。下面我们将会看到许多不同的match。最后是数据包的目标所在。若数据包符合所有的match,内核就用target来处理它,或者说把包发往 target。比如,我们可以让内核把包发送到当前表中的其他链(可能是我们自己建立的),或者只是丢弃这个包而没有什么处理,或者向发送者返回某个特殊的应答。下面有详细的讨论。--------------------------------------------------------------------------------6.2. Tables选项-t用来指定使用哪个表,它可以是下面介绍的表中的任何一个,默认的是 filter表。注意,下面的介绍只是章节表和链的摘要。Table 6-1. TablesTable (表名) Explanation (注释) nat nat表的主要用处是网络地址转换,即Network Address Translation,缩写为NAT。做过NAT操作的数据包的地址就被改变了,当然这种改变是根据我们的规则进行的。属于一个流的包只会经过这个表一次。如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作。也就是说,余下的包不会再通过这个表,一个一个的被NAT,而是自动地完成。这就是我们为什么不应该在这个表中做任何过滤的主要原因,对这一点,后面会有更加详细的讨论。PREROUTING 链的作用是在包刚刚到达防火墙时改变它的目的地址,如果需要的话。OUTPUT链改变本地产生的包的目的地址。POSTROUTING链在包就要离开防火墙之前改变其源地址。 mangle 这个表主要用来mangle数据包。我们可以改变不同的包及包头的内容,比如 TTL,TOS或MARK。注意MARK并没有真正地改动数据包,它只是在内核空间为包设了一个标记。防火墙内的其他的规则或程序(如tc)可以使用这种标记对包进行过滤或高级路由。这个表有五个内建的链: PREROUTING,POSTROUTING, OUTPUT,INPUT和 FORWARD。PREROUTING在包进入防火墙之后、路由判断之前改变包,POSTROUTING是在所有路由判断之后。 OUTPUT在确定包的目的之前更改数据包。INPUT在包被路由到本地之后,但在用户空间的程序看到它之前改变包。FORWARD在最初的路由判断之后、最后一次更改包的目的之前mangle包。注意,mangle表不能做任何NAT,它只是改变数据包的 TTL,TOS或MARK,而不是其源目地址。NAT是在nat表中操作的。 filter filter表是专门过滤包的,内建三个链,可以毫无问题地对包进行DROP、LOG、ACCEPT和REJECT等操作。FORWARD 链过滤所有不是本地产生的并且目的地不是本地(所谓本地就是防火墙了)的包,而 INPUT恰恰针对那些目的地是本地的包。OUTPUT 是用来过滤所有本地生成的包的。上面介绍了三个不同的表的最基本的内容。你应该知道它们的使用目的完全不同,还要清楚每一条链的使用。如果你不了解,就可能会在防火墙上留下漏洞,给人以可乘之机。在章节表和链 中,我们已详细地讨论了这些必备的的表和链。如果你没有完全理解包是怎样通过这些表、链的话,我建议你回过头去再仔细看看。--------------------------------------------------------------------------------6.3. Commands在这一节里,我们将要介绍所有的command以及它们的用途。command指定iptables 对我们提交的规则要做什么样的操作。这些操作可能是在某个表里增加或删除一些东西,或做点儿其他什么。以下是iptables可用的command(要注意,如不做说明,默认表的是 filter表。):Table 6-2. CommandsCommand -A, --append Example iptables -A INPUT ... Explanation 在所选择的链末添加规则。当源地址或目的地址是以名字而不是ip地址的形式出现时,若这些名字可以被解析为多个地址,则这条规则会和所有可用的地址结合。Command -D, --delete Example iptables -D INPUT --dport 80 -j DROP或iptables -D INPUT 1Explanation 从所选链中删除规则。有两种方法指定要删除的规则:一是把规则完完整整地写出来,再就是指定规则在所选链中的序号(每条链的规则都各自从1被编号)。 Command -R, --replace Example iptables -R INPUT 1 -s 192.168.0.1 -j DROP Explanation 在所选中的链里指定的行上(每条链的规则都各自从1被编号)替换规则。它主要的用处是试验不同的规则。当源地址或目的地址是以名字而不是ip地址的形式出现时,若这些名字可以被解析为多个地址,则这条command会失败。 Command -I, --insert Example iptables -I INPUT 1 --dport 80 -j ACCEPT Explanation 根据给出的规则序号向所选链中插入规则。如果序号为1,规则会被插入链的头部,其实默认序号就是1。 Command -L, --list Example iptables -L INPUT Explanation 显示所选链的所有规则。如果没有指定链,则显示指定表中的所有链。如果什么都没有指定,就显示默认表所有的链。精确输出受其它参数影响,如-n 和-v等参数,下面会介绍。 Command -F, --flush Example iptables -F INPUT Explanation 清空所选的链。如果没有指定链,则清空指定表中的所有链。如果什么都没有指定,就清空默认表所有的链。当然,也可以一条一条地删,但用这个command会快些。Command -Z, --zero Example iptables -Z INPUT Explanation 把指定链(如未指定,则认为是所有链)的所有计数器归零。 Command -N, --new-chain Example iptables -N allowed Explanation 根据用户指定的名字建立新的链。上面的例子建立了一个名为allowed的链。注意,所用的名字不能和已有的链、target同名。 Command -X, --delete-chain Example iptables -X allowed Explanation 删除指定的用户自定义链。这个链必须没有被引用,如果被引用,在删除之前你必须删除或者替换与之有关的规则。如果没有给出参数,这条命令将会删除默认表所有非内建的链。 Command -P, --policy Example iptables -P INPUT DROP Explanation 为链设置默认的target(可用的是DROP 和ACCEPT,如果还有其它的可用,请告诉我),这个target称作策略。所有不符合规则的包都被强制使用这个策略。只有内建的链才可以使用规则。但内建的链和用户自定义链都不能被作为策略使用,也就是说不能象这样使用:iptables -P INPUT allowed(或者是内建的链)。 Command -E, --rename-chain Example iptables -E allowed disallowed Explanation 对自定义的链

fnhssap 发表于 2004-8-25 22:26:54

Chapter 7. 防火墙配置实例 rc.firewall在本章里,我们将要建立一个防火墙,并且详细地说明了如何去阅读、理解它。在这个例子中,我们使用的是最基本的配置,对其工作方式和我们在里面做了些什么都有深入的解释。这个例子应该能在某些方面给你提供基本的思路,比如,如何解决不同的问题(当然是网络方面的),再如,在真正把脚本应用于工作之前应该考虑些什么,等等。对本例中的变量值做些修改就可能在实际的网络中使用,但不建议你这样做,因为你的网络配置和我在例子中使用的情况可能不一样哦。但只要你有了这个基本的防火墙规则集,很可能只需要少量的调整就可以把它用于实际了。可能有效率更高的方法来建立规则集,但这个脚本就是为易读而写的,所以每个人都能理解它,即使没有多少BASH脚本编程的知识。 --------------------------------------------------------------------------------7.1. 关于rc.firewall好,既然你能从头看到这儿,就说明你已经做好一切准备来检查这个脚本了。例子rc.firewall.txt(代码在附录示例脚本的代码里)很大,但没有多少注释。我建议你先大致看看它的内容,留个印象,再来仔细地阅读本章(要有耐心哦)。--------------------------------------------------------------------------------7.2. rc.firewall详解7.2.1. 参数配置本小节要对照着rc.firewall脚本代码来看。rc.firewall.txt的第一小节是配置选项,包含的都是一些至关重要的信息,它们是随着你的网络的不同而改变的。比如,每个网络的IP地址都不一样,所有要把它放在这儿。$INET_IP的值应该是在Internet上能使用的才可以,如果你有$INET_IP的话。如果没有,你就要看看 rc.DHCP.firewall.txt这种配置方法了,里面有很多有趣的东西。变量 $INET_IFACE应该指向连接Internet的真实设备,比如eth0、eth1、ppp0、tr0等等。这个脚本里没有包含任何DHCP或PPPoE的选项,所以这两节是空白的。其他空白的部分,也是这样的原因。之所以保留这些空白,是为了更容易区分这些结构相同而内容不同的脚本。如果你需要这些部分,可以从其他脚本拷贝过来,或者你自己写了:)Local Area Network小节包含的是LAN必须的信息,如连接到LAN的网卡的IP、LAN所用的地址段等。Localhost configuration小节里的信息在99%的情况下都不要改变,因为我们总是使用127.0.0.1作为地址,也总是把接口命名为lo。紧随其后的是IPTables Configuration,里面只有一个变量,即$IPTABLES。它指定的是iptables程序的准确位置,如果是自己编译安装的话,一般都是/usr/local/sbin/iptables。但更多的发行版都把程序放在另外的地方,如 /usr/sbin/iptables,等等。--------------------------------------------------------------------------------7.2.2. 外部模块的装载首先,我们要使用命令/sbin/depmod -a使module dependencies files保持最新,然后,再装载脚本需要的模块。我们应该始终避免装入不需要的模块,如果可能,还要尽力避免装入无所事事的模块,除非你确实需要它们。这样做主要是为了安全,因为每增加一个模块都要花费额外的努力以增加新的规则(这样就容易出漏洞哦)。比如,如果你想支持LOG、REJECT和MASQUERADE target,不要把相应的功能静态地编译进内核,我们使用以下模块来完成:/sbin/insmod ipt_LOG/sbin/insmod ipt_REJECT/sbin/insmod ipt_MASQUERADE   注意,本文使用的脚本都是用类似命令装入模块,这可能会引起装载失败(有错误信息显示)。原因是多方面的,但如果较基本的模块也失败的话,那最大的可能是哪个模块或相应的功能已被静态地编译进内核了。进一步的信息可以看看附录常见问题与解答中的模块装载问题。 接下来的一行是装载ipt_owner模块,它的作用是“只允许特定的用户创建特定的连接”。在这个例子中,我没有使用到它,但你可能会用到。比如,你可能只允许root建立FTP 和HTTP连接访问redhat.com,而其他用户都不可以。你也可以只允许你自己使用的用户名和root才能访问 Internet,这样别人会很烦的,但你的安全性在某些方面会有所提高哦,比如,把你当作发起攻击的跳板的情况。关于ipt_owner的更多信息,可以看看章节规则是如何练成的里的Owner match 。在这儿我们也可以为状态匹配安装扩展模块。状态匹配和连接跟踪的所有扩展模块的名字都是这样的: ip_conntrack_*和ip_nat_* 。连接跟踪的helper是一些特殊的模块,正是它们告诉了内核怎样恰当地跟踪特殊的连接。没有这些helper,内核在处理特殊连接的时候,就不知道该查看些什么东西。NAT helper就是连接跟踪helper的扩展,它会告诉内核在包里找什么、如何转换它们,这样连接才能真正工作起来。比如, FTP是一个复杂的协议,它利用包的有效数据部分来发送连接信息。如果一台需要被NAT的机子(译者注:也就是说,机子在一个内网里)连接Internet上的FTP服务器,它就会把自己的内网IP地址放在包的数据区内发送出去,以使FTP服务器能连接到那个地址。但私有地址不能在LAN外使用,所以FTP服务器不知道用它做什么,连接就会断掉了。FTP NAT helper能完成这些连接中所有的地址转换工作,因此FTP服务器就知道该往哪儿连了。同样的事情也发生在DCC的文件传输(这里指的是发送)和聊天上,为了建立连接,IP地址和端口都需要利用IRC协议的数据区发送,而且还要做一些转换工作。没有这些helper的话,FTP和IRC只有一部分工作是正常的,但另一部分根本就无法工作。例如,你可以通过DCC接收文件,但就是不能发送。这个问题的原因在于DCC是如何建立连接的。当DCC想发送文件时,会告诉接收者你要发送文件,并让它知道要连接到什么地方。如果没有helper,这个DCC连接最终会断开,因为接收者收到的是内网的地址。这样,当它按那个地址连接时,其实就连到和它在同一内网的机子了。那为什么可以接收呢?因为发送者给你的是可在 Internet上使用的IP地址(大部分情况下,IRC服务器都有真实的IP地址)。如果你在通过防火墙使用mIRC DCC时遇到了问题,但和其他IRC客户沟通很正常,看看附录常见问题与解答里的 关于mIRC DCC的问题 吧。 在这个例子中,我们在这儿装载支持FTP和IRC协议的模块。有关连接跟踪和nat的详细信息,请查看附录 常见问题与解答。在patch-o-matic中

fnhssap 发表于 2004-8-25 22:29:08

Chapter 7. 防火墙配置实例 rc.firewall在本章里,我们将要建立一个防火墙,并且详细地说明了如何去阅读、理解它。在这个例子中,我们使用的是最基本的配置,对其工作方式和我们在里面做了些什么都有深入的解释。这个例子应该能在某些方面给你提供基本的思路,比如,如何解决不同的问题(当然是网络方面的),再如,在真正把脚本应用于工作之前应该考虑些什么,等等。对本例中的变量值做些修改就可能在实际的网络中使用,但不建议你这样做,因为你的网络配置和我在例子中使用的情况可能不一样哦。但只要你有了这个基本的防火墙规则集,很可能只需要少量的调整就可以把它用于实际了。可能有效率更高的方法来建立规则集,但这个脚本就是为易读而写的,所以每个人都能理解它,即使没有多少BASH脚本编程的知识。 --------------------------------------------------------------------------------7.1. 关于rc.firewall好,既然你能从头看到这儿,就说明你已经做好一切准备来检查这个脚本了。例子rc.firewall.txt(代码在附录示例脚本的代码里)很大,但没有多少注释。我建议你先大致看看它的内容,留个印象,再来仔细地阅读本章(要有耐心哦)。--------------------------------------------------------------------------------7.2. rc.firewall详解7.2.1. 参数配置本小节要对照着rc.firewall脚本代码来看。rc.firewall.txt的第一小节是配置选项,包含的都是一些至关重要的信息,它们是随着你的网络的不同而改变的。比如,每个网络的IP地址都不一样,所有要把它放在这儿。$INET_IP的值应该是在Internet上能使用的才可以,如果你有$INET_IP的话。如果没有,你就要看看 rc.DHCP.firewall.txt这种配置方法了,里面有很多有趣的东西。变量 $INET_IFACE应该指向连接Internet的真实设备,比如eth0、eth1、ppp0、tr0等等。这个脚本里没有包含任何DHCP或PPPoE的选项,所以这两节是空白的。其他空白的部分,也是这样的原因。之所以保留这些空白,是为了更容易区分这些结构相同而内容不同的脚本。如果你需要这些部分,可以从其他脚本拷贝过来,或者你自己写了Local Area Network小节包含的是LAN必须的信息,如连接到LAN的网卡的IP、LAN所用的地址段等。Localhost configuration小节里的信息在99%的情况下都不要改变,因为我们总是使用127.0.0.1作为地址,也总是把接口命名为lo。紧随其后的是IPTables Configuration,里面只有一个变量,即$IPTABLES。它指定的是iptables程序的准确位置,如果是自己编译安装的话,一般都是/usr/local/sbin/iptables。但更多的发行版都把程序放在另外的地方,如 /usr/sbin/iptables,等等。--------------------------------------------------------------------------------7.2.2. 外部模块的装载首先,我们要使用命令/sbin/depmod -a使module dependencies files保持最新,然后,再装载脚本需要的模块。我们应该始终避免装入不需要的模块,如果可能,还要尽力避免装入无所事事的模块,除非你确实需要它们。这样做主要是为了安全,因为每增加一个模块都要花费额外的努力以增加新的规则(这样就容易出漏洞哦)。比如,如果你想支持LOG、REJECT和MASQUERADE target,不要把相应的功能静态地编译进内核,我们使用以下模块来完成:/sbin/insmod ipt_LOG/sbin/insmod ipt_REJECT/sbin/insmod ipt_MASQUERADE   注意,本文使用的脚本都是用类似命令装入模块,这可能会引起装载失败(有错误信息显示)。原因是多方面的,但如果较基本的模块也失败的话,那最大的可能是哪个模块或相应的功能已被静态地编译进内核了。进一步的信息可以看看附录常见问题与解答中的模块装载问题。 接下来的一行是装载ipt_owner模块,它的作用是“只允许特定的用户创建特定的连接”。在这个例子中,我没有使用到它,但你可能会用到。比如,你可能只允许root建立FTP 和HTTP连接访问redhat.com,而其他用户都不可以。你也可以只允许你自己使用的用户名和root才能访问 Internet,这样别人会很烦的,但你的安全性在某些方面会有所提高哦,比如,把你当作发起攻击的跳板的情况。关于ipt_owner的更多信息,可以看看章节规则是如何练成的里的Owner match 。在这儿我们也可以为状态匹配安装扩展模块。状态匹配和连接跟踪的所有扩展模块的名字都是这样的: ip_conntrack_*和ip_nat_* 。连接跟踪的helper是一些特殊的模块,正是它们告诉了内核怎样恰当地跟踪特殊的连接。没有这些helper,内核在处理特殊连接的时候,就不知道该查看些什么东西。NAT helper就是连接跟踪helper的扩展,它会告诉内核在包里找什么、如何转换它们,这样连接才能真正工作起来。比如, FTP是一个复杂的协议,它利用包的有效数据部分来发送连接信息。如果一台需要被NAT的机子(译者注:也就是说,机子在一个内网里)连接Internet上的FTP服务器,它就会把自己的内网IP地址放在包的数据区内发送出去,以使FTP服务器能连接到那个地址。但私有地址不能在LAN外使用,所以FTP服务器不知道用它做什么,连接就会断掉了。FTP NAT helper能完成这些连接中所有的地址转换工作,因此FTP服务器就知道该往哪儿连了。同样的事情也发生在DCC的文件传输(这里指的是发送)和聊天上,为了建立连接,IP地址和端口都需要利用IRC协议的数据区发送,而且还要做一些转换工作。没有这些helper的话,FTP和IRC只有一部分工作是正常的,但另一部分根本就无法工作。例如,你可以通过DCC接收文件,但就是不能发送。这个问题的原因在于DCC是如何建立连接的。当DCC想发送文件时,会告诉接收者你要发送文件,并让它知道要连接到什么地方。如果没有helper,这个DCC连接最终会断开,因为接收者收到的是内网的地址。这样,当它按那个地址连接时,其实就连到和它在同一内网的机子了。那为什么可以接收呢?因为发送者给你的是可在 Internet上使用的IP地址(大部分情况下,IRC服务器都有真实的IP地址)。如果你在通过防火墙使用mIRC DCC时遇到了问题,但和其他IRC客户沟通很正常,看看附录常见问题与解答里的 关于mIRC DCC的问题 吧。 在这个例子中,我们在这儿装载支持FTP和IRC协议的模块。有关连接跟踪和nat的详细信息,请查看附录 常见问题与解答。在patch-o-matic中,还有H.323 conntrack helper等其他象NAT helper的模块。但为了使用它们,你需要使用patch-o-matic提供的补丁,还需要编译内核。详细的操作信息可以查看章节准备阶段 。注意,为了能对FTP和IRC协议做网络地址转换,需要装载ip_nat_ftp和ip_nat_irc。在装载NAT模块之前,你还要载入ip_conntrack_ftp和ip_conntrack_irc模块。NAT模块和conntrack模块以相同的方式被使用,但NAT模块使我们能对这两个协议做NAT。--------------------------------------------------------------------------------7.2.3. proc的设置我们可以使用下面的语句打开IP转发功能(IP forwarding):echo "1" > /proc/sys/net/ipv4/ip_forward注意,何时何地打开这个功能才算合适是值得好好考虑的一个问题。在本文所用的脚本中,我都是在创建IP过滤器(在本文里就是指iptables的过滤规则)之前打开它的。这可能引起这样一种情况,就是在一小段时间内(时间的长短随脚本的复杂程度和机子的性能高低而变化,可能只有一毫秒,也可能会长达一分钟),防火墙可以转发任何包(译者注:因为这时防火墙的过滤规则还没有被装入)。这种情况又会导致安全方面的问题,不怀好意的人可能会趁此通过防火墙破坏我们的网络。也就是说,我们应该在创建所有防火墙的规则之后再打开IP转发功能,我这样做只是为了保正所有脚本的兼容性。(译者注:我们在实际应用中一定要注意这一点,尽量不要先开IP转发功能) 万一你使用的是SLIP、PPP或DHCP,也就是说你是动态获取IP的,那还要用下面的命令打开ip_dynaddr:echo "1" > /proc/sys/net/ipv4/ip_dynaddr 如果你还要打开其他的proc选项,也是用类似的方法,但有关那些选项的具体介绍以不是本文的内容,你可以看看其他相关的文章。在附录其他资源和链接里就有一些介绍了内核proc系统的短小精干的文章。如果你在本文中找不到想要的资料,就可以到附录其他资源和链接去看看,你会有所收获的。 在本文所用的脚本中还包含了一个名为Non-Required proc configuration(非必需的proc设置)的小节。当有什么工作不象你所想象的那么正常时,可以来这儿看看,它能提供给你最基本的一些信息,但在你真正弄明白它们的含义之前不要进行改动。--------------------------------------------------------------------------------7.2.4. 规则位置的优化本节简要地描述了针对脚本rc.firewall.txt,我将如何选择、使用内建的链链和自定义的链。我选择过的一些路径从这个或那个角度看可能是错误的,我会指出这些情况和问题发生在何时何地。这里还对章节 表和链 做了简要的回顾,希望能给你一点儿提醒,以使你能想起在实际应用中包是如何表和链的。 为了尽可能地少占用CPU,我们已经替换了所有不同的自定义链,与此同时,我把主要的精力放在了安全性和易读性上。我不让TCP包去经历ICMP、UDP和TCP规则的洗礼,而是简单地匹配所有的TCP包,然后让它去一个自定义链中旅行。这种方法并不比让它经历所有的规则开销大。下图可以解释在Netfilter中,外来的包是如何被处理的(相对于章节表和链的深入讨论,这个图形太粗糙了)。我希望通过上面的解释和下面的图形能让大家明白写这个脚本的目的,详细的注释在后面几节。利用这个图形,我们可以弄清楚脚本的目的。整个脚本基于这样一种假设,我们有一个局域网,一个防火墙及一个Internet连接,且有一个静态IP地址(相对的是动态地址,它们使用的连接是DHCP、PPP、 SLIP,等等),还想把防火墙作为Internet上的一台服务器来运行某些服务。我们完全信任局域网,因此不能阻塞任何从局域网发出的数据传输。还有一个要优先考虑的事,我们只允许那些被明确说明为可以接受的数据通过。为了做到这一点,我们就要把缺省策略设为DROP。这样,那些没有被明确标识为允许进入的数据就都被阻塞了。在上面的假设里,我们想让局域网能够访问Internet。因为局域网是被完全信任的,所以我们应该允许所有来自局域网的数据通过。但Internet是不被信任的,所以我们想阻塞从Internet向我们的局域网发起的连接。根据上面的所有假设,我们来考虑考虑需要做什么、不需要做什么以及我们想做什么。首先,我们解决的是局域网要能连接到Internet的问题。那我们就要对所有数据包做NAT操作,因为局域网内的机子都没有真实的IP地址。NAT是在PREROUTING链中完成的,这也是脚本最后创建的那个规则所在的链。这意味着我们必须要在FORWARD链中做过滤工作,否则我们就是允许所有外部的机子都能完全访问局域网了。因为我们完全信任局域网,所以允许所有由内向外的数据通过。由于我们假设Internet上的机子都不可以访问局域网内的机子,所以要阻塞所有由外向内的连接,但已经建立的或相关的连接除外,因为它们只是用来回应内网对外网的访问,而不是建立对内网的新连接。由于资金有限,我们的防火墙只提供了有限的几个服务:HTTP、 FTP、SSH和IDENTD。因此,我们要在INPUT链里允许这些协议通过,还要在 OUTPUT链里允许返回的数据通过。我们除了完全信任局域网,也信任loopback和它的IP地址,因此我们要有相应的规则来允许所有来自局域网和loopback的数据通过。但是我们不会允许一些特殊的包或包头通过,也不会接受Internet上某一段IP的访问。比如,网段 10.0.0.0/8是为局域网而保留的,一般来说,我们不允许来自它们的包进入,因为这样的包90%都是用来进行欺骗的。不过,在实现这条标准之前,还要注意一个问题,就是有一些ISP在他们的网络里使用的恰恰就是这些地址。 在附录常见问题与解答里有这个问题的进一步说明。因为我们在防火墙上运行FTP服务,而且想让包经历最少的规则,所以要把处理established和related状态的规则放到INPUT链的顶部。基于同样的原因,我们把这些规则分到子链中。这样,包就可以尽量少地穿越规则,从而节省时间,也可以降低网络的冗余。在这个脚本里,我们依据不同的协议(如TCP、 UDP或ICMP)把包分到子链中。用来匹配 TCP包的链叫做tcp_packets,它可以匹配所有我们允许通过的TCP端口和子协议(如FTP、HTTP等)。我们还要建立一个名为allowed的子链,以便在真正接受“那些使用有效端口来访问防火墙的TCP包”之前,对它们进行附加的检查。至于ICMP包,自有称作 icmp_packets的链来处理。在决定如何建立这个链时,我考虑到如果我们同意接受ICMP包的类型和代码,就没有必要对它们做附加的检查,所以直接接受它们就行了。最后,UDP包由谁处理呢?当然就是 udp_packets了。如果包是那种允许被接收的类型,就直接放行了。因为我们的网络很小,所以防火墙也要作为工作站来用。这就要求我们要允许一些特殊的协议能和它通信,比如speak freely和ICQ。现在,我们来考虑考虑OUTPUT链。因为很信任防火墙,所以我们允许几乎所有离开它的包通过,而没有阻塞任何用户和协议。但我们也不想让人利用这台机子进行IP欺骗,因此我们只放行那些从防火墙本身的IP发出的包。为了实现这一点,我们很可能在ACCEPT链中加入这样一条规则:如果包是由防火墙的IP发出的,就放行,否则,它们就会被OUTPUT链的缺省策略DROP掉。--------------------------------------------------------------------------------7.2.5. 缺省策略的设置在开始写其他规则之前,我们先要用下面的语句建立缺省的策略:iptables [-P {chain} {policy}]每一条链的策略都是用来处理那些在相应的链里没被规则匹配的包。也就是说,如果有一个包没有被规则集中的任何规则匹配,那策略就有用武之地了。 要谨慎地设置其他表里的链的策略,因为它们不是用来过滤包的,这就可能引起很怪异的行为发生。 --------------------------------------------------------------------------------7.2.6. 自定义链的设置现在,你对我们的防火墙应该已经有了一个很清晰的印象,心动了吧。心动不如行动,让我们把它变为现实吧。这一节我们就要小心仔细地创建所有自定义链和链内的规则。如前所述,我们要建立这几条自定义链:icmp_packets、tcp_packets、udp_packets 和allowed,其中allowed链是由tcp_packets链调用的。所有进入$INET_IFACE的ICMP包都会被重定向到icmp_packets链,TCP包是到 tcp_packets链,那UDP包自然就是udp_packets链了,详细的解释都在 INPUT chain里。创建自定义链的命令还记得吗?很简单哦,只要使用选项-N ,再指定链的名字即可(不要忘了,新建的链都是空的),如下: iptables [-N chain]在下面的几节里,我们会详尽地介绍上面创建的每一条链,以使你了解它们包含哪些规则、有什么作用。 --------------------------------------------------------------------------------7.2.6.1. bad_tcp_packets链这条链包含的规则检查进入包(incoming packet)的包头是否不正常或有没有其他问题,并进行相应地处理。但事实上,我们使用它只是为了过滤掉一些特殊的包:没有设置SYN位但又是NEW状态的TCP包,还有那些设置了SYN/ACK但也被认为是NEW状态的TCP包。这条链可以用来检查所有可能的不一致的东西,比如上面的包或者XMAS port-scans等。我们还可以为INVALID状态的包增加一条规则的。如果你想完全了解无SYN位的NEW状态(NEW not SYN),可以去附录常见问题与解答里看看未设置SYN的NEW状态包一节,它介绍了未设置SYN的NEW状态包通过其他规则的情况。在某些情况下可以允许这种包通过,但99%的情况是我们不想让它们通过。因此,我们会先记录这种包,然后再扔掉它们。我们拒绝SYN/ACK包以NEW状态进入的原因也是非常简单的,深入的说明在附录常见问题与解答的NEW状态的SYN/ACK包 里。基本上,我们这样做是出于对其他主机的好意,因为我们为他们预防了序列号预测攻击(sequence number prediction)。--------------------------------------------------------------------------------7.2.6.2. allowed链如果包是从$INET_IFACE进入的,而且是TCP包,那它就要经过tcp_packets 链的检验。如果这个连接就是冲着被允许通过的端口来的,我们还要对它进行一些检查,以确定是否真的要接受它。这些“最后的审判”都是在allowed链里进行的。首先,我们看看这个包是否是SYN包,如果是,它很可能是新连接的第一个包,我们当然接受了。如果不是,那就看看包是否来自某个ESTABLISHED或RELATED状态的连接,是的话,就接受。ESTABLISHED状态的连接是那种在两个方向上都有流量存在的连接。依据状态机制的观点,这个连接一定处于是ESTABLISHED状态的,因为我们现在能看到这个包,说明以前肯定收到了相应的SYN包。最后一条规则将DROP所有其他的包。当包到达最后这条规则,就几乎意味着所有连接都不会有双向的交流,也就是说,我们不会回应 SYN包。当试图用非SYN包开始新的连接时,包也会走到这条规则。不用SYN包建立新连接没有什么实际的用处,当然,端口扫描要排除在外。就我知道的而言,现在没有什么有用的TCP/ IP程序会使用SYN包以外的包来打开一个TCP连接。因此,我们要把这样的包DROP掉,我有99%的把握说它们是端口扫描用的。--------------------------------------------------------------------------------7.2.6.3. 处理TCP的链tcp_packets链指定了哪些端口可从Internet访问。但我们还要对进入的包做更多的检查,因此,每个包都会被发送到上面提到的allowed链。-A tcp_packets告诉iptables要在哪条链里增加规则,规则被放在指定链的末尾。-p TCP指定要匹配的是TCP包,-s 0/0说明要匹配的源地址是从网络掩码为0.0.0.0的地址0.0.0.0开始的,换句话说,就是所有的地址。这实际上是默认值,我写出来只是尽可能使你更明白。--dport 21指定目的端口,也就是说如果包是发往端口21的,就会被匹配。如果所有的标准都匹配了,包就要被送往allowed链。TCP的21号端口也是允许访问的,也就是FTP的控制端口,它可以控制FTP连接,前面提到过,我还允许所有RELATED状态的连接通过。这样,我们也就可以使用PASSIVE(主动)和ACTIVE(被动)的连接了,当然,要事先装载ip_conntrack_ftp模块。如果我们不想再提供 FTP服务,就卸载ip_conntrack_ftp模块,并把$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 21 -j allowed 这一行从文件 rc.firewall.txt里删掉。22号端口是SSH使用的。如果你允许外网的如何人都能通过telnet(使用23号端口)访问你的机子,那你还是使用SSH吧,它的安全性要好很多。注意,你操作的是防火墙,把任何访问权分配给除你自己之外的人都不是什么好主意。防火墙总是应该尽量少地暴露自己。80是HTTP端口,也就是说你在防火墙上运行了网页服务。如果你不提供网页服务,就删掉这条规则吧。最后我们还提供了IDENTD服务,端口是113。这个服务对某些协议是必须的,如IRC。注意,如果你NAT一些在内网里的主机的话,软件oidentd也值得一用,它会把 IDENTD请求中继给内网里正确的机子。如果没有匹配上面任何一条规则,包就会被送回tcp_packets链的父链,也就是把它发到 tcp_packets链的那条规则所在的链。如果你想打开更多的端口,只要对tcp_packets链里的任何一行使用“复制、粘贴大法”,再修改一下端口号即可。--------------------------------------------------------------------------------7.2.6.4. 处理UDP的链如果我们在INPUT链中遇到了UDP包,就把它发送到udp_packets链。在那里,我们只处理UDP包,所以要用-p UDP来指定相应的协议。我们接受来自任何地址的包,故有-s 0/0,这其实就是源地址选项的默认值,但为了更明确,我们还是把它写出来了。此外,我们只接受发往特定端口的包,这些端口是我们想对Internet开放的。注意,我们不需要依据发送端的源端口来决定是否打开某个端口,这个工作是由状态机制完成的。如果我们想运行某个使用 UDP端口的服务(如DNS),只要开放相应的端口,其他的端口不需要打开。那些处于 ESTABLISHED状态、正在进入防火墙的包在到达包含--state ESTABLISHED,RELATED的规则(这是 INPUT链里那些“处理来自Internet的包的规则”中的第一条规则)之后就会被接受了。 我们不接受外来的以53号端口为目的的UDP包,也就是说,我们不想接受外来的DNS查询。其实,规则已经写好了,我只是把它给注释掉了。如果你想把防火墙作为一台允许Internet访问的DNS 服务器,那就把注释符号去掉。就我个人而言,我会打开123号端口,它对应的协议是network time protocol,简称NTP 。我们可以利用这个协议与某台具有精确时间的时间服务器联系,以设置本机的时间。你们中的大部分可能用不到此协议,所以我也把它注释掉了,虽然我已经写出了规则。我打开了2074号端口,它是某些实时的多媒体应用程序使用的。比如speak freely ,你可以用这个程序通过音箱、麦克风或耳麦与其他人进行实时交谈。如果你不需要,就把这条规则注释掉吧。端口4000相应的协议是ICQ协议,由ICQ使用,世界上使用最广泛的聊天程序之一,“地球人都知道”。Linux上至少有2-3种不同的ICQ克隆。我想不必解释为什么要开放这个端口了吧。(译者注:国产的聊天程序,常见的是QQ(端口8000),现在又有了UC(端口3001)等。)如果你正在经历日志满天飞的苦恼,这里有两个额外的规则可以使用,当然,这要看是因为什么引起的了。我们这里的第一条规则会阻塞目的端口是135到139的广播包。大部分Microsoft使用者会用到NetBIOS 或SMB,而它们就使用这些广播包。这条规则可以阻塞所有位于外网的那些Microsoft Network产生的广播包,我们的日志也就可以简洁一些了。第二条规则也是解决日志问题,不过问题的产生者变了,这回是外网的DHCP查询。如果你的外网是由非交换的以太网组成的,在那里客户机可以通过DHCP 得到IP地址,也就是说,如果外网里会有很多DHCP查询广播包,那就启用这条规则吧。 注意,我把最后这两条规则也注释掉了,因为有些人可能想看看相关的记录。如果你正经历“合法日志过多”的痛苦,就试试丢弃那些包吧。其实,在INPUT链中,就在这两条有关日志的规则之前,还有更多这种类型的规则。--------------------------------------------------------------------------------7.2.6.5. 处理ICMP的链现在,我们该决定可以接受哪些ICMP类型了。在INPUT链中,如果ICMP包是从eth0 (即本例的Internet接口)进入的,我们就要把它重定向到icmp_packets 链(前面提到过),以检查是否是可以接受的类型。目前,我只接受三种ICMP包:ICMP Echo requests,TTL equals 0 during transit和TTL equals 0 during reassembly。默认不接受其他任何ICMP类型的原因是,几乎所有其他类型的ICMP包都是RELATED状态的,也就是说它们都会被处理 RELATED状态的规则放行。 如果一个ICMP包是用来回应“已经存在的包或流”的,那它就是与那些流相关的,也就是说,它的状态是RELATED。更多的信息在章节状态机制里。 现在来解释一下我为什么只接受上面提到的三种ICMP包。Echo Request用来请求echo reply,这个操作主要被用来ping其他的机子,以确定那些机子是否可用。如果没有这一条规则,其他机子将不能通过ping来确定我们是否可用。注意,有些人倾向于删掉此规则,只是因为他们不想被Internet看到。删掉这个规则将会使任何来自Internet的、对我们防火墙的ping都无效,因为防火墙对他们完全没有回应。允许超时(Time Exceeded,如TTL equals 0 during transit传输期间生存时间为0和TTL equals 0 during reassembly在数据报组装期间生存时间为0)信息进入,我们就可以追踪从本地到某台主机的路径,或者在包的TTL为0时,我们能得到回应信息。比如,在我们追踪到某台主机的路径时,会以 TTL = 1的包开始。当它得到第一个路由时,TTL减为0,我们也会得到第一个路由返回的超时信息。然后是TTL = 2的包,我们就会得到第二个路由器返回的超时信息。如此,直到得到我们的目的主机返回的信息。这样,我们就可以从路径上的每一台主机得到一个回应,从而我们可以看到路径上的每一台主机,也就可以知道路径是断在哪台机子了。完整的ICMP类型列表在附录ICMP类型里。关于ICMP类型的更多信息与用法,我建议你看看下面的文章:Ralph Walden的The Internet Control Message Protocol。J. Postel的RFC 792 - Internet Control Message Protocol。 注意,我阻塞了所有我不想接受的ICMP包,这对你的网络来说可能会有问题,但在我这里,一切工作正常。 --------------------------------------------------------------------------------7.2.7. INPUT链我写的INPUT链大部分是使用其他链来完成这个艰难的工作的。这样做,我们就不需要从iptables 装载太多的规则(译者注:这是针对装载INPUT链的规则说的,因为这时其他规则已经装载好了),而且它在较慢的机子上也可以工作得很好,但另一方面,这样的机子在高负载时还是会丢弃很多包(译者注:机子慢,就是不行)。之所以能做到这一点,是因为对于大量不同的包,我们通过检查特定的细节来确定它们的类别,再把这些包发送到相应的自定义链去处理。这样,我们可以分割规则集使之包含很少的规则,每个包要经历的规则也就少了。从而,在过滤包时,防火墙的开销也就小多了。首先,我们要检查进入的tcp包的形态是否是不正常的或我们不想要的。这个工作是这样完成的,我们把所有的tcp包送到bad_tcp_packets链,由其中的规则进行检查,具体的描述在小节bad_tcp_packets链里。然后,我们开始处理被信任的网络的数据传输。这包括所有来自“连接内网的网卡”的流量,所有来自和发往loopback的流量(要注意,和loopback相对应的IP地址包括了所有分配给防火墙的地址,其中也包括连接Internet的地址)。我们把处理LAN的流量的规则放在防火墙的上部,因为我们的局域网产生的流量要远远多于Internet连接。这样,规则会更有效率,防火墙就能以较小的开销去匹配包,从而网络阻塞的可能性也就减小了,而且也便于我们查看经过防火墙的包主要是什么类型。下面的一些规则会处理来自Internet的信息,在接触这些规则之前,有一个相关的规则,我们可用它来减少一些开销。这是一个处理状态的规则,它允许所有处于状态ESTABLISHED或RELATED且发往 Internet接口的包进入。在allowed链中有一个与此类似的规则(译者注:实在是多余,建议大家把它拿掉吧)。顺序上,当然是INPUT链里的规则先处理包了。然而,在allowed链里保留--state ESTABLISHED,RELATED规则还是有一些原因的,比如,方便某些人想剪切此功能,粘贴到其他地方。在INPUT链里,我们会把从$INET_IFACE进入的所有TCP包发往tcp_packets链,类似地,把UDP包发往udp_packets链,把 ICMP包发往icmp_packets链。一般说来,防火墙遇到的最多的包是TCP包,其次是 UDP包,最后是ICMP包。但要注意,这只是一般情况,对你可能不适用。一样的规则因为顺序不同,或者说逻辑不同,效率会有很大的差别。如果规则集写得不好,即使只有100条规则,而且有100mbit的网卡,就算是Pentium III的机子也会吃不消的。所以你自己写规则集时一定要注意这一点。这里有一条被注释掉了规则,万一在我们的防火墙外部有一些Microsoft网络,我们可以启用它来解除日志过多的烦恼。Microsoft的客户机有个坏习惯,就是向地址224.0.0.0/8发送大量的多播包。因此我们要有这条规则来阻塞那些包,以免我们的日志被它们填满。还记得吗?udp_packets链里也有两条类似的规则。忘了的话,就到处理UDP的链看看吧。在其他的包被INPUT链的策略处理之前,我们会把它们记录下来,以便查找可能的问题或bug:它可能就是我们不想允许它进入的那种包,也可能是对我们做了什么坏事的用户,还可能是防火墙的问题,如我们阻塞了应该被放行的包。我们要了解所有的情况,这样问题才能得以解决。我们每分钟最多记录3个包,因为我们可不想让日志里记载的都是废话。为了容易辨别包的来源,我们还对所有的记录设置了前缀。所有没被上面的规则处理的包都会被策略DROP掉。策略的设置在本章的小节缺省策略的设置里,距离我们已经很远喽。--------------------------------------------------------------------------------7.2.8. FORWARD链在本例中,FORWARD链包含的规则很少。首先,我们会把所有的包发往bad_tcp_packets 链。此链我们前面提到过多次,它可以被多条链调用,其实它也就是为这个目的而设计的。之后就是FORWARD链的主要规则了。第一个允许所有来自$LAN_IFACE的数据通过,没有任何限制,也就是说,我们的LAN可自由地访问Internet。第二个允许ESTABLISHED和RELATED状态的包能通过防火墙。换句话说,就是所有对我们的内网发出的连接的回应都可以返回局域网。为了使我们的内网能访问Internet,这些规则是必须的,因为我们在前面已经把FORWARD链的策略设为DROP了。这样设置规则也是很聪明的,因为它在保证局域网可以访问Internet的同时阻止了Internet对局域网的访问。最后我们也有一个处理日志的规则,用来记录没被上面任何规则匹配的包。这样的包很可能是形态不正常的或者是其他问题,比如可能是黑客攻击。这个规则与INPUT链中的那个类似,只是前缀不同,这里用的是:"IPT FORWARD packet died: "。前缀主要用来分离日志的记录,便于我们查找包的来源和包头的一些信息。--------------------------------------------------------------------------------7.2.9. OUTPUT链除了我几乎没有人把防火墙还当作工作站来使用,但正因为这样,我允许几乎所有从防火墙的IP(包括 LOCALHOST_IP,$LAN_IP或$STATIC_IP )出发的数据,而阻塞其他情况。因为其他任何情况都可能被人以某种方式欺骗。最后的规则还是用来记录那些要被策略DROP掉的包。这样,我们就可以了解它们,继而可以对产生的问题(可能是具有威胁性的错误,或者是用来进行欺骗的包)采取行动。--------------------------------------------------------------------------------7.2.10. PREROUTING链顾名思义,PREROUTING链(nat表的)是在路由之前做网络地址转换工作的。然后,包再经过路由,就会被送到filter表的INPUT或FORWARD链。我们在这里讨论这个链的唯一原因是,我们觉得有责任再次指出你不应该在此链中做任何过滤。PREROUTING链只会匹配流的第一个包,也就是说,这个流的所有其他的包都不会被此链检查。事实上,在这个脚本中,我们根本没有用到PREROUTING 链。如果你想对一些包做DNAT操作,例如,你把web server放在了局域网内,这里就是你放置规则的地方。有关PREROUTING链的详细信息在章节表和链中。 千万注意,PREROUTING链只能做网络地址转换,不能被用来做任何过滤,因为每个流只有第一个包才会经过此链。--------------------------------------------------------------------------------7.2.11. POSTROUTING链我们最后的任务应该是构造网络地址转换,对吧?至少对我来说是的。我们在nat表的 POSTROUTING里只加入了一条规则,它会对所有从Internet接口(对我来说,这是eth0)发出的包进行NAT操作。在所有的例子脚本里,都有一些变量,它们要给以正确的配置。选项-t指定要在那个表里插入规则,这里是nat表。命令-A说明我们要把规则添加到 POSTROUTING链末尾。-o $INET_IFACE指定要匹配所有从接口INET_IFACE出去的包,这里我们使用的是eth0。最后,我们把target设置为SNAT。这样,所有匹配此规则的包都会由SNAT target处理,之后,它们的源地址就是Internet接口的地址了。不要忘了SNAT可是一定要有IP地址的,用--to-source 来设置哦。在这个脚本中,我们选择SNAT而不用MASQUERADE是有原因的。主要的原因是我们的防火墙有静态IP地址,使用SNAT会更快更有效。还有一个原因是我们要在这个例子中展示它的作用以及怎样使用它。如果你没有静态的IP地址,要想实现SNAT,还是使用MASQUERADE为好,因为它简单易用,而且它可以自动获得IP地址。当然,计算机的消耗会多一点,但如果你使用DHCP,这样做是很值得的。如果你想了解MASQUERADE target的表现,应该看看脚本rc.DHCP.firewall.txt。

fnhssap 发表于 2004-8-25 22:30:12

Chapter 8. 例子简介本章的目的是对指南提到的每个脚本都给以简单明了的说明,以及提供一个关于这些脚本的框架,描述它们提供的服务。这些脚本不是任何情况都能用的,它们可能并不符合你的意图。也就是说,为了能满足你的需要,还是要取决于你自己。在这方面,下面的内容可能会给你很大的帮助。第一小节介绍了这些脚本的结构,你会发现我们在这些脚本里使用的处理方式还是比较容易的。--------------------------------------------------------------------------------8.1. rc.firewall.txt脚本的结构本指南所有的脚本都是依据一个特定的结构来写的。理由嘛,就是这样可以使它们彼此相似,便于我们查找不同之处。本章将要对这个结构做一个很好的说明,而且还会简单地阐述这些脚本为什么会按照现在这种样子来写,以及我为什么选择一直使用这种结构。 注意,即使我选择了这种结构,你也不一定非要用它,对你来说,它可能并不是最好的。我选择它只是因为它易读,而且能很好地符合我的逻辑。 --------------------------------------------------------------------------------8.1.1. 脚本结构这就是本指南所有脚本遵循的脚本结构。如果有不同于此的地方,可能就是我出错了,除非我特意说明为什么要打破这种结构。Configuration ?? 首先是一个配置选项区,里面的变量在脚本中会用到。几乎任何脚本(shell-script)的第一部分都是配置选项区。Internet ?? 有关Internet连接的配置。如果我们没有任何Internet连接,这一部分就可以跳过去。注意,相比我们列出来的,这一部分可能会包含更多小节,虽然我们这里只有了了几个,但足够应对我们已有的各种Internet连接了。DHCP ?? 如果脚本用到了DHCP,我们就要在此添加相应的配置。PPPoE ?? 如果想把脚本用于PPPoE连接,就要在此添加相应的配置。 LAN ?? 如果防火墙后有局域网,就要使用这里的配置了。大部分情况下都会用到这儿,因为局域网几乎总是存在的。DMZ ?? 对非军事区(DMZ zone)的配置。大部分脚本不会用到这个设置,因为这些脚本针对的主要是一些普通的家庭网络,或小企业的网络。Localhost ?? 本地(local-host)的有关设置。虽然我把它们写成变量的形式,但一般不会被改变,也不应该有什么理由要改变它们。iptables ?? 有关iptables的设置。大部分情况下,这里只设置一个变量,用来指向iptables程序的位置。Other ?? 如果还有什么信息,首先应该把它们放在相应的小节里,实在没有相应的小节,就放这儿吧。Module loading ?? 脚本应该维护一个模块列表。它分为两部分,第一部分包含必需的模块,同时第二部分要包含不必要的模块的列表。 注意,这些模块可能会提高安全性,或为管理者、客户添加某些服务,还有一些模块不是必需的,但它们可能也被加入了列表。不过,在本例中,我已经注意了这个问题。 Required modules ?? 这里装载的是必要的模块,它们可能会提高安全性或为管理者、客户增加某些服务。Non-required modules ?? 这里列出的是不必要的模块,所以它们都被注释掉了。如果你用到了它们提供的功能,就可以启用它们。proc configuration ?? 这儿关心的是有关proc系统的设置。如果一些选项是必须的,我们就启用它,如果不是,就把它注释掉。大部分有用的proc配置都列在这儿了,但远远不是全部的。Required proc configuration ?? 包含了使脚本能正常工作的所有必需的proc配置,它也可以包含一些能提高安全性或为管理者、客户增加特定服务的选项。Non-required proc configuration ?? 这里提到的选项不是必需的,虽然它们可能很有用。因此,我把它们都注释掉了。当然,这里并没有包括所有这样的选项。rules set up ?? 现在,应该添加规则了。我把所有的规则都明确地分配到了与表、链相应的小节里。所有自定义的规则都写在系统内建的链之前(译者注:当然要写在前面了,因为后面要调用它们哦)。另外,我是按照命令iptables -L输出的顺序来安排此脚本里表与链的出现顺序的(译者注:这样,便于我们查看哦)。Filter table ?? 首先是filter表,而且我们先要设置策略。Set policies ?? 为所有系统内建的链设置策略。通常,我会设置 DROP,对于允许使用的服务或流会在后面明确地给以ACCEPT。这样,我们就可以方便地排除所有我们不想让人们使用的端口。Create user specified chains ?? 在这里创建所有以后会用到的自定义链。如果没有事先建立好,后面是不能使用它们的,所以我们要尽早地建立这些链。Create content in user specified chains ?? 建立自定义链里使用的规则。其实你也可以在后面的某个地方写这些规则,之所以写在这儿,唯一的原因是这样做规则和链会离得近些,便于我们查看。INPUT chain ?? 创建INPUT链的规则。 从这里开始,我就是遵循iptables -L的输出格式来创建规则的,这样做的唯一原因就是为了便于阅读,避免混淆。 FORWARD chain ?? 为FORWARD链创建规则。OUTPUT chain ?? 为OUTPUT链创建规则。其实,在这里要建的规则很少。nat table ?? 在处理完filter表之后,该设置nat表了。我们这样做是有一定原因的。首先,我们不想太早地打开转发机制(译者注:注意,filter表设定的是过滤机制,而不是转发)和NAT功能,因为它们可能导致数据会在错误的时间(也就是这样的时刻:我们打开了NAT,但过滤规则还没有运行)通过防火墙。还有,我把nat表看作是围绕filter表的一个层。也就是说,filter表是核心, nat表是它外部的一个层,mangle表是第二层。从某些观点来看,这可能有点不对,但也八九不离十了。Set policies ?? 与filter一样,我们先来设置策略。一般说来,缺省的策略,即ACCEPT,就很好。这个表不应该被用来做任何过滤,而且我们也不应该在这儿丢弃任何包,因为对我们假设的网络情况来说,可能会发生一些难以应付的事情。我把策略设为ACCEPT,因为没有什么原因不这样做。Create user specified chains ?? 在这儿创建nat表会用到的自定义链。一般情况下,我没有任何规则要在这儿建立,但我还是保留了这个小节,以防万一罢了。注意,在被系统内建链调用之前一定要建好相应的自定义链。Create content in user specified chains ?? 建立自定义链的规则。PREROUTING chain ?? 要对包做DNAT操作的话,就要用到此链了。大部分脚本不会用到这条链,或者是把里面的规则注释掉了,因为我们不想在不了解它的情况下就在防火墙上撕开一个大口子,这会对我们的局域网造成威胁。当然,也有一些脚本默认使用了这条链,因为那些脚本的目的就是提供这样的服务。POSTROUTING chain ?? 如果使用SNAT操作,就要在此建立规则。你可能有一个或多个局域网需要防火墙的保护,而我就是依据这样的情况来写此脚本的,所以这个脚本中使用的 POSTROUTING链是相当实用的。大部分情况下,我们会使用SNAT target,但有些情况,如PPPoE,我们不得不使用MASQUERADE target。OUTPUT chain ?? 不管什么脚本都几乎不会用到这个链。迄今为止,我还没有任何好的理由使用它,如果你有什么理由用它了的话,麻烦你把相应的规则也给我一份,我会把它加到本指南里的。mangle table ?? 最后要做的就是处理mangle表了。通常,我不会使用这个表,因为一般情况下,它不会被任何人要到,除非他们有什么特殊的需要,比如为了隐藏一条连接后的多台机子,我们要统一设置TTL或TOS等。在这个脚本里,此表是空白的。但在此指南中还是有个小小的例子说明了mangle表的用处。Set policies ?? 设置策略。这里的情形和nat表几乎完全相同。这里不应该做过滤,也不应该丢弃任何包。在任何脚本里我都不会把mangle表的策略设为其他的值,也不鼓励你这样做。Create user specified chains ?? 建立自定义链。我几乎不会用到这个链,所以没有建立任何规则。保留此小节,只是已备后用。Create content in user specified chains ?? 建立自定义链的规则。PREROUTING ?? 本指南的所有脚本都未在此链建立规则。INPUT chain ?? 本指南的所有脚本都未在此链建立规则。FORWARD chain ?? 本指南的所有脚本都未在此链建立规则。OUTPUT chain ?? 本指南的所有脚本都未在此链建立规则。POSTROUTING chain ?? 本指南的所有脚本都未在此链建立规则。这应该可以较详细地解释每个脚本的结构是怎样的以及它们为什么要使用这个结构了。 注意,上面的描述其实还是非常简单的,应该被看作一个摘要,它简要地解释了脚本为什么要按照这种松散的结构来写。千万注意,我可没有说过这种结构是唯一的、最好的。--------------------------------------------------------------------------------8.2. rc.firewall.txt脚本rc.firewall.txt是核心,第七章防火墙配置实例 rc.firewall对它已经做了很详细的解释,其他的脚本都是以它为基础得到的。这个脚本主要是针对具有两个连接的家庭网络而设计的,如一个局域网连接,一个Internet连接。我们假设的情况是你有一个静态IP地址,不需要DHCP,PPP, SLIP或其他什么协议为你动态分配IP。如果你想要的恰恰是使用这些协议的脚本,就到rc.DHCP.firewall.txt看看吧。脚本rc.firewall.txt要完全发挥作用,系统必需要有下面列出的功能,你可以把它们编译进内核,也可以编译成模块。如果你改变了脚本,就要加入相应的功能模块或把它们编进内核。CONFIG_NETFILTER CONFIG_IP_NF_CONNTRACK CONFIG_IP_NF_IPTABLES CONFIG_IP_NF_MATCH_LIMIT CONFIG_IP_NF_MATCH_STATE CONFIG_IP_NF_FILTER CONFIG_IP_NF_NAT CONFIG_IP_NF_TARGET_LOG --------------------------------------------------------------------------------8.3. rc.DMZ.firewall.txt脚本rc.DMZ.firewall.txt所针对的情况是这样的:有一个可信任的内网,一个DMZ,还有一个Internet连接。这里的DMZ是通过设置一对一的NAT 操作得到的,它需要IP别名(就是在一块网卡上设置多个IP地址)的支持。我们还有其他的方法来实现 DMZ:如果你有一个整个的网段,可划分子网,然后把某个子网分给DMZ,再为防火墙配置相应的内网与外网 IP地址(译者注:第一种方法是针对有多个网段的情况,即内网一个网段,DMZ一个网段,第二种方法是把一个网段划分成几个子网,这样就和第一种情况一样了)。注意,这种方法会多消耗两个IP,一个是网络地址,一个是广播地址(译者注:具体细节请上网搜索子网划分的相关信息,这个指南并不包含此类信息)。以上两种方法用哪一个就要你自己决定了。本指南会给你实现防火墙与NAT的手段或叫做技术,但具体如何去做,没有完全的说明,因为这已经超出本文的范围了。这个脚本需要以下模块,也可能它们已被编译进内核了。CONFIG_NETFILTER CONFIG_IP_NF_CONNTRACK CONFIG_IP_NF_IPTABLES CONFIG_IP_NF_MATCH_LIMIT CONFIG_IP_NF_MATCH_STATE CONFIG_IP_NF_FILTER CONFIG_IP_NF_NAT CONFIG_IP_NF_TARGET_LOG 从图中可以看出,此脚本假设你有两个内网,一个是可信任的内网,使用地址192.168.0.0/24,另一个是 DMZ(我们正是对它做一对一的NAT),使用地址192.168.1.0/24。如果有人从Internet向我们的DNS_IP发送一个包,我们就要对它使用DNAT,之后,此包的目的地址就指向DMZ 里的DNS服务器了,它也就可以到达真正的DNS服务器。否则,DNS服务器不会看到这个包,也就没有应答之说了。下面是实现上述DNAT功能的语句:$IPTABLES -t nat -A PREROUTING -p TCP -i $INET_IFACE -d $DNS_IP \--dport 53 -j DNAT --to-destination $DMZ_DNS_IP    我们可以看出,这个规则要放在nat表的PREROUTING链中,包要满足的条件是:使用 TCP协议且使用53号端口,从接口$INET_IFACE进入,而且要以$DNS_IP为目的。被匹配的包要交给DNAT target来处理,它会把包的目的地址改为由--to-destination指定的地址$DMZ_DNS_IP。这就是 DNAT的工作流程。当相应的应答包被发送到防火墙时,会自动地被un-DNAT。现在,你应该完全可以读懂这个脚本了。如果有什么你不明白的东西在脚本的其他部分没有被用到,那可能就是我的错误了,要告诉我哦。 --------------------------------------------------------------------------------8.4. rc.DHCP.firewall.txt脚本rc.DHCP.firewall.txt适用于那些使用DHCP、PPP或SLIP连接Internet的情况,它和原始的脚本rc.firewall.txt几乎一样,主要的区别在于这里不再使用变量STATIC_IP。原因很简单了,就是它不能和动态的IP一起使用。此脚本相对于原始脚本的改变是很少的,但还是有一些人发信问我做了什么改变。经过大家的考验,这个脚本应该是一个很好的解决方案了。它需要如下功能模块。CONFIG_NETFILTER CONFIG_IP_NF_CONNTRACK CONFIG_IP_NF_IPTABLES CONFIG_IP_NF_MATCH_LIMIT CONFIG_IP_NF_MATCH_STATE CONFIG_IP_NF_FILTER CONFIG_IP_NF_NAT CONFIG_IP_NF_TARGET_MASQUERADE CONFIG_IP_NF_TARGET_LOG 我做的改变主要是删除了变量STATIC_IP以及和它相关的所有东西。以前,主要的过滤工作是基于变量STATIC_IP的,现在是INET_IFACE 了。也就是说,在这个脚本里,我们不再把-d $STATIC_IP作为过滤的条件,而是用 -i $INET_IFACE。这几乎是唯一的改变,也是必需的改变。可还是有一些问题要考虑。现在,我们不能再在INPUT链依据某些条件,比如--in-interface $LAN_IFACE --dst $INET_IP来进行过滤(译者注:因为这时已无固定的INET_IP)。这强迫我们只能基于Internet接口进行包的过滤,在这种情况下,内网必须访问那个可变的 Internet的IP。这会出现一些问题,有个例子可以说明这一点,就是我们在防火墙上运行HTTP服务。如果我们访问这个网站(其中,主页包含了一个指向HTTP服务器的静态连接,这可能是某个动态的DNS解决方案),问题就暴露了。经过NAT操作的机子会向DNS查询HTTP服务器的IP,然后再试着访问这个IP。万一我们是基于接口和IP做的过滤,这台机子就不能访问到HTTP了,因为INPUT链会 DROP掉这个包(译者注:还是因为Internet接口的IP不固定)。在某种情况下,这也会发生在你有静态IP的时候,但在那种情况下,我们可以增加一条规则,以检查LAN接口的包是否是发往INET_IP的,若是,则ACCEPT。如果你看过以前的内容,得到或写一个可以获取动态IP的脚本可能会是个解决问题的好办法。比如,我们可以写一个脚本,它紧随着Internet连接的启动而运行,而且它能从命令ifconfig的输出中提取IP,再把这个IP赋给某个变量。较好的办法是使用一些程序自带的脚本,如 pppd带的脚本ip-up。也有一些网站,如linuxguruz.org,提供了很多有用的脚本,你可以在附录其他资源和链接找到它的链接。 这个脚本比rc.firewall.txt的安全性要差一点。我明确地建议你尽可能使用后者,因为前者的开放性大了点,所以外部攻击的威胁就大了。 还有一种方法可获得IP,就是在脚本里加上类似这样的语句:INET_IP=`ifconfig $INET_IFACE | grep inet | cut -d : -f 2 | \cut -d ' ' -f 1`    上面这句话的作用是从ifconfig的输出里提取接口$INET_IFACE的IP,再赋给$INET_IP。更好的办法是使用脚本 retreiveip.txt。但要注意,这个方法可能会引起一些不正常的情况,比如使防火墙和内网之间已有的连接停止。下面就说明一下最常见的问题。如果这个脚本的代码是在另一个脚本内运行的,而那个脚本又是由PPP daemon启动的,就会因为NEW not SYN rules(具体信息查看未设置SYN的NEW状态包)的原因而挂起所以当前活动的连接。如果你删掉那个规则,可能会没有事,但还是不保险。如果你不想改动已有的规则,而又要添加或删除规则,还要不损害已有的规则,这就没法做了。比如,你又想阻塞所有局域网里的机子访问防火墙,又想让它们能控制防火墙上的PPP daemon,如果不删除那个用来阻塞的规则,怎么能完成这样的事?事情可能也不必这么复杂,就像上面说的,这会导致一些安全问题。但如果这个脚本能保持简单,维持规则的顺序与发现问题都是很容易的。--------------------------------------------------------------------------------8.5. rc.UTIN.firewall.txt脚本rc.UTIN.firewall.txt适用于这样的情况:我们不信任任何与防火墙连接的网络,包括内网。我们只允许内网使用POP3、HTTP 和FTP。至于从Internet来的连接,权限和其他脚本一样。此脚本需要以下功能模块。CONFIG_NETFILTER CONFIG_IP_NF_CONNTRACK CONFIG_IP_NF_IPTABLES CONFIG_IP_NF_MATCH_LIMIT CONFIG_IP_NF_MATCH_STATE CONFIG_IP_NF_FILTER CONFIG_IP_NF_NAT CONFIG_IP_NF_TARGET_LOG 这个脚本遵循的原则是不要相信任何人,包括我们自己的员工。这是个令人悲痛的现实,大部分破坏和攻击确实是来自我们内部的。这个脚本只是在加强防火墙方面给了你一个例子。它和 rc.firewall.txt并没有太多的不同,只是少了一些允许通行的规则。 --------------------------------------------------------------------------------8.6. rc.test-iptables.txt这个脚本用来测试iptables里所有的链。当然,这要根据你的配置情况做些操作,如打开ip_forwarding或是设置masquerading,等等。只要你的安装了基本的 iptables,就可以使用它。其实这个脚本只使用了LOG,以便能记录所有的ping请求与应答。通过这种方式,我们就可以了解哪些链被穿越了以及被穿越的顺序。使用方法如下,先运行这个脚本,再发布一个ping命令,如:ping -c 1 host.on.the.internet    然后用命令tail -n 0 -f /var/log/messages就可看到用了哪些链以及是什么顺序,除非记录因某些原因被替换了。 此脚本仅仅是为测试而写的。也就是说,不要使用类似这样的规则,它记录某一类包的所有信息,这会很快地占满你的日志分区,而且它会成为一个有效的DoS攻击。它还可能导致在最初的DoS攻击之后,无法记录真正的攻击信息。 --------------------------------------------------------------------------------8.7. rc.flush-iptables.txtrc.flush-iptables.txt不应该被称作脚本,它只是重置并清空所有的表、链。它先把filter表的INPUT、OUTPUT和 FORWARD链的策略设为缺省的ACCEPT,然后是nat表的PREROUTING 、POSTROUTING和OUTPUT链。我们这样做就不必为被关闭的连接和没有通过的包而操心。这个脚本就是为防火墙设置和除错用的,因此我们只关心打开所有的东西并恢复它们的缺省值就行了。之后,我们清空filter表里所有的链,紧接着是NAT表的。这样,就不会有什么不应该存在的规则了。这个做完后就该删除filter表和NAT表里的自定义链了。这时,脚本的工作就应该完成了。当然,如果你用到了mangle表,可以在这个脚本里添加相应的清空规则。(译者注:其实作者已经这样做了) 最后再说明一下,有些人写信建议我把这个脚本放到rc.firewall脚本里面,而且是用Red Hat Linux脚本的语法,这样当rc.firewall启动时,这个脚本也可以启动。但我不会这样做的,因为这是一个指南,主要是用来学习iptables的使用方法的,不应该有过多的shell脚本特有的语法。加入shell脚本特有的语法会使阅读的难度大大增加,这就远离了我的初衷。这个指南是按照易读的标准来写的,以后我会继续这样做。--------------------------------------------------------------------------------8.8. Limit-match.txt这个脚本是用来测试limit match的,也会让你明白limit match是如何工作的。装入这个脚本,再用不同的时间间隔发送ping数据包,可以看出哪个包可以通过,这些包又是以什么频率通过的。你应该可以看出,在limit的burst值再次到达之前,所有的echo replies都会被阻塞。--------------------------------------------------------------------------------8.9. Pid-owner.txt这个脚本说明了如何使用PID owner match。它其实什么都没做,但你可以运行一下,命令iptables -L -v的输出会说明它确实匹配了些东西。--------------------------------------------------------------------------------8.10. Sid-owner.txt说明SID owner match如何使用的一个例子。同样,它也是什么都没做,但你可以运行一下,命令iptables -L -v的输出会说明它确实匹配了些东西。--------------------------------------------------------------------------------8.11. Ttl-inc.txt一个小小的例子,说明了如何隐藏我们的防火墙或路由器,以使跟踪路由程序看不到,这样就可以对可能的攻击者隐藏很多信息。--------------------------------------------------------------------------------8.12. Iptables-save ruleset这只是一个输出的例子,它在规则的保存与恢复里被用来说明 iptables-save命令是如何使用的。所以,它没有任何用处,只是一个参考而已。--------------------------------------------------------------------------------附录 A. 常用命令详解A.1. 查看当前规则集的命令查看当前正在使用的规则集是一个十分常用的操作,使用iptables的什么命令还记得吗?我们可是在规则是如何练成的这一章里介绍过啊,虽然到时说得简单了点。再复习一下吧,命令语法如下:iptables -L 这个命令会尽可能地以易读的形式显示当前正在使用的规则集。比如,它会尽量用文件/etc/services里相应的名字表示端口号,用相应的DNS记录表示IP地址。但后者可能会导致一些问题,例如,它想尽力把LAN的IP地址(如192.168.1.1)解析成相应的名字。但192.168.0.0/16这个网段是私有的,也就是说,它只能用在局域网里,而不能在Internet里使用,所以它不会被Internet上的DNS服务器解析。因此,当解析这个地址时,命令就好像停在那儿了。为了避免这种情况的发生,我们就要使用选项: iptables -L -n 如果你想看看每个策略或每条规则、每条链的简单流量统计,可以在上面的命令后再加一个verbose标志,如下:iptables -L -n -v 不要忘了,iptables -L命令还可以查看nat表和mangle表的内容哦(更不要忘了,默认的表是filter),只需要使用-t选项,比如我们只想看nat表的规则,就用下面的命令:iptables -L -t nat 在/proc里,可能还有一些文件你会感兴趣。比如,你可以在连接跟踪记录表里看到当前有哪些连接。这个表包含了当前的所有连接,你还可以通过它了解到每个连接处于什么状态。要注意,这个表是不能编辑的,即使可以,也不应该更改它。可以用下面的命令查看这个表:cat /proc/net/ip_conntrack | less 此命令会显示当前所有被跟踪的连接,但要读懂那些记录可是有些难度哦。--------------------------------------------------------------------------------A.2. 修正和清空iptables的命令即使你把iptables弄的一塌糊涂,我们也有非常有效的命令来处理,而不必重新启动计算机。我接到过很多关于这个问题的询问,所以我想最好在这儿回答一下。如果你增加的规则有问题,要想删掉它,只要把命令中的-A改为-D即可。这样,iptables就会找到那个错误的规则并删掉它,但如果在你的规则里有好几条同样的规则,它只能删掉找到的第一条。如果你不想这样的事情发生,那就试试用序号来删除。如,你想删除INPUT链的第10条规则,可以使用 iptables -D INPUT 10。还有一种情况,就是要清空整个链,这就要使用选项-F。比如,我们要清空整个 INPUT链,使用的命令就是iptables -F INPUT。但是要注意,选项-F并不改变链的缺省策略。所以,如果被我们清空的那条INPUT链的策略是DROP,它还是会阻塞所有的包。那怎么才能重置策略呢?还记得策略DROP是如何设置的吧,还是用那个方法啊。比如,我们把INPUT链的策略改为ACCEPT,就用iptables -P INPUT ACCEPT。我已经写了一个用来清空并重置iptables的脚本,叫做rc.flush- iptables.txt(附录里有它的代码),在你写自己的防火墙脚本时,很可能会用到。但如果你在mangle表里乱试乱改而导致问题的话,这个脚本就帮不上忙了。因为在脚本rc.firewall.txt里,我没有用到mangle表,所以在 rc.flush-iptables.txt里也就没有添加相应的恢复功能。--------------------------------------------------------------------------------附录 B. 常见问题与解答B.1. 模块装载问题装载模块时,你可能会遇到几个问题,比如,有错误提示说明没有你指定名字的那种模块: insmod: iptable_filter: no module by that name found这个提示是无关紧要的,因为那些模块很有可能已经被静态地编译进内核了。当你遇到这个信息时,这是你应该首先想到的。至于是否真的如我们所想,最简单的测试方就是敲一个用到那个模块功能的命令试试。对于上面的情况,可能是filter表没有装入,从而就没有相应的功能,当然不能使用filter表了。为了检查 filter表是否装入,可以用下面的命令来试试:iptables -t filter -L   这个命令会输出filter表里所有的链,或者是运行失败,给出错误提示信息。如果一切正常,输出结果类似下面的情况,当然,这还要看你是否已经在filter表里加入了规则(译者注:在这个例子里,表是空的)。Chain INPUT (policy ACCEPT)target   prot opt source               destinationChain FORWARD (policy ACCEPT)target   prot opt source               destinationChain OUTPUT (policy ACCEPT)target   prot opt source               destination    如果你确实没有装载filter表,得到的就是如下信息:iptables v1.2.5: can't initialize iptables table `filter': Table \   does not exist (do you need to insmod?)Perhaps iptables or your kernel needs to be upgraded.    这个问题就有些严重了,从此提示中我们能得到两个信息:第一,我们确实没有把相应的功能编译进内核里;第二,在模块一般应在的目录中没有找到这个模块。这意味着问题是,你或者忘记了装载想用的模块,或者没有用depmod -a命令更新模块数据库,或者没有把相应的功能编译进内核(不论是静态的还是作为模块)。当然还可能是其他原因,但这些是主要的,不管怎样,大部分原因是很容易解决的。比如,第一个问题可以简单地通过在内核源码目录里运行make modules_install 命令来解决,这当然是有前提的,就是源码已经编译(compile)而且模块已经构建(build)。第二个问题的解决办法也很简单,只要运行一下depmod -a命令,之后再看看能否正常工作即可。第三个问题有点超出我们的范围了,而且这个问题或多或少会让你感到发晕。更多的信息可以在Linux文档计划里找到。在运行iptables时,你还可能得到另外一个错误信息: iptables: No chain/target/match by that name   这说明你要用的链或target、或match不存在,原因有很多,但最普遍的是你拼错了名字。当你想使用一个不可用的模块时也会产生这种错误。模块之所以不可用,可能是因为你没有装载正确的模块,或者内核里不包含那个模块,或者是iptables自动装载模块时失败了。通常,你不止应该考虑上面提到的所有解决办法,还要考虑规则中target的拼写错误,或者其他的原因。--------------------------------------------------------------------------------B.2. 未设置SYN的NEW状态包iptables有个“特点”没有被很好地给以说明,所以很多人(当然,也包括我)都忽视了它。这个“特点”就是:如果你使用状态NEW,那么未设置SYN的包也会通过防火墙。之所以有这个特点,是因为在某些情况下,我们想把那样的包看作某个(比如是和另一个防火墙有关的)已处于ESTABLISHED状态的连接的一部分。这个特点使拥有两个或更多的防火墙协同工作成为可能,而且可使数据在服务器间无丢失的传输,如辅助防火墙可以接受子网的防火墙的操作。但它也会导致这样的事情:状态 NEW会允许几乎所有的TCP连接进入,而不管是否有3次握手。为了处理这个问题,我们需要在防火墙的 INPUT链、OUTPUT链和FORWARD链加入如下规则(译者注:此规则作者称为“NEW not SYN rules”,下一小节还会提到):$IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j LOG \   --log-prefix "New not syn:"$IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j DROP   警告,在Netfilter/iptables项目中,这个特点所拥有的行为缺少文档说明,更明确的说,在你的防火墙上,它是一个很不安全的因素。注意,这个规则用于microsoft的TCP/IP(微软实现的TCP/IP就是不行,至少现在不行)产生的包时还是有些问题。如果包是由microsoft的产品生成的,且被标为状态NEW,那么就会被此规则记录然后丢弃。看起来规则工作很正常啊,是吧。但问题就出在这儿了,因为连接无法中断了。这个问题出现在关闭连接时,在最后一个包即FIN/ACK包发出后,Netfilter的状态机制就会关闭连接、删除连接跟踪表里的相应记录。但就在这时,Microsoft那不完善的程序会发送另外一个包,这个包就是那种未设置SYN且被认为是NEW状态的包,因此它就会被上面的规则匹配。换句话说,就是对这个规则不需要过于关注,如果你很在意它,就在规则里加入选项--log-headers吧。这样,你就可以把包头记录下来,从而可以更好地了解相应的包。对于这个规则,还有一些已知的问题。比如,某个连接(比如是从LAN发出的)已经连接到防火墙,而且有个脚本要在启动PPP时激活。当你启动PPP连接时,刚才提到的那个连接可能就会被干掉(be killed)。当然,这只会在特定的情况下才能发生,就是你把conntrack和nat作为模块运行,并且每次运行那个脚本时这两个模块都要被装入和卸载。如果你在防火墙之外的机子上运行telnet,而且又通过这个telnet连接运行脚本rc.firewall.txt,也会导致上面的问题。为了能简单地表达这个问题,你先准备一个telnet连接,或其他的流连接,再运行连接跟踪模块,然后装入上面的规则,最后,试着用telnet client或daemon发送一些数据。效果应该出来了,连接跟踪代码会认为这个连接是非法的,因为在此之前,它没有看到任何方向有包发出,更为严重的是现在连接上有了未设置SYN的包,因为刚才由telnet client或daemon发出的包肯定不是这个连接的第一个包。因此,上面的规则就起作用了,也就是说,这个包会被记录下来,然后被无情地扔掉,从而连接就会中断。--------------------------------------------------------------------------------B.3. NEW状态的SYN/ACK包某些,TCP欺骗攻击所用的技术叫做序列号预测(Sequence Number Prediction)。在这类攻击中,攻击者利用另一台机子的IP访问攻击对象(译者注:这就是为什么叫欺骗的原因了,攻击者是想假冒另一台被攻击对象信任的机子,以达到欺骗攻击对象的目的),然后再试着预测攻击对象使用什么序列号。我们来看看典型的使用序列号预测技术的欺骗是如何实现的,参与者:攻击者(attacker)试图假装另一台机子(other host)向受害者(victim)发送数据。以的IP为源地址向发SYN。向回应SYN/ACK。现在,若以RST回应这个未知的SYN/ACK,攻击就失败了,但如果已经没有这个能力了呢?比如它早已被另外的攻击(如SYN flood)降服,或者被关闭,或者它的RST包被防火墙拒绝。如果没能破坏这条连接,而且猜对了序列号,那它就能以的身份和交谈了。只要我们没能在第三步以RST回应那个未知的SYN/ACK包,就会被攻击,而且我们还会被连累(译者注:因为我们本身也被攻击了,而且还可能会成为攻击者的替罪羊被起诉,呜呜,好惨)。所以,为安全起见,我们应该以正确的方式向发送一个RST包。如果我们使用类似“NEW not SYN rules”(译者注:在上一小节中)的规则,SYN/ACK包就可以被丢弃了。因此,我们在bad_tcp_packets链中加入了如下规则:iptables -A bad_tcp_packets -p tcp --tcp-flags SYN,ACK SYN,ACK \-m state --state NEW -j REJECT --reject-with tcp-reset   这样,你想成为上面那个的机会就很少了(译者注:作者好幽默啊,我们可不想成为被别人利用的对象),而且这条规则在绝大部分情况下是安全的,不会有什么副作用,但多个防火墙要协同工作的情况要除外。那种情况下,防火墙之间会经常传递、接受包或流,有了这条规则,有些连接可能会被阻塞,即使是合法的连接。这条规则的存在还产生了另外一问题,就是有几个portscan(端口扫描器)会看到我们的防火墙,但好在仅此而已。--------------------------------------------------------------------------------B.4. 使用私有IP地址的ISP我的一位朋友告诉我说有些事我完全忘记了,从那时起,我就把这一节加上了。你刚上网时连接的网络是 ISP提供的,但某些愚蠢的ISP在那个网络里使用的是私有地址,而那是IANA专门分配给局域网使用的。Swedish Internet Service Provider和电话垄断企业Telia就是这样做的,例如在DNS服务器上,他们使用的IP地址段就是10.x.x.x。我们最容易遇到的问题是,在这个脚本里,为了防止被欺骗,不允许从10.x.x.x发出的连接来访问我们。不幸的是,对于上面的例子,为了DNS能正常地被访问,我们不得不把规则的放宽松一些。也就是说,我们或者在刚才提到的那条防止欺骗的规则上面增加一条规则(如下),或者是把那条规则注释掉:/usr/local/sbin/iptables -t nat -I PREROUTING -i eth1 -s \   10.0.0.1/32 -j ACCEPT   我愿意对这些ISP再多费些唇舌。这些IP地址不是为了让你象这样愚蠢的使用而分配给你的,至少我知道不是这样的。对于一个大集团的站点或者是我们自己的家庭网络来说,这样用是很合适的,但你不能只因为你们的一些原因就强迫我们把自己公示于天下。 --------------------------------------------------------------------------------B.5. 放行DHCP数据一旦你了解DHCP是如何工作的,就会知道这其实是一个很简单的任务。但你必须小心处理到底让谁进入、不让谁进入。首先,我们要明白DHCP是工作在UDP协议之上的,所以,UDP协议是我们期望的第一个条件。其次,我们应该检查是从那个接口接收和发送请求的。例如,如果我们设置了DHCP使用接口eth0,那就要阻塞 eth1上的DHCP请求。为了让规则再详细些,我们只需打开(allow)DHCP实际使用的UDP端口,一般都是67和 68。这两个端口是标准定义,我们就用它们来匹配被允许的包。现在,规则应该是这个样子的:$IPTABLES-I INPUT -i $LAN_IFACE -p udp --dport 67:68 --sport \   67:68 -j ACCEPT   注意,现在我们能够接受所有来自和发往UDP端口67、68的数据,好像不太安全,但这并不是多大的问题,因为这条规则只允许从67或68端口连接的主机才能访问。当然,此规则还可以更严谨一些,但也应该足够接受所有的DHCP请求和更新,而不至于需要在防火墙上开一个大洞。如果你很在意现在的规则是否很宽松,你当然可以写一个限制条件更紧的。--------------------------------------------------------------------------------B.6. 关于mIRC DCC的问题mIRC使用一个特殊的设定,它可以使mIRC连接穿过防火墙,也可以使DCC连接能在防火墙不了解它的情况下正常工作。如果此选项和iptables还有ip_conntrack_irc模块与ip_nat_irc模块一起使用,那mIRC就不能工作了。问题在于mIRC会自动对包进行NAT操作,这样当包到达防火墙后,防火墙就完全不知道该对包做什么了,也不知道该怎么做。如果是防火墙来处理,它只是简单地用自己的IP去询问IRC服务器,然后用那个地址发送DCC请求。mIRC不希望防火墙自作聪明地以这种方式代替自己来处理这个包。打开“I am behind a firewall”(我在防火墙后)这个配置选项并且使用ip_conntrack_irc和 ip_nat_irc模块,会导致Netfilter建立包含“Forged DCC send packet”的记录。最简单的解决办法是不要选中mIRC的那个选项而让iptables来做这些工作。意思就是要明确地告诉mIRC,它不是在防火墙后面的。 --------------------------------------------------------------------------------附录 C. ICMP类型这是一个完整的ICMP类型的列表:Table C-1. ICMP类型TYPE CODE Description Query Error 0 0 Echo Reply??回显应答(Ping应答) x   3 0 Network Unreachable??网络不可达   x 3 1 Host Unreachable??主机不可达   x 3 2 Protocol Unreachable??协议不可达   x 3 3 Port Unreachable??端口不可达   x 3 4 Fragmentation needed but no frag. bit set??需要进行分片但设置不分片比特   x 3 5 Source routing failed??源站选路失败   x 3 6 Destination network unknown??目的网络未知   x 3 7 Destination host unknown??目的主机未知   x 3 8 Source host isolated (obsolete)??源主机被隔离(作废不用)   x 3 9 Destination network administratively prohibited??目的网络被强制禁止   x 3 10 Destination host administratively prohibited??目的主机被强制禁止   x 3 11 Network unreachable for TOS??由于服务类型TOS,网络不可达   x 3 12 Host unreachable for TOS??由于服务类型TOS,主机不可达   x 3 13 Communication administratively prohibited by filtering??由于过滤,通信被强制禁止   x 3 14 Host precedence violation??主机越权   x 3 15 Precedence cutoff in effect??优先中止生效   x 4 0 Source quench??源端被关闭(基本流控制)   5 0 Redirect for network??对网络重定向   5 1 Redirect for host??对主机重定向   5 2 Redirect for TOS and network??对服务类型和网络重定向   5 3 Redirect for TOS and host??对服务类型和主机重定向      8 0 Echo request??回显请求(Ping请求) x   9 0 Router advertisement??路由器通告   10 0 Route solicitation??路由器请求   11 0 TTL equals 0 during transit??传输期间生存时间为0    x 11 1 TTL equals 0 during reassembly??在数据报组装期间生存时间为0   x 12 0 IP header bad (catchall error)??坏的IP首部(包括各种差错)   x 12 1 Required options missing??缺少必需的选项   x 13 0 Timestamp request (obsolete)??时间戳请求(作废不用) x   14   Timestamp reply (obsolete)??时间戳应答(作废不用)x   15 0 Information request (obsolete)??信息请求(作废不用) x   16 0 Information reply (obsolete)??信息应答(作废不用)x   17 0 Address mask request??地址掩码请求 x   18 0 Address mask reply??地址掩码应答 x   --------------------------------------------------------------------------------附录 D. 其他资源和链接这里有一些资源的链接,我从这些地方获得了不少信息,相信对你应该也很有帮助:ip-sysctl.txt ??来自内核2.4.14,一篇关于IP网络控制参数的短小精干的参考文章。The Internet Control Message Protocol ??一篇很好的详细介绍ICMP协议的文章,作者是Ralph Walden。RFC 792 - Internet Control Message Protocol ??ICMP的权威文件,如果你想找关于ICMP协议的信息,这是你应该首先想到的地方。作者:J. Postel。RFC 793 - Transmission Control Protocol ??TCP的权威文件,从1981年开始,它就成为TCP的规范了。只要你想学习TCP,就一定要读读这篇技术性很强的文章。作者:J. Postelip_dynaddr.txt ??来自内核2.4.14,关于通过sysctl和proc文件系统设置ip_dynaddr 的参考文章。iptables.8 ??iptables 1.2.4的帮助,这是HTML版本的。在你读写iptables规则时,这是一个很好的参考,你应该把它带在身边。Firewall rules table ??由Stuart Clark给出的一个小小的PDF文件,里面是防火墙配置的参考样式,对你书写自己的防火墙规则很有帮助。http://www.netfilter.org/ ??Netfilter和iptables的官方网站,是每一个打算在linux里配置iptables和 Netfilter的人必到之处。http://www.netfilter.org/documentation/index.html#FAQ ??官方的Netfilter Frequently Asked Questions,是开始了解iptables和Netfilter的好去处。http://www.netfilter.org/unreliable-guides...OWTO/index.html ??非常好的包过滤基础指南,介绍了如何使用iptables进行包过滤。作者是iptables 和Netfilter的核心开发者之一Rusty Russell。http://www.netfilter.org/unreliable-guides...OWTO/index.html ??介绍网络地址转换的很好的指南。作者是iptables和Netfilter的核心开发者之一Rusty Russell。http://www.netfilter.org/unreliable-guides...OWTO/index.html ??只有很少的文章介绍如何在Netfilter和iptables 的用户空间、内核空间里编写代码,这是其中一篇。作者还是Rusty Russell。http://www.linuxguruz.org/iptables/ ??很好的资源链接网页,里包含了Internet 上大部分关于iptables的链接,尤其是它还包含了很多为不同用处而写的iptables脚本的链接。http://www.islandsoft.net/veerapen.html ??这篇文章讨论了iptables自动增强坚固性的可能,以及如何通过很少的改动使你的计算机能自动地把敌对站点加入iptables的一个特殊的“禁止列表”。/etc/protocols ??此文件是从Slackware发行版中抽取的。你可以利用此文件找到协议所对应的协议号,如IP、ICMP或TCP对应的号码。/etc/services ??此文件也是从Slackware发行版中抽取的。它非常值得一读,你可以大致了解什么协议使用什么端口。Internet Engineering Task Force ??IETF是制定和维护互联网标准的最大的组织之一,很多大企业集团和个人都是它的成员,他们共同工作是为了确保Internet的互操作性。Linux Advanced Routing and Traffic Control HOW-TO ??此站点主要讨论Linux高级路由和流量控制,这个HOW-TO是关于Linux高级路由的最大的也是最好的一篇文章。作者是Bert Hubert。Paksecured Linux Kernel patches ??此站点包含了Matthew G. Marsh写的所有内核补丁,FTOS patch就在这儿。ULOGD project page ??ULOGD的站点。The Linux Documentation Project ??有关Linux的文档的极好(可以说是最好)的站点。有关Linux的很多较大的文档这儿都有,如果TLDP里没有,你就要好好地在网络上搜索一下了。如果你想了解多一些,就去看看吧。http://kalamazoolinux.org/presentations/20.../conntrack.html ??这篇文章里有一个极其精彩的例子,它是用来展示conntrack模块以及它在Netfilter里的工作的。如果你想多看一些有关conntrack的文章,这一篇应该是必读的。http://www.docum.org/ ??此站点包含了全部有关CBQ(Class Based Queue)、tc和ip命令的资料,这是很少的几个这样的站点中的一个。此站点由Stef Coene维护。http://lists.samba.org/mailman/listinfo/netfilter ??Netfilter的官方邮件列表,非常有用哦。万一你遇到了一些问题,而这篇文章或这里提到的一些链接解决不了,它就是你的救世主了。当然,资源不止我上面提到的这些,还有iptables的源码和文档,及很多可以帮助你的朋友。--------------------------------------------------------------------------------

fnhssap 发表于 2004-8-25 22:31:16

附录 E. 鸣谢很多朋友在我写这篇文章时给了我热心的帮助,我要感谢他们:Fabrice Marie,对我糟糕的语法和拼写做了大量的订正,还用make文件等工具把这篇指南转换成了DocBook。Marc Boucher,在状态匹配代码的使用方面给了我很多帮助。 Frode E. Nyboe,大幅度改善了rc.firewall的规则,当我要重写这个规则集、把多个表的遍历(the multiple table traversing)引入同一份文件时,给了我很多灵感。Chapman Brad, Alexander W. Janssen,开始时,我对包如何穿越nat和filter 表的理解是错误的,是他们使我了解到这一点的,而且他们还给了我正确的顺序。Michiel Brandenburg, Myles Uyema,帮我解决了一些状态匹配代码,并让它正常问题。Kent `Artech' Stahre,帮我绘制图形,还帮我查错。Anders 'DeZENT' Johansson,提示我有些古怪的ISP在Internet上使用保留的网址,至少对他来说遇到了这样的情况。Jeremy `Spliffy' Smith,提示我有些内容容易使大家糊涂,还帮我进行了测试和查错。还有很多人,我和他们进行过讨论,也请教过他们,这里不能一一提及了。 --------------------------------------------------------------------------------Appendix F. HistoryVersion 1.1.19 (21 May 2003).By:Oskar AndreassonContributors: Peter van Kampen,Xavier Bartol, Jon Anderson, Thorsten Bremer and Spanish Translation Team.Version 1.1.18 (24Apr 2003).By: Oskar AndreassonContributors:Stuart Clark, Robert P. J. Day,Mark Orenstein and Edmond Shwayri.Version 1.1.17(6Apr 2003).By: Oskar AndreassonContributors:Geraldo Amaral Filho, Ondrej Suchy, Dino Conti,Robert P. J. Day, Velev Dimo, Spencer Rouser,Daveonos, Amanda Hickman, Olle Jonsson and Bengt Aspvall.Version 1.1.16 (16 Dec 2002).By:Oskar AndreassonContributors: Clemens Schwaighower,Uwe Dippel and Dave Wreski.Version 1.1.15 (13Nov 2002).By: Oskar AndreassonContributors:Mark Sonarte, A. Lester Buck, Robert P. J. Day,Togan Muftuoglu,Antony Stone, Matthew F.Barnes and Otto Matejka. Version 1.1.14 (14Oct 2002).By: Oskar AndreassonContributors:Carol Anne, Manuel Minzoni, Yves Soun, Miernik,Uwe Dippel, Dave Klipec and Eddy L O Jansson. Version 1.1.13 (22 Aug 2002)http://iptables- tutorial.haringstad.comBy: Oskar AndreassonContributors:Tons of people reporting bad HTML version.Version 1.1.12 (19 Aug 2002)http://www.netfilter.org/tutorial/By:Oskar AndreassonContributors: Peter Schubnell, Stephen J.Lawrence, Uwe Dippel, Bradley Dilger, Vegard Engen,Clifford Kite, Alessandro Oliveira, Tony Earnshaw, Harald Welte, Nick Andrew and Stepan Kasal.Version 1.1.11 (27 May 2002)http://www.netfilter.org/tutorial/By:Oskar AndreassonContributors: Steve Hnizdur,Lonni Friedman,Jelle Kalf, Harald Welte, Valentina Barrios and Tony Earnshaw.Version 1.1.10 (12April 2002)http://www.boingworld.com/workshops/linux/iptables-tutorial/By:Oskar AndreassonContributors: Jelle Kalf,Theodore Alexandrov, Paul Corbett, Rodrigo Rubira Branco, Alistair Tonner, Matthew G. Marsh,Uwe Dippel, Evan Nemerson and Marcel J.E. Mol.Version 1.1.9 (21 March 2002)http://www.boingworld.com/workshops/linux/iptables-tutorial/By: Oskar Andreasson Contributors: Vince Herried, Togan Muftuoglu, Galen Johnson,Kelly Ashe, JanneJohansson, Thomas Smets, Peter Horst,Mitch Landers, Neil Jolly, Jelle Kalf,Jason Lam and Evan Nemerson.Version 1.1.8 (5March 2002)http://www.boingworld.com/workshops/linux/iptables-tutorial/By:Oskar AndreassonVersion 1.1.7 (4 February 2002)http://www.boingworld.com/workshops/linux/iptables-tutorial/By: Oskar Andreasson Contributors: Parimi Ravi, Phil Schultz, Steven McClintoc,Bill Dossett,Dave Wreski, Erik Sj?und,Adam Mansbridge, Vasoo Veerapen, Aladdin andRusty Russell.Version 1.1.6 (7 December 2001)http://people.unix-fu.org/andreasson/By: Oskar AndreassonContributors:Jim Ramsey, Phil Schultz, G?an B?e, Doug Monroe,JasperAikema, Kurt Lieber, Chris Tallon, Chris Martin,Jonas Pasche, JanLabanowski, Rodrigo R. Branco,Jacco van Koll and Dave Wreski.Version 1.1.5(14 November 2001)http://people.unix-fu.org/andreasson/By:Oskar AndreassonContributors: Fabrice Marie,Merijn Schering and Kurt Lieber.Version 1.1.4 (6November 2001)http://people.unix-fu.org/andreassonBy:Oskar AndreassonContributors: Stig W. Jensen,Steve Hnizdur, Chris Pluta and Kurt Lieber.Version 1.1.3 (9 October 2001)http://people.unix-fu.org/andreassonBy: Oskar AndreassonContributors: Joni Chu, N.Emile Akabi- Davis and Jelle Kalf.Version 1.1.2 (29September 2001)http://people.unix-fu.org/andreassonBy:Oskar AndreassonVersion 1.1.1 (26 September 2001)http://people.unix-fu.org/andreassonBy: Oskar AndreassonContributors:Dave Richardson.Version 1.1.0 (15 September 2001)http://people.unix-fu.org/andreassonBy: Oskar AndreassonVersion 1.0.9 (9 September 2001)http://people.unix-fu.org/andreasson By: Oskar AndreassonVersion 1.0.8 (7 September 2001) http://people.unix-fu.org/andreassonBy: Oskar AndreassonVersion 1.0.7 (23 August 2001)http://people.unix-fu.org/andreassonBy: Oskar AndreassonContributors: Fabrice Marie.Version 1.0.6http://people.unix-fu.org/andreassonBy: Oskar Andreasson Version 1.0.5http://people.unix-fu.org/andreassonBy:Oskar AndreassonContributors: Fabrice Marie.    --------------------------------------------------------------------------------Appendix G. GNU Free Documentation LicenseVersion 1.1, March 2000Copyright ?2000 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.--------------------------------------------------------------------------------0. PREAMBLEThe purpose of this License is to make a manual, textbook, or other written document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others.This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software.We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference.--------------------------------------------------------------------------------1. APPLICABILITY AND DEFINITIONSThis License applies to any manual or other work that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you".A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language.A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (For example, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them.The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License.The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License.A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, whose contents can be viewed and edited directly and straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup has been designed to thwart or discourage subsequent modification by readers is not Transparent. A copy that is not "Transparent" is called "Opaque".Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML designed for human modification. Opaque formats include PostScript, PDF, proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML produced by some word processors for output purposes only.The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text.--------------------------------------------------------------------------------2. VERBATIM COPYINGYou may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3.You may also lend copies, under the same conditions stated above, and you may publicly display copies.--------------------------------------------------------------------------------3. COPYING IN QUANTITYIf you publish printed copies of the Document numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects.If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages.If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a publicly-accessible computer-network location containing a complete Transparent copy of the Document, free of added material, which the general network-using public has access to download anonymously at no charge using public-standard network protocols. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public.It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document.--------------------------------------------------------------------------------4. MODIFICATIONSYou may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version:Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission.List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has less than five).State on the Title page the name of the publisher of the Modified Version, as the publisher.Preserve all the copyright notices of the Document.Add an appropriate copyright notice for your modifications adjacent to the other copyright notices.Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below.Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice.Include an unaltered copy of this License.Preserve the section entitled "History", and its title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence.Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission.In any section entitled "Acknowledgements" or "Dedications", preserve the section's title, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein.Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles.Delete any section entitled "Endorsements". Such a section may not be included in the Modified Version.Do not retitle any existing section as "Endorsements" or to conflict in title with any Invariant Section.If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles.You may add a section entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard.You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one.The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version.--------------------------------------------------------------------------------5. COMBINING DOCUMENTSYou may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice.The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work.In the combination, you must combine any sections entitled "History" in the various original documents, forming one section entitled "History"; likewise combine any sections entitled "Acknowledgements", and any sections entitled "Dedications". You must delete all sections entitled "Endorsements."--------------------------------------------------------------------------------6. COLLECTIONS OF DOCUMENTSYou may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects.You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document.--------------------------------------------------------------------------------7. AGGREGATION WITH INDEPENDENT WORKSA compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, does not as a whole count as a Modified Version of the Document, provided no compilation copyright is claimed for the compilation. Such a compilation is called an "aggregate", and this License does not apply to the other self-contained works thus compiled with the Document, on account of their being thus compiled, if they are not themselves derivative works of the Document.If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one quarter of the entire aggregate, the Document's Cover Texts may be placed on covers that surround only the Document within the aggregate. Otherwise they must appear on covers around the whole aggregate.--------------------------------------------------------------------------------8. TRANSLATIONTranslation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License provided that you also include the original English version of this License. In case of a disagreement between the translation and the original English version of this License, the original English version will prevail.--------------------------------------------------------------------------------9. TERMINATIONYou may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the Document is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.--------------------------------------------------------------------------------

fnhssap 发表于 2004-8-25 22:32:17

10. FUTURE REVISIONS OF THIS LICENSEThe Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See http://www.gnu.org/copyleft/.Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation.--------------------------------------------------------------------------------How to use this License for your documentsTo use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page:Copyright ?YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. A copy of the license is included in the section entitled "GNU Free Documentation License".If you have no Invariant Sections, write "with no Invariant Sections" instead of saying which ones are invariant. If you have no Front-Cover Texts, write "no Front-Cover Texts" instead of "Front-Cover Texts being LIST"; likewise for Back-Cover Texts.If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software.--------------------------------------------------------------------------------Appendix H. GNU General Public LicenseVersion 2, June 1991Copyright ?1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.--------------------------------------------------------------------------------0. PreambleThe licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too.When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.The precise terms and conditions for copying, distribution and modification follow.--------------------------------------------------------------------------------1. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATIONThis License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.NO WARRANTYBECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.END OF TERMS AND CONDITIONS--------------------------------------------------------------------------------2. How to Apply These Terms to Your New ProgramsIf you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.Copyright ?       This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USAAlso add information on how to contact you by electronic and paper mail.If the program is interactive, make it output a short notice like this when it starts in an interactive mode:Gnomovision version 69, Copyright ?year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc.,hereby disclaims all copyright interest in the progra m `Gnomovision' (which makes passes at compilers)written by James Hacker., 1 April 1989 Ty Coon, President of ViceThis General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. --------------------------------------------------------------------------------附录 I. 示例脚本的代码I.1. rc.firewall脚本代码#!/bin/sh## rc.firewall - Initial SIMPLE IP Firewall script for Linux 2.4.x and iptables## Copyright ?2001Oskar Andreasson ## This program is free software; you can redistribute it and/or modify# it under the terms of the GNU General Public License as published by# the Free Software Foundation; version 2 of the License.## This program is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the# GNU General Public License for more details.## You should have received a copy of the GNU General Public License# along with this program or from the site that you downloaded it# from; if not, write to the Free Software Foundation, Inc., 59 Temple# Place, Suite 330, Boston, MA02111-1307   USA############################################################################## 1. Configuration options.### 1.1 Internet Configuration.#INET_IP="194.236.50.155"INET_IFACE="eth0"INET_BROADCAST="194.236.50.255"## 1.1.1 DHCP### 1.1.2 PPPoE### 1.2 Local Area Network configuration.## your LAN's IP range and localhost IP. /24 means to only use the first 24# bits of the 32 bit IP address. the same as netmask 255.255.255.0#LAN_IP="192.168.0.2"LAN_IP_RANGE="192.168.0.0/16"LAN_IFACE="eth1"## 1.3 DMZ Configuration.### 1.4 Localhost Configuration.#LO_IFACE="lo"LO_IP="127.0.0.1"## 1.5 IPTables Configuration.#IPTABLES="/usr/sbin/iptables"## 1.6 Other Configuration.############################################################################## 2. Module loading.### Needed to initially load modules#/sbin/depmod -a## 2.1 Required modules#/sbin/modprobe ip_tables/sbin/modprobe ip_conntrack/sbin/modprobe iptable_filter/sbin/modprobe iptable_mangle/sbin/modprobe iptable_nat/sbin/modprobe ipt_LOG/sbin/modprobe ipt_limit/sbin/modprobe ipt_state## 2.2 Non-Required modules##/sbin/modprobe ipt_owner#/sbin/modprobe ipt_REJECT#/sbin/modprobe ipt_MASQUERADE#/sbin/modprobe ip_conntrack_ftp#/sbin/modprobe ip_conntrack_irc#/sbin/modprobe ip_nat_ftp#/sbin/modprobe ip_nat_irc############################################################################# 3. /proc set up.### 3.1 Required proc configuration#echo "1" > /proc/sys/net/ipv4/ip_forward## 3.2 Non-Required proc configuration##echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter#echo "1" > /proc/sys/net/ipv4/conf/all/proxy_arp#echo "1" > /proc/sys/net/ipv4/ip_dynaddr############################################################################# 4. rules set up.######## 4.1 Filter table### 4.1.1 Set policies#$IPTABLES -P INPUT DROP$IPTABLES -P OUTPUT DROP$IPTABLES -P FORWARD DROP## 4.1.2 Create userspecified chains### Create chain for bad tcp packets#$IPTABLES -N bad_tcp_packets## Create separate chains for ICMP, TCP and UDP to traverse#$IPTABLES -N allowed$IPTABLES -N tcp_packets$IPTABLES -N udp_packets$IPTABLES -N icmp_packets## 4.1.3 Create content in userspecified chains### bad_tcp_packets chain#$IPTABLES -A bad_tcp_packets -p tcp --tcp-flags SYN,ACK SYN,ACK \-m state --state NEW -j REJECT --reject-with tcp-reset $IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG \--log-prefix "New not syn:"$IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP## allowed chain#$IPTABLES -A allowed -p TCP --syn -j ACCEPT$IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT$IPTABLES -A allowed -p TCP -j DROP## TCP rules#$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 21 -j allowed$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 22 -j allowed$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 80 -j allowed$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 113 -j allowed## UDP ports##$IPTABLES -A udp_packets -p UDP -s 0/0 --destination-port 53 -j ACCEPT#$IPTABLES -A udp_packets -p UDP -s 0/0 --destination-port 123 -j ACCEPT$IPTABLES -A udp_packets -p UDP -s 0/0 --destination-port 2074 -j ACCEPT$IPTABLES -A udp_packets -p UDP -s 0/0 --destination-port 4000 -j ACCEPT## In Microsoft Networks you will be swamped by broadcasts. These lines # will prevent them from showing up in the logs.##$IPTABLES -A udp_packets -p UDP -i $INET_IFACE -d $INET_BROADCAST \#--destination-port 135:139 -j DROP## If we get DHCP requests from the Outside of our network, our logs will # be swamped as well. This rule will block them from getting logged.##$IPTABLES -A udp_packets -p UDP -i $INET_IFACE -d 255.255.255.255 \#--destination-port 67:68 -j DROP## ICMP rules#$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT## 4.1.4 INPUT chain### Bad TCP packets we don't want.#$IPTABLES -A INPUT -p tcp -j bad_tcp_packets## Rules for special networks not part of the Internet#$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -s $LAN_IP_RANGE -j ACCEPT$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LO_IP -j ACCEPT$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LAN_IP -j ACCEPT$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $INET_IP -j ACCEPT## Special rule for DHCP requests from LAN, which are not caught properly# otherwise.#$IPTABLES -A INPUT -p UDP -i $LAN_IFACE --dport 67 --sport 68 -j ACCEPT## Rules for incoming packets from the internet.#$IPTABLES -A INPUT -p ALL -d $INET_IP -m state --state ESTABLISHED,RELATED \-j ACCEPT$IPTABLES -A INPUT -p TCP -i $INET_IFACE -j tcp_packets$IPTABLES -A INPUT -p UDP -i $INET_IFACE -j udp_packets$IPTABLES -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets## If you have a Microsoft Network on the outside of your firewall, you may # also get flooded by Multicasts. We drop them so we do not get flooded by # logs##$IPTABLES -A INPUT -i $INET_IFACE -d 224.0.0.0/8 -j DROP## Log weird packets that don't match the above.#$IPTABLES -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \--log-level DEBUG --log-prefix "IPT INPUT packet died: "## 4.1.5 FORWARD chain### Bad TCP packets we don't want#$IPTABLES -A FORWARD -p tcp -j bad_tcp_packets## Accept the packets we actually want to forward#$IPTABLES -A FORWARD -i $LAN_IFACE -j ACCEPT$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT## Log weird packets that don't match the above.#$IPTABLES -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG \--log-level DEBUG --log-prefix "IPT FORWARD packet died: "## 4.1.6 OUTPUT chain### Bad TCP packets we don't want.#$IPTABLES -A OUTPUT -p tcp -j bad_tcp_packets## Special OUTPUT rules to decide which IP's to allow.#$IPTABLES -A OUTPUT -p ALL -s $LO_IP -j ACCEPT$IPTABLES -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT$IPTABLES -A OUTPUT -p ALL -s $INET_IP -j ACCEPT## Log weird packets that don't match the above.#$IPTABLES -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \--log-level DEBUG --log-prefix "IPT OUTPUT packet died: "####### 4.2 nat table### 4.2.1 Set policies### 4.2.2 Create user specified chains### 4.2.3 Create content in user specified chains### 4.2.4 PREROUTING chain### 4.2.5 POSTROUTING chain### Enable simple IP Forwarding and Network Address Translation#$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to-source $INET_IP## 4.2.6 OUTPUT chain######## 4.3 mangle table### 4.3.1 Set policies### 4.3.2 Create user specified chains### 4.3.3 Create content in user specified chains### 4.3.4 PREROUTING chain### 4.3.5 INPUT chain### 4.3.6 FORWARD chain### 4.3.7 OUTPUT chain### 4.3.8 POSTROUTING chain#    --------------------------------------------------------------------------------I.2. rc.DMZ.firewall脚本代码 #!/bin/sh## rc.DMZ.firewall - DMZ IP Firewall script for Linux 2.4.x and iptables## Copyright ?2001Oskar Andreasson ## This program is free software; you can redistribute it and/or modify# it under the terms of the GNU General Public License as published by# the Free Software Foundation; version 2 of the License.## This program is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the# GNU General Public License for more details.## You should have received a copy of the GNU General Public License# along with this program or from the site that you downloaded it# from; if not, write to the Free Software Foundation, Inc., 59 Temple# Place, Suite 330, Boston, MA02111-1307   USA############################################################################## 1. Configuration options.### 1.1 Internet Configuration.#INET_IP="194.236.50.152"HTTP_IP="194.236.50.153"DNS_IP="194.236.50.154"INET_IFACE="eth0"## 1.1.1 DHCP### 1.1.2 PPPoE### 1.2 Local Area Network configuration.## your LAN's IP range and localhost IP. /24 means to only use the first 24# bits of the 32 bit IP address. the same as netmask 255.255.255.0#LAN_IP="192.168.0.1"LAN_IFACE="eth1"## 1.3 DMZ Configuration.#DMZ_HTTP_IP="192.168.1.2"DMZ_DNS_IP="192.168.1.3"DMZ_IP="192.168.1.1"DMZ_IFACE="eth2"## 1.4 Localhost Configuration.#LO_IFACE="lo"LO_IP="127.0.0.1"## 1.5 IPTables Configuration.#IPTABLES="/usr/sbin/iptables"## 1.6 Other Configuration.############################################################################## 2. Module loading.### Needed to initially load modules#/sbin/depmod -a## 2.1 Required modules#/sbin/modprobe ip_tables/sbin/modprobe ip_conntrack/sbin/modprobe iptable_filter/sbin/modprobe iptable_mangle/sbin/modprobe iptable_nat/sbin/modprobe ipt_LOG/sbin/modprobe ipt_limit/sbin/modprobe ipt_state## 2.2 Non-Required modules##/sbin/modprobe ipt_owner#/sbin/modprobe ipt_REJECT#/sbin/modprobe ipt_MASQUERADE#/sbin/modprobe ip_conntrack_ftp#/sbin/modprobe ip_conntrack_irc#/sbin/modprobe ip_nat_ftp#/sbin/modprobe ip_nat_irc############################################################################# 3. /proc set up.### 3.1 Required proc configuration#echo "1" > /proc/sys/net/ipv4/ip_forward## 3.2 Non-Required proc configuration##echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter#echo "1" > /proc/sys/net/ipv4/conf/all/proxy_arp#echo "1" > /proc/sys/net/ipv4/ip_dynaddr############################################################################# 4. rules set up.######## 4.1 Filter table### 4.1.1 Set policies#$IPTABLES -P INPUT DROP$IPTABLES -P OUTPUT DROP$IPTABLES -P FORWARD DROP## 4.1.2 Create userspecified chains### Create chain for bad tcp packets#$IPTABLES -N bad_tcp_packets## Create separate chains for ICMP, TCP and UDP to traverse#$IPTABLES -N allowed$IPTABLES -N icmp_packets## 4.1.3 Create content in userspecified chains### bad_tcp_packets chain#$IPTABLES -A bad_tcp_packets -p tcp --tcp-flags SYN,ACK SYN,ACK \-m state --state NEW -j REJECT --reject-with tcp-reset$IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG \--log-prefix "New not syn:"$IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP## allowed chain#$IPTABLES -A allowed -p TCP --syn -j ACCEPT$IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT$IPTABLES -A allowed -p TCP -j DROP## ICMP rules## Changed rules totally$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT## 4.1.4 INPUT chain### Bad TCP packets we don't want#$IPTABLES -A INPUT -p tcp -j bad_tcp_packets## Packets from the Internet to this box#$IPTABLES -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets## Packets from LAN, DMZ or LOCALHOST### From DMZ Interface to DMZ firewall IP#$IPTABLES -A INPUT -p ALL -i $DMZ_IFACE -d $DMZ_IP -j ACCEPT## From LAN Interface to LAN firewall IP#$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -d $LAN_IP -j ACCEPT## From Localhost interface to Localhost IP's#$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LO_IP -j ACCEPT$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LAN_IP -j ACCEPT$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $INET_IP -j ACCEPT## Special rule for DHCP requests from LAN, which are not caught properly# otherwise.#$IPTABLES -A INPUT -p UDP -i $LAN_IFACE --dport 67 --sport 68 -j ACCEPT## All established and related packets incoming from the internet to the# firewall#$IPTABLES -A INPUT -p ALL -d $INET_IP -m state --state ESTABLISHED,RELATED \-j ACCEPT## In Microsoft Networks you will be swamped by broadcasts. These lines# will prevent them from showing up in the logs.##$IPTABLES -A INPUT -p UDP -i $INET_IFACE -d $INET_BROADCAST \#--destination-port 135:139 -j DROP## If we get DHCP requests from the Outside of our network, our logs will# be swamped as well. This rule will block them from getting logged.##$IPTABLES -A INPUT -p UDP -i $INET_IFACE -d 255.255.255.255 \#--destination-port 67:68 -j DROP## If you have a Microsoft Network on the outside of your firewall, you may# also get flooded by Multicasts. We drop them so we do not get flooded by# logs##$IPTABLES -A INPUT -i $INET_IFACE -d 224.0.0.0/8 -j DROP## Log weird packets that don't match the above.#$IPTABLES -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \--log-level DEBUG --log-prefix "IPT INPUT packet died: "## 4.1.5 FORWARD chain### Bad TCP packets we don't want#$IPTABLES -A FORWARD -p tcp -j bad_tcp_packets## DMZ section## General rules#$IPTABLES -A FORWARD -i $DMZ_IFACE -o $INET_IFACE -j ACCEPT$IPTABLES -A FORWARD -i $INET_IFACE -o $DMZ_IFACE -m state \--state ESTABLISHED,RELATED -j ACCEPT$IPTABLES -A FORWARD -i $LAN_IFACE -o $DMZ_IFACE -j ACCEPT$IPTABLES -A FORWARD -i $DMZ_IFACE -o $LAN_IFACE -m state \--state ESTABLISHED,RELATED -j ACCEPT## HTTP server#$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $DMZ_IFACE -d $DMZ_HTTP_IP \--dport 80 -j allowed$IPTABLES -A FORWARD -p ICMP -i $INET_IFACE -o $DMZ_IFACE -d $DMZ_HTTP_IP \-j icmp_packets## DNS server#$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $DMZ_IFACE -d $DMZ_DNS_IP \--dport 53 -j allowed$IPTABLES -A FORWARD -p UDP -i $INET_IFACE -o $DMZ_IFACE -d $DMZ_DNS_IP \--dport 53 -j ACCEPT$IPTABLES -A FORWARD -p ICMP -i $INET_IFACE -o $DMZ_IFACE -d $DMZ_DNS_IP \-j icmp_packets## LAN section#$IPTABLES -A FORWARD -i $LAN_IFACE -j ACCEPT$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT## Log weird packets that don't match the above.#$IPTABLES -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG \--log-level DEBUG --log-prefix "IPT FORWARD packet died: "## 4.1.6 OUTPUT chain### Bad TCP packets we don't want.#$IPTABLES -A OUTPUT -p tcp -j bad_tcp_packets## Special OUTPUT rules to decide which IP's to allow.#$IPTABLES -A OUTPUT -p ALL -s $LO_IP -j ACCEPT$IPTABLES -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT$IPTABLES -A OUTPUT -p ALL -s $INET_IP -j ACCEPT## Log weird packets that don't match the above.#$IPTABLES -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \--log-level DEBUG --log-prefix "IPT OUTPUT packet died: "####### 4.2 nat table### 4.2.1 Set policies### 4.2.2 Create user specified chains### 4.2.3 Create content in user specified chains### 4.2.4 PREROUTING chain#$IPTABLES -t nat -A PREROUTING -p TCP -i $INET_IFACE -d $HTTP_IP --dport 80 \-j DNAT --to-destination $DMZ_HTTP_IP$IPTABLES -t nat -A PREROUTING -p TCP -i $INET_IFACE -d $DNS_IP --dport 53 \-j DNAT --to-destination $DMZ_DNS_IP$IPTABLES -t nat -A PREROUTING -p UDP -i $INET_IFACE -d $DNS_IP --dport 53 \-j DNAT --to-destination $DMZ_DNS_IP## 4.2.5 POSTROUTING chain### Enable simple IP Forwarding and Network Address Translation#$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to-source $INET_IP## 4.2.6 OUTPUT chain######## 4.3 mangle table### 4.3.1 Set policies### 4.3.2 Create user specified chains### 4.3.3 Create content in user specified chains### 4.3.4 PREROUTING chain### 4.3.5 INPUT chain### 4.3.6 FORWARD chain### 4.3.7 OUTPUT chain### 4.3.8 POSTROUTING chain#    --------------------------------------------------------------------------------I.3. rc.UTIN.firewall脚本代码#!/bin/sh## rc.firewall - UTIN Firewall script for Linux 2.4.x and iptables## Copyright ?2001Oskar Andreasson ## This program is free software; you can redistribute it and/or modify# it under the terms of the GNU General Public License as published by# the Free Software Foundation; version 2 of the License.## This program is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the# GNU General Public License for more details.## You should have received a copy of the GNU General Public License# along with this program or from the site that you downloaded it# from; if not, write to the Free Software Foundation, Inc., 59 Temple# Place, Suite 330, Boston, MA02111-1307   USA############################################################################## 1. Configuration options.### 1.1 Internet Configuration.#INET_IP="194.236.50.155"INET_IFACE="eth0"INET_BROADCAST="194.236.50.255"## 1.1.1 DHCP### 1.1.2 PPPoE### 1.2 Local Area Network configuration.## your LAN's IP range and localhost IP. /24 means to only use the first 24# bits of the 32 bit IP address. the same as netmask 255.255.255.0#LAN_IP="192.168.0.2"LAN_IP_RANGE="192.168.0.0/16"LAN_IFACE="eth1"## 1.3 DMZ Configuration.### 1.4 Localhost Configuration.#LO_IFACE="lo"LO_IP="127.0.0.1"## 1.5 IPTables Configuration.#IPTABLES="/usr/sbin/iptables"## 1.6 Other Configuration.############################################################################## 2. Module loading.### Needed to initially load modules#/sbin/depmod -a## 2.1 Required modules#/sbin/modprobe ip_tables/sbin/modprobe ip_conntrack/sbin/modprobe iptable_filter/sbin/modprobe iptable_mangle/sbin/modprobe iptable_nat/sbin/modprobe ipt_LOG/sbin/modprobe ipt_limit/sbin/modprobe ipt_state## 2.2 Non-Required modules##/sbin/modprobe ipt_owner#/sbin/modprobe ipt_REJECT#/sbin/modprobe ipt_MASQUERADE#/sbin/modprobe ip_conntrack_ftp#/sbin/modprobe ip_conntrack_irc#/sbin/modprobe ip_nat_ftp#/sbin/modprobe ip_nat_irc############################################################################# 3. /proc set up.### 3.1 Required proc configuration#echo "1" > /proc/sys/net/ipv4/ip_forward## 3.2 Non-Required proc configuration##echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter#echo "1" > /proc/sys/net/ipv4/conf/all/proxy_arp#echo "1" > /proc/sys/net/ipv4/ip_dynaddr############################################################################# 4. rules set up.######## 4.1 Filter table### 4.1.1 Set policies#$IPTABLES -P INPUT DROP$IPTABLES -P OUTPUT DROP$IPTABLES -P FORWARD DROP## 4.1.2 Create userspecified chains### Create chain for bad tcp packets#$IPTABLES -N bad_tcp_packets## Create separate chains for ICMP, TCP and UDP to traverse#$IPTABLES -N allowed$IPTABLES -N tcp_packets$IPTABLES -N udp_packets$IPTABLES -N icmp_packets## 4.1.3 Create content in userspecified chains### bad_tcp_packets chain#$IPTABLES -A bad_tcp_packets -p tcp --tcp-flags SYN,ACK SYN,ACK \-m state --state NEW -j REJECT --reject-with tcp-reset$IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG \--log-prefix "New not syn:"$IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP## allowed chain#$IPTABLES -A allowed -p TCP --syn -j ACCEPT$IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT$IPTABLES -A allowed -p TCP -j DROP## TCP rules#$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 21 -j allowed$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 22 -j allowed$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 80 -j allowed$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 113 -j allowed## UDP ports##$IPTABLES -A udp_packets -p UDP -s 0/0 --source-port 53 -j ACCEPT#$IPTABLES -A udp_packets -p UDP -s 0/0 --source-port 123 -j ACCEPT$IPTABLES -A udp_packets -p UDP -s 0/0 --source-port 2074 -j ACCEPT$IPTABLES -A udp_packets -p UDP -s 0/0 --source-port 4000 -j ACCEPT## In Microsoft Networks you will be swamped by broadcasts. These lines# will prevent them from showing up in the logs.##$IPTABLES -A udp_packets -p UDP -i $INET_IFACE -d $INET_BROADCAST \#--destination-port 135:139 -j DROP## If we get DHCP requests from the Outside of our network, our logs will# be swamped as well. This rule will block them from getting logged.##$IPTABLES -A udp_packets -p UDP -i $INET_IFACE -d 255.255.255.255 \#--destination-port 67:68 -j DROP## ICMP rules#$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT## 4.1.4 INPUT chain### Bad TCP packets we don't want.#$IPTABLES -A INPUT -p tcp -j bad_tcp_packets## Rules for special networks not part of the Internet#$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LO_IP -j ACCEPT$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LAN_IP -j ACCEPT$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $INET_IP -j ACCEPT## Rules for incoming packets from anywhere.#$IPTABLES -A INPUT -p ALL -d $INET_IP -m state --state ESTABLISHED,RELATED \-j ACCEPT$IPTABLES -A INPUT -p TCP -j tcp_packets$IPTABLES -A INPUT -p UDP -j udp_packets$IPTABLES -A INPUT -p ICMP -j icmp_packets## If you have a Microsoft Network on the outside of your firewall, you may# also get flooded by Multicasts. We drop them so we do not get flooded by# logs##$IPTABLES -A INPUT -i $INET_IFACE -d 224.0.0.0/8 -j DROP## Log weird packets that don't match the above.#$IPTABLES -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \--log-level DEBUG --log-prefix "IPT INPUT packet died: "## 4.1.5 FORWARD chain### Bad TCP packets we don't want#$IPTABLES -A FORWARD -p tcp -j bad_tcp_packets## Accept the packets we actually want to forward#$IPTABLES -A FORWARD -p tcp --dport 21 -i $LAN_IFACE -j ACCEPT$IPTABLES -A FORWARD -p tcp --dport 80 -i $LAN_IFACE -j ACCEPT$IPTABLES -A FORWARD -p tcp --dport 110 -i $LAN_IFACE -j ACCEPT$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT## Log weird packets that don't match the above.#$IPTABLES -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG \--log-level DEBUG --log-prefix "IPT FORWARD packet died: "## 4.1.6 OUTPUT chain### Bad TCP packets we don't want.#$IPTABLES -A OUTPUT -p tcp -j bad_tcp_packets## Special OUTPUT rules to decide which IP's to allow.#$IPTABLES -A OUTPUT -p ALL -s $LO_IP -j ACCEPT$IPTABLES -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT$IPTABLES -A OUTPUT -p ALL -s $INET_IP -j ACCEPT## Log weird packets that don't match the above.#$IPTABLES -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \--log-level DEBUG --log-prefix "IPT OUTPUT packet died: "####### 4.2 nat table### 4.2.1 Set policies### 4.2.2 Create user specified chains### 4.2.3 Create content in user specified chains### 4.2.4 PREROUTING chain### 4.2.5 POSTROUTING chain### Enable simple IP Forwarding and Network Address Translation#$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to-source $INET_IP## 4.2.6 OUTPUT chain######## 4.3 mangle table### 4.3.1 Set policies### 4.3.2 Create user specified chains### 4.3.3 Create content in user specified chains### 4.3.4 PREROUTING chain### 4.3.5 INPUT chain### 4.3.6 FORWARD chain### 4.3.7 OUTPUT chain### 4.3.8 POSTROUTING chain#

fnhssap 发表于 2004-8-25 22:32:57

I.4. rc.DHCP.firewall脚本代码#!/bin/sh## rc.firewall - DHCP IP Firewall script for Linux 2.4.x and iptables## Copyright ?2001Oskar Andreasson ## This program is free software; you can redistribute it and/or modify# it under the terms of the GNU General Public License as published by# the Free Software Foundation; version 2 of the License.## This program is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the# GNU General Public License for more details.## You should have received a copy of the GNU General Public License# along with this program or from the site that you downloaded it# from; if not, write to the Free Software Foundation, Inc., 59 Temple# Place, Suite 330, Boston, MA02111-1307   USA############################################################################## 1. Configuration options.### 1.1 Internet Configuration.#INET_IFACE="eth0"## 1.1.1 DHCP### Information pertaining to DHCP over the Internet, if needed.## Set DHCP variable to no if you don't get IP from DHCP. If you get DHCP# over the Internet set this variable to yes, and set up the proper IP# address for the DHCP server in the DHCP_SERVER variable.#DHCP="no"DHCP_SERVER="195.22.90.65"## 1.1.2 PPPoE## Configuration options pertaining to PPPoE.## If you have problem with your PPPoE connection, such as large mails not# getting through while small mail get through properly etc, you may set# this option to "yes" which may fix the problem. This option will set a# rule in the PREROUTING chain of the mangle table which will clamp# (resize) all routed packets to PMTU (Path Maximum Transmit Unit).## Note that it is better to set this up in the PPPoE package itself, since# the PPPoE configuration option will give less overhead.#PPPOE_PMTU="no"## 1.2 Local Area Network configuration.## your LAN's IP range and localhost IP. /24 means to only use the first 24# bits of the 32 bit IP address. the same as netmask 255.255.255.0#LAN_IP="192.168.0.2"LAN_IP_RANGE="192.168.0.0/16"LAN_IFACE="eth1"## 1.3 DMZ Configuration.### 1.4 Localhost Configuration.#LO_IFACE="lo"LO_IP="127.0.0.1"## 1.5 IPTables Configuration.#IPTABLES="/usr/sbin/iptables"## 1.6 Other Configuration.############################################################################## 2. Module loading.### Needed to initially load modules#/sbin/depmod -a## 2.1 Required modules#/sbin/modprobe ip_conntrack/sbin/modprobe ip_tables/sbin/modprobe iptable_filter/sbin/modprobe iptable_mangle/sbin/modprobe iptable_nat/sbin/modprobe ipt_LOG/sbin/modprobe ipt_limit/sbin/modprobe ipt_MASQUERADE## 2.2 Non-Required modules##/sbin/modprobe ipt_owner#/sbin/modprobe ipt_REJECT#/sbin/modprobe ip_conntrack_ftp#/sbin/modprobe ip_conntrack_irc#/sbin/modprobe ip_nat_ftp#/sbin/modprobe ip_nat_irc############################################################################# 3. /proc set up.### 3.1 Required proc configuration#echo "1" > /proc/sys/net/ipv4/ip_forward## 3.2 Non-Required proc configuration##echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter#echo "1" > /proc/sys/net/ipv4/conf/all/proxy_arp#echo "1" > /proc/sys/net/ipv4/ip_dynaddr############################################################################# 4. rules set up.######## 4.1 Filter table### 4.1.1 Set policies#$IPTABLES -P INPUT DROP$IPTABLES -P OUTPUT DROP$IPTABLES -P FORWARD DROP## 4.1.2 Create userspecified chains### Create chain for bad tcp packets#$IPTABLES -N bad_tcp_packets## Create separate chains for ICMP, TCP and UDP to traverse#$IPTABLES -N allowed$IPTABLES -N tcp_packets$IPTABLES -N udp_packets$IPTABLES -N icmp_packets## 4.1.3 Create content in userspecified chains### bad_tcp_packets chain#$IPTABLES -A bad_tcp_packets -p tcp --tcp-flags SYN,ACK SYN,ACK \-m state --state NEW -j REJECT --reject-with tcp-reset$IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG \--log-prefix "New not syn:"$IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP## allowed chain#$IPTABLES -A allowed -p TCP --syn -j ACCEPT$IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT$IPTABLES -A allowed -p TCP -j DROP## TCP rules#$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 21 -j allowed$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 22 -j allowed$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 80 -j allowed$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 113 -j allowed## UDP ports#$IPTABLES -A udp_packets -p UDP -s 0/0 --source-port 53 -j ACCEPTif [ $DHCP == "yes" ] ; then $IPTABLES -A udp_packets -p UDP -s $DHCP_SERVER --sport 67 \ --dport 68 -j ACCEPTfi#$IPTABLES -A udp_packets -p UDP -s 0/0 --source-port 53 -j ACCEPT#$IPTABLES -A udp_packets -p UDP -s 0/0 --source-port 123 -j ACCEPT$IPTABLES -A udp_packets -p UDP -s 0/0 --source-port 2074 -j ACCEPT$IPTABLES -A udp_packets -p UDP -s 0/0 --source-port 4000 -j ACCEPT## In Microsoft Networks you will be swamped by broadcasts. These lines# will prevent them from showing up in the logs.##$IPTABLES -A udp_packets -p UDP -i $INET_IFACE \#--destination-port 135:139 -j DROP## If we get DHCP requests from the Outside of our network, our logs will# be swamped as well. This rule will block them from getting logged.##$IPTABLES -A udp_packets -p UDP -i $INET_IFACE -d 255.255.255.255 \#--destination-port 67:68 -j DROP## ICMP rules#$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT## 4.1.4 INPUT chain### Bad TCP packets we don't want.#$IPTABLES -A INPUT -p tcp -j bad_tcp_packets## Rules for special networks not part of the Internet#$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -s $LAN_IP_RANGE -j ACCEPT$IPTABLES -A INPUT -p ALL -i $LO_IFACE -j ACCEPT## Special rule for DHCP requests from LAN, which are not caught properly # otherwise.#$IPTABLES -A INPUT -p UDP -i $LAN_IFACE --dport 67 --sport 68 -j ACCEPT## Rules for incoming packets from the internet.#$IPTABLES -A INPUT -p ALL -i $INET_IFACE -m state --state ESTABLISHED,RELATED \-j ACCEPT$IPTABLES -A INPUT -p TCP -i $INET_IFACE -j tcp_packets$IPTABLES -A INPUT -p UDP -i $INET_IFACE -j udp_packets$IPTABLES -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets## If you have a Microsoft Network on the outside of your firewall, you may# also get flooded by Multicasts. We drop them so we do not get flooded by# logs##$IPTABLES -A INPUT -i $INET_IFACE -d 224.0.0.0/8 -j DROP## Log weird packets that don't match the above.#$IPTABLES -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \--log-level DEBUG --log-prefix "IPT INPUT packet died: "## 4.1.5 FORWARD chain### Bad TCP packets we don't want#$IPTABLES -A FORWARD -p tcp -j bad_tcp_packets## Accept the packets we actually want to forward#$IPTABLES -A FORWARD -i $LAN_IFACE -j ACCEPT$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT## Log weird packets that don't match the above.#$IPTABLES -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG \--log-level DEBUG --log-prefix "IPT FORWARD packet died: "## 4.1.6 OUTPUT chain### Bad TCP packets we don't want.#$IPTABLES -A OUTPUT -p tcp -j bad_tcp_packets## Special OUTPUT rules to decide which IP's to allow.#$IPTABLES -A OUTPUT -p ALL -s $LO_IP -j ACCEPT$IPTABLES -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT$IPTABLES -A OUTPUT -p ALL -o $INET_IFACE -j ACCEPT## Log weird packets that don't match the above.#$IPTABLES -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \--log-level DEBUG --log-prefix "IPT OUTPUT packet died: "####### 4.2 nat table### 4.2.1 Set policies### 4.2.2 Create user specified chains### 4.2.3 Create content in user specified chains### 4.2.4 PREROUTING chain### 4.2.5 POSTROUTING chain#if [ $PPPOE_PMTU == "yes" ] ; then $IPTABLES -t nat -A POSTROUTING -p tcp --tcp-flags SYN,RST SYN \ -j TCPMSS --clamp-mss-to-pmtufi$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j MASQUERADE## 4.2.6 OUTPUT chain######## 4.3 mangle table### 4.3.1 Set policies### 4.3.2 Create user specified chains### 4.3.3 Create content in user specified chains### 4.3.4 PREROUTING chain### 4.3.5 INPUT chain### 4.3.6 FORWARD chain### 4.3.7 OUTPUT chain### 4.3.8 POSTROUTING chain#    --------------------------------------------------------------------------------I.5. rc.flush-iptables脚本代码#!/bin/sh# # rc.flush-iptables - Resets iptables to default values. # # Copyright ?2001Oskar Andreasson ## This program is free software; you can redistribute it and/or modify# it under the terms of the GNU General Public License as published by# the Free Software Foundation; version 2 of the License.## This program is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the# GNU General Public License for more details.## You should have received a copy of the GNU General Public License# along with this program or from the site that you downloaded it# from; if not, write to the Free Software Foundation, Inc., 59 Temple# Place, Suite 330, Boston, MA02111-1307   USA## Configurations#IPTABLES="/usr/sbin/iptables"## reset the default policies in the filter table.#$IPTABLES -P INPUT ACCEPT$IPTABLES -P FORWARD ACCEPT$IPTABLES -P OUTPUT ACCEPT## reset the default policies in the nat table.#$IPTABLES -t nat -P PREROUTING ACCEPT$IPTABLES -t nat -P POSTROUTING ACCEPT$IPTABLES -t nat -P OUTPUT ACCEPT## reset the default policies in the mangle table.#$IPTABLES -t mangle -P PREROUTING ACCEPT$IPTABLES -t mangle -P OUTPUT ACCEPT## flush all the rules in the filter and nat tables.#$IPTABLES -F$IPTABLES -t nat -F$IPTABLES -t mangle -F## erase all chains that's not default in filter and nat table.#$IPTABLES -X$IPTABLES -t nat -X$IPTABLES -t mangle -X    --------------------------------------------------------------------------------I.6. rc.test-iptables脚本代码#!/bin/bash## rc.test-iptables - test script for iptables chains and tables.## Copyright ?2001Oskar Andreasson ## This program is free software; you can redistribute it and/or modify# it under the terms of the GNU General Public License as published by# the Free Software Foundation; version 2 of the License.## This program is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the# GNU General Public License for more details.## You should have received a copy of the GNU General Public License# along with this program or from the site that you downloaded it# from; if not, write to the Free Software Foundation, Inc., 59 Temple# Place, Suite 330, Boston, MA02111-1307   USA### Filter table, all chains#iptables -t filter -A INPUT -p icmp --icmp-type echo-request \-j LOG --log-prefix="filter INPUT:"iptables -t filter -A INPUT -p icmp --icmp-type echo-reply \-j LOG --log-prefix="filter INPUT:"iptables -t filter -A OUTPUT -p icmp --icmp-type echo-request \-j LOG --log-prefix="filter OUTPUT:"iptables -t filter -A OUTPUT -p icmp --icmp-type echo-reply \-j LOG --log-prefix="filter OUTPUT:"iptables -t filter -A FORWARD -p icmp --icmp-type echo-request \-j LOG --log-prefix="filter FORWARD:"iptables -t filter -A FORWARD -p icmp --icmp-type echo-reply \-j LOG --log-prefix="filter FORWARD:"## NAT table, all chains except OUTPUT which don't work.#iptables -t nat -A PREROUTING -p icmp --icmp-type echo-request \-j LOG --log-prefix="nat PREROUTING:"iptables -t nat -A PREROUTING -p icmp --icmp-type echo-reply \-j LOG --log-prefix="nat PREROUTING:"iptables -t nat -A POSTROUTING -p icmp --icmp-type echo-request \-j LOG --log-prefix="nat POSTROUTING:"iptables -t nat -A POSTROUTING -p icmp --icmp-type echo-reply \-j LOG --log-prefix="nat POSTROUTING:"iptables -t nat -A OUTPUT -p icmp --icmp-type echo-request \-j LOG --log-prefix="nat OUTPUT:"iptables -t nat -A OUTPUT -p icmp --icmp-type echo-reply \-j LOG --log-prefix="nat OUTPUT:"## Mangle table, all chains#iptables -t mangle -A PREROUTING -p icmp --icmp-type echo-request \-j LOG --log-prefix="mangle PREROUTING:"iptables -t mangle -A PREROUTING -p icmp --icmp-type echo-reply \-j LOG --log-prefix="mangle PREROUTING:"iptables -t mangle -I FORWARD 1 -p icmp --icmp-type echo-request \-j LOG --log-prefix="mangle FORWARD:"iptables -t mangle -I FORWARD 1 -p icmp --icmp-type echo-reply \-j LOG --log-prefix="mangle FORWARD:"iptables -t mangle -I INPUT 1 -p icmp --icmp-type echo-request \-j LOG --log-prefix="mangle INPUT:"iptables -t mangle -I INPUT 1 -p icmp --icmp-type echo-reply \-j LOG --log-prefix="mangle INPUT:"iptables -t mangle -A OUTPUT -p icmp --icmp-type echo-request \-j LOG --log-prefix="mangle OUTPUT:"iptables -t mangle -A OUTPUT -p icmp --icmp-type echo-reply \-j LOG --log-prefix="mangle OUTPUT:"iptables -t mangle -I POSTROUTING 1 -p icmp --icmp-type echo-request \-j LOG --log-prefix="mangle POSTROUTING:"iptables -t mangle -I POSTROUTING 1 -p icmp --icmp-type echo-reply \-j LOG --log-prefix="mangle POSTROUTING:"

fnhssap 发表于 2004-8-25 22:35:16

近来在用MANDRAKE LINUX 9.2,找了一些资料.希望大家能喜欢.对了SMOOTHWALL,及IPCOP的朋友来讲,可能会用得着
页: [1]
查看完整版本: IPTABLE 指南