Linux学习94 Linux防火墙核心概念全面讲解

一、概述

  1、我们所谓的套接字通信的模式是指一台主机之上有一个工作在用户空间的进程,他可能用各种各样的并发响应的模式响应多个客户端的请求,即工作在服务端的进程他要与别的主机通信,当机遇C/S架构的模型时通常是向内核注册监听一个套接字,我们说过对于我们的网络来讲我们大体可以分为通信子网和资源子网,通信子网是在内核中实现,而资源子网是在用户空间实现,靠进程来进行的。而通信子网中基于TCP/IP模型大概分为相应的四层。最下面是链路层或物理层,主要实现本地通信或局域网通信,如果要完成互联网寻址,我们就依赖于上面的互联网层或网络层,他的主要通信方式封装的为IP守护。再上层为传输层,为TCP和UDP等等。这三层是在内核空间中实现的。

    

  2、我们互连网通信一般都是一端拿着IP和端口与另一端拿着IP和端口进行通信,这个通信建立起来以后我们就称之为一个已建立的套接字。(CIP:port,SIP:port)

  3、我们监听的端口不一定要互联网上的客户端访问,有可能只要本地使用。但是只要你监听了别人就有可能乘虚而入。因此我们需要加一道墙让外面无法访问。我们可以在墙上只开放能访问某些端口外面能够访问。

  4、我们大多数防火墙可以称之为包过滤型防火墙。我们需要在内核的TCP/IP协议栈上进行限制。

  5、我们可以在局域网的边缘处加一道防火墙,即路由器(网关)之前部署一个应用,这个应用可以检测所有报文,如果检测到这个报文有问题就将其干掉。

  6、那么如果是一台linux主机的话他如何去完成这个功能呢?我们前面说过我们内核中可以打开网卡的核心转发功能,打开核心转发后网卡就是核心网关了,他可以有两个网卡,从一个网卡中来的报文他可以路由到另一个网络中去,那么我们这个报文在当前主机上是如何完成路由的呢?一个报文来了后首先到达网卡,而后到达网卡驱动然后到达内核处理缓冲区中,接下来内核将其交给TCP/IP协议栈分析报文是谁的,如果目标IP是自己就看是本地哪个进程端口的,如果目标IP不是自己的那么接下来他会帮忙发出去,看看要到达的目标地址经过我们哪个网络接口能出去,那么这个要怎么看呢?即他会检查自己本地的路由表,如果他并不知道目标是谁,他会交给默认网关。所以经过路由表检查以后如果发现是自己的那么就会交给相应的目标网卡。即此时他会在内核中转一圈,既然能转一圈那么就能设置防火墙规则了。这个就是网络防火墙。

    

  7、我们来设定我们把防火墙施加在不同的位置就能实现包过滤的功能了。Linux内核中设置了两个不同的位置来实现这个功能。

    a、当目标IP是自己的时候,就交给本地用户空间进程,本机进程处理完后经由本机发出的门也要有一道墙。这个叫主机防火墙。

    b、通过另外一个接口再重新发出去,这个叫网络防火墙。

      

  8、其实真正内核中实现的防火墙的位置一共有5处。

    a、在我们内核中,无论任何时候当报文到达本地主机以后,第一步有一个叫路由的过程,即无论从哪个网卡进来的报文,目标有可能是本机或其它主机。即这个报文是到本机内部来还是由本机转发。路由之后就有了两种逻辑,第一个逻辑即到达本机内部来的,这种只管到达本机内部来的我们称之为input,即入栈钩子。勾住如果没问题就放行了。这是一种逻辑。

    b、还有一种逻辑是转发,所谓转发就是如果检查完以后没问题就送给另外一道门,这道门也一样的,即转发的时候我允不允许你通过我这里,要不要收保护费呢?所以对于此处来讲我们也设置了一个钩子,叫forward。这两个是路由以后的结局。

    c、但是需要注意的是,在路由发生之前我们有些事还可以悄悄的做一些其它的预处理工作,比如到我们forward时要扣去百分之三十的关税,但是在来之前如果我们能找到他的大领导说一说有可能只需要扣去百分之十了。因此在路由之前我们可以先做一些预处理工作,也可以设置一个钩子,因此这一道钩子我们称之为prerouting。因此我们就有了三个钩子了

    d、接着我们在我们的报文到达本地某个进程之后,假如我们某个请求是由外部发出的,的确是到本机内部来的,就input到我们的进程来了,也有可能是我们自己是客户端访问别人也有可能,但无论是哪一种,别人访问自己自己响应的或者是自己内部某个进程主动发出去访问别人的他们首先都需要经由自己的内部人员的审核。因此,基于内部来讲我们需要要确保自己的人是根红苗正的,于是不管是别人访问自己自己响应的或者自己发送请求别人的都需要经由一道钩子来实现,这个钩子我们称之为output

    e、但是我们需要明白无论是本地出去的还是别人转发的最终都需要经过我们的网卡出去,但是我们可以想象一下,如图中所示,假如我们有四块网卡,他要经过哪块网卡出去呢?因此他需要路由。我们知道很有可能每一个网卡都会有一个下一条,或者说是下一台主机,那么到底应该经由哪台主机或路由器往互联网上发呢?我们应该选一条最佳的路,这四块网卡哪一条是最佳的呢?因此我们要看路由,因此在报文发出之前还有一次路由的过程,这次的路由就是要送报文出去了,但是路由完了以后报文就要离开本机了,再不宰他就来不及了,因此我们还要再伸手一次,再来一个钩子,即postrouting,即路由之后。然后再发送至网卡报文出去。

      

    f、因此大体上我们有这五处位置,第一处位置即刚刚进来的时候事先做一些处理,第二个位置到达本机内部来,第三个位置,经由本机转发,这三个位置我们可以称之为前半场。如果马上由output和postrouting发出去了,这就叫后半场。因此前半场是来的路上他包括prerouting,input,forward三个。因此我们还有离去的路上,也就是后半场,他包括output,forward,postrouting,我们发现forward在前半场和后半场都有。但是其实他的逻辑和左右没有关系,他和我们的报文的阶段有关系,一个报文刚刚到达本机要么就到达input,要么就到达forward。

      

  8、任何一个报文到达本机以后他一定会到达这五个位置中的一个或多个位置。比如到达本机内部来的他会经过两个位置,即刚进来本机后他会先到达input,由本机发出的有两个位置,即output和postrouting。由本机转发的有三个位置,prerouting,forward,postrouting。因此内核中这五个位置是内核中安置的一个框架。框架放进来以后相当于就在内核中放了这五个位置,任何报文只要到达这个位置都要勾起来拔毛。事实上我们在这个钩子上放的其实是检查规则,即我们放了很多检查条件和处理规则,即如果你的源IP是什么,源端口是什么,目标IP目标端口是什么,满足的时候如何处理,比如拔一根毛或两根毛,或直接干掉。但是我们如何在内核中装规则呢?因为我们用户是没法直接操作内核的,因为内核所有功能都是通过系统调用向外提供的。因此我们需要一个工具来进行相应的规则的实现。这个工具就叫iptables,他是一个用户空间用于编写规则的工具。他能调用内核的接口将相应的规则送到内核中进行生效,真正实现防火的是内核中的这几个框架,以及送往框架中的规则。而这个框架我们称之为网络过滤器,即netfilter。

  9、其实我们linux防火墙到今天已经有好几代了,第一代的时候叫ipfirewall,这才是内核1.0时代。内核2.0时代的时候叫做ipchains,也就是连锁店的意思,为什么叫chains呢?因为我们的规则是自上而下串起来一起生效的,后来发现这每一个钩子上面都是一条链,把链转换下来就相当于是由行和列组成的表,因此再往后就叫iptables了。但是到linux4.0以后,iptables名字也改了,叫nftables。到centos7以后,红帽研发了另外一个产品叫firewalld,他是由python研发的多功能命令工具并且还有一个前端图形界面。这样我们使用起来就简单多了。

    a、我们首先需要关闭我们的firewalld。因为我们现在是需要使用后端的iptables。

      systemctl stop firewalld

      systemctl disabled firewalld 

    b、我们还需要清空我们的iptables所有规则

    c、我们还可以使用firewall-config命令打开我们的firewalld的图形界面。

      

      (1)、我们可以看到我们可以定义dmz区域,公共区域,等等等等区域。

