IptableNetfilter

在上一篇文章 linux iptables常用命令--配置一个生产环境的iptables 我们知道iptables有好几个表,如raw,mangle,nat,filter,有好几条链,如PRE_ROUTING、INPUT、OUTPUT、FORWARD、POST_ROUTING,那么它们有什么关系,调用流程是怎样的。

其实Iptables只是一个应用层的程序,它属于用户空间,通过iptables配置规则后都会调用 Netfilter开放的接口来对存放在内核空间中的数据进行修改。

Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它属于内核空间,有五个挂载点,当数据包到达这些位置的时候会调用这些函数,在这些位置上我们可以对数据包的内容进行修改,达到控制的目的,这5个挂载点分别是PRE_ROUTING、INPUT、OUTPUT、FORWARD、POST_ROUTING。也就是我们常说的五条链。

iptables四表五链

链是放在表中的,总共有四个表,每个表有不同的优化级:raw>mangle >nat> filter

一个表有若干个链,如下所示:

raw

mangle

nat

filter

prerouting

Y

Y

Y

input

Y

Y

output

Y

Y

Y

Y

forward

Y

Y

postrouting

Y

Y

加红的代表用得相对比较多的。

四张表的功能

raw

是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理,一般在高并发时有可能会用到,来设置一些连接不跟踪状态,防止ip_conntrack文件被撑爆。

mangle

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

nat

主要用于修改数据包的IP地址、端口号等信息(网络地址转换,如SNAT、DNAT、MASQUERADE、REDIRECT),一般在作为网关服务器上会用到,如果有搭建过openvpn的话,一般也会用到。

filter

主要用于对数据包进行过滤,有DROP、ACCEPT、REJECT、LOG等,一般在input 和forward chain用得最多,也是出现频率最高的。

iptables数据包流向

一个数据包到达时,是怎么依次穿过各个链和表的,是得看看下面这张详细的流程图了:

我们结合上图举个例子:

假如有数据包从Network IN要通过iptables,数据包流向如下:

1.Network IN数据包到达服务器的网络接口

2.进入raw表的 PREROUTING 链,这个链的作用是决定数据包是否被状态跟踪。

进入 mangle 表的 PREROUTING 链,在此可以修改数据包,比如 TOS 等。

进入 nat 表的 PREROUTING 链,可以在此做DNAT(目标地址转换)

3.决定路由,查看目标地址是交给本地主机还是转发给其它主机。

4.到这里分两种情况,一种情况是数据包要转发给其它主机(一般情况下它是在担任网关服务器),数据包会依次经过:

5.进入 mangle 表的 FORWARD 链,

进入 filter 表的 FORWARD 链,在这里我们可以对所有转发的数据包进行过滤。

6.进入 mangle 表的 POSTROUTING 链

进入 nat 表的 POSTROUTING 链,在这里一般都是用来做 SNAT (源地址转换)

7.数据包流出网络接口,发往network out。

8.另一种情况,数据包的目标地址就是发给本地主机的,它会依次穿过:

9.进入 mangle 表的 INPUT 链,

进入 filter 表的 INPUT 链,在这里我们可以对流入的所有数据包进行过滤,

数据包交给本地主机的应用程序进行处理。

10.应用程序处理完毕后发送的数据包进行路由发送决定。

11.进入 raw 表的 OUTPUT 链。

进入 mangle 表的 OUTPUT 链,

进入 nat 表的 OUTPUT 链,

进入 filter 表的 OUTPUT 链。

12.进入 mangle 表的 POSTROUTING 链,

进入 nat 表的 POSTROUTING 链。

13.进入出去的网络接口,发送往network out。

所以,如果我们要过滤控制包的进出,只需要把input chain和forward chain这两个关口把控住就好了,这也是我们上篇文章把input chain和forward chain默认设置为drop的原因。

以上这张流程图值得反复仔细查看,这样以后制定规则就心里有数,通与不通也才能快速排错。

Save

Save

Save

Save

Save

Save

Save

Save

Save

Save

