Oskar Andreasson
献辞
- 目录
- 译者序
- 关于作者
- 如何阅读
- 必备知识
- 本文约定
- 1. 序言
- 译者序
- 2. 准备阶段
-
- 2.1. 哪里能取得iptables
- 2.2. 内核配置
- 2.3. 编译与安装
- 2.2. 内核配置
-
- 2.3.1. 编译
- 2.3.2. 在Red Hat 7.1上安装
- 2.3.1. 编译
- 2.1. 哪里能取得iptables
- 3. 表和链
- 4. 状态机制
-
- 4.1. 概述
- 4.2. conntrack记录
- 4.3. 数据包在用户空间的状态
- 4.4. TCP 连接
- 4.5. UDP 连接
- 4.6. ICMP 连接
- 4.7. 缺省的连接操作
- 4.8. 复杂协议和连接跟踪
- 4.2. conntrack记录
- 4.1. 概述
- 5. 保存和恢复数据管理规则
-
- 5.1. 速度
- 5.2. restore的不足之处
- 5.3. iptables-save
- 5.4. iptables-restore
- 5.2. restore的不足之处
- 5.1. 速度
- 6. 规则是如何练成的
-
- 6.1. 基础
- 6.2. Tables
- 6.3. Commands
- 6.4. Matches
- 6.2. Tables
- 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 target
- 6.5.2. DNAT target
- 6.5.1. ACCEPT target
- 6.1. 基础
- 7. 防火墙配置实例 rc.firewall
-
- 7.1. 关于rc.firewall
- 7.2. rc.firewall详解
- 7.1. 关于rc.firewall
- 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 ruleset
- 8.3. rc.DMZ.firewall.txt
- A. 常用命令详解
-
- A.1. 查看当前规则集的命令
- A.2. 修正和清空iptables的命令
- A.1. 查看当前规则集的命令
- B. 常见问题于与解答
-
- B.1. 模块装载问题
- B.2. 未设置SYN的NEW状态包
- B.3. NEW状态的SYN/ACK包
- B.4. 使用私有IP地址的ISP
- B.5. 放行DHCP数据
- B.6. 关于mIRC DCC的问题
- B.2. 未设置SYN的NEW状态包
- B.1. 模块装载问题
- C. ICMP类型
- D. 其他资源和链接
- E. 鸣谢
- F. History
- G. GNU Free Documentation License
- D. 其他资源和链接
-
- 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 documents
- 1. APPLICABILITY AND DEFINITIONS
- 0. PREAMBLE
- H. GNU General Public License
- I. 示例脚本的代码
-
- 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脚本代码
- I.2. rc.DMZ.firewall脚本代码
- I.1. rc.firewall脚本代码
- 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类型
- 3-1. 以本地为目标(就是我们自己的机子了)的包
译者序
关于作者
如何阅读
必备知识
本文约定
-
代码和命令输出使用定宽字体,命令用粗体。
[blueflux@work1 neigh]$ ls default eth0 lo [blueflux@work1 neigh]$
-
所有的命令和程序名都用粗体。
-
所有的系统部件,如硬件、内核部件、loopback使用斜体。
-
计算机文本输出用 这种字体。
-
文件名和路径名象这样 /usr/local/bin/iptables 。
1. 序言
1.2. 指南是如何写的
1.3. 文中出现的术语
2. 准备阶段
2.1. 哪里能取得iptables
2.2. 内核配置
严格地说,iptables并不需要CONFIG_PACKET,但是它有很多用处(译者注:其他程序需要),所以就选上了。当然,你不想要,不选就是了。(译者注:建议还是选的为好) |
-
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
2.3. 编译与安装
2.3.1. 编译
有一些补丁仅仅处在实验阶段,把它们也安装上不是一个好主意。这一步,你会遇到很多十分有趣的匹配和对数据包的操作,但它们还正在实验。
为了完成这一步,我们要在iptables的目录内用到如下一些命令: |
总之,只有某些补丁会被询问是否加入内核,而Netfilter的开发者们有大量的补丁或附件想要加入内核,但还要再实验一阵子才能做到。如果你想安装这些东西,就用下面的命令: |
你要是不打算用patch-o-matic修补内核,以上的命令都用不着,它们不是必需的。不过,你可以用这些命令来看看有什么有趣的玩意儿,这不会影响任何东西。 |
For kernel 2.6
准备工作:
1, 最新的patch-o-matic-ng,在下面的地址可以下载到最新的:
http://ftp.netfilter.org/pub/patch-o-matic-ng/
2, 最新的iptables源代码:
http://www.netfilter.org
3, 内核源代码:
http://www.kernel.org
4, L7-filter 补丁以及协议描述文件:
http://sourceforge.net/project/showfiles.php?group_id=80085
测试系统环境及软件版本:
1, GCC 3.4.2
2, Kernel 2.6.9
3, Iptbles 1.3.1
4, l7-protocols 2005-02-06
5, netfilter-layer7 v1.0
6, patch-o-matic-ng 20050309
安装步骤:
1, 解压kernel到/usr/src: #tar –jxvf kernel-2.6.9.tar.bz2 –C /usr/src
2, 使用上面类似的命令解压其余的文件到/source/temp下:
为kernel打补丁:
Cd /usr/src/linux-2.6.9
Make menuconfig(注意生成.config)
cd /source/temp/patch-o-matic-ng-20050309
KERNEL_DIR=/usr/src/linux-2.6.9 IPTABLES_DIR=/source/temp/iptables-1.3.1 ./runme time
(注:runme后跟需要添加的模块,不要使用base或其它的命令,会导致后面iptables不能编译通过。我编译的模块有:time ipv4options psd mport ipp2p quota。很遗憾的是string模块不支持kernel-2.6版本)
##这里是与l7-filter有关的(你可以不做这里的):
Cd /usr/src/linux-2.6.9
Patch –p1 </source/temp/netfilter-layer7-v1.0/kernel-2.6-layer7-1.0.patch
Cd /source/temp/iptables-1.3.1
Patch –p1 </source/temp/netfilter-layer7-v1.0/iptables-layer7-1.0.patch
##这里是与l7-filter有关的结束
Cd /usr/src/linux-2.6.9
Make menuconfig (在这里选择你添加的netfilter的模块)
Make
Make modules_install
修改grub或lilo使用新的kernel来启动Linux
编译iptables:
Cd /source/temp/iptables-1.3.1
Export KERNEL_DIR=/usr/src/linux-2.6.9
Export IPTABLES_DIR=/source/temp/iptables-1.3.1
make PREFIX=/usr LIBDIR=/lib BINDIR=/sbin &&
make PREFIX=/usr LIBDIR=/lib BINDIR=/sbin install
安装l7-filter协议文件:
Cd /source/temp/l7-protocols-2005-02-06
Make install
测试是否成功:
Iptables –A OUTPUT –p tcp –m mport –sports 21:23,80 –j DROP
等等测试命令,如果你需要看帮助:
Iptables –m ip2p2 –help
2.3.2. 在Red Hat 7.1上安装
Red Hat 7.1预装的iptables版本有些老了,在使用之前,你可能想装个新的,再自己编译一下内核。 |
-
2. 不带NFS的多用户环境,和层3的区别仅在于不带网络支持。
-
3. 多用户环境,就是我们一般事用的层。
-
5. X11,图形界面。
Chapter 3. 表和链
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 | 到达本地程序了(比如,服务程序或客户程序) |
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) |
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) |
在上面的情况里,不要在INPUT链上做过滤。INPUT是专门用来操作那些以我们的机子为目的地址的包的,它们不会被路由到其它地方的。 |
想要更多的信息,可以看看rc.test-iptables.txt ,这个脚本包括了一些规则,它们会向你展示包是怎样通过各个表和链的。 |
3.2. mangle 表
强烈建议你不要在这个表里做任何过滤,不管是DANT,SNAT或者Masquerade。 |
-
TOS
-
TTL
-
MARK
3.3. nat 表
-
DNAT
-
SNAT
-
MASQUERADE
3.4. Filter 表