当前位置: 代码迷 >> 综合 >> netfilter/iptables详解
  详细解决方案

netfilter/iptables详解

热度:98   发布时间:2024-01-30 12:10:40.0

【简介】

       官方曰ptables is the userspace command line program used to configure the Linux 2.4.x and later packet filtering ruleset. It is targeted towards system administrators.

Since Network Address Translation is also configured from the packet filter ruleset, iptables is used for this, too.

       翻译过来大概内容是:iptables是提供给系统管理员用来配置linux 2.4以及之后版本包的过滤规则集的一个工具。

       其实如果真正要说起来,iptables并不能称作一个防火墙,真正意义上的防火墙(安全框架)应该是netfilter,是linux系统核心层内部的一个数据包处理模块。netfilter提供三个服务:1、NAT;2、数据包内容修改;3、数据包过滤的防火墙功能。人们通过iptables这个工具将规则策略设定进netfilter罢了,时间一长,大家就习惯把iptables称作iptables防火墙了。

       用通俗的语言解释一遍:netfilter就好比古代京城的保卫体系,iptables则为记录着允许进城/进宫/进殿规则的小册子。

(ps:由于iptables相关的知识点实在太多,所以本文只讲解基础的iptables原理以及常见的使用场景。)

【京城保卫体系(netfilter)详解】

基础工作原理

       外部的数据包传进网卡后,通过内核的一系列处理后(这里不展开讲内核如何处理数据包的过程,之后有空会针对此处展开来讲),来到netfileter框架,根据设置好的规则(规则)对数据包的头部进行检查,如果符合条件,再根据规则内容进行相应的处理(转发出去或者转发至上层协议/应用),如果不符合,就丢弃(drop)此数据包。

五表五链

一、五表(Tables)

       首先提个问题,表是什么?就我个人理解而言,表是具有同类规则的合集

       大家常说的四表分别是filter表、nat表、mangle表、raw表,其实还有一个就是几乎被大家忽略的security表。下面是各个表的简介:

作用

raw

用于配置数据包,raw中的数据包不会被系统追踪,即关闭nat表上启用的追踪机制。raw处理后,将跳过nat表和ip_conntrack处理。

mangle

用于对特定数据包的修改,即修改包头数据,做标志,以便其他规则或程序可以利用这种标志对数据包进行过滤或策略路由;

nat

用于网络地址转换,如:修改源/目标ip、端口,即ip转发 、端口转发;

filter

用于存放所有防火墙相关操作的默认表;

security

用于强制访问控制,如SELinux。关于security表的更多内容,可以查看下面两个页面:https://lwn.net/Articles/267140/

http://www.bubuko.com/infodetail-3262253.html

优先级

raw>mangle>nat>filte

二、五链(Chains)

       链是什么?链是数据处理的流程,相关信息如下表

hook函数

对应链

作用时间(生命周期)

NF_IP_PRE_ROUTING

PREROUTING链

对数据包做路由选择之前,应用链中规则

NF_IP_LOCAL_IN

INPUT链

收到数据包目的ip为本机ip时,应用链中规则

NF_IP_FORWARD

FORWARD链

收到数据包目的ip为其他ip时,应用链中规则

NF_IP_LOCAL_OUT

OUTPUT链

本机上层协议/应用对外发送数据包时,应用链中规则

NF_IP_POST_ROUTING

POSTROUTING链

对数据包做路由选择之后,转发出去之前,应用此链中规则

 

、规则的关系

       想必大家都知道这么一句话吧,表是由链构成,前面有说到,表是具有同类规则的合集,链是数据处理的流程,那么问题来了,表是实实在在存在的表,链只是个流程,这句话从逻辑上来讲似乎不那么合理。那么这就需要深究一下到底表是什么,链是什么了。

       从代码层面来说,表是一个结构体,链是一个hook函数。学过c语言的同学对结构体应该是不陌生的,就是一些同类数据构成的数据集合。这时候你会发现表的定义和这个是类似的,但是hook函数可能就陌生了,那么hook函数是什么呢?hook翻译过来就是‘钩子’,就是在一个数据包/事件传输到下个点的途中,钩住它,然后监控、进行一些自己特定的操作,然后再传至下一个点。有没有发现这有点像arp欺骗,从中间截取你的数据包,然后进行一些操作,再传送至目标地址,这里只不过不是外部的处理,只是内部的一个合法的操作而已。

       前文提到了很次根据规则处理,那么这个规则是什么呢?规则由一个目标(数据包经过匹配所有条件后的动作,即符合条件后的执行动作)和很多匹配(导致该规则可以应用的数据包所满足的条件,即数据包需要满足的条件)指定。

规则的次序非常关键,谁的规则越严格,应该放的越靠前,而检查规则的时候,是按照从上往下的方式进行检查的。

       初始化并注册好的表的结构如下图(从大佬文章中借图,若侵权请告知删除,大佬文章链:接表(table)的注册与初始化)

五虎上将图

       读书的时候老师讲解netfilter/iptables规则匹配判断过程时自研了一套五虎上将图,如今我用自己的语言将其重现出来,准备开始咯~

场景一

       话说,三国时期蜀国那么一群战士打仗胜利归来,准备接受皇帝刘备的嘉奖,于是乎准备进宫,他们首先来到主城成都城门(PREROUTNING链),此时张飞负责把手入城口,查看了他们的身份证明(PREROUTNING链上的规则),确认了他们是即将要觐见的蜀国功臣们(符合PREROUTNING链上的规则),便打开城门欢迎他们进城;

       进了城门后,他们顺着指引来到皇宫门口(INPUT链),这时负责镇守皇宫入口的关羽查看了皇帝刘备的圣旨(INPUT链上的规则),得知需要召见这群战士进宫领赏,于是将其放行入宫前去觐见;

       进宫后,刘备很是欢喜,奖励黄金还给他们封了官侯,并又下了一道圣旨(上层协议/应用处理完后返回数据包),给他们带回军营嘉奖其他士兵。

       授奖后,这一群人又启程准备回去军营继续坚守国土,又来到了赵云赵子龙把手的皇宫出口(OUTPUT链),确认此群人没有问题(匹配符合OUTPUT链上的规则),便放行出皇宫。

       放行出宫后,因军中不能太久没有主帅,于是他们马上准备出城前往军营驻扎地,他们来到出城口(POSTROUTING链),把守出城口的马超查看了他们令牌后,便将其放行出城。

场景二

       还是三国时期,话说又有那么几个刺客,准备通过主城去到其他城池完成刺杀任务,他们首先来到城门口,张飞查验他们蜀国身份令牌后,并了解了其将经过此城前往其他城池,于是放行起进城歇息。

       来到主城后,他们经由主路(FORWARD链)准备歇息一下,并见了他们的老大黄忠,由于时局有变,他们被重新分配至其他的城池,连夜收拾行李带上新任务准备出发;

       收拾好后他们来到马超把手的出城口(POSTROUTING链),经过查验没有问题放行;

iptables数据包流程详解

       从上面的五虎上将图我们了解了大概的数据包流程,你会发现里面并没有提到表相关东西,那么究竟是如何进行的呢?下图为官方提供的

详细过程见下图

 

  相关解决方案