防火墙相关概念
-
iptables相关概念以及工作原理
-
iptables中四表五链的原理及规则
-
iptables中的基本命令详解
——————防火墙相关概念———————-
LINUX防火墙:隔离内部网络和外部网络的隔离技术。
介于3-4层的传输 ——管理控制 服务的提供。
系统安全:
1.第三方监控杀毒软件
2.系统策略
3.文件权限
4.防火墙规则 :原地址 目标地址 端口 协议 mac 数据包中的标志
类似ACL访问控制列表: 过滤
从逻辑上讲。防火墙可以大体分为主机防火墙和网络防火墙。
主机防火墙:针对于单个主机进行防护。
网络防火墙:往往处于网络入口或边缘,针对于网络入口进行防护,服务于防火墙背后的本地局域网。
网络防火和主机防火墙并不中突,可以理解为,网络防火墙主外(集体),主机防火墙主内(个人)。
从物理上讲,防火墙可以分为硬件防火墙和软件防火墙。
硬件防火墙:在硬件级别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高。如:思科ASA 华为防火墙 天融信防火墙 等。
软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能低,成本低。如:iptables firewall(CentOS7独有的)等。
iptables相关概念
iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过 iptables这个代理,将用户的安全设定执行到对应的安全框架中,这个安全框架”才是直正的防火墙,这个框架的名字叫 netfilter。
netfilter才是防火墙真正的安全框架( framework), netfilter位于内核空间。
iptables其实是个命令行工具,位于用户空间,我们用这个工具操作真正的框架。
netfilter/ iptables(下文中简称为 iptables)组成 Linux平台下的包过滤防火墙,与大多数的 Linux软件一样,这个包过滤防火墙是兔费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。
Netfilter是 Linux操作系统核心层内部的—一个数据包处理模块,它具有如下功能:
网络地址转换( Network Address Translate)
数据包内容修改以及数据包过滤的防火墙功能。所以说,虽然我们使用 service iptables start启动 iptables”服务”,但是其实准确的来说, iptables并没有一个守护进程,所以并不能算是真正意义上的服务,而应该算是内核提供的功能。
iptables基础工作原理
我们知道 iptables是按照规则来办事的,我们就来说说规则( rules),规则其实就是网络管理员预定义的条件,规则一般的定义为”如果数据包头符合这样的条件,就这样处理
这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、|CMP)和服务类型(如HTP、FP和SMTP)等。
数据包与规则匹配时, iptables就根据规则所定义的方法来处理这些数据包,如放行( accept)、拒绝( reject))和丢弃(drop)等。配置防火墙的主要工作就是添加、修改
和删除这些规则。
这样说可能并不容易理解,我们来换个容易理解的角度,从头说起
当客户端访问服务器的web服务时,客户端发送报文到网卡,而tcp/ip协议栈是属于内核的一部分,所以,客户端的信息会通过内核的TCP协议传输到用户空间中的web服务
中,而此时,客户端报文的目标终点为web服务所监听的套接字(P:Por)上,当web服务需要响应客户端请求时,web服务发出的响应报文的目标终点则为客户端,这个时
候,web服务所监听的P与端囗反而变成了原点,我们说过, netfilter 才是真正的防火墙,它是内核的部分,所以,如果我们想要防火墙能够达到”防火”的目的,则需要在内
核中设置关卡,所有进出的报文都要通过这些关卡,经过检查后,符合放行条件的才能放行,符合阻拦条件的则需要被阻止,于是,就出现了input关卡和 output关卡,而这些
关卡在 iptables中不被称为关卡”而被称为链”。
其实我们上面描述的场景并不完善,因为客户端发来的报文访问的目标地址可能并不是本机,而是其他服务器,当本机的内核支持 IP FORWARD时,我们可以将报文转发给其
他服务器,所以,这个时候,我们就会提到 iptables中的其他”关卡,也就是其他链”,他们就是”路由前”、“转发”、”路由后”,他们的英文名是
PREROUTING、 FORWARD、 POSTROUTING
也就是说,当我们启用了防火墙功能时,报文需要经过如下关卡,也就是说,根据实际情况的不同,报文经过链可能不同。如果报文需要转发,那么报文则不会经过 Input链
发往用户空间,而是直接在内核空间中经过 forward链和 postrouting链转发出去的。
所以,根据上图,我们能够想象出某些常用场景中,报文的流向
到本机某进程的报文: PREROUTING->|NPUT
由本机转发的报文: PREROUTING-> FORWARD-> POSTROUTING
由本机的某进程发出报文(通常为响应报文): OUTPUT-> POSTROUTING
1. 规则表
表的概念
我们再想想另外一个问题,我们对每个”链”上都放置了一串规则,但是这些规则有些很相似,比如,A类规则都是对ip或者端囗的过滤,B类规则是修改报文,那么这个时候,我
们是不是能把实现相同功能的规则放在一起呢,必须能的
我们把具有相同功能的规则的集合叫做表”,所以说,不同功能的规则,我们可以放置在不同的表中进行管理,而iptables已经为我们定义了4种表,每种表对应了不同的功
能,而我们定义的规则也都逃脫不了这4种功能的范围,所以,学习 iptables之前,我们必须先搞明白每种表的作用。
iptables为我们提供了如下规则的分类,或者说, iptables为我们提供了如下”表”:
filter表:负责过滤功能,防火墙;内核模块: iptables_filter
nat 表: network address translation,网络地址转换功能;内核模块: iptables_nat
mangle表:拆解报文,做出修改,并重新封装的功能; iptables_mangle
raw表:关闭nat表上启用的连接追踪机制; iptables_raw
也就是说,我们自定义的所有规则,都是这四种分类中的规则,或者说,所有规则都存在于这4张表中。
-
raw:高级功能,如:网址过滤。
-
mangle:数据包修改(QOS),用于实现服务质量。
-
nat:地址转换,用于网关路由器。Nat地址转换
-
filter:包过滤,用于防火墙规则。过滤数据包,通还是不通
数据包经过防火墙的处理顺序
2. 规则链处理时机
链的概念
现在,我们想象一下,这些”关卡在 tables中为什么被称作”链呢?���们知道,防火墙的作用就在于对经过的报文匹配”规则”,然后执行对应的”动作“所以,当报文经过这些
关卡的时候,则必须匹配这个关卡上的规则,但是,这个关卡上可能不止有一条规则,而是有很多条规则,当我们把这些规则串到一个链条上的时候,就形成了“链所以,我们
把每一个关卡”想象成如下图中的模样,这样来说,把他们称为链更为合适,每个经过这个关卡的报文,都要将这条链”上的所有规则匹配遍,如果有符合条件的规则,
则执行规则对应的动作。
INPUT链:处理输入数据包。入站数据包处理
OUTPUT链:处理输出数据包。出站数据包处理
PORWARD链:处理转发数据包。
PREROUTING链:用于目标地址转换(DNAT)进站进行的过滤。
POSTOUTING链:用于源地址转换(SNAT)出站进行的过滤。
3.表链关系
首先
我们需要注意的是,某些“链中注定不会包含某类规则°,就像某些”关卡”天生就不具备某些功能一样,比如,A”关卡”只负责打击陆地敌人,没有防空能力,B”关卡“只负
责打击空中敌人,没有防御步兵的能力,C关卡”可能比较NB,既能防空,也能防御陆地敌人,D”关卡·最屌,海陆空都能防。
那让我们来看看,每个关卡都有哪些能力,或者说,让我们看看每个”链”上的规则都存在于哪些表”中。
我们还是以图为例,先看看 prerouting “链”上的规则都存在于哪些表中。
注意:下图只用于说明 prerouting 链上的规则存在于哪些表中,并没有描述表的顺序。
这幅图是什么意思呢?它的意思是说, prerouting链只拥有nat表、raw表和 mangle表所对应的功能,所以, prerouting中的规则只能存放于nat表、raw表和 mangle表中
那么,根据上述思路,我们来总结一下,每个关卡”都拥有什么功能,
或者说,每个”链中的规则都存在于哪些”表”中。
PREROUTING的规则可以存在于:raw表, mangle表,nat表
NPUT的规则可以存在于: mangle表, filter表,( centos7中还有nat表, centos6中没有)。
FORWARD的规则可以存在于: mangle表, filter表
OUTPUT的规则可以存在于:raw表 mangle表,nat表,filter表
POSTROUTING的规则可以存在于: mangle表,nat表。
但是,我们在实际的使用过程中,往往是通过”表作为操作入口,对规则进行定义的,之所以按照上述过程介绍 iptables,是因为从关卡的角度更容易从入门的角度理解,但
是为了以便在实际使用的时候,更加顺畅的理解它们,此处我们还要将各”表”与”链”的关系罗列出来,
表(功能)<->链(钩子)
raw表中的规则可以被哪些链使用: PREROUTING, OUTPUT
mangle表中的规则可以被哪些链使用: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
nat表中的规则可以被哪些链使用: PREROUTING, OUTPUT, POSTROUTING( centos7中还有NPUT, centos6中没有)
filter表中的规则可以被哪些链使用: INPUT, FORWARD, OUTPUT
其实我们还需要注意一点,因为数据包经过一个链的时候,会将当前链的所有规则都匹配遍,但是匹配时总归要有顺序,我们应该一条一条的去匹配,而且我们说过,相同
功能类型的规则会汇聚在一张”表中,那么,哪些“表”中的规则会放在链”的最前面执行呢,这时候就需要有一个优先级的问题,我们还拿 prerouting”链”做图示
prerouting链中的规则存放于三张表中,而这三张表中的规则执行的优先级如下
raw –> mangle—> nat
但是我们知道, iptables为我们定义了4张长”表”当他们处于同一条”链”时,执行的优先级如下
优先级次序(由高而低):
raw — mangle –> nat—> filter
但是我们前面说过,某些链天生就不能使用某些表中的规则,所以,4张长表中的规则处于同一条链的目前只有 output链,它就是传说中海陆空都能防守的关卡。
为了更方便的管理,我们还可以在某个表里面创建自定义链,将针对某个应用程序所设置的规则放置在这个自定义链中,但是自定义链接不能直接使用,只能被某个默认的链当
做动作去调用才能起作用,我们可以这样想象,自定义链就是一段比较”短”的链子,这条短”链子上的规则都是针对某个应用程序制定的,但是这条短的链子并不能直接使用
而是需要焊接在 Iptables默认定义链子上,才能被 iptables使用,这就是为什么默认定义的链需要把自定义链当做动作去引用的原因。这是后话,后面再聊,在实际使用
时我们即可更加的明白。
数据经过防火墙的流程
综上所述,我们可以将数据包通过防火墙的流程总结为下图:
我们在写 Iptables规则的时候,可以时刻牢记这张路由次序图,灵活配置规则。
我们将经常用到的对应关系重新写在此处,方便对应图例查看。
链的规则存放于哪些表中(从链到表的对应关系)
· REROUTING的规则可以存在于:raw表, mangle表,nat表。
·NPUT的规则可以存在于: mangle表, filter表,( centos7中还有nat表, centos6中没有)。
·FORWARD的规则可以存在于: mangle表, filter表。
·OUTPUT的规则可以存在于:raw表 mangle表,nat表, filter表。
·POSTROUTING的规则可以存在于: mangle表,nat表。
表中的规则可以被哪些链使用(从表到链的对应关系):
·raw表中的规则可以被哪些链使用: PREROUTING, OUTPUT
·mangle表中的规则可以被哪些链使用: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
·nat表中的规则可以被哪些链使用: PREROUTING, OUTPUT, POSTROUTING( centos7中还有|NPUT, centos6中没有
·filter表中的规则可以被哪些链使用: INPUT, FORWARD, OUTPUT
下图中nat表在 centos7中的情况就不再标明。
规则的概念
规则:根据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理
那么我们来通俗的解释一下什么是 Iptables的规则,之前打过一个比方,每条链都是一个”关卡,每个通过这个”关卡”的报文都要匹配这个关卡上的规则,如果配,则对报
文进行对应的处理,比如说,你我二人此刻就好像两个报文”,你我二人此刻都要入关,可是城主有命,只有器宇轩昂的人才能入关,不符合此条件的人不能入关,于是守关将
土按照城主制定的规则”,开始打量你我二人,最终,你顺利入关了,而我已被拒之门外,因为你符合器宇轩昂的标准,所以把你放行”了,而我不符合标谁,所以没有被放
行,其实,“宇轩昂就是种匹配条件”,“放行就是种动作,”匹配条件”与”动作“组成了规则
了解了规则的概念,那我们来聊聊规则的组成部分此处只是大概的将规则的结构列出,后面的文章中会单独对规则时进行总结。
规则由匹配条件和处理动作组成
匹配 条件
匹配条件分为基本匹配条件与扩展匹配条件
基本匹配条件
源地址 Source IP,目标地址 Destination|P
上述内容都可以作为基本匹配条件
扩展匹配条件
除了上述的条件可以用于匹配,还有很多其他的条件可以用于匹配,这些条件泛称为扩展条件,这些扩展条件其实也是 netfilter中的部分,只是以模块的形式存在,如果想要
使用这些条件,则需要依赖对应的扩展模块
源端口 Source port,目标端口 Destination Port
上述内容都可以作为扩展匹配条件
-
ACCEPPT:接受数据包。
-
DROP:直接丢弃数据包。不给任何回应信息,这时候客户端会感觉自己的请求沉入大海,等过了超时时间才会有反应。
-
REDIRECT:重定向、映射、透明代理。
-
SNAT:源地址转换。
-
DNAT:目标地址转换。
-
MASQUERADE:IP伪装(NAT),用于ADSL。是SNAT的一种特殊形式,适用于动态的,临时会变的IP上。
-
LOG:日志记录。在/var/log/messages文件中记录日志信息。除了记录对数据包不做任何动作。
基础命令
-t<表>: 指定要操纵的表
-A: 向规则链末尾中添加,追加条目;(append)
-D: 从规则链中删除条目;(delete)
-I: 向规则链的开头(或者指定序号)中插入条目,未指定规则序号时,默认作为第一规则;(insert)
-R: 替换规则链中的条目;
-L: 显示规则链中已有的条目;(list)
-F: 清除规则链中已有的条目,若位置定规则序号,则默认清空所有;(flush)
-v: 查看规则列表时显示详细信息(verbose)
-Z: 清空规则链中的数据包计算器和字节计数器;
-N: 创建新的用户自定义规则链;
-P: 定义规则链中的默认目标;(police)
-h: 显示帮助信息;
-p: 指定要匹配的数据包协议类型;
-s: 指定要匹配的数据包源ip地址;
-j<目标>:指定要跳转的目标;
-i<网络接口>:指定数据包进入本机的网络接口;
-o<网络接口>:指定数据包要离开本机所使用的网络接口。
iptables命令选项输入顺序:
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> — sport 源端口 <-d 目标IP/目标子网> — dport 目标端口 -j 动作
PS:
LUNIX7 上面独有的firewall 区域划分 public 默认区域信任区域 非信任区域
systemctl start firewalld.service LINUX7上面独有的防火墙firewall
NAT表基础拓扑实验
NAT表
NAT 地址转换
SNAT source 源地址 转换 作用场景:内部网络访问广域网
DNAT destnation 目标地址转换 作用场景:广域网主机访问内部网络服务器
1.拓扑实验环境
搭建以上iptables规则。
一共开三个虚拟机 全部网络适配器设置为仅主机模式
web1:一台centos6.5 作为内部网络内的客户端,设置ip地址为192.168.100.101
web2:一台centos7 作为外部网络,设置ip地址12.0.0.12
一台centos6.5 作为iptables防火墙(要有双网卡)一个网卡设置为内部网的网卡192.168.100.1,一个设置为外部网的网卡12.0.0.1,service network restart 重启下网卡
2.实验思路
在iptables防火墙上配置
· 清空防火墙的规则filter 默认规则
· 清空防火墙 nat规则
· vim /etc/sysctl.conf——net.ipv4.ip_forward = 1 #永久开启路由功能
· sysctl –p #重新加载配置文件
· 开始进行iptables的规则设置
3.操作步骤
1)iptables防火墙 :修改配置文件,开启路由功能
清除iptables防火墙中原有的规则(因为是实验所以删除所有iptables规则,现实中按实际情况操作)
2)SNAT source : 源地址转换
POSTOUTING链:用于源地址转换(SNAT)出站进行的过滤。
命令是:
[ root@linuxidc ~]# iptables –t nat –A POSTROUTING –s 192.168.100.0/24 –o eth0 –j SNAT –to-source 12.0.0.1
#使192.168.100.0网段的内网web服务数据包出站转换成12.0.0.1的IP地址
3)DNAT destination : 目标地址转换
PREROUTING链:用于目标地址转换(DNAT)进站进行的过滤。
命令是:
[ root@linuxidc ~]# iptables –t nat –A PREROUTING –d 12.0.0.1 –p tcp –dport 80 –i eth1 –j DNAT — to-destination 192.168.100.101
#使通过12.0.0.1网卡的数据包发送的ip地址指向为192.168.100.101的内网web服务
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx
本文永久更新链接地址:https://www.linuxidc.com/Linux/2018-08/153567.htm