Linux iptables原理--数据包流向
Iptable与Netfilter
在上一篇文章 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原理--数据包流向的更多相关文章
- Linux内核二层数据包接收流程
本文主要讲解了Linux内核二层数据包接收流程,使用的内核的版本是2.6.32.27 为了方便理解,本文采用整体流程图加伪代码的方式从内核高层面上梳理了二层数据包接收的流程,希望可以对大家有所帮助.阅 ...
- 利用wireshark抓取远程linux上的数据包
原文发表在我的博客主页,转载请注明出处. 前言 因为出差,前后准备总结了一周多,所以博客有所搁置.出差真是累人的活计,不过确实可以学习到很多东西,跟着老板学习做人,学习交流的技巧.入正题~ wires ...
- Linux内核网络数据包处理流程
Linux内核网络数据包处理流程 from kernel-4.9: 0. Linux内核网络数据包处理流程 - 网络硬件 网卡工作在物理层和数据链路层,主要由PHY/MAC芯片.Tx/Rx FIFO. ...
- Linux系统捕获数据包流程
Linux系统捕获数据包流程 为了提高数据包的捕获效率,瓶颈问题是一个需要非常关注的焦点.减少在捕获数据包过程中的瓶颈,就能够提高数据包捕获的整体性能.下面本文将以Linux操作系统为平台,分析捕获数 ...
- Linux iptables原理和使用
1.原理 iptables简介 netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵 ...
- linux 内核网络数据包接收流程
转:https://segmentfault.com/a/1190000008836467 本文将介绍在Linux系统中,数据包是如何一步一步从网卡传到进程手中的. 如果英文没有问题,强烈建议阅读后面 ...
- linux简单的数据包捕获分析
有时我们会遇到一些问题,需要捕捉数据包分析,当手头有没有专业的抓图工具,您可以使用tcpdump相反,看看(一般版本附带这个工具) 比如,我们要分析eth0与接口192.168.7.188 这个对象I ...
- 【lwip】04-网络数据包流向
目录 前言 4.1 TCPIP分层与lwip数据共享 4.2 协议栈线程模型 4.3 pbuf 结构体 4.3.1 pbuf的标志位flags 4.4 pbuf的类型 4.4.1 PBUF_RAM类型 ...
- iptables导致数据包过多时连接失败
前几天做服务器压力测试,本地10个线程不停的去向服务器建立连接,然后请求数据,然后连接再关闭,程序每运行几万次之后就会发现客户端程序没办法connect服务器,connect超时. 一开始怀疑是自己服 ...
随机推荐
- 作业三: 代码规范、代码复审、PSP
分) 对于是否需要有代码规范,请考虑下列论点并反驳/支持: 这些规范都是官僚制度下产生的浪费大家的编程时间.影响人们开发效率, 浪费时间的东西. 我是个艺术家,手艺人,我有自己的规范和原则. 规范不能 ...
- 从Facebook跑来阿里的赵海平大叔,你要干啥?
赵海平在今年三月份来到阿里,听毕玄(他现任主管)说去年五六月份就跟赵海平聊上了.有人问:为啥 BAT 三大巨头,你看中了阿里巴巴?在今天现场达一千多人的分享中赵海平给出了回复:“因为百度和腾讯没找我呗 ...
- 新版C#编译器关于函数闭包的一处更改
感谢@DiryBoy的补充,他提到这个问题在MSDN上是有说明的: http://msdn.microsoft.com/en-us/library/vstudio/hh678682.aspx 在Vis ...
- MySQL 存储过程和函数
概述 一提到存储过程可能就会引出另一个话题就是存储过程的优缺点,这里也不做讨论,一般别人问我我就这样回答你觉得它好你就用它.因为mysql中存储过程和函数的语法非常接近所以就放在一起,主要区别就是函数 ...
- DOM访问元素样式和操作元素样式
在HTML中定义样式的方式有三种:通过<link/>元素包含外部样式表文件(外部样式表).使用<style/>元素定义嵌入式样式(嵌入式样式表).使用style特性定义针对特定 ...
- SVN+码云 简单使用流程
1.登录码云网站...
- Apache Spark源码剖析
Apache Spark源码剖析(全面系统介绍Spark源码,提供分析源码的实用技巧和合理的阅读顺序,充分了解Spark的设计思想和运行机理) 许鹏 著 ISBN 978-7-121-25420- ...
- Angular使用$compile为从Ajax加载的HTML绑定ng-click事件
这是一个Angular使用$compile为从Ajax加载的HTML绑定ng-click事件的实现方式,由于近期忙碌,就先放代码.代码如下: <table data-ng-table=" ...
- 利用typescript使backbone强类型智能提示
模型类一旦多了没有强类型和智能提示是相当痛苦的,所以. 仅仅用ts定义一个模型类: class Person extends Backbone.Model { defaults = { Name:&q ...
- <nginx.conf> nginx用户权限
Nginx用户权限 在nginx.conf文件的第一行一般是设置用户的地方(编译安装nginx时的参数--user=<user>也是指定用户的地方),如 user www www; 如不指 ...