Netfilter

我们在介绍这个 iptables工具之前,需要知道这个Netfilter是什么。

Linux防火墙是由Netfilter组件提供的,Netfilter工作在内核空间,集成在linux内核中Netfilter 是Linux 2.4.x之后新一代的Linux防火墙机制,是linux内核的一个子系统。Netfilter采用模块化设计,具有良好的可扩充性,提供扩展各种网络服务的结构化底层框架。Netfilter与IP协议栈是无缝契合,并允许对数据报进行过滤、地址转换、处理等操作

Netfilter官网文档:https://netfilter.org/documentation/

勾子函数

那接下来呢咱们重点来看看这个防火墙内核里面 它有5个非常重要的勾子函数 勾子函数 这个勾子函数是我们呃 在做开发的时候 一个比较专业的一个概念。什么叫勾子函数呢 它和一般的函数之间有什么区别呢?


什么是勾子函数

勾子函数 说的就是它是一种特殊的函数 这种函数呢 预留了一些这个可调用的 一个接口那么有助于我们 将来外界的用程序去调用 就相当于我们预留了一个后门 相当你可以理解成一个后门 这个后门呢 将来留在那 将来我想用可以 别人用也可以啊 就预留了几个功能 对外可以发布出来

      那一般来讲 我们写函数 有的时候 这个函数 就是给咱们这个软件内部用的 内部的软件之间相互调用 但是对外不公开 而我们这的勾子函数 说的是我们对外给它公开 那将来这个勾子函数 我们可以通过啊 别人做软件开发 调用这5个勾子的函数 来实现这个相关的功能

      所以可以理解成 就相当于对外发布出来的 预留着一个后门接口啊 后门接口在类似内核里面 它集成了5个勾子函数 这个五钩子函数呢 用来控制关于网络通讯的五道关卡啊

Netfilter在内核中选取五个位置放了五个hook(勾子) function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),而这五个hook function向用户开放,用户可以通过一个命令工具(iptables)向其写入规则由信息过滤表(table)组成,包含控制IP包处理的规则集(rules),规则被分组放在链(chain)上

如下图

iptables 介绍及用法_防火墙


勾子函数运行原理

我们要理解下图,理解下图工作流程就知道了 勾子函数运行原理


iptables 介绍及用法_iptables用法_02


就是五个勾子函数 它恰恰处于我们网络通信的必经之路 的五个地方啊 那这里面就描述了 我们通讯过程中要涉及到的五道关 五个必经之路

其中这是我的一个主机

iptables 介绍及用法_iptables用法_03

那这个主机 他里面运行了自己的应用程序啊 这里面我有自己的一个应用程序 比方说这个叫APP 这是我的一个应用程序 那这个应用程序呢 他和外网进行进行通讯啊 假设咱们是一个web服务之类的 应用程序 要和外部的网络进行通讯.


那么现在呢 我们从外部进来一个网络连接 刚进来的时候呢 刚进入到网卡

iptables 介绍及用法_iptables用法_04

我们这有一个网卡 这个网卡收到数据报文以后 那他一看 这个数据报文是我的啊 或者不是我的 他接下来要处理了啊 那么网卡在处理的时候呢

第一步先要经过所谓的路由 路由就是有一个叫Pre routing啊 有一个叫Pre routing的 这样的一个勾子函数啊。这个Pre routing呢 这个勾子函数 它是用来检测你的数据报文 是不是 我要接下来 近一步要处理的一个数据报文 如果是,好 那我就接着往下走 如果不是 那我就把它抛弃掉了 就不让传了 那这个Pre routing呢 它起到了一个检查总入口的作用 那这个Pre routing 检查完以后 接着要进入到下一步

      第二步 就是检查路由表 这是个路由表

这个路由表经过检查 决定了他下一步要怎么走 这个路由表 如果发现这个数据报文是 发送给我本机的应用程序啊 比方说 发现你访问的是我本机的这个APP 好那我就把这个请求往上转发

当然往上转发的话呢 他并不是一下子就到位 他要经过下一个检查

第三步

这个检查叫input 好那这个input呢 它在把数据报文 发送给你的本地用程序之前 他要先去检查 你是否符合这个input的规则 如果符合input规则好 那你就能访问 如果不符合 那就不能访问了啊 这就是in put这样的一个作用啊

      好那如果这个经过路由表一查 发现你这个数据报文不是给我的 是给别的用程序用的 那么接着他要继续往外走啊 往外走要走的话呢 到达下一个地方叫什么呢

       叫另外一个总出口 它有个总出口啊 这个总出口叫什么 叫所谓的post routing 这是个总出口 这个总出口跟刚才的Prerouting很像 Prorouting 是个总入口 post routing是一个总出口