二、iptables:包过滤型的防火墙

  1、Firewall:防火墙,隔离工具;工作于主机或网络边缘,对于进出本机或本网络的报文根据事先定义的检查规则做匹配检测,对于能够被规则匹配到的报文做出相应处理的组件。

    a、主机防火墙

    b、网络防火墙

    c、软件防火墙(软件逻辑)

    d、硬件防火墙(硬件和软件逻辑)

  2、ipfw(firewall framework)

  3、ipchains(firewall framework)

  4、iptables(netfilter)

    a、netfilter:kernel

    b、iptables:rules until

    c、hook function:

      input

      output

      forward

      prerouting

      postrouting

  5、nftables

  6、链(内置):对iptables命令来讲,我们上面所说的钩子不叫做钩子而是叫做规则链。每一个规则链的名字和他的钩子名一样但是要全大写字母。比如放在prerouting链上的规则我们在iptables上下文写的时候你说明要送往PREROUTING。

    a、PREROUTING

    b、INPUT

    c、FORWARD

    d、OUTPUT

    e、POSTROUTING

  7、功能:其实我们内核中的netfilter加我们用户空间的iptables所能够实现的功能不仅仅是防火墙,他还能实现其他的额外功能,比如下面的

    a、filter:过滤,防火墙

    b、nat:网络地址转换(network address translation);用于修改源IP或目标IP,也可以改端口。即报文到达我们防火墙的时候我们将其源地址和目标地址改一改,甚至于把目标端口改成其他端口,这儿我们称之为转换,因为我们报文来这儿的时候改了,回去的时候还得改回去。即我们在内网之前放一个防火墙。我们内网出去的时候防火墙就将相应的源地址转换为防火墙自己的地址,外部访问内网服务器的时候,也只能访问防火墙的地址,防火墙将相应的目标地址再转换为内网中的IP地址。因此起到了一个保护作用。保护客户端的主要是做源地址转换,保护服务端的主要是做目标地址转换。

    c、mangle:拆解报文,做出修改,并重新封装起来。这个是修改除了地址之外的其它属性的,我们的地址修改是由nat来实现的。mangle要修改的比如ttl值,上层协议,协议版本等等。

    d、raw:关闭nat表上启用的连接追踪机制;我们的nat启动时为了确保他能够将出去的请求回来的时候能够对应到相应的客户端上,我们就需要用到连接追踪表。无论是目标地址转换还是源地址转换这里都需要,这个时候我们就需要打开一个连接追踪功能,连接追踪功能就是把每一个请求的源地址源端口,目标地址目标端口和他的报文序列号之类的给他记录到相应的内存空间中,回头再有报文请求的时候我们可以查表看看这个人此前有没有访问过,是不是此前的请求报文对应的,因此他是用来记录并识别连接功能的,这就是连接追踪表。有些连接追踪功能是没有必要的所以就有了我们的raw功能。他就是关闭nat表上启用的连接追踪机制。

  8、功能<--链:我们每一个功能就叫一个表。

    a、raw:PREROUTING,OUTPUT

    b、mangle:PREROUTING,INPUT,FORWARD,OUT,POSTROUTING

    c、nat:PREROUTING,[INPUT,]OUTPUT,POSTROUTING

    d、filter:INPUT,FORWARD,OUTPUT

  9、报文流向

    a、流入本机:PREROUTING --> INPUT

    b、由本机流出:OUTPUT --> POSTROUTING

    c、转发:PREROUTING --> FORWARD --> POSTROUTING

  10、路由功能发生的时刻

    a、报文进入本机后:

      判断目标主机是?

    b、报文离开本机之前

      判断经由哪个接口送往下一站

  11、相应说明

    a、假如我们写规则的时候,我们要实现任何到达即访问本机80端口的我都拒绝,这就涉及到好几个地方,首先,拒绝,就是过滤功能,在我们上述所说的4个功能中我们就使用了filter,然后,到达本机内部来的访问80端口的,方向就定了,那一定是源地址是互联网上的任意地址,而目标地址是本机。源端口有可能是互联网上的任意端口,但目标端口是本机的80端口。那么这个报文就会是流入本机这一个流向,因此他就只有两个流经两个方向,即PREROUTING和INPUT。我们说过要做拒绝就是要做过滤。而过滤功能如上所示是不能在PREROUTING上做的,因此我们的规则就只能写在INPUT上了。所以我们用哪个功能,什么方向,什么位置,我们就基本能确定下来了。如果确定不了的话我们规则就是没法写的。

    b、我们每一个功能叫一个表,我们可以发现我们有一个链功能很强大,每个功能上都有他的身影。那就是OUTPUT,假如这四种功能规则都写在一块儿了,那么谁先生效谁后生效呢?假如你要是过滤完后把它拒绝了我们还怎么做地址改动呢?所以这四种功能的规则都可以放在同一个链上或者是同一个钩子上。但是他们一定是同一类在一起,并且生效有先后次序的,先后次序就是我们上面说的raw,mangle,nat,filter这个次序,优先级由高到低。raw是最高的,filter是最低的。

      

原文地址:https://www.cnblogs.com/Presley-lpc/p/12985799.html