linux防火墙

https://www.cnblogs.com/kqdssheng/p/16405868.html

https://zhuanlan.zhihu.com/p/580178712

 《精通Linux内核网络 -(以)罗森著》

1、netfilter、iptables、firewall、ufw之间的关系:netfilter-->iptables-->[ firewall | ufw ]。netfilter处在最底层(内核),负责根据上层下达的规则对报文进行处理【实际干活的】;iptables属于一个应用层临时命令工具,负责制定一系列的规则然后提交给netfilter【部门领导】;firewall和ufw属于一个应用层常驻服务工具,负责用人性化的语言制定最齐全的规则并将其转换为iptables理解的规则,然后让iptables再提交给netfilter进行处理【公司领导】。
  • iptables属于一个应用层临时命令工具:规则制定之后iptables便不再参与什么活动,等系统重启之后之前配置的规则全部都丢失,只能再次通过iptables-restore来手动恢复之前通过iptables-save保存的规则。(有些linux发行版中,iptables也属于一种常驻服务,可以通过服务管理工具统一对其进行管理。但是似乎不支持规则动态加载。)
  • firewall和ufw属于一个应用层常驻服务工具:服务在启用之后便将自身此前存储的规则自动通过iptables进行加载,而后如果有新的规则变动,它们都可以支持规则的动态加载让其立即生效(ufw存疑)。
  • iptables与firewalld都不是真正的防火墙,它们都只是用来定义防火墙策略的防火墙管理工具而已;或者说,它们只是一种服务。iptables服务会把配置好的防火墙策略交由内核层面的netfilter网络过滤器来处理,而firewalld服务则是把配置好的防火墙策略交由内核层面的nftables包过滤框架来处理。换句话说,当前在Linux系统中其实存在多个防火墙管理工具,旨在方便运维人员管理Linux系统中的防火墙策略,我们只需要配置妥当其中的一个就足够了。

2、应用平台。iptables是红帽系列6及以下的默认防火墙(如CentOS6.x),firewall 是红帽系列7及以上的默认防火墙(如CentOS7.x),UFW是Debian系列的默认防火墙。虽然都是在不同平台下的默认防火墙,但并非ufw就不能再红帽系列使用。3、兼容性。iptables是linux防火墙的基石,所以存在firewall、ufw的地方就一定会看到iptables。而在不启用firewall、ufw服务的情况下,也依旧可以通过iptables来使用防火墙。不过firewall和ufw同时存在并启的情况下,规则会很混乱。4、Firewall防火墙与华为下一代USG防火墙 区域对比。USG也使用了区域的概念,不过在使用上与firewall有很大的区别。

  • Firewall 区域:多规则的集合,将区域与流量通道(网络接口)进行绑定,达到对过往流量的控制。【面向单主机】 例,当一个报文从网卡进入时,系统便根据网卡绑定的区域进行对应区域规则的逐条匹配。
  • USG 区域:多接口的集合,将区域当做规则五元组(源/目的区域、源/目的ip-port、动作)的一部分。整体使用上就是:接口划区-->进入策略-->创建规则。【面向多网络】 例,当一个报文从网卡进入时,系统根据网卡的来源得知其来源区域,又根据目的ip路由得出其去往网卡的目的区域,然后根据得到的信息(源/目的区域、源/目的ip-port)开始逐条匹配策略中的规则。

Netfilter

Netfilter是Linux 2.4内核引入的全新的包过滤引擎,位于Linux内核中的包过滤功能体系,基于内核控制,实现防火墙的相关策略。Netfilter 由一些数据包过滤表组成,这些表包含内核用来控制信息包过滤的规则集。Netfilter在数据包必须经过且可以读取规则的位置,设有5个控制关卡。这5个关卡处的检查规则分别放在5个规则链中叫钩子函数(hook functions)。也就是说5条链对应着数据包传输路径中的5个控制关卡,链中的规则会在对应的关卡检查和处理。任何一个数据包,只要经过本机,必然经过5个链中的某个或某几个。

Netfilter中的五个规则链

规则链作用
PREROUTING 数据包刚进入网络接口之后,路由之前
INPUT 数据包从内核流入用户空间
FORWARD 在内核空间中,从一个网络接口进入,到另一个网络接口去。转发过滤。
OUTPUT 数据包从用户空间流出到内核空间
POSTROUTING 路由后,数据包离开网络接口前

来源:https://www.likecs.com/show-203697241.html

osi网络七层:物理层,数据链路层(mac),网络层(ip),传输层(tcp udp),会话层,表示层,应用层。也可分为四层:物理层(物理层、链路层),网络层,传输层,应用层。

tcp五层:物理层,数据链路层(mac),网络层(ip),传输层(tcp udp),应用层(包含了osi中的会话层,表示层)

1、什么是Netfilter

Netfilter是Linux 2.4.x引入的一个子系统,它作为一个通用的、抽象的框架,提供一整套的hook函数的管理机制,使得诸如数据包过滤、网络地址转换(NAT)和基于协议类型的连接跟踪成为了可能。

