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超时. 一开始怀疑是自己服 ...
随机推荐
- SQL Server 求结果
;with cte as ( select CONVERT(DATE, DATEADD(DAY, -9, GETDATE())) as paytime union all select datead ...
- Oracle like查询
查询方式:LIKE '%xx%' 普通: SELECT * FROM TABLE T WHERE T.COLUNM LIKE '%xx%' 优化:使用 INSTR SELECT * FROM TABL ...
- sql 代码调试
begin --开启事务 begin tran --插入 INSERT INTO [DICTIONARY] (TablName,Column_Id,Column_Name) --数据源 select ...
- C#_基础:委托速讲
1定义:委托=函数指针 C# public delegate void Test(string str); 等价C++ public void (*Test)(string str): 委托赋值(初始 ...
- SQL Server定时自动抓取耗时SQL并归档数据发邮件脚本分享
SQL Server定时自动抓取耗时SQL并归档数据发邮件脚本分享 第一步建库和建表 USE [master] GO CREATE DATABASE [MonitorElapsedHighSQL] G ...
- 使用密码记录工具keepass来保存密码
在第一章,曾经给过您建议,密码不要保存在文档中,那样不安全,如果密码很多而且又很复杂,人的大脑是不可能很容易记住的,只能记录下来,如果不能记在文档中那记在哪里呢?下面介绍给您一款记录密码的软件,使用. ...
- 用"hosting.json"配置ASP.NET Core站点的Hosting环境
通常我们在 Prgram.cs 中使用硬编码的方式配置 ASP.NET Core 站点的 Hosting 环境,最常用的就是 .UseUrls() . public class Program { p ...
- ASP.Net MVC3 图片上传详解(form.js,bootstrap)
图片上传的插件很多,但很多时候还是不能切合我们的需求,我这里给大家分享个我用一个form,file实现上传四张图片的小demo.完全是用jquery前后交互,没有用插件. 最终效果图如下: 玩过花田人 ...
- 关于printf错用格式化字符串导致double和long double输出错误的小随笔
[题外话] 以前用HUSTOJ给学校搭建Online Judge,所有的评测都是在Linux下进行的.后来为了好往学校服务器上部署,所以大家重新做了一套Online Judge,Web和Judge都是 ...
- PHPCMS后台密码忘记解决办法
什么是PHPCMS? PHPCMS是一款网站管理软件.该软件采用模块化开发,支持多种分类方式,使用它可方便实现个性化网站的设计.开发与维护.它支持众多的程序组合,可轻松实现网站平台迁移,并可广泛满足各 ...