iptables实战书

Posted yangjinheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iptables实战书相关的知识,希望对你有一定的参考价值。

第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 地址是配置好的。当然,这也有好处,就是我们可以使用通过 PPPPPPOESLIP 等拨号得到的地址,这些地址可是由 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

这条链主要完成 DNATSNAT 后面处理。在这条链上面不要做报文过滤。

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

这儿对于本级发送的报文做目的 NATDNAT

7

 

 

路由决定,因为前面的 mangle nat 表可能修改了报文的路由信息

8

filter

OUTPUT

这儿是对发送报文做过滤的地方

9

mangle

POSTROUTING

这条链可能被两种报文遍历,一种是转发的报文,另外就是本级产生的报文

10

nat

POSTROUTING

在这儿我们做源 NATSNAT),我们建议不要在这儿做报文过滤,因为有副作用。即使你设置了默认策略,一些报文也有可能溜过去

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默认允许(黑名单);

那些可以由一条规则描述的多个规则合并为一个。

 

 文章写的不错?请扫下面作者的讨饭专用码,鼓励作者继续分享

 

技术分享图片

 

以上是关于iptables实战书的主要内容,如果未能解决你的问题,请参考以下文章

iptables系列教程| iptables 实战篇

iptables的实战整理

iptables防火墙介绍+实战

企业级iptables防火墙实战

iptables基础实战练习

Linux下防火墙iptables原理及实战