Android network — iptables四表五链
Android network — iptables四表五链
- 1. iptables简介
- 2. iptables的四表五链
- 2.1 iptables流程图
- 2.2 四表
- 2.3 五链
- 2.4 iptables的常见情况
- 3. NAT工作原理
- 3.1 BNAT
- 3.2 NAPT
- 4. iptables配置
本文主要介绍了iptables的基本工作原理和四表五链等基本概念以及NAT的工作原理。
1. iptables简介
我们先来看一下netfilter官网对iptables的描述:
iptables 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.
The iptables package also includes ip6tables. ip6tables is used for configuring the IPv6 packet filter.
也就是说iptables
实际上只是位于用户空间的一个面向系统管理员的Linux防火墙的管理工具而已,而真正实现防火墙功能的是netfilter
,它是Linux内核中实现包过滤的内核模块,iptables
对应在内核中的模块应该是ip_tables
,我们查看系统内核中ip_tables
的信息的时候可以看到ip_tables.ko
这个模块是在netfilter
这个目录下的。
实际上除了iptables
还有如nftables
、firewalld
等防火墙工具都是在用户空间(用户层)对相应的内核空间中对应的netfilter
相关的模块进行操作的工具。
2. iptables的四表五链
2.1 iptables流程图
首先我们来看一下下面的这张图了解一下iptables中的表和链的概念。图中使用箭头展示了用户访问使用了iptables的机器的过程,其中按照箭头的顺序我们就可以将其梳理为一条大的带有分支的链条,在每个需要进行操作的模块处都标有名称和相应的括号,括号内的就是iptables的四表,而每个模块都可以视为一个链。
之所以叫做链就是因为在访问该链的时候会按照每个链对应的表依次进行查询匹配执行的操作,如PREROUTING
链对应的就是(raw
->mangle
->nat
),每个表按照优先级顺序进行连接,每个表中还可能有多个规则,因此最后看起来就像链一样,因此称为链。而iptables
的表中存储的就是对应的规则和需要执行的操作,这里以路由器为例查看其中iptables
的filter
表:
注意每一个链对应的表都是不完全一样的,表和链之间是多对多的对应关系。但是不管一个链对应多少个表,它的表都是按照下面的优先顺序来进行查找匹配的。
表的处理优先级:raw
>mangle
>nat
>filter
。
2.2 四表
iptables
的四个表iptable_filter
,iptable_mangle
,iptable_nat
,iptable_raw
,默认表是filter
(没有指定表的时候就是filter表)。
-
filter 表
:用来对数据包进行过滤,具体的规则要求决定如何处理一个数据包。对应的内核模块为:
iptable_filter
,其表内包括三个链:input
、forward
、output
; -
nat 表
:nat 全称:network address translation 网络地址转换,主要用来修改数据包的 IP 地址、端口号信息。对应的内核模块为:
iptable_nat
,其表内包括三个链:prerouting
、postrouting
、output
; -
mangle 表
:主要用来修改数据包的服务类型,生存周期,为数据包设置标记,实现流量整形、策略路由等。对应的内核模块为:
iptable_mangle
,其表内包括五个链:prerouting
、postrouting
、input
、output
、forward
; -
raw 表
:主要用来决定是否对数据包进行状态跟踪。对应的内核模块为:
iptable_raw
,其表内包括两个链:output
、prerouting
;
raw表只使用在
PREROUTING
链和OUTPUT
链上,因为优先级最高,从而可以对收到的数据包在系统进行ip_conntrack(连接跟踪)前进行处理。一但用户使用了raw表,在某个链上,raw表处理完后,将跳过NAT表和ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了。RAW表可以应用在那些不需要做nat的情况下,以提高性能。
2.3 五链
iptables
的五个链PREROUTING
,INPUT
,FORWARD
,OUTPUT
,POSTROUTING
。
input 链
:当收到访问防火墙本机地址的数据包时,将应用此链中的规则;output 链
:当防火墙本机向外发送数据包时,将应用此链中的规则;forward 链
:当收到需要通过中转发给其他地址的数据包时,将应用此链中的规则,注意如果需要实现forward转发需要开启Linux内核中的ip_forward功能;prerouting 链
:在对数据包做路由选择之前,将应用此链中的规则;postrouting 链
:在对数据包做路由选择之后,将应用此链中的规则;
2.4 iptables的常见情况
下面我们利用上面的流程图来对几种常见的情况解析:关键点在于发往iptables主机的数据包的目的地址是否是iptables主机本机。如果是,那我们就可以理解为常见的开启了iptables防火墙的网站服务器主机;如果不是,那就是走ip_forward进行转发,比如我们常见的NAT路由器的NAT服务和策略路由等。如下图为开启了ip_forward功能。
3. NAT工作原理
接下来介绍一些NAT(Network Address Translation,网络地址转换)的基本知识,众所周知,IPv4的公网IP地址已经枯竭,但是需要接入互联网的设备还在不断增加,这其中NAT就发挥了很大的作用(此处不讨论IPv6)。NAT服务器提供了一组私有的IP地址池(10.0.0.0/8、172.16.0.0/12、192.168.0.0/16),使得连接该NAT服务器的设备能够获得一个私有的IP地址(也称局域网IP/内网IP),当设备需要连接互联网的时候,NAT服务器将该设备的私有IP转换成可以在互联网上路由的公网IP(全球唯一)。NAT的实现方式有很多种,这里我们主要介绍三种:静态NAT、动态NAT和网络地址端口转换(NAPT)。
3.1 BNAT
- 静态NAT:LVS的官方文档中也称为(N-to-N mapping)
,前面的N指的是局域网中需要联网的设备数量,后面的N指的是该NAT服务器所拥有的公网IP的数量。既然数量相等,那么就可以实现静态转换,即一个设备对应一个公网IP,这时候的NAT服务器只需要维护一张静态的NAT映射转换表。
内网IP | 外网IP |
---|---|
192.168.1.55 | 219.152.168.222 |
192.168.1.59 | 219.152.168.223 |
- 动态NAT:LVS的官方文档中也称为(M-to-N mapping)
,注意这时候的M>N,也就是说局域网中需要联网的设备数量多于NAT服务器拥有的公网IP数量,这时候就需要由NAT服务器来实现动态的转换,这样每个内网设备访问公网的时候使用的公网IP就不一定是同一个IP。
在一些家用路由器中,DMZ是指一部所有端口都暴露在外部网络的内部网络主机,除此以外的端口都被转发。严格来说这不是真正的DMZ,因为该主机仍能访问内部网络,并非独立于内部网络之外的。但真正的DMZ是不允许访问内部网络的,DMZ和内部网络是分开的。这种 DMZ主机并没有真正DMZ所拥有的子网划分的安全优势,其常常以一种简单的方法将所有端口转发到另外的防火墙或NAT设备上。
3.2 NAPT
以上的这两种都属于基本网络地址转换(Basic NAT),这种转换在技术上比较简单,仅支持地址转换,不支持端口映射,这也就带来了另一个问题就是资源的浪费。我们知道一个IP实际上可以对应多个端口,而我们访问应用实际上是通过IP地址+端口号的形式来访问的,即客户端访问的时候发送请求到服务器端应用程序监听的端口即可实现访问。那么NAPT就是在这基础上的扩展延申,它在IP地址的基础上加上了端口号,支持了端口映射的功能。
- NAPT:NAPT实际上还可以分为 源地址转换(SNAT) 和 目的地址转换(DNAT) 两种。注意这个源地址和目的地址是针对NAT服务器而言,我们通过下面一张图来说明:
首先我们这里有一个客户端,上面运行着一个浏览器,假设它使用的是5566
端口,它需要访问14.25.23.47
这个Web服务器的HTTPS服务的443
端口,它在访问的时候需要经过局域网出口的这个路由器网关(同时也是NAT服务器),路由器对它进行一个NAPT的源地址转换(SNAT),这个时候客户端的请求经过NAT服务器之后变成了222.17.23.45:7788
这个IP端口对Web服务器的443
端口进行访问。注意在这个过程中,目标服务器(Web服务器)的IP和端口是一直没有改变的。
接下来在Web服务器接收到请求之后,需要返回数据给发送请求的设备,注意这时候web服务器返回数据的指向IP应该是刚刚NAT服务器发送请求的227.17.23.45:7788
这个IP端口,这时候路由器网关再进行一次NAPT的目标地址转换(DNAT),目标的IP端口就是最开始发送请求的192.168.1.77:5566
这个端口。
实际上对于大多数人来说日常接触到最多的就是路由器做的SNAT和DNAT操作,它们一般成对出现用于解决公网IP资源不足的问题,需要注意的是NAT是可以进行嵌套操作的,即NAT下面的网络设备还可以继续做NAT,只要做NAT的网段不和上层的NAT的网段相同即可。
4. iptables配置
在了解清楚iptables的工作原理和每个表以及链的作用之后,我们就可以根据其特点进行针对性的配置。本篇先介绍简单
iptables 的基本语法命令格式
iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]
表名、链名
:指定iptables
命令所操作的表
和链
,未指定表名时将默认使用filter
表;管理选项
:表示iptables
规则的操作方式,比如:插入
、增加
、删除
、查看
等;匹配条件
:指定要处理的数据包的特征,不符合指定条件的数据包不处理;控制类型
:指数据包的处理方式,比如:允许accept
、拒绝reject
、丢弃drop
、日志LOG
等;
iptables 命令的常用管理选项
-A:在指定链的末尾添加一条新的规则
-D:删除指定链中的某一条规则,可删除指定序号或具体内容
-I:在指定链中插入一条新规则,未指定序号时默认作为第一条规则
-R:修改、替换指定链中的某一条规则,可指定规则序号或具体内容
-L:列出指定链中所有的规则,未指定链名,则列出表中的所有链
-F:清空指定链中所有的规则,未指定链名,则清空表中的所有链
-P:设置指定链的默认策略
-n:使用数字形式显示输出结果
-v:查看规则列表时显示详细的信息
-h:查看命令帮助信息
--line-numbers:查看规则列表时,同时显示规则在链中的顺序号
相关文章:

Android network — iptables四表五链
Android network — iptables四表五链 1. iptables简介2. iptables的四表五链2.1 iptables流程图2.2 四表2.3 五链2.4 iptables的常见情况 3. NAT工作原理3.1 BNAT3.2 NAPT 4. iptables配置 本文主要介绍了iptables的基本工作原理和四表五链等基本概念以及NAT的工作原理。 1. i…...

【C++从0到王者】第十六站:stack和queue的使用
文章目录 一、stack的使用1.stack的介绍2.stack的使用 二、queue的使用1.queue的护额晒2.queue的使用 三、stack和queue相关算法题1.最小栈2.栈的压入、弹出序列3.逆波兰表达式4.两个栈实现一个队列5.用两个队列实现栈6.二叉树的层序遍历1.双队列2.用一个变量levelSize去控制 7…...

centos7 部署Tomcat和jpress应用
目录 一、静态、动态、伪静态 二、Web 1.0 和 Web 2.0 三、centos7 部署Tomcat 3.1 安装、配置jdk 3.2 安装 Tomcat 3.3 配置服务启动脚本 3.3.1 创建用户和组 3.3.2 创建tomcat.conf文件 3.3.3 创建服务脚本(tomcat.service) 3.3.4 重新加载守护进程并且测试 四、部…...