当然中间应该还有一个 forward 那这个 forward就是 如果你的数据报文不是给我的 我要经过 forward往外转发 那往外转发的话呢 转到哪去 转到post routing

      然后呢我这是不是有个应用程序 对不对哎 我这个应用程序 收到一个数据报文以后 一看是我的 我收如果我收到报文以后 我可能要回应对方对吧 回应对方 我要给对方回应 回应的话呢 我们要交到另外一个所谓的勾子函数

     这个勾子函数呢 就是output 它的作用 就是用来把本机的用程序往外发的数据呢 给它转发出去 然后这个output的出去的时候呢 我们还要经过一个路由表的检查

哎把它发送到路由表 然后路由表再汇总到 刚才说的post routing

好那这就是它整个流程啊。

大体上呢 是这样一个逻辑啊 他设了5道关卡 分别是哪道关卡呢 第一道关卡然后这是第二道关卡 这个是第三道关卡 这是第四道关卡 这是第五道关卡 都可以用来影响咱们数据报文的通讯 最终能不能接收 能不能发出去 就靠我这5道关卡协作来进行控制了


三种报文流向

流入本机:PREROUTING --> INPUT-->用户空间进程

流出本机:用户空间进程 -->OUTPUT--> POSTROUTING

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

如何定义规则

我们知道勾子函数原理之后,我们自己要记住下面这个图,才能更好定义防火墙规则


iptables 介绍及用法_勾子函数原理_05

就是说图中加颜色的部分都可以定义规则

但是我们设置规则都是有逻辑的、有理由的,不能乱加

案例说明

iptables 介绍及用法_iptables用法_06

还是这个图

现在假设 APP提供的是HTTP服务,我现在要求A主机能访问我,B主机不能访问我,我应该在那个勾子函数做控制呢?

      根据数据报文走的路径我们可以知道 Prerouting 和 input 两个勾子函数这里需要做控制,但是需要在那个勾子函数做控制呢?

假设

在Pre routing上加控制可以吗?

虽然在Pre routing 可以控制访问,控制A能访问,B不能访问 这是可以控制的 但是你想过没有 我们a可以访问 这个b不让访问 b不让访问呢 那我们是不是并没有说 不允许b穿过我(Pre routing)呀 我只是说b不让访问 并没有说b不让穿过我 但是你在Pre routing设置规则 是不是就意味着B它不能穿过去了 所以这种情况不能在 上加控制。

      因为Pre routing它是个总入口 它负责接收的是经过我或者访问我的 所有流量 它都是经过它的 所以在这加个规则得它进也进不来 穿也穿不过去了 这样的话是不是就有点误杀了 我并没有说B不允许穿过我呀 所以呢Prorouting 上设是不合适的

那当然就是在INPUT上设规则合适 为什么说这个地方设合适啊 因为他这是不是路由表检查过了 这个路由表检查过 是不是只有发给我用程序的数据报文 才进到INPUT里 也就是说只要进到INPUT里面 已经确定就是访问我的了 那既然访问我 那是不是 他就不会影响穿过我的流量了 所以我们就在INPUT上来设 是合理的啊

还是刚才的问题,我们如果在OUTPUT上设置规则可不可以呢?设置A能访问APP,B不能访问APP

就比如到A来的允许出去,B来的不允许出去 ,这样就是进来没有回应

数据报文需要考虑进出的问题,如果进来出不去,就没有意义了

OUTPUT上设置和INPUT上设置有什么区别呢?哪个好呢?

有两点

      第一点就是 如果在OUTPUT上设置,就意味着,B请求到了APP之后,APP折腾了半天这个B是发不出去的,浪费APP资源

     第二点就是,我们的要求是B不能访问APP,没说 APP不能访问B这个主机,一旦在OUTPUT设置规则,就会导致,APP想访问B,也是访问不到的

我们加规则一定要根据5个勾子函数运行原理加

有了这些原理基础,我们在学 iptable命令,会清楚的知道它每个参数的含义

iptables的组成

    在 iptable这个命令里面。他有五个和钩子函数相关的。相对应的,咱不叫钩子函数。我们刚才说过了iptable,就是一个用户空间的工具。那么,用户空间的工具在用的时候呢?他会有一些这个参数选项。那其中他如何来表示这五个勾子函数的具体的这个位置呢?


什么是链

这个chain(链)我们对应的就是五个勾子函数。所以我们在iptables里面。那么,去指定链儿指定的这个链儿和我们刚才说的五个勾子函数,正好是一一对应。那么,我有五个勾子函数,就有五个链分别对应的恰恰它的名称也一模一样。也分别叫刚才说的什么input output。也是一模一样的。

五个内置链chain

INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING

什么是表

iptables 介绍及用法_防火墙_07

那这五个表是什么意思呢?这五个表表示的就是它的作用,它的功能

