前言
关于防火墙
在生产环境公网条件下,黑客丛生、罪恶漫天,企业会在公网和内网之间砌一座保护墙,这个就叫做防火墙,有软件和硬件之分,其原理都是依据策略对穿越防火墙自身的流量过滤。保障数据的安全性是继保障数据的可用性之后最为重要的一项工作。防火墙作为公网 与内网之间的保护屏障,在保障数据的安全性方面起着至关重要的作用。
常见的防火墙有两种,firewalld和iptables。虽然他俩都叫做防火墙,但其实都不是真正的防火墙, 它们都只是用来定义防火墙策略的防火墙管理工具,是一种服务。
火墙的核心是netfilter。
关于netfilter
netfilter提供了一个抽象、通用化的框架。作为中间件,为每种网络协议都定义了一套钩子函数。例如Ipv4定义了5个钩子函数,这些钩子函数在数据报流过协议栈的5个关键点被调用,也就是说,IPv4协议栈上定义了5个“允许垂钓点”。在每一个“垂钓点”,都可以让netfilter放置一个“鱼钩”,把经过的网络包(Packet)钓上来,与相应的规则链进行比较,并根据审查的结果,决定包的下一步命运,即是被原封不动地放回IPv4协议栈,继续向上层递交;还是经过一些修改,再放回网络;或者干脆丢弃掉。
这是火墙表和链的基础。
关于iptables
为什么专门提iptables呢?因为iptables和火墙表和链的关系密切。
iptables防火墙由Netfilter项目开发,自2001年1月linux2.4内核发布以来,它已经逐渐成了linux不可分割的一部分。netfilter提供了一框架,iptables在它之上建立了防火墙功能
火墙的表与链(四表五链)
链(chain)的概念
什么是iptables里的链呢?我们知道iptables的作用是通过经过报文匹配的规则,然后执行相对应的动作,但往往这些规则不是一条规则,而是很多条,当我们把这些规则串到一个链条上的时候,就形成了链。
规则链
链 | 说明 |
---|---|
PREROUTING | 对数据包作路由选择前应用此链中的规则。(所有的数据包进来的时侯都先由这个链处理) |
INPUT | 进来的数据包应用此规则链中的策略 |
OUTPUT | 外出的数据包应用此规则链中的策略 |
FORWARD | 转发数据包时应用此规则链中的策略 |
POSTROUTING | 对数据包作路由选择后应用此链中的规则。(所有的数据包出来的时侯都先由这个链处理) |
表(table)的概念
我们再想想另外一个问题,我们对每一个“链”上都放置了一串规则,但这些规则都有些相似,比如,A类规则都是对IP或者端口的过滤,B类则是修改报文,那么这个时候我们可不可以把他们放在一起呢?当然可以
我们把具有相同功能的规则的集合叫做“表”。不同功能的规则,我们可以放在不同的表中进行管理。
注:iptables为我们定义了4种表
规则表
(1)、filter表
属性 | 说明 |
---|---|
相关链 | INPUT、FORWARD、OUTPUT |
作用 | 报文过滤 |
内核模块 | iptables_filter |
(2)、nat表(地址转发,端口伪装都是在nat表
)
属性 | 说明 |
---|---|
相关链 | PREROUTING、POSTROUTING、OUTPUT |
作用 | 只能用来完成源/目的地址的转换。需要注意的是,只有第一个报文会经过这个表,这个连接的其他报文会自动完成转换。这个表的 target 有: DNAT、SNAT、MASQUERADE、REDIRECT |
(3)、mangle表(备份表
)
属性 | 说明 |
---|---|
相关链 | PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD |
作用 | 修改数据包的服务类型、TTL、并且可以配置路由实现QOS |
内核模块 | iptable_mangle |
(4)、raw表(关闭Nat表上启用的连接追踪机制
)
属性 | 说明 |
---|---|
相关链 | OUTPUT、PREROUTING |
作用 | raw表的一个主要用途就是为了一件事情,那就是对报文设置一个标志,决定数据包是否被状态跟踪机制处理 |
内核模块 | iptable_raw |
注:
第一张表:filter表格:放的是经过内核的ip input output forward
第二张表:nat表格:放的不是经过内核的服务 input output postrouting prerouting
第三张表:备用表格mangle: input output forward postrouting prerouting
第四张表:raw表:放的是不经过内核的output,prerouting
还有一点要特别强调:
filter表的访问都是要经过服务器内核的
nat表的访问都是不经过服务器内核防火墙访问规则
表链关系
表里主要存放一些规则,不过表里的规则不是适合每一条链的,某些‘链’中注定不会包含某些‘表’的规则。为了解释一下这句话的含义,我们用prerouting举例:
这个意思就是prerouting链只拥有nat表,raw表,mangle表所对应的功能
prerouting链中的规则存放于三张表中,而这三张表中的规则执行的优先级如下:
raw->mangle->nat(和上面的顺序一样)
不过火墙其实总共是有四张表,但四张表中的规则处于同一条链的目前只有output链。
报文流向
当客户端访问服务器的web服务时,客户端发送报文到网卡,而TCP/IP协议栈是属于内核的一部分,所以,客户端的信息会通过内核的TCP协议传输到用户空间中的web服务中,而此时客户端的目标终点为web服务所监听的套接字,当web服务需要响应客户请求时,web服务发出的响应报文的目标终点则为客户端,这个时候,web服务所监听的IP与端口反而变成了原点。为了控制放行,需要在内核中设置INPUT 和OUTPUT进行检查。
不过有可能客户端发来的报文目标地址并不是本机而是其他服务器,这时候就需要添加PREROUTING,FORWARD,POSTROUTING
所以报文的流向可以分为以下几种:
到本机某进程的报文:PREROUTING -> INPUT
由本机转发的报文:PREROUTING -> FORWARD -> POSTROUTING
由本机的某进程发出报文(通常为响应报文):OUTPUT -> POSTROUTING