Unity Shader:常用的C#与shader交互的方法
俗话说久病成医,虽然不是专业技术美术,但代码写久了自然会积累一些常用的shader交互方法。零零散散的,总结如下: 1,改变UGUI的材质球属性 有时候我们需要改变ui的一些属性,从而实现想要的效果。通常UGUI上…...

luajit 使用 clang编译的坑
为了尝试将LuaJIT接入虚幻Lua插件之中,需要预编译LuaJIT链接库,在桌面平台问题不大, 主要是移动平台,涉及跨平台编译,因为对跨平台编译具体细节没有系统研究,这里先记录一下跨平台编译LuaJIT的主要过程 由于官方提供的…...

[SWPUCTF 2021 新生赛]Do_you_know_http
打开环境,根据题目提示,应该是考察http相关的东西 打开环境提示说请使用wLLm浏览器访问 那我们更改浏览器信息,在burp重发器中发包后发现是302重定向,但是提示说success成功,说明 我们修改是成功的,既然是…...

web前端之CSS
文章目录 一、CSS简介1.1 CSS语法规则 二、CSS的引用方法2.1 定义行内样式表2.2定义内部样式表2.3链入外部样式表2.4导入外部样式表 三、CSS选择符3.1 基本选择符3.1.1 标签选择符3.1.2 class类选择符3.1.3 id选择符 3.2 复合选择符3.2.1 交集选择符(合并选择器&…...

HarmonyOS元服务开发实践:桌面卡片字典
一、项目说明 1.DEMO创意为卡片字典。 2.不同卡片显示不同内容:微卡、小卡、中卡、大卡,根据不同卡片特征显示同一个字的不同内容,基于用户习惯可选择喜欢的卡片。 3.万能卡片刷新:用户点击卡片刷新按钮查看新内容,同时…...

xLua学习
xLua教程:https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/XLua%E6%95%99%E7%A8%8B.md xLua配置:https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/configure.md FAQ:https://github.com/Tencent/xLua/blob/maste…...

Web3到底是个啥?
Web3到底是个啥? Web3是近两年来科技领域最火热的概念之一,但是目前对于Web3的定义却仍然没有形成标准答案,相当多对于Web3的理解,都是建立在虚拟货币行业(即俗称的“币圈”)的逻辑基础之上的。 区块链服务…...

pycharm、idea、golang等JetBrains其他IDE修改行分隔符(换行符)
文章目录 pycharm、idea、golang系列修改行分隔符我应该选择什么换行符JetBrains IDE,默认行分隔符 是跟随系统修改JetBrains IDE,默认行分隔符 pycharm、idea、golang系列修改行分隔符 一般来说,不同的开发环境和项目对换行格式的使用偏好不同: Windo…...

ThinkPHP函数深度解析
ThinkPHP是一个具有丰富功能和强大灵活性的PHP开发框架。在这篇文章中,我们将详细介绍ThinkPHP的一些关键函数,以帮助开发人员更好地理解和使用这个框架。 1. 入门:ThinkPHP的核心函数 1.1 C()函数 C()函数用于读取和设置配置参数。它是Thin…...

【java】【maven】【高级】MAVEN聚合继承属性等
目录 1、模块开发与设计 2、聚合 2、继承 3、属性 4、版本管理 5、资源配置 6、多环境配置 7、多环境开发配置 8、跳过测试 9、私服 前言:maven的高级使用包含分模块开发与设计、聚合、继承、属性、版本管理、资源配置、多环境配置、多环境开发配置、跳过…...

LeetCode150道面试经典题-合并两个有序数组(简单)
合并两个有序数组 题目: 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 注意&a…...

记录 运维三剑客一件部署的的docker-compose,yml文件
CAdvisor: 收集 InfluxDB: 存储 Grafana: 展示 version: 3.1volumes:grafana_data: {}services:influxdb:image: tutum/influxdb:0.9restart: alwaysenvironment:- PRE_CREATE_DBcadvisorports:- "8083:8083"- "8086:8086"volumes:- ./data/inf…...

Xposed框架开发
文章目录 xpose插件开发步骤清单文件新建一个类(插件入口点)设置入口点 Hook第一个实例zhuceji.apk一些常用的HOOKHookH5PluginHookProxyPluginHookSystem 资料Xposed原理初探 xpose插件开发步骤 magisk安装与配置 Xpose Framework API LSPosed magisk …...

2.13 Android ebpf非网络相关帮助函数API汇总(十二 本章完)
1.long bpf_user_ringbuf_drain(struct bpf_map *map, void *callback_fn, void *ctx, u64 flags) 描述:从指定的用户环形缓冲区中排出样本,并为每个此类样本调用提供的回调: long (*callback_fn)(struct bpf_dynptr *dynptr, void *ctx); 如果callback_fn返回0,帮助函数…...

关于游戏的笔记
关于搭建秦时明月2一键端,并且开启秘境神秘商人东海寻仙幻化 1.该游戏下主要的目录 gm端 服务框架 服务端 2.修改对应的文件 C:\qs\Q2Server\server\conf_common\ManagerAddress.xmlC:\qs\Q2Server\server\conf_manager\GateServer.xml修改ip 3.启动gm startup…...

vue diff 前后缀+最长递增子序列算法
文章目录 查找相同前后缀通过前后缀位置信息新增节点通过前后缀位置信息删除节点 中间部份 diff判断节点是否需要移动删除节点删除未查找到的节点删除多余节点 移动和新增节点最长递增子序列 求解最长递增子序列位置信息 查找相同前后缀 如上图所示,新旧 children 拥…...

【Python】Locust持续优化:InfluxDB与Grafana实现数据持久化与可视化分析
目录 前言 influxDB 安装运行InfluxDB 用Python 上报数据到influxdb ocust 数据写入到 influx Locust的生命周期 上报数据 优化升级 配置Grafana 总结 资料获取方法 前言 在进行性能测试时,我们需要对测试结果进行监控和分析,以便于及时发现问…...

数组模拟循环链表
5073. 空闲块 - AcWing题库 数组模拟循环链表 /*从当前位置开始遍历空闲块链表(初始是从地址最小的第一个空闲块开始),寻找满足条件的最小块 (即:大于等于请求空间的最小空闲块,如果有多个大小相同的最小空…...

第三章 图论 No.5最小生成树之虚拟源点,完全图与次小生成树
文章目录 虚拟源点:1146. 新的开始贪心或kruskal性质:1145. 北极通讯网络最小生成树与完全图:346. 走廊泼水节次小生成树:1148. 秘密的牛奶运输 虚拟源点:1146. 新的开始 1146. 新的开始 - AcWing题库 与一般的最小…...

RESTful API的讲解以及用PHP实现RESTful API
RESTful API是什么 RESTful是一种设计风格,是一种用于构建Web服务的架构。RESTful API是一种基于REST(Representational State Transfer)架构风格的Web服务接口设计规范。它强调使用HTTP协议中的请求方法(例如GET、POST、PUT、DEL…...

Spring中@Component和@Bean的区别
1. 用途不同 Component用于标识普通类 Bean是在配置类中声明和配置Bean对象 2. 使用方式不同 Component是一个类级别的注解,Spring通过ComponentScan注解扫描并注册为Bean. Bean是一个方法级别的注解,在配置类中手动声明和配置Bean 3. 控制权不同 Component注解修饰的类使…...

【问题解决】mysql 数据库字符串分割之后多行输出方法
背景: 项目需要从一张表查询出来数据插入到另一张表,其中有一个字段是用逗号分隔的字符串,需要多行输入到另一张表,那么这个如何实现呢 方案: 下面先粘贴下sql语句: select SUBSTRING_INDEX(SUBSTRING_…...

flutter开发实战-时间显示刚刚几分钟前几小时前
flutter开发实战-时间显示刚刚几分钟前几小时前 在开发中经常遇到从服务端获取的时间戳,需要转换显示刚刚、几分钟前、几小时前、几天前、年月日等格式。 一、代码实现 static String timeFormatterChatTimeStamp(int seconds) {try {int nowDateSeconds (DateTi…...

导出LLaMA等LLM模型为onnx
通过onnx模型可以在支持onnx推理的推理引擎上进行推理,从而可以将LLM部署在更加广泛的平台上面。此外还可以具有避免pytorch依赖,获得更好的性能等优势。 这篇博客(大模型LLaMa及周边项目(二) - 知乎)进行…...

回顾 OWASP 机器学习十大风险
日复一日,越来越多的机器学习 (ML) 模型正在开发中。机器学习模型用于查找训练数据中的模式,可以产生令人印象深刻的检测和分类能力。机器学习已经为人工智能的许多领域提供了动力,包括情感分析、图像分类、面部检测、威胁情报等。 数十亿美…...

ENSP软件的基本使用命令(第三十一课)
ENSP软件的基本使用命令(第三十一课) 下面的图片是今天操作的核心基础操作 1 命令行页面 交换机 路由器 PC机 分别展示一下 页面的样子 2 基本命令结构...

五、FreeRTOS数据类型和编程规范
1、数据类型 (1)每个移植的版本都含有自己的portmacro.h头文件,里面定义了2个数据类型。 (2)TickType_t FreeRTOS配置了一个周期性的时钟中断:Tick Interrup每发生一次中断,中断次数累加,这被称为tick counttick count这个变量…...