咱们平常用的最多的filter表和NAT表。其他的表用的不多。

五个表安全优先级

优先级由高到低的顺序为

security -->raw-->mangle-->nat-->filter

表和链的对应关系

iptables 介绍及用法_勾子函数原理_08

iptables 规则说明

那么iptable这是一个命令行工具,它可以定义各种规则。那么,定义规则其中,里面规则里面包括哪些内容呢?那规则里面我们包括。是首先你要针对哪张表哪个链儿,这两个先定义出来表和链儿表和链儿先定义出来,哎,定义完以后呢,再加上各种。条件各种加上各种条件,那这个条件呢?比方说你是根据IP地址作为条件呀,

     还是根据什么这个 访问的时间作为条件呀啊,还是根据这个协议作为条件呀啊,这个就多了这个规则可以很多。啊那。符合了规则以后,接下来干什么呢?就是定义动作。这个动作呢,最常见的就是允许和拒绝,最容易理解,要是符合这个条件了,允许符不符合条件了就拒绝,怎么样的啊?那实际上除了这个以外,还有一些其他动作,

     比方说我们还可以定义什么?符合这个条件了,我就做SNAT转发,我还可以定义什么标签就修改它的报文,也可以记日志等等啊,这些呢都可以,不过呢,这个我们。讲到后面再说,

    我们记住。两个最常见的动作就行了,一个动作就是允许,一个动作是拒绝

    具体表现为这三个关键字。不过,这三个关键字呢,有两个都是表示拒绝, 下图着三个关键字

iptables 介绍及用法_iptables用法_09

Drop 拒绝 Reject 拒绝

但是这两个拒绝有区别,当然你应该知道这个区别在哪?

那这是两种拒绝啊,一种是。抛弃了,包来了,我就抛弃了,不做响应了。那这个reject 那直接回应一个拒绝

accept就是接受

所以我们大体上明白了啊,那一个iptable里面定义的规则无非就是,我们要加一些条件,然后加一些条件以后,给它加上一些这个对应的控制动作动作

iptables规则添加时考量点

那其中我们定义防火墙规则的话,有一个需要考虑清楚的就是你应该在哪个表哪个链儿上要定义好,这个你要清楚。当然,我们现在已经知道了五个表,五个链。对吧,那么表我们用的最多的是filter表,filter表就是实现访问控制的过滤用的。啊,那么NAT表和那个mongle表咱们用到了再说,

所以我们在这呢,姑且只考虑一个表就是filter表。

      filter表就是代表,起到的是过滤功能,我们可以在五个对应的链上。来实施filter。对应的给它实施这个过滤功能,我可以在prerouting。postrouting forward input output,这五个对应的链上来定义过滤规则。好,当然这个过滤规则我们怎么定义要和你的业务需要密切相关?到底怎么去定义?你要考虑数据报的流向。啊,判断它的源和目标,这个都是我们要定义规则的时候,

     头脑里要把那个五个对应的表啊,就是五个对应的链那个。所谓的勾子函数的位置要给它记住了,这样的话才能更好的去定义这个规则。


iptable 命令实战


Filter表中INPUT规则


iptables 介绍及用法_iptables用法_10


语法要求:

这个INPUT必须是大写字母 包括DROP 也是大写字母

我们来看这个图是什么意思

iptables 是命令    

-t filter 指定了表名  这个可以省略  
		因为iptables 默认是过滤模式是这个filter 模式

-A  INPUT 说的就是这个链   -A表示 append 追加、附加

-s   192.168.0.1
		 -s  表示源地址  所以就表示 源地址是192.168.0.1
 
 -j DROP
 		-j 表示跳 jump 跳跃。   
    		那来了这个数据包,我就把它跳到。给他扔到那个DROP,这个动作里。
				这个DROP,不就是抛弃吗?
        那DROP就是抛弃的意思啊,DROP是抛弃不是放弃的意思啊


那那这样的话是不是就意味着就相当于把192.168.0.1的请求,只要是来的。就拒绝了哎,不能访问了啊,

案例演示

首先我Centos7这个机器 ping 10.0.0.8 是可以通的

这个Centos7 的IP 是10.0.0.7

iptables 介绍及用法_iptables用法_11

我们在10.0.0.8这个主机上写规则,拒绝10.0.0.7的访问

我们把 -t filter 省略了 这个过滤

我们这样就能拒绝10.0.0.7 的访问了

iptables 介绍及用法_iptables用法_12


然后在把10.0.0.6 主机也拒绝访问

iptables 介绍及用法_iptables用法_13


这是两种不同的拒绝,我看通过抓包工具看

iptables 介绍及用法_iptables用法_14

      这就是两种不同的拒绝,一种是回应你信息,一种是不回应你就抛弃了,所以这样的话呢,我们看到了都是一种拒绝