Linux 的中的防火墙就是那么一组软件对数据包的处理,Linux 中的防火墙主要是进行一些包的过滤,而这套防火墙是这样的一个发展过程:
iptables 之所以能够替代 ipchains 是因为它具有以下一些优势:
iptables 就是目前工作于较新版(内核版本高过2.4的) Linux 内核中的强大的数据包过滤的软件,它主要是由两部分组成
netfilter 工作于系统的内核空间,最底层的工作,所以真正令过滤规则生效的并不是 iptables 而是 netfilter,而 iptables 工作在 netfilter之上,是一个让用户编写规则的工具。
netfilter 是 Linux 内核中的一个框架,因 Linux 拥有高模块化的内核。iptables 这个应用层的程序便是调用它的接口实现规则的修改。
Netfilter 所设置的规则是存放在内存中的,而 iptables 通过 Netfilter 放出的内核接口 ip_tables 来对Netfilter 配置表进行修改。这个配置表主要由 tables、chains、target 组成。
其中表主要有这四张:
每个表中可以用的 链(chains) 不全相同,当然 iptables 支持新建 链,而 链 是 Netfilter 框架中制定的对数据包的流向更改规则。它是防火墙中的“关卡”,所有进出的报文都要经过这些关卡,满足条件的放行,符合阻拦条件的则拒绝。也可称为hook point。系统有5种hook point:
根据实际情况的不同,报文经过的链可能不同,如果报文只是经过本机,本机只负责转发,则报文不会经过input链,而是经过forward和postrouting链。
target 中大部分是通用的,当然有部分是特定使用的,这里只列举常用的几种规则,更多的规则大家可以使用 man 来查看
其中 filter 表的主要作用就是对数据包的过滤,访问控制(相类似的有思科自己开发的 ACL)。该表下有三个规则链:
NAT 是一种把内部网络的 ip 地址转换为合法的公网 ip 地址,当私有网主机和公共网主机通信的IP包经过NAT网关时,将 IP 包中的源IP或目的 IP 在私有 IP 和 NAT 的公共 IP 之间进行转换。能够有效的解决公网地址不足的问题,在一定程度上起到安全的作用
其中 NAT(Network Address Translation) 表主要用于修改数据包的报头的 IP 地址、端口号等信息。可以实现数据包伪装、平衡负载、端口转发和透明代理。该表包含三个链:
NAT 分为三种类型
NPAT是把内部地址映射到外部网络的一个IP地址的不同端口上,但是这里虽然是将多个内网 ip 地址转换为一个公网地址,但是这里的地址是公网地址+端口号的形式,而不是简单的一个公网地址。
在 iptables 中我们比较常用 NPAT 的形式,而 NPAT 又细分为以下的两种:
其中 mangle 表主要用于修改数据包的 TOS(Type Of Service,服务类型,根据不同的服务质量。来选择经过路由的路径)、TTL(Time To Live,生存周期,每经过一个路由器将减1,mangle 可以修改此值设定TTL要被增加的值,这个选项可以使我们的防火墙更加隐蔽,而不被 trace-routes 发现等等)以及为数据包设置 Mark 标记(特殊标记,用来做高级路由,以使不同的包能使用不同的队列要求,等等),Qos(Quality Of Service,服务质量)调整以及策略路由等应用,由于 TOS,Qos 类似的方式需要相应的路由设备支持,所以应用并不广泛。这里不做过多的讲解,这个表中包含五个规则链:PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD。
raw 表是自1.2.9以后版本的 iptables 新增的表,主要用于决定数据包是否被状态跟踪机制处理。在匹配数据包时,raw 表的规则要优先于其他表。包含两条规则链:OUTPUT、PREROUTING
iptables中数据包被跟踪连接有4种不同状态:
我们对每一张表以及每一个链都有了一个大体上的认识,我们可以通过这样一张表了解到我们的数据包在我们的内核中是怎样的一个前进的流程,到底要经过多少次审核,多少个关卡
从这张图中我们可以了解到每个数据包的进与出都会经历这样的一个流程
从数据包在内核中的走向我们可以得出以下几点,也是我们需要着重注意的几点:
在修改规则的时候我们会用到各种参数,下面列出一些常用的参数:
参数 | 解释 |
---|---|
-t | 制定我们修改或者添加的规则是放入那个表,若是没有指定默认为 filter 表 |
-A | 表示我们添加的这个规则追加在表的最后面,append |
-I | 表示我们指定位置插入当前的这个规则,insert,指定的位置写在链后面 ,若是没有指定则默认值为1,也就是将该规则添加在指定表的指定链的第一位 |
-D | 删除某条规则,delete,后面可以指明具体的规则,如上面的例子,也可以指定位置,位置同样是放在链的后面 |
-F | 清除所有的规则,若是后面有跟上链,便只删除该链下的所有规则 |
-L | 显示规则链中已有的条目 |
-N | 创建新的用户自定义规则链 |
-p | 指定要匹配的数据包协议类型,如上文我们使用的tcp |
-s | 指定要匹配的数据包源ip地址 |
-i<网络接口> | 指定数据包进入本机的网络接口 |
-o<网络接口> | 指定数据包要离开本机所使用的网络接口 |
-j<目标> | 指定要跳转的目标; |