第1章 iptables组成介绍
1.1 iptables介绍
1. iptables的前身叫ipfirewall,最开始由艾伦·考克斯在1994年从FreeBSD将它移植到Linux 1.1
2. 它是运行在用户空间的软件,它通过控制Linux内核netfilter模块,来管理网络数据包的流动与转送。
3. 它是用来设置、维护、检查Linux内核的IP包过滤规则的;
4. 可以定义不同的表,每个表都包含几个内部的链,用户定义还可以自定义链;
5. 每个链都是一个规则检查的列表,对由此经过的包进行相应的匹配检查;
6. 每条规则都应该指定对匹配到的报文执行的“动作”,而“动作”可以跳向同一个表内的用户定义的链。
1.1.1 s四表五链
? 表
表 |
实现功能 |
在哪里实现功能 |
Filter |
过滤数据包,默认表 |
INPUT,FORWARD,OUTPUT |
NAT |
网络地址转换 |
PREROUTING,OUTPUT,POSTROUTING |
Mangle |
修改数据包,改变包头中内容(TTL, TOS, MARK ) |
PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING |
Raw |
关闭NAT表上启用的连接追踪机制 |
POSTROUTING,OUTPUT |
? 链
链 |
作用 |
PREROUTING |
数据包进入本机路由表之前 |
INPUT |
数据包通过路由表后确定目的地址为本机 |
FORWARD |
数据包通过路由表之后目的地址不是本机 |
OUTPUT |
本机产生的数据包,向外转发 |
POSTOUTING |
数据包准备发送到网卡接口之前 |
自定义链:由于自定义链没有对应的钩子函数,报文不会经过自定义链,只能再内置链上通过规则进行引用后生效,只能做处理动作,或者跳转目标。
1.2 表的作用
1.2.1 Mangle表
这个表主要用来进行报文修改,你可以自由的修改报文的 TOS 之类的,在这个表里面,千万不要做过滤/NAT/伪装这类的事情。下面这些动作 ‘Target’ 只能在 mangle 表里面使用,其他地方不能用。
? TOS 动作
主要用来修改报文的 TOS 字段,这个字段可以设置一个网络的报文如何被路由这样的策略。需要注意的是这个实现并不完善,网络里面的很多路由器都不处理这个字段。换句话讲,不要设置发完网络报文的 TOS 字段,除非你准备用 iprouter2 来做路由。
? TTL 动作
可以用来设置所有的报文都有一个系统的 TTL 这类的操作,一个很重要的理由就是我们可以欺骗 ISP。一些 ISP 不愿意看到用户几台计算机共享同一个连接,那些 ISP 会查找一台单独的计算机是否使用不同的 TTL,并且以此作为判断连接是否被共享的标志。
? MARK 动作
可以给报文设置一些其他应用程序可识别的标记,例如iprouter2 程序。这样它就能够给予标记完成路由。利用这个标记我们也可以做带宽限制或者基于类的入队。
? SECMARK 动作
主要用在针对报文设置安全标记,这个标记可以被selinux 或者其他安全系统使用。SCEMARK 和 CONNSECMARK 一起合用可以针对连接设置标记。
? CONNSECMARK 动作
用来把一个连接的标记拷贝给单个报文或者相反,然后这些标记被 selinux 或者其他安全子模块使用。
1.2.2 NAT表
这个表只能用来完成 NAT 功能,换句话讲,它只能用来完成源/目的地址的转换。需要注意的是,只有第一个报文会经过这个表,这个连接的其他报文会自动完成转换。这个表的 target 有:
? DNAT target
主要用在我们只有一个公网 IP,然后我们需要把用户访问数据重定向到不同的服务器。换句话讲我们改变了报文的目的地址,然后重路由到实际主机。
? SNAT target
改变包的源地址,这在很大程度上可以隐藏你的本地网络或者 DMZ 等。一个很好的例子是我们知道防火墙的外部地址,但必须用这个地址替换本地网络地址。有了这个操作,防火墙就能自动地对包做 SNAT 和 De-SNAT(就是反向的 SNAT),以使 LAN 能连接到Internet。如果使用类似192.168.0.0/24 这样的地址,是不会从 Internet 得到任何回应的。因为 IANA定义这些网络(还有其他的)为私有的,只能用于 LAN 内部
? MASQUERADE target
的作用和 SNAT 完全一样,只是计算机的负荷稍微多一点。因为对每个匹配的包,MASQUERADE 都要查找可用的 IP 地址,而不象 SNAT用的 IP 地址是配置好的。当然,这也有好处,就是我们可以使用通过 PPP、PPPOE、SLIP 等拨号得到的地址,这些地址可是由 ISP 的 DHCP 随机分配的。
1.2.3 RAW表
RAW表的一个主要用途就是为了一件事情,那就是对报文设置一个标志,让这个报文不被连接跟踪系统所跟踪。我们通过NOTRACK动作来实现这个功能。一个连接在NOTRACK里面被处理,接着连接跟踪系统就不会再处理这个报文。不增加一个表是解决不了前面的问题的,因为我们其他表都是在连接跟踪处理完之后再处理报文。
这个表只有 PREROUTING 和 OUTPUT 两个链,只是因为这两个地方是他们hit 连接跟踪的唯一地方。
1.2.4 Filter表
这个表主要是用来报文过滤的,我们可以在任何时候匹配包并过滤它们。我们就是在这里根据包的内容对包做 DROP 或 ACCEPT 的。当然,我们也可以预先在其他地方做些过滤,但是这个表才是设计用来过滤的。几乎所有的 Target都可以在这儿使用。大量具体的介绍在后面,现在你只要知道过滤工作主要是在这儿完成的就行了。
1.3 报文的三种流向
1.3.1 目的为本机的报文
表 |
链 |
注释 |
|
1 |
|
|
报文在线路上 |
2 |
|
|
到了接口上(例如 eth0) |
3 |
raw |
PREROUTING |
这个链在连接跟踪之前处理报文,它能够设置一条连接不被连接跟踪处理 |
4 |
|
|
这儿是连接跟踪处理的点 |
5 |
mangle |
PREROUTING |
这个链主要用来修改报文,例如修改 TOS 等等 |
6 |
nat |
PREROUTING |
这个链主要用来处理 DNAT,我们应该避免在这条链里面做过滤,因为可能有一些报文会漏掉 |
7 |
|
|
路由决定,例如决定报文是上本机还是转发或者其他地方。 |
8 |
mangle |
INPUT |
到了这点,mangle 表的 INPUT 链被使用,在把这个报文实际送给本机前,路由之后,我们需要再次修改报文 |
9 |
filter |
INPUT |
在这儿我们对所有送往本级的报文进行过滤,要注意所有收到的并且目的地址为本机的报文都会经过这个链,而不管哪个接口进来的或者它往哪儿去 |
10 |
|
|
到达本地进程或者应用程序,例如服务器或者客户端程序 |
1.3.2 内核转发的报文
步骤 |
表 |
链 |
注释 |
1 |
|
|
在线路上(例如 internet) |
2 |
|
|
到了接口(例如 eth0) |
3 |
raw |
PREROUTING |
在这儿你可以设置不想被连接跟踪系统处理的连接。 |
4 |
|
|
这儿做的是非本地报文的连接跟踪系统处理 |
5 |
mangle |
PREROUTING |
这条链主要用来修改报文,例如改变 TOS 等等。 |
6 |
nat |
PREROUTING |
这条链主要完成 DNAT,SNAT 后面处理。在这条链上面不要做报文过滤。 |
7 |
|
|
路由决定,例如转发报文还是上送本机。 |
8 |
mangle |
FORWARD |
包继续被发送至 mangle 表的 FORWARD 链,这是非常特殊的情况才会用到的。在这里,包被 mangle。这次 mangle 发生在最初的路由判断之后,在最后一次更改包的目的之前(译者注:就是下面的 FORWARD 链所做的,因其过滤功能,可能会改变一些包的目的地,如丢弃包)。 |
9 |
filter |
FORWARD |
包被继续转发至 filter 表的 FORWARD 链,只有转发报文才会到这儿,因此这儿我们做所有报文的过滤。在你自己制定规则的时候,请考虑这一点。 |
10 |
mangle |
POSTROUTING |
这个链也是针对一些特殊类型的包(译者注:参考第 6 步,我们可以发现,在转发包时,mangle 表的两个链都用在特殊的应用上)这一步 mangle 是在所有更改包的目的地址的操作完成之后做的,但这时包还在本地上 |
11 |
nat |
POSTROUTING |
这个链只能作为 SNAT 作用,千万不要做报文过滤,伪装(Masquerading)也是在这儿工作的。 |
12 |
|
|
到了报文的出接口(例如 eth1) |
13 |
|
|
报文又一次到了线路上(例如本地网络) |
1.3.3 由本机发出的报文
步骤 |
表 |
链 |
注释 |
1 |
|
|
由本地进程或者应用程序发出(例如服务器或者客户端程序) |
2 |
|
|
路由选择,用哪个源地址以及从哪个接口上出去,当然还有其他一些必要的信息 |
3 |
raw |
OUTPUT |
这儿是你能够在连接跟踪生效前处理报文的点,这儿你可以标记某个连接不被连接跟踪处理 |
4 |
|
|
这儿就是本地发出报文进行连接跟踪处理的地儿 |
5 |
mangle |
OUTPUT |
这儿是我们修改报文的地方,我们应该避免在这条链里面做过滤,因为它可能有副作用 |
6 |
nat |
OUTPUT |
这儿对于本级发送的报文做目的 NAT(DNAT) |
7 |
|
|
路由决定,因为前面的 mangle 和 nat 表可能修改了报文的路由信息 |
8 |
filter |
OUTPUT |
这儿是对发送报文做过滤的地方 |
9 |
mangle |
POSTROUTING |
这条链可能被两种报文遍历,一种是转发的报文,另外就是本级产生的报文 |
10 |
nat |
POSTROUTING |
在这儿我们做源 NAT(SNAT),我们建议不要在这儿做报文过滤,因为有副作用。即使你设置了默认策略,一些报文也有可能溜过去 |
11 |
|
|
在接口上发出(例如 eth0) |
12 |
|
|
到了线路上(例如 internet) |
第2章 iptables规则基础
2.1 iptables命令用法
2.1.1 命令编写规则示例
iptables -t filter -A INPUT -s 0.0.0.0/0 -d 10.0.0.1 -p tcp -j ACCEPT |
|||||
iptables |
指定表 |
操作 |
指定链 |
匹配模式 |
处理动作 |
iptables |
如:-t nat,省略则默认filter |
如:-A ,-I,-D |
如:INPUT |
如:-s 匹配源地址 --sport匹配源端口 |
如: ACCEPT放行 |
2.1.2 规则的组成部分
规则由匹配条件和处理动作组成:
匹配模式:根据协议报文特征指定
基本匹配条件:源ip、目标ip、源端口、目标端口
扩展匹配条件:连接追踪、状态追踪、根据mac地址做追踪、甚至应用层的特性
处理动作:可以是
内建的处理机制
自定义处理机制
2.1.3 匹配模式简介
[!] 在选项前加上"!"表示对规则取反。
-p 传输层协议[tcp|dup|icmp],检查报文中的协议,即ip首部中的protocols所标识的协议,all代表全部
-s 指定源地址,可以是主机名、网络名和具体的IP地址。
-d 目标地址,可以是IP或者是网络
-i 数据报文的流入接口,匹配流入接口时候,仅用于:PREROUTING,INPUT,FORWARD链上
-o 报文的流出接口,仅用于:OUTPUT,POSTROUTING链上
-j 执行动作,具体见“动作”列表
-m 使用扩展匹配功能
2.1.4 可执行动作
ACCEPT 接受
DROP 丢弃
REJECT 拒绝
RETURN 返回调用链
REDIRECT 端口重定向
LOG 记录日志
MARK 做防火墙标志
DNAT 目标地址转换
SNAT 源地址转换
MASQUERADE 地址伪装
自定义链由自定义链进行匹配检查
2.2 iptables命令的选项
2.2.1 链管理相关参数
-F 清空规则链,省略链表示清空指定表上的所有链,也可以清空某个链上的一条规则,使用链并指明规则即可
-N 表示创建新的自定义规则链
-X 删除用户定义的空的规则链,如果不为空则需-F清空
-Z 置零计数器
-P 为指定链设置默认策略,对于filter表中的链而言,默认策略通常有:ACCEPT,DROP,REJECT
-E 重命名自定义链,引用计数不为0的链,无法改名,也无法删除
2.2.2 规则管理相关参数
-A 在指定链的末尾添加(append)一条新的规则
-I 在指定链中插入(insert)一条新的规则,默认在第一行添加
-D 删除(delete)指定链中的某一条规则,可以按规则序号和内容删除
-R 修改、替换(replace)指定链中的某一条规则,可以按规则序号和内容替换
-L 列出(list)指定链中所有的规则
-n 以数字格式显示地址和端口号,不反解
-v 显示详细信息,可用-vvv
-x 显示计数器的精确值,而不是取整
--line-number 显示规则编号
2.3 iptables链规则管理
2.3.1 查看规则及其编号
iptables -L -n -v --line-number #-L列出规则-n以数字形式列出-v显示详细信息--line-number显示规则的编号
policy ACCEPT 这表示一个默认规则,可以使用-P修改,可以是:ACCEPT接受,DROP丢弃,REJECT拒绝。
pkts bytes target prot opt source destination state
匹配计数 报文大小和 处理动作 协议 额外选项 源地址 目标地址 连接追踪状态
2.3.2 删除指定编号的规则
iptables -t filter -D FORWARD 9 #删除规则编号为9的规则
2.3.3 删除用户所有的空链
iptables -t filter -X
2.3.4 设置一个默认策略为DROP
iptables -t filter -P FORWARD DROP #将filter表上FORWARD链默认规则改为DROP
2.3.5 保存iptables规则,恢复iptables规则
iptables-save >/etc/sysconfig/iptables
iptables-restore </etc/sysconfig/iptables
2.4 编写规则时的思路
2.4.2 编写规则考量点
表的生效的先后顺序 raw -> mangle -> nat -> filter
分析要实现哪种功能,才能决定在哪张表上设置规则;
分析报文流经的路径,能够判断需要添加在哪个链上;
规则编号的顺序即是规则检查的次序,如果规则被匹配,则不再向下检查;
控制同一种应用的、同类的规则,匹配范围小的放上面,效率更高;
多个规则,访问频繁的放在最上面,效率更高;
设置默认策略:默认拒绝(白名单)or默认允许(黑名单);
那些可以由一条规则描述的多个规则合并为一个。
文章写的不错?请扫下面作者的讨饭专用码,鼓励作者继续分享