【博客595】从linux收包与发包过程看iptables链如何发挥作用

news2024/9/27 23:28:59

从linux收包与发包过程看iptables链如何发挥作用

1、linux收包过程(以udp包为例)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、linux发包过程(以udp包为例)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、收发包过程中iptables的hook如何发挥作用

主要分为三个部分:

  • 接收数据的处理流程是:PREROUTING链 -> 路由判断(是本机)-> INPUT链 -> 本机进程
  • 发送数据包流程是:路由选择 -> OUTPUT链 -> POSTROUTING链 -> 网卡发出
  • 转发数据过程:PREROUTING链 -> 路由判断(不是本设备,找到下一跳) -> FORWARD链 -> POSTROUTING链 -> 网卡发出

3-1、接收数据过程分析:

在这里插入图片描述
过程分析:

Linux 在网络包接收在 IP 层的入口函数是 ip_rcv。网络在这里包碰到的第一个 HOOK 就是 PREROUTING。当该钩子上的规则都处理完后,会进行路由选择。如果发现是本设备的网络包,进入 ip_local_deliver 中,在这里又会遇到 INPUT 钩子

源码分析:

先看ip_rcv
//file: net/ipv4/ip_input.c 
int ip_rcv(struct sk_buff *skb, ......){ 
    ...... 
    return NF_HOOK(NFPROTO_IPV4, NF_INET_PRE_ROUTING, skb, dev, NULL, 
               ip_rcv_finish); 
 
} 

NF_HOOK 这个函数会执行到 iptables 中 pre_routing 里的各种表注册的各种规则。
当处理完后,进入 ip_rcv_finish。在这里函数里将进行路由选择。
这也就是 PREROUTING 这一链名字得来的原因,因为是在路由前执行的。

//file: net/ipv4/ip_input.c 
static int ip_rcv_finish(struct sk_buff *skb){ 
    ... 
    if (!skb_dst(skb)) { 
        int err = ip_route_input_noref(skb, iph->daddr, iph->saddr, 
                           iph->tos, skb->dev); 
        ... 
    } 
    ... 
    return dst_input(skb); 
 
} 

如果发现是本地设备上的接收,会进入 ip_local_deliver 函数。
接着是又会执行到 LOCAL_IN 钩子,这也就是我们说的 INPUT 链。

//file: net/ipv4/ip_input.c 
int ip_local_deliver(struct sk_buff *skb){ 
 ...... 
    return NF_HOOK(NFPROTO_IPV4, NF_INET_LOCAL_IN, skb, skb->dev, NULL, 
               ip_local_deliver_finish); 
 
} 

3-2、发送数据过程分析:

在这里插入图片描述
过程分析:

Linux 在网络包发送的过程中,首先是发送的路由选择,然后碰到的第一个 HOOK 就是 OUTPUT,然后接着进入 POSTROUTING 链。

源码分析:

网络层发送的入口函数是 ip_queue_xmit。
//file: net/ipv4/ip_output.c 
int ip_queue_xmit(struct sk_buff *skb, struct flowi *fl) 
{ 
 // 路由选择过程 
 // 选择完后记录路由信息到 skb 上 
 rt = (struct rtable *)__sk_dst_check(sk, 0); 
 if (rt == NULL) { 
  // 没有缓存则查找路由项 
  rt = ip_route_output_ports(...); 
  sk_setup_caps(sk, &rt->dst); 
 } 
 skb_dst_set_noref(skb, &rt->dst); 
 ... 
 //发送 
 ip_local_out(skb); 
} 

在这里先进行了发送时的路由选择,然后进入发送时的 IP 层函数 __ip_local_out。
//file: net/ipv4/ip_output.c  
int __ip_local_out(struct sk_buff *skb) 
{ 
 struct iphdr *iph = ip_hdr(skb); 
 
 iph->tot_len = htons(skb->len); 
 ip_send_check(iph); 
 return nf_hook(NFPROTO_IPV4, NF_INET_LOCAL_OUT, skb, NULL, 
         skb_dst(skb)->dev, dst_output); 
} 
上面的NF_HOOK将发送数据包送入到 NF_INET_LOCAL_OUT (OUTPUT) 链。
执行完后,进入 dst_output。

//file: include/net/dst.h 
static inline int dst_output(struct sk_buff *skb) 
{ 
 return skb_dst(skb)->output(skb); 
} 

在这里获取到之前的选路,并调用选到的 output 发送。将进入 ip_output。
//file: net/ipv4/ip_output.c 
int ip_output(struct sk_buff *skb) 
{ 
 ... 
 
 //再次交给 netfilter,完毕后回调 ip_finish_output 
 return NF_HOOK_COND(NFPROTO_IPV4, NF_INET_POST_ROUTING, skb, NULL, dev, 
  ip_finish_output, 
  !(IPCB(skb)->flags & IPSKB_REROUTED)); 
} 

3-3、转发数据过程分析:
在这里插入图片描述

过程分析:

除了接收和发送过程以外,Linux 内核还可以像路由器一样来工作。它将接收到网络包(不属于自己的),然后根据路由表选到合适的网卡设备将其转发出去。
这个过程中,先是经历接收数据的前半段。在 ip_rcv 中经过 PREROUTING 链,然后路由后发现不是本设备的包,那就进入 ip_forward 函数进行转发,在这里又会遇到 FORWARD 链。最后还会进入 ip_output 进行真正的发送,遇到 POSTROUTING 链。

源码分析:

先是进入 IP 层入口 ip_rcv,在这里遇到 PREROUTING 链。
//file: net/ipv4/ip_input.c 
int ip_rcv(struct sk_buff *skb, ......){ 
    ...... 
    return NF_HOOK(NFPROTO_IPV4, NF_INET_PRE_ROUTING, skb, dev, NULL, 
               ip_rcv_finish); 
 
} 

PREROUTING 链条上的规则都处理完后,进入 ip_rcv_finish,
在这里路由选择,然后进入 dst_input。

//file: include/net/dst.h 
static inline int dst_input(struct sk_buff *skb) 
{ 
 return skb_dst(skb)->input(skb); 
} 

转发过程的这几步和接收过程一模一样的。不过内核路径就要从上面的 input 方法调用开始不一样。
非本设备的不会进入 ip_local_deliver,而是会进入到 ip_forward。

//file: net/ipv4/ip_forward.c 
int ip_forward(struct sk_buff *skb) 
{ 
 ...... 
 return NF_HOOK(NFPROTO_IPV4, NF_INET_FORWARD, skb, skb->dev, 
         rt->dst.dev, ip_forward_finish); 
} 

在 ip_forward_finish 里会送到 IP 层的发送函数 ip_output。
//file: net/ipv4/ip_output.c 
int ip_output(struct sk_buff *skb) 
{ 
 ... 
 //再次交给 netfilter,完毕后回调 ip_finish_output 
 return NF_HOOK_COND(NFPROTO_IPV4, NF_INET_POST_ROUTING, skb, NULL, dev, 
  ip_finish_output, 
  !(IPCB(skb)->flags & IPSKB_REROUTED)); 
} 

3-4、汇总:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/170162.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Kubernetes 企业项目实战】04、基于 K8s 构建 EFK+logstash+kafka 日志平台(中)

目录 一、安装存储日志组件 Elasticsearch 1.1 创建名称空间 1.2 安装 elasticsearch 组件 1)创建 headless service 服务 2)通过 statefulset 创建 elasticsearch 集群 二、安装 kibana 可视化 UI 界面 一、安装存储日志组件 Elasticsearch 1.1 …

django框架全解

