Iptables(1)
Iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的”安全框架”中,这个”安全框架”才是真正的防火墙,这个框架的名字叫netfilter,netfilter才是防火墙真正的安全框架(framework),netfilter位于内核空间。iptables其实是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架。
iptables概念
Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:
-
网络地址转换(Network Address Translate)
-
数据包内容修改
-
数据包过滤的防火墙功能
netfilter才是真正的防火墙,它是内核的一部分,所以,如果我们想要防火墙能够达到”防火”的目的,则需要在内核中设置关卡,所有进出的报文都要通过这些关卡,经过检查后,符合放行条件的才能放行,符合阻拦条件的则需要被阻止,于是,就出现了input关卡和output关卡,而这些关卡在iptables中不被称为”关卡”,而被称为”链”。客户端发来的报文访问的目标地址可能并不是本机,而是其他服务器,当本机的内核支持IP_FORWARD时,我们可以将报文转发给其他服务器,所以,这个时候,我们就会提到iptables中的其他”关卡”,也就是其他”链”,他们就是 “路由前”、”转发”、”路由后”,他们的英文名是 PREROUTING、FORWARD、POSTROUTING。
注:转发功能开启需要配置 /proc/sys/net/ipv4/ip_forward
链的概念
当我们启用了防火墙功能时,报文需要经过如下关卡,也就是说,根据实际情况的不同,报文经过”链”可能不同。如果报文需要转发,那么报文则不会经过input链发往用户空间,而是直接在内核空间中经过forward链和postrouting链转发出去的。
到本机某进程的报文:PREROUTING –> INPUT
由本机转发的报文:PREROUTING –> FORWARD –> POSTROUTING
由本机的某进程发出报文(通常为响应报文):OUTPUT –> POSTROUTING
PREROUTING INPUT FORWARD OUTPUT OUTPUT 每个关卡都有自己单个或多个规则(PREROUTING->规则1->规则2… )这就称为链。每个经过”关卡”的报文,都要将这条”链”上的所有规则匹配一遍,如果有符合条件的规则,则执行规则对应的动作。
表的概念
每个”链”上都放置了一串规则,但是这些规则有些很相似,比如,A类规则都是对IP或者端口的过滤,B类规则是修改报文,那么这个时候,我们把实现相同功能的规则放在一起,具有相同功能的规则的集合叫做”表”。
-
filter表:负责过滤功能,防火墙;内核模块:iptables_filter
-
nat表:network address translation,网络地址转换功能;内核模块:iptable_nat
-
mangle表:拆解报文,做出修改,并重新封装 的功能;iptable_mangle
-
raw表:关闭nat表上启用的连接追踪机制;iptable_raw
也就是说,我们自定义的所有规则,都是这四种分类中的规则,或者说,所有规则都存在于这4张”表”中。但不是每个链都具有这四个表。我们在实际的使用过程中,往往是通过”表”作为操作入口,对规则进行定义的。
PREROUTING 的规则可以存在于:raw表,mangle表,nat表。
INPUT 的规则可以存在于:mangle表,filter表,(centos7中还有nat表,centos6中没有)。
FORWARD 的规则可以存在于:mangle表,filter表。
OUTPUT 的规则可以存在于:raw表,mangle表,nat表,filter表。
POSTROUTING 的规则可以存在于:mangle表,nat表。
因为数据包经过一个”链”的时候,会将当前链的所有规则都匹配一遍,但是匹配时总归要有顺序,我们应该一条一条的去匹配,而且我们说过,相同功能类型的规则会汇聚在一张”表”中,四个表在同一个关卡的优先级次序(由高而低):raw –> mangle –> nat –> filter
规则匹配
基本匹配条件:
源地址Source IP,目标地址 Destination IP
扩展匹配条件:
源端口Source Port, 目标端口Destination Port
处理动作:
处理动作在iptables中被称为target(这样说并不准确,我们暂且这样称呼),动作也可以分为基本动作和扩展动作。
ACCEPT:允许数据包通过。
DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。
REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。
SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。
MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。
DNAT:目标地址转换。
REDIRECT:在本机做端口映射。
LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。
参考链接:
https://www.cnblogs.com/minseo/p/13595092.html
https://xie1997.blog.csdn.net/article/details/82662026
https://www.zsythink.net/archives/1199