iptables是Linux下功能强大的应用层防火墙工具, 说到iptables必然提到Netfilter,iptables是应用层的,其实质是一个定义规则的配置工具,而核心的数据包拦截和转发是Netfiler。Netfilter是Linux操作系统核心层内部的一个数据包处理模块。iptables和Netfilter关系如图1所示。

Linux下Netfilter简介

2、Netfilter的工作原理

Netfilter防火墙的内核模块为了对经过内核TCP/IP协议栈的不同类型数据包能够加以多种手段的控制和处理,在数据包经过协议栈的游历路线之中,分别选择了5个挂接点,Netfilter在netfilter_ipv4.h中将这个五个点重新命了个名,分别被命名为PRE_ROUTING、LOCAL_IN、FORWARD、LOCAL_OUT以及POST_ROUTING。数据包的传输流程以及Netfilter在IPV4协议中的挂载点结构如图2所示。

Linux下Netfilter简介

每个挂载点上,有很多已经按照预先注册了的回调函数(也被称为钩子函数),对于每个到来的数据包都会依次经过这些挂载点上的钩子函数的处理,从而判断数据包的是否继续传输。

5个挂载点在IPV4协议栈中定义的钩子函数,分别是NF_IP_PRE_ROUTING、NF_IP_LOCAL_IN、NF_IP_FORWARD、NF_IP_LOCAL_OUT、NF_IP_POST_ROUTING,这些函数的具体功能如下所示。

①NF_IP_PRE_ROUTING:进入的网络数据包在路由查找之前,在ip_rcv()函数(ip_rcv()是Linux核心网络堆栈中用于接收IPV4数据包的主要函数)中被处理并经过钩子点。在此之前,系统只对IP包头中的协议版本、包长度、校验和等进行简单的检查;

②NF_IP_LOCAL_IN:所有目的地址为本机的数据包将在ip_local_device()函数中处理,并流经该钩子点,iptables在这里设置过滤规则对流入数据包进行过滤;

③NF_IP_FORWARD:这是Linux防火墙最重要的钩子点,所有经过防火墙转发,目的地址非本机的数据包将在这里被处理。该钩子点在ip_forward()函数中被调用;

④NF_IP_LOCAL_OUT:所有从本机产生并发送出去的数据包都会经过该钩子点;

⑤NF_IP_POST_ROUTING:在数据包被最终发送至物理介质之前,可以在该点引入数据包的处理,该位置适合做SNAT(Source Network Address Translation)或统计工作。

每个注册的钩子函数经过处理后都将返回下列值之一,告知Netfilter核心代码处理结果,以便对数据包采取相应的动作。

NF_ACCEPT:表明该数据包还是被接受的并且该数据包应当被递交到网络协议栈的下一个阶段;

NF_DROP:表明丢弃该数据报,不再传输;

NF_STOLEN:表明该钩子函数将从此开始对数据包进行处理,并且Netfilter应当放弃对该数据包做任何处理,但是这并不意味着该数据包的资源已经被释放了;

NF_QUEUE:表明是将数据包发送到用户空间,等待在用户空间的处理程序进行处理;

NF_REPEAT:表明再次调用该钩子喊出,应当谨慎使用这个值,以免造成死循环。

3、Netfilter过滤技术的实现

(1)基于接口过滤

基于接口的过滤时所能够做的最简单的过滤技术。利用钩子函数nf_hookfn中的net_device结构体的name键值,可以根据数据包的目的接口名或源接口名来丢弃这些数据包。

(2)基于IP地址的过滤

类似基于接口的数据包过滤技术,基于源/目的IP地址的数据包过滤技术也较为简单。但基于IP地址的过滤技术需要调用结构体sk_buff的数据。通常建立一个接口体sk_buf的指针,并指向结构体数据,从而获取数据包中网络层头部信息,从而获取IP地址,进而与过滤规则中的IP地址进行比对。

(3)基于TCP端口的过滤

防火墙要执行的另一个简单的规则就是基于TCP目的端口哦的数据包过滤,这比检验IP地址略微复杂。因为要创建一个指向TCP头的指针,只需创建一个指向结构体的指针tcphdr,并将它指向数据包中的IP头之后,就可获得一个TCP头指针了。利用TCP头指针读取数据包的TCP端口的信息,并与过滤规则中定义的过滤端口作比较,如果数据包的TCP端口与想抛弃数据包的指定端口匹配,数据包就会被丢弃。

(4)基于数据包内容的过滤

在结构图sk_buff中吗,成员data是数据包内容。利用sb->data可以访问得到数据包内容,通过读取数据包中的内容数据,并与过滤规则中定义的关键字符串进行比较确定是否匹配,匹配规则按照规则定义的目标动作来处理,不匹配表示该数据包通过了过滤规则,由此实现对数据包内容的过滤。

posted @ 2022-12-19 18:14  古锁阳关  阅读(215)  评论(0编辑  收藏  举报