目录简介MVC与MTV模型MVCMTV创建项目目录生命周期静态文件配置(无用)启动django路由分组无名分组有名分组路由分发反向解析反向解析结合分组名称空间re_path与path自定义转换器视图HttpRequest常用方法HttpResponseJsonFBV和CBV模板(前后端分…

SpringBoot+VUE前后端分离项目学习笔记 - 【24 服务器安装部署】

本节主要实现服务器购买以及服务部署 PS: 由于没有服务器本节仅做大致流程记录,无实际操作步骤 服务器配置安装 文档:docker安装centos、jdk、mysql、redis… 链接:http://note.youdao.com/noteshare?id6a01550a3acfbafc7cbbea4ae99c0e48&a…

嵌入式Linux-进程间通信

1.进程间通信 1.1 进程间通信的介绍 进程间通信(interprocess communication,简称 IPC)指两个进程之间的通信。系统中的每一个进程都有各自的地址空间,并且相互独立、隔离,每个进程都处于自己的地址空间中。所以同一…

【自学Docker】Docker attach命令

Docker attach命令 大纲 docker attach教程 使用 docker attach 命令可以用来进入到一个正在运行的 Docker容器。docker attach 命令后面的 CONTAINER 可以是容器Id,或者是容器名。 要能够使用 docker attach 的容器必须是正在运行的。 docker attach语法 haic…

# Itext Pdf 5 教程

Itext Pdf 5 教程 Itext Pdf Itext7收费&#xff0c;故使用Itext5传统版&#xff0c;Itext5不再维护 官网&#xff1a;iText 5 |iText PDF Itext5 Java Api 地址&#xff1a;iText 5 Java | iText PDF 依赖 <!-- itextpdf --> <dependency><groupId>c…

视频编辑:VisioForge Video Edit SDK .Net 15.5 标准版 Crack

视频编辑&#xff1a;VisioForge Video Edit SDK .Net v15.5 标准版 Crack,我没有专业版&#xff0c;希望你提供 VisioForge Video Edit SDK .Net 允许程序员轻松地将视频编辑和处理功能集成到他们的软件应用程序中。SDK 允许您使用任何音频和视频文件创建您的电影。您可以为其…

2022年游戏安全风险增长96%,高维作弊对抗激烈

导读&#xff1a;2022年&#xff0c;游戏行业在多种因素影响下遭遇寒冬。但游戏黑灰产规模在迅速壮大&#xff0c;不少游戏饱受其侵扰&#xff0c;越来越多的游戏厂商开始重视游戏安全问题。 为帮助游戏厂商能够清晰、直观地了解当前游戏安全对抗形势&#xff0c;在经过多轮调…

【虹科云展厅专题】虹科赋能汽车智能化云展厅——汽车总线专题

虹科2023年开年福利 聚焦前沿技术&#xff0c;【虹科赋能汽车智能化云展厅】正式上线&#xff0c;本次云展厅围绕“汽车以太网/TSN、汽车总线、智能网联、电子测试与验证、自动驾驶”等核心话题&#xff0c;为您带来如临展会现场般的讲演与介绍&#xff0c;更有技术工程师全程…

机智云DUT实现远程智能鱼池管理系统

一、前言机智云研发的4G DTU在养殖智能系统管理方面优势&#xff0c;此处以智能鱼池管理系统为例。1.实时数据监控机智云智能鱼池养殖智能系统实现对整个鱼池水质的实时监控&#xff0c;无人值守设备状态下运行。为客管理者提供实时异常数据报警信息、实时环境参数波动、实时/定…

nacos的安装部署

文章目录1.nacos的下载2.nacos数据库的建立3.nacos配置文件修改3.1配置文件3.2设置单点登录4.登录nacos网页1.nacos的下载 下载地址&#xff1a; https://github.com/alibaba/nacos/releases 根据自己的需要下载合适的版本。 2.nacos数据库的建立 navicat运行nacos下conf的…

【深度】从链上分析和金融安全角度,看stETH的囚徒困境和Celsius挤兑事件

6月7日开始&#xff0c;以Celsius被曝损失 3.5 万枚 ETH开始&#xff0c;ETH流动性生态乃至整个加密货币市场进入到一个以stETH为中心的流动性囚徒困境之中&#xff0c;而这也造成了对Celsius等加密货币“银行”挤兑现象的发生。 SharkTeam将从事件的起源开始&#xff0c;也就…

拆解“算力偏科”难题,智算中心下一步向何处去?

十年前&#xff0c;英国《经济学人》曾用工业用电量为主的指标来评估中国GDP&#xff0c;而现在算力已经成为新的指标。似乎每个企业、每个城市都在努力增加算力。一位读者不无困惑地留言&#xff0c;大家都说自己算力有多少FLOPS&#xff0c;能支撑这个大模型、那个大数据&…

九龙证券|北上资金连续10日“跑步入场”,1月净流入已逼近2022全年

1月以来&#xff0c;北上资金净流入规划已接近2022全年。 半导体概念股集体大涨 1月17日&#xff0c;沪指缩量小幅调整&#xff0c;收跌0.1%&#xff1b;深成指涨0.13%&#xff0c;创业板指收涨0.24%&#xff0c;科创50涨逾1%。 板块方面&#xff0c;半导体及元件板块继续走强…

基于.NetCore+React单点登录系统

更多开源项目请查看&#xff1a; 一个专注推荐.Net开源项目的榜单 对于有多个应用系统的企业来说&#xff0c;每一个应用系统都有自己的用户体系&#xff0c;这就造成用户在切换不同应用系统时&#xff0c;就要多次输入账号密码&#xff0c;导致体验非常不好&#xff0c;也造成…

【vue系列-07】vue脚手架的基本使用

深入理解脚手架的使用一&#xff0c;vue脚手架的基本使用1&#xff0c;vue-cli安装2&#xff0c;vue项目中的文件组成3&#xff0c;render配置项4&#xff0c;ref属性5&#xff0c;props属性6&#xff0c;mixin属性7&#xff0c;scope属性一&#xff0c;vue脚手架的基本使用 在…

vsftpd使用指北

vsftpd使用指北 文章目录vsftpd使用指北1.安装vsftpd2.登录3.切换本地路径下载命令&#xff1a;get用于下载单个文件&#xff1a;mget用于批量下载&#xff1a;上传命令&#xff1a;FilezillaReferencevsftpd 是“very secure FTP daemon”的缩写&#xff0c;是一个完全免费的、…

Vue组件化

1、Vue组件化开发思想 1.1、认识组件化开发 组件化也是类似的思想&#xff1a; 如果我们将一个页面中所有的处理逻辑全部放在一起&#xff0c;处理起来就会变得非常复杂&#xff0c;而且不利于后续的管理以及扩展&#xff1b;但如果&#xff0c;我们讲一个页面拆分成一个个小…

【算法竞赛学习】csoj:寒假第一场

文章目录前言新年礼物灯笼展摩天楼神抽新年大礼前言 由于本人菜鸡&#xff0c;所以大多都是使用出题人的代码和思路 如有侵权&#xff0c;麻烦联系up删帖&#xff0c;本贴仅作为笔记记录 本篇大多是在吹水&#xff0c;技术方面可以直接看代码注释&#xff0c;思路在水文中&am…

Linux下的进程通信之管道通信

目录 进程间通信的背景 为什么要进行进程间通信&#xff1f; 管道 什么是管道&#xff1f; 匿名管道 匿名管道原理 如何创建匿名管道&#xff1f; 命名管道 进程间通信的背景 进程间通信就是在不同的进程之间进行的数据的交换&#xff0c;进程间通信又称为Interproces…