- install iptables
- 2.4 内核 iptables1.2.6a
- yum install -y bzip2
- wget https://netfilter.org/projects/iptables/files/iptables-1.3.1.tar.bz2
遍历表和链
数据包是以什么顺序、如何遍历不同的链和表的。一些组件是iptables 与内核共用的,比如,数据包路由的判断。数据包为什么被路由,一个好的例子是 DNAT 和 SNAT,不要忘了 TOS 的作用。
当一个报文进入防火墙时候,首先触发硬件,接着被传递给内核中的合适设备。在这个报文到最终目的之前,它会在内核中会经历一系列步骤,
目的为本机的报文(就是我们自己的机器)
step(步骤) | table(表) | chain(链) | comment(注释) |
---|---|---|---|
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 | 本地进程或者应用程序,例如服务器或者客户端程序 |
现在数据包是由 INPUT 链过,而不是 FORWARD 链。这样更符合逻辑。
源地址是本地主机发出报文
step(步骤) | table(表) | chain(链) | comment(注释) |
---|---|---|---|
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) |
报文的目的地址是另外一个网络
step(步骤) | table(表) | chain(链) | comment(注释) |
---|---|---|---|
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 的意思吗)。这次 mangle 发生在最初 的路由判断之后,在最后一次更改包的目的之前 (译者注:就是下面的 FORWARD 链所做的,因其过 滤功能,可能会改变一些包的目的地,如丢弃 包)。–摘录自 1.09 版本的中文翻译。 |
9 | filter | FORWARD | The packet gets routed onto the FORWARD 包被继续转发至 filter 表的 FORWARD 链,只有转发 报文才会到这儿,因此这儿我们做所有报文的过 滤。在你自己制定规则的时候,请考虑这一点。 |
10 | mangle | POSTROUTING | 这个链也是针对一些特殊类型的包(译者注:参考第 6 步,我们可以发现,在转发包时,mangle 表的两个链都用在特殊的应用上)。这一步 mangle 是在所有更改包的目的地址的操作完成之后做的,但这时包还在本地上。–摘录自 1.09 版本的中文翻译。 |
11 | nat | POSTROUTING | 这个链只能作为 SNAT 作用,千万不要做报文过滤,伪装(Masquerading)也是在这儿工作的。 |
12 | 到了报文的出接口(例如 eth1) | ||
13 | 有一次到了线路上(例如本地网络) |
请一定注意这儿没有为某一个接口或者与之类似的链,FORWARD 链会被本机的所有转发报文遍历。
mangle表
这个表主要用来进行报文修改,你可以自由的修改报文的 TOS 之类的。
在这个表里面,千万不要做过滤/NAT/伪装这类的事情。
- 只能在 mangle 表里面使用
- TOS: TOS target 主要用来修改报文的 TOS 字段,这个字段可以设置一个网络的报文如何被路由这样的策略。需要注意的是这个实现并不完善,网络里面的很多路由器都不处理这个字段。换句话讲,不要设置发完网络报文的 TOS 字段, 除非你准备用 iprouter2 来做路由。
- TTL: TTLtarget 可以用来设置所有的报文都有一个系统的 TTL 这类的操作,一 个很重要的理由就是我们可以欺骗 ISP。一些 ISP 不愿意看到用户几台计算机 共享同一个连接,那些 ISP 会查找一台单独的计算机是否使用不同的 TTL,并且以此作为判断连接是否被共享的标志。
- MARK: MARK target 可以给报文设置一些其他应用程序可识别的标记,例如iprouter2 程序。这样它就能够给予标记完成路由。利用这个标记我们也可以做带宽限制或者基于类的入队。
- SECMARK: SECMARK target 主要用在针对报文设置安全标记,这个标记可以被 selinux 或者其他安全系统使用。SCEMARK 和 CONNSECMARK 一起合用可以针对连 接设置标记。
- CONNSECMARK: CONNSECMARK target 用来把一个连接的标记拷贝给单个报文或者相反,然 后这些标记被 selinux 或者其他安全子模块使用。
nat表
- 这个表只能用来完成 NAT 功能,换句话讲,它只能用来完成源/目的地址的转换。需要注意的是,只有第一个报文会经过这个表,这个连接的其他报文会自动完成转换。这个表的 target 有:
- DNAT: DNAT target 主要用在我们只有一个公网 IP,然后我们需要把用户访问数据重定向到不同的服务器。换句话讲我们改变了报文的目的地址,然后重路由 到实际主机。
- SNAT: SNAT target 改变包的源地址,这在很大程度上可以隐藏你的本地网络或 者 DMZ 等。一个很好的例子是我们知道防火墙的外部地址,但必须用这个地址 替换本地网络地址。有了这个操作,防火墙就能自动地对包做 SNAT 和 De- SNAT(就是反向的 SNAT),以使 LAN 能连接到 Internet。如果使用类似 192.168.0.0/24 这样的地址,是不会从 Internet 得到任何回应的。因为 IANA 定义这些网络(还有其他的)为私有的,只能用于 LAN 内部
- MASQUERADE: MASQUERADE target 的作用和 SNAT 完全一样,只是计算机的负荷稍微多一 点。因为对每个匹配的包,MASQUERADE 都要查找可用的 IP 地址,而不象 SNAT 用的 IP 地址是配置好的。当然,这也有好处,就是我们可以使用通过 PPP、 PPPOE、SLIP 等拨号得到的地址,这些地址可是由 ISP 的 DHCP 随机分配的。
- REDIRECT:
raw表
- RAW表的一个主要用途就是为了一件事情,那就是对报文设置一个标志,让 这个报文不被连接跟踪系统所跟踪。我们通过NOTRACK target来实现这个功 能。一个连接在NOTRACK里面被处理,接着连接跟踪系统就不会再处理这个报 文。不增加一个表是解决不了前面的问题的,因为我们其他表都是在连接跟踪 处理完之后再处理报文,
- 这个表只有 PREROUTING 和 OUTPUT 两个链,只是因为这两个地方是他们 hit 连接跟踪的唯一地方。
- 要让这个表能够工作,iptables_raw 模块需要被加载,加入我 们显式的制定-t raw 标志,只要这个模块可用,它就会被自动 加载。
filter表
- 主要是用来报文过滤的,根据包的内容对包做 DROP 或 ACCEPT 的。
用户自定义链
- 一个报文在处理的时候能够通过 jump 规则跳转到本表的另外一个链,但是需要指出的是这个新的链表必须是用户自定义的,不能是任何内建的链表。这个规则的查询是逐条的,自上向下的。遍历结束的条件是被一个 target 终止或 者内建的链表结束。
- 用户自定义的链没有默认策略,只有内建的才可以配置默认策 略。在用户自定义的链最空有一个空白的规则,它的动作的 return 返回到主链。
- 用户自定义链的每个条规则都必须逐一的被检查,直到有一个规则匹配这 个报文,接着调用这个规则的 target 处理这个报文,处理的结果当然可能结束 或者继续,另外还有一种可能就是达到了规则链的末尾。加入到达了规则链的 末尾,那么报文就会被送回父链,父链可能是用户自定义链,也有可能是内嵌 的链。