Linux iptables原理--数据包流向的更多相关文章

  1. Linux内核二层数据包接收流程

    本文主要讲解了Linux内核二层数据包接收流程,使用的内核的版本是2.6.32.27 为了方便理解,本文采用整体流程图加伪代码的方式从内核高层面上梳理了二层数据包接收的流程,希望可以对大家有所帮助.阅 ...

  2. 利用wireshark抓取远程linux上的数据包

    原文发表在我的博客主页,转载请注明出处. 前言 因为出差,前后准备总结了一周多,所以博客有所搁置.出差真是累人的活计,不过确实可以学习到很多东西,跟着老板学习做人,学习交流的技巧.入正题~ wires ...

  3. Linux内核网络数据包处理流程

    Linux内核网络数据包处理流程 from kernel-4.9: 0. Linux内核网络数据包处理流程 - 网络硬件 网卡工作在物理层和数据链路层,主要由PHY/MAC芯片.Tx/Rx FIFO. ...

  4. Linux系统捕获数据包流程

    Linux系统捕获数据包流程 为了提高数据包的捕获效率,瓶颈问题是一个需要非常关注的焦点.减少在捕获数据包过程中的瓶颈,就能够提高数据包捕获的整体性能.下面本文将以Linux操作系统为平台,分析捕获数 ...

  5. Linux iptables原理和使用

    1.原理 iptables简介 netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵 ...

  6. linux 内核网络数据包接收流程

    转:https://segmentfault.com/a/1190000008836467 本文将介绍在Linux系统中,数据包是如何一步一步从网卡传到进程手中的. 如果英文没有问题,强烈建议阅读后面 ...

  7. linux简单的数据包捕获分析

    有时我们会遇到一些问题,需要捕捉数据包分析,当手头有没有专业的抓图工具,您可以使用tcpdump相反,看看(一般版本附带这个工具) 比如,我们要分析eth0与接口192.168.7.188 这个对象I ...

  8. 【lwip】04-网络数据包流向

    目录 前言 4.1 TCPIP分层与lwip数据共享 4.2 协议栈线程模型 4.3 pbuf 结构体 4.3.1 pbuf的标志位flags 4.4 pbuf的类型 4.4.1 PBUF_RAM类型 ...

  9. iptables导致数据包过多时连接失败

    前几天做服务器压力测试,本地10个线程不停的去向服务器建立连接,然后请求数据,然后连接再关闭,程序每运行几万次之后就会发现客户端程序没办法connect服务器,connect超时. 一开始怀疑是自己服 ...

随机推荐

  1. 利用sql注入

    INSERT查询中实现注入攻击 1. 思路就是在含有insert语句的页面插入目标值信息.经常包含的是一个子查询. 2. 注意在insert过程中,左边的注入点和右边的注入点会有不同 3. 在mysq ...

  2. QSort函数对不同类型数据快速排序浅谈

    一.对int类型数组排序 int num[100]; int cmp ( const void *a , const void *b ){return *(int *)a - *(int *)b;} ...

  3. Mpale 在汽车底盘悬架系统公差分析应用

    汽车底盘的作用是接受发动机的动力,使车轮转动,并保证汽车按驾驶员的操纵正常行驶.底盘包括传动系统.行驶系统.转向系统和制动系统这四大部分,通常,这四大系统也简称为传动系.行驶系.转向系和制动系.悬架是 ...

  4. dev GridControl 根据鼠标坐标 选中行

    if (e.Button == System.Windows.Forms.MouseButtons.Right) { DevExpress.XtraGrid.Views.Grid.ViewInfo.G ...

  5. SQL Server CheckPoint的几个误区

        有关CheckPoint的概念对大多数SQL Server开发或DBA人员都不陌生.但是包括我自己在内,大家对于CheckPoint都或多或少存在某些误区,最近和高文佳同学(感谢高同学的探讨) ...

  6. Backbone源码分析(三)

    Backbone源码分析(一) Backbone源码分析(二) Backbone中主要的业务逻辑位于Model和Collection,上一篇介绍了Backbone中的Model,这篇文章中将主要探讨C ...

  7. Hadoop学习笔记—20.网站日志分析项目案例(一)项目介绍

    网站日志分析项目案例(一)项目介绍:当前页面 网站日志分析项目案例(二)数据清洗:http://www.cnblogs.com/edisonchou/p/4458219.html 网站日志分析项目案例 ...

  8. 多线程中的锁系统(三)-WaitHandle、AutoResetEvent、ManualResetEvent

    本章主要介绍下基于内核模式构造的线程同步方式,事件,信号量. 阅读目录: 理论 WaitHandle AutoResetEvent ManualResetEvent 总结 理论 Windows的线程同 ...

  9. C#中Finally的一个不太常见的用法

    最近在看.net BCL 传送门 的源码. 在 System.Collections.Concurrent.ConcurrentQueue 中看到一段有意思的代码.注意这段代码是写在Concurren ...

  10. Go语言的堆栈分析

    本文为理解翻译,原文地址:http://www.goinggo.net/2015/01/stack-traces-in-go.html Introduction 在Go语言中有一些调试技巧能帮助我们快 ...