Iptables防火墙原理

一、IPTABLES概念

 iptables是隔离主机以及网络的工具,通过自己设定的规则以及处理动作对数据报文进行检测以及处理。从设备上分类,防火墙分为软件防火墙、硬件防火墙、芯片级防火墙。从技术上分类,防火墙分为数据包过滤型防火墙、应用代理型防火墙。这是因为四层模型的每一层都可以应用防火墙。

  防火墙的发展史就是从墙到链再到表的过程,也即是从简单到复杂的过程。为什么规则越来越多,因为互联网越来越不安全了,所有防火墙的的规则也越来越复杂。防火的工具变化如下:

    ipfirewall(墙)-->ipchains(链条)--iptables(表)

    2.0版内核中,包过滤机制是ipfw,管理工具是ipfwadm;

    2.2 版内核中,包过滤机制ipchain,管理工具是ipchains;

    2.4版及以后的内核中,包过滤机制是netfilter,管理工具iptables

二、IPTABLES原理

  iptables 是 Linux 中比较底层的网络服务,它控制了 Linux 系统中的网络操作,firewalld不仅仅是对 iptables 上层封装那么简单,还 有 ipv6 支持等功能。同时,iptables 不仅仅是防火墙这么简单,它基本上能实现你在 linux 上对于网络的所有需求。

 linux的防火墙由netfilter和iptables组成。用户空间的iptables制定防火墙规则,内核空间的netfilter实现防火墙功能。

iptables(用户空间)     位于/sbin/iptables,是用来管理防火墙的命令的工具,为防火墙体系提供过滤规则/策略,决定如何过滤或                                         处理到达防火墙主机的数据包,称为Linux防火墙的“用户态
netfilter

Linux是一个极其模块化的内核。

netfilter也是以模块化的形式存在于Linux中,所以每添加一个和netfilter相关的模块,代表着netfilter就多一个功能。

有些模块是使用netfilter所必须的,所以这些模块已经默认编译到内核中而非需要时加载。

存放netfilter模块的目录有三个:

              /lib/modules/$kernel_ver/net/{netfilter,ipv4/netfilter,ipv6/netfilter}。$kernel_ver代表内核版本号。

       其中:ipv4/netfilter/存放的ipv4的netfilter

                  ipv6/netfilter/存放的ipv6的netfilter,

                  /lib/modules/$kernel_net/kernel/netnetfilter/存放的是同时满足ipv4和ipv6的netfilter。

                 在最后一个目录中放入更多的模块,是netfilter团队发展的目标,因为要维护ipv4和ipv6两个版本挺累的。

要使netfilter能够工作,就需要将所有的规则读入内存中。netfilter自己维护一个内存块,在此内存块中有4个表:filter表、NAT表、mangle表和raw表。在每个表中有相应的链,链中存放的是一条条的规则,规则就是过滤防火的语句或者其他功能的语句。也就是说表是链的容器,链是规则的容器。实际上,每个链都只是一个hook函数(钩子函数)而已。

说到这里,需要纠正一个概念,Linux上的防火墙是由netfilter实现的,但是netfilter的功能不仅仅只有"防火",一般可以认为"防火"的功能只是filter表的功能。

作用 当一个数据包进入网卡时,数据包首先进入PREROUTING链,在PREROUTING链中我们有机会修改数据包的DestIP(目的IP),然后内核的"路由模块"根据"数据包目的IP"以及"内核中的路由表"判断是否需要转送出去(注意,这个时候数据包的DestIP有可能已经被我们修改过了)
如果数据包就是进入本机的(即数据包的目的IP是本机的网口IP),数据包就会沿着图向下移动,到达INPUT链。数据包到达INPUT链后,任何进程都会-收到它
本机上运行的程序也可以发送数据包,这些数据包经过OUTPUT链,然后到达POSTROTING链输出(注意,这个时候数据包的SrcIP有可能已经被我们修改过了)
如果数据包是要转发出去的(即目的IP地址不再当前子网中),且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出(选择对应子网的网口发送出去)
filter 主要用于对数据包进行过滤,也就是防火墙实现"防火"的功能。根据具体的规则决定是否放行该数据包(如DROP、ACCEPT、REJECT、LOG)。filter 表对应的内核模块为iptable_filter

OUTPUT

FORWARD

INPUT

NAT

主要功能为进行一对一、一对多、多对多等网址转译工作(网络地址转换,可以转换源地址、源端口、目标地址、目标端口如SNAT、DNAT、MASQUERADE、REDIRECT),由于转译工作的特性,需进行目的地网址转译的封包,就不需要进行来源网址转译,反之亦然,因此为了提升改写封包的率,在防火墙运作时,属于一个流的包(因为包的大小限制导致数据可能会被分成多个数据包)只会经过这个表一次。如果第一个包被允许做

NAT或Masqueraded,那么余下的包都会自动地被做相同的操作,也就是说,余下的包不会再通过这个表。表对应的内核模块为 iptable_nat。

NAT依赖于ip_forward,因此需要先开启它。NAT的基础是nf_conntrack,用来记录NAT表的映射关系

从内核2.6.34开始,NAT表支持操作INPUT链。它只为SNAT服务。和snat on postrouting类似,只不过snat on
input用来转换"目标是本机的数据包"的源地址

PREROUTING

POSTROUTING

OUTPUT

mangle

一种特殊的表,通过mangle表可以实现数据包的拆分和还原。

主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服务质量)调整以及策略路由等应用,由于需要相应的路由设备支持,因此应用并不广泛

包含所有的链
raw

加速数据包穿过防火墙的表,也就是增强防火墙性能的表

是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理。在匹配数据包时,raw表的规则要优先于其他表

PREROUTING

OUTPUT

NAT有三个作用:

◇ 地址转换。让内网(私有地址)可以共用一个或几个公网地址连接Internet。这是从内向外的,需要在网关式防火墙的POSTROUTING处修改源地址,这是SNAT功能。

◇ 保护内网服务器。内网主机连接Internet使用的是公网地址,对外界而言是看不到内网服务器地址的,所以外界想要访问内部主机只能经过防火墙主机的公网地址,然后将目标地址转换为内网服务器地址,这起到了保护内网服务器的作用。转换目标地址需要在网关式防火墙的PREROUTING链处修改,这是DNAT功能。

◇ 不仅可以修改目标地址,还可以使用端口映射功能。DNAT是修改目标地址,端口映射是修改目标端口。如将web服务器的8080端口映射为防火墙的80端口。

外网主机和内网主机通信有两种情况的数据包:一种情况是建立NEW状态的新请求连接数据包,一种是回应的数据包。无论哪种情况,在NEW状态数据包经过地址转换之后会在防火墙内存中维护一张NAT表,保存未完成连接的地址转换记录,这样在回应数据包到达防火墙时可以根据这些记录路由给正确的主机。

也就是说,SNAT主要应付的是内部主机连接到I

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凤舞飘伶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值