linux如何修改ip数据包

由“(Android)iptables修改数据包源IP“实验展开去 iptables修改源ip;iptables NAT;Android iptables;Ping不回复;ICMP不回复 阅读详情
dsr0.0.1程序存档及说明---如何修改ip数据包
2007-10-08 19:41:38
本程序功能
 对发送的数据包的数据包类型进行修改
改为dsr类型,设dsr类型的值为24
同时加入dsr选项,保存原来的数据类型

接收的数据包为逆过程
还原原数据包的数据类型
去掉dsr选项


实现的效果
只用同时运行该程序的机子可以进行通讯
无法其他机子的正常通讯

单机测试效果
ping自己的机子可以ping通
但ping其他的机子则不行

本程序算是我的第一个程序吧
主要目的是实验ip数据包的修改方法,以便进一步的编程,可以说是小实验吧
对于如何修改ip数据包作了详细的说明和代码演示
可以为以后编程作参考

特此存档以便后查

测试内核为2.6.20
==========================================
/*DSR处理程序dsr.c*/

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/skbuff.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
#include <linux/string.h>
#include <linux/ip.h>
#include <net/ip.h>
#include <dsr.h>
#define DSR 24

//定义两个结构体,以便向钩子函数注册
static struct nf_hook_ops nfho1;
static struct nf_hook_ops nfho2;

//发送处理程序,截获发送的数据包,添加dsr头部(4字节),将有的协议类型更换为dsr类型
unsigned int dsr_send(unsigned int hooknum,struct sk_buff **skb,const struct net_device *in,const struct net_device *out,int (*okfn)(struct sk_buff *))
{
    struct iphdr *iph_n=(*skb)->nh.iph;
    int iph_len=((*skb)->nh.iph->ihl)*4;//ip首部长度,单位字节
    //printk("skb_headroom %i/n",skb_headroom(*skb));

    //__u8 icmp_type=00000001;
    //if(iph_n->protocol == icmp_type){iph_n->protocol=DSR;ip_send_check(iph_n);return NF_ACCEPT;}
    if(iph_n->protocol!=0)
    {
        unsigned char *dsrh_addr=skb_push((*skb),sizeof(struct dsr_header));//返回值为待写入数据的区域
       
        struct dsr_header dsrh;
        if(dsrh_addr==NULL){printk("the headroom is not enough/n");return NF_DROP;}
        //printk("a is %p/n b is %p/n",dsrh_addr,(*skb)->nh.iph);
       
        (*skb)->nh.iph=memmove(dsrh_addr,iph_n,iph_len);//前移ip头部
        iph_n=(*skb)->nh.iph;
        dsrh_addr+=iph_len;//确定dsr选项的地址
           
        //dsr选项值设定
        dsrh.nextheader=iph_n->protocol;
        dsrh.reserved=00000000;
        dsrh.length=0000000000000000;
        memcpy(dsrh_addr,&dsrh,4);//选项值写入内存相应区域
       
        //更改协议类型为DSR,并校验头部
        iph_n->protocol=DSR;
        iph_n->tot_len=htons((*skb)->len);
        ip_send_check(iph_n);
        //printk("a2 is %p/n b2 is %p/n",dsrh_addr,(*skb)->nh.iph);
        printk("send %i/n%i/n",iph_n->protocol,dsrh.nextheader);
        //printk("the new skb_headroom is %i/n",skb_headroom(*skb));
        return NF_ACCEPT;
    }
   
    else{return NF_DROP;}

    //return NF_ACCEPT;
}

//接收处理函数,还原数据包的原有数据类型,去除dsr选项
unsigned int dsr_rcv(unsigned int hooknum,struct sk_buff **skb,const struct net_device *in,const struct net_device *out,int (*okfn)(struct sk_buff *))
{
    struct iphdr *iph_n=(*skb)->nh.iph;
    printk("rcving/n");
   
    if(iph_n->protocol==DSR)
    {
//iph_n->protocol=1;
        int iph_len=((*skb)->nh.iph->ihl)*4;//ip首部长度,单位字节
        unsigned char *dsrh_addr=skb_pull((*skb),sizeof(struct dsr_header));//返回的是去掉了sizeof(dsr_header)后的地址,计ip头应移动到的地址;

        struct dsr_header *dsrh;//=(struct dsr_header *)iph_n+iph_len;
        (*skb)->nh.iph=(struct iphdr *)dsrh_addr;
        dsrh_addr=dsrh_addr+iph_len-sizeof(struct dsr_header);//确定dsr选项部分的地址
        //printk("%p/n",dsrh_addr);
        dsrh=(struct dsr_header *)dsrh_addr;
        //printk("iph %p/ndsr  %p/n",iph_n,dsrh);
        printk("rcv %i/n%i/n",iph_n->protocol,dsrh->nextheader);
        iph_n->protocol=dsrh->nextheader;
        memmove((*skb)->nh.iph,iph_n,iph_len);//ip头后移
        //(*skb)->nh.iph+=iph_len;
        iph_n=(*skb)->nh.iph;
        iph_n->tot_len=htons((*skb)->len);
        //printk("iph2  %p/n",iph_n);
        ip_send_check(iph_n);
    }

    return NF_ACCEPT;
}
//初始化函数,完成向钩子函数的注册
static int __init dsr_init(void)
{
    nfho1.hook=dsr_rcv;
    nfho1.hooknum=NF_IP_PRE_ROUTING;
    nfho1.pf=PF_INET;
    nfho1.priority=NF_IP_PRI_FIRST;
    nf_register_hook(&nfho1);
    nfho2.hook=dsr_send;
    nfho2.hooknum=NF_IP_LOCAL_OUT;
    nfho2.pf=PF_INET;
    nfho2.priority=NF_IP_PRI_FIRST;
    nf_register_hook(&nfho2);
    return 0;
}
//反注册钩子函数,module的出口
static void __exit dsr_exit(void)
{
    nf_unregister_hook(&nfho1);
    nf_unregister_hook(&nfho2);
}
module_init(dsr_init);
module_exit(dsr_exit);
==========================================
dsr.h文件如下
#ifndef _DSR_H
#define _DSR_H

#include <linux/types.h>

struct dsr_header
{
    __u8 nextheader;
    __u8 reserved;
    __u16 length;
};


#endif/*_DSR_H*/
==========================================
makefile文件
obj-m +=dsr.o
KERNELBUILD := /lib/modules/`uname -r`/build/
CFLAGS += -I/home/lightmusic/workspace/dsr/include/
default:
    make -C $(KERNELBUILD) M=$(shell pwd) modules
clean:
    rm -rf *.o .*.cmd *.ko *.mod.c .tmp_versions
==========================================
 
基于Transformer的CFD代理模型:AeroTransformer原理、实现与优化 计算流体动力学(CFD)仿真是航空航天、汽车工程等领域的关键技术,但其高计算成本限制了设计优化效率。代理模型通过机器学习方法学习输入参数与流场输出间的映射关系,能实现秒级预测,大幅加速仿真流程。Transformer架构凭借其全局注意力机制,能有效建模流场中的长程物理关联,克服了传统卷积神经网络在捕捉全局依赖上的局限。通过预训练与微调策略,模型能先在大规模多样化数据集上学习通用流体规律,再针对特定任务快速适配,显著提升了小样本下的泛化能力与工程实用价值。AeroTransformer项目正是这一技术路线的典 阅读详情

相关推荐

RTDETR多模态融合实战:基于注意力机制的红外与可见光目标检测优化

本文深入探讨了基于RTDETR模型的红外与可见光多模态目标检测优化方案。针对复杂光照下的检测难题,文章提出并实战演示了如何利用注意力机制(如SimAM与交叉注意力)实现RGB与IR特征的智能动态融合,从而构建更鲁棒的“全天候”检测系统,有效提升安防、自动驾驶等场景在夜间及恶劣天气下的检测精度与可靠性。

weixin_29083373的博客 189

linux iptables源ip替换,Linux更改源IP地址的传入流量

好的,现在我想我明白你想要什么.这是一个非常特殊的情况,与我之前发布的常规端口转发方法不同(见下文).以下规则应该这样做.传入数据包上的SNAT我假设如下:>< x>:服务器的公共IP>< y>:客户端的公共IP>< a>:服务器的内部IP(192.168.2.1)>< b>:客户端的内部“伪造”IP(192.168.2.10...

weixin_42653672的博客 2433

银河麒麟V10系统grub崩溃急救指南:从光盘救援到完整恢复(附常见错误排查)

本文详细介绍了银河麒麟V10系统grub崩溃的急救方法,从使用安装光盘进入救援环境到完整恢复系统的全流程。针对不同损坏程度(轻度、中度、严重)提供了分级恢复策略,包括grub2-install和grub2-mkconfig等关键命令的使用,并附有常见错误排查表,帮助用户快速解决引导问题。

weixin_30955617的博客 483

linux更改源地址发送数据包,使用iptables重写某些传入数据包的源地址?

我有一个应用程序,其中设备将UDP流量发送到Linux机箱,在那里使用UDP samplicator进行复制并发送到多个其他设备进行分析 . UDP samplicator配置为在复制时保留原始传入数据包的源地址 . 那部分完美无缺 .我今天在samplicator盒子上使用iptables有选择地不将UDP流量从某些来源转发到特定的分析目标,因为一些分析目标只需要查看来自某些设备的数据,这也很...

weixin_42189774的博客 759

从零构建生产级K8s-v1.35.0集群:基于Containerd与Cilium的kubeadm实战指南

本文详细介绍了从零构建生产级K8s-v1.35.0集群的全过程,涵盖环境准备、Containerd配置、Kubernetes组件安装、集群初始化及Cilium网络部署等关键步骤。通过实战经验分享系统调优技巧和常见问题解决方案,帮助读者快速搭建稳定高效的Kubernetes集群。

weixin_28725553的博客 222

深入解析MSPM0系列Keil开发中‘ti_msp_dl_config.h‘缺失问题的根源与修复

本文深入解析TI MSPM0系列Keil开发中'ti_msp_dl_config.h'文件缺失问题的根源与修复方法。该错误常见于编译时提示file not found,主要因SysConfig工具未正确生成或工程路径配置错误导致。文章提供了从环境检查、手动生成文件到工程配置调整的系统化解决方案,帮助开发者快速解决这一常见KEIL开发难题。

gold的博客 970

SNAT概述

SNAT策略及应用 DNAT策略及应用 规则的导出,导入 使用防火墙 SNAT策略概述 SNAT策略的典型应用环境 局域网主机共享单个公网IP地址接入Internet SNAT策略的原理 源地址转换,Source Network Address Translation 修改数据包的源地址 SNAT原理与应用 SNAT应用环境;局域网主机共享单个公网IP地址接入Internet (私有IP不能在Internet中正常路由)SNAT原理;源地址转换,根据指定条件修改数据包的源IP地址,通常被叫做源映谢

Sldy0701的博客 8747

服务器AutoDL自己部署QWen3

说明:核心参数:30B 模型原精度权重文件约 60GB,单张 PRO 6000 拥有 48GB 显存,单卡塞不下原精度模型,2张 PRO 6000 = 96GB 总显存,这不仅能装下模型,还能留出约 30GB 显存给 KV Cache(上下文长度) 以及 Omni 多模态组件 处理图片/视频输入时的额外开销。1. 前提准备模型选择:直接下载到 AutoDL 服务器上=》原精度模型(BF16/FP16) 的 Qwen3-Omni-30B,选择的示例和环境如下。# 3. 正式执行模型下载。

xiaoxiao_00001的博客 416

数据包经由路由转发时源、目的IP地址及MAC地址变化情况

IP数据包经由路由转发的时候源ip,目的ip,源MAC,目的mac是否发生改变,如何改变? A—–(B1-B2)—–(C1-C2)——-E 如上拓扑图为例,B1和B2是路由器B上的两个接口,C1和C2是路由器C上的两个接口,A和E是PC,由主机A向主机E发送数据包,那么在主机A形成的数据包的目的IP就是E的IP,源IP就是主机A的IP地址,目标MAC地址就是B1的MAC地址,源MAC地址就是A

VMA_LMA的专栏 1万+

基于Simulink的无迹卡尔曼滤波(UKF)SOC高精度估计仿真

本文介绍了基于Simulink的无迹卡尔曼滤波(UKF)在电池SOC高精度估计中的应用。通过无迹变换替代传统EKF的线性化过程,UKF显著提升了SOC估计精度,在强非线性工况下误差可控制在0.5%以内。文章详细阐述了UKF的核心原理,包括Sigma点生成、状态预测和观测更新等关键步骤,并基于Thevenin等效电路模型构建了完整的UKF SOC估算系统。通过Simulink建模和仿真验证,展示了UKF在大电流脉冲、变温工况等复杂场景下的优异性能,其动态响应时间小于30ms,长期累积误差低于0.7%。研究为储

amy_mhd的博客 125

TC3XX - MCAL知识点(三十五):Tasking编译器下,Tc3xx的MCAL代码如何使用多核,多核中断、多核任务、多核外设之间的MCAL配置与代码例程

文章用于记录在裸机情况下使用多核Tc387芯片,如何高效运行以及正确的代码、工程属性、链接文件配置等问题,相互结合、相互影响的地方,以示后续使用记录。

梦想技术家 963

Linux内核动态加载netfilter模块并修改数据包源IP地址

这次加载netfilter模块比上篇的helloworld能稍微简单一点,但万变不离其宗,一些细节就不赘述,本文引用了这篇文章部分代码。内核是3.10版本。 1.编写http.c文件 #include <linux/netfilter.h> #include <linux/init.h> #include <linux/inet.h> #include <...

某潜水用户的博客 1914

AI辅助Android开发:从传统到智能化的技术演进

AI辅助开发的核心在于利用算法模型自动化或优化传统任务。在Android开发中,AI可应用于需求分析、设计、编码、测试和维护各阶段。需求分析:AI工具如基于NLP的模型(例如GPT系列)可解析用户需求文档,自动生成用户故事和原型设计。假设产品需求为“开发一个航班查询应用”,AI能提取关键词,输出UML图或伪代码。代码生成:使用AI代码助手(如GitHub Copilot),工程师输入自然语言描述,AI生成Java/Kotlin代码片段。

郑伟强dev的专栏 137

php修改IP发送数据包,标题: linux下伪造IP发送数据包和接收数据包的程序(碰到了几个问题)...

#include#include#include#include#include#include#include#include#include#defineDESTPORT80#defineLOCALPORT8888#defineLOCAL_IP"192.168.0.1"voidsend_tcp(intsockfd,structsockaddr_in*addr);unsigne...

weixin_32218639的博客 200

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

转:Linux2.4.0IP层转发(ip_forward)流程

 Linux2.4.0IP层转发(ip_forward)流程 Linux2.4.0IP层转发流程 Email:getmoon@163.com QQ:505333 欲攬明月 下载地址:http://linuxsouce.home.sohu.com/download/ipforward.zip 其他文档下载:http://linuxsouce.home.sohu.com/download/inde

Robust516的专栏 2121

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

教你修改以及重构skb -基于2.6.18

<br />测试环境:<br />    CentOS5.3 2.6.18<br /> 工具:<br />    sendip和wireshark<br />    sendip可以发送各种数据包,确实方便.wireshark图形化的显示对于分析整个数据包还是相当不错的...<br />    <br /> 一:内核 态基于Netfilter构造数据包<br /> 主要有两种方式:<br /> 1. alloc_skb申请一个skb结构体,然后根据实际的应用填充不同的成员,或者基于当前

high7344的专栏 1786

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

修改以及重构SKB

修改以及重构SKB测试环境:<br />   CentOS5.3 2.6.18<br />工具:<br />   sendip和wireshark<br />   sendip可以发送各种数据包,确实方便.wireshark图形化的显示对于分析整个数据包还是相当不错的...<br />   <br />一:内核态基于Netfilter构造数据包<br />主要有两种方式:<br />1. alloc_skb申请一个skb结构体,然后根据实际的应用填充不同的成员,或者基于当前数据包的skb,<br />   

星愿心愿的专栏 1434

linux内核中如何修改skb报文

前言 在内核开发中,我们很多时候需要修改linux网络数据包的内容。那么怎样修改skb报文才正确?这个问题在网上的资料讲解的不是很全,下面是我这几天梳理的步骤 skb修改数据包流程 -内核代码中有许多用于计算校验和的API,一下是linux网络技术内幕相关API的截图 修改数据包的流程分析和相关api的介绍 在内核中构造数据包的时候,我们需要关注三个校验和:分别是sk_buf中的csum,ip_summed,ip头部中的check和udp或者tcp头部中的check 用于计算校验和的API:L3

小小程序员的博客 3748

常用修改报文手段

常用修改报文手段使用linux tcprewrite使用科莱数据包生成器使用wireshark使用scapy工具 使用linux tcprewrite 回放报文工具tcpreplay下面有个工具tcprewrite可以修改报文,可以修改报文2-4层头部信息,具体修改内容说明见 https://blog.youkuaiyun.com/ly_6118/article/details/86714477 tcpre...

ly_6118的博客 9698

linux 内核开发-重构skb

测试环境:   CentOS5.3 2.6.18工具:   sendip和wireshark   sendip可以发送各种数据包,确实方便.wireshark图形化的显示对于分析整个数据包还是相当不错的...   一:内核态基于Netfilter构造数据包主要有两种方式:1. alloc_skb申请一个skb结构体,然后根据实际的应用填充不同的成员,或者基于当前数据包的skb,   调用skb_c

stephen_yin的专栏 3522

linux net.ipv4.ip_forward 数据包转发

出于安全考虑,Linux系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将数据包发往本机另一块网卡,该网卡根据路由表继续发送数据包。这通常是路由器所要实现的功能。 要让Linux系统具有路由转发功能,需要配置一个Linux的内核参数net.ipv4.ip_forward。这个参数指定了Linux系统当前对路由转发功能的支持情况;其值为0时表示禁止进行IP转发;如果是1,则说明IP转发功能已经打开。 要配置Linux内核中的net.ipv4.i

whatday的专栏 4万+

MAC和IP地址伪造发包

思路 1.动态修改arp缓存表里的主机mac地址 2.通过scapy的sinff()方法获取本机数据包后,对包内ip进行修改。 3.自动化实现 1.修改MAC 基础操作 很简单 liunx系统下 sudo ifconfig eth0 down sudo ifconfig eth0 hw ether 修改的MAC sudo ifconfig eth0 up 2.修改IP 1.安装python环境和pip下安装scapy模块 2.抓包 ...

qq_43402663的博客 1716

linux udp传数据,修改linux上的传出UDP数据包中的数据

它的RADIUS部分对查询并不重要,但我想我会解释一下上下文:我有一个基于Linux的半径服务器,它始终在“访问 - 接受”数据包中包含某个属性,这是我的一个网络设备所不喜欢的 . 服务器没有禁用所述属性的选项 . 我正在研究使用脚本修改传出访问接受以删除属性并重新计算校验和和Radius身份验证器字段的可能性 .我将能够编写一个python脚本,它创建一个UDP套接字来监听,然后根据需要修改ra...

weixin_35057850的博客 375

Linux-回放数据包

在日常工作中,我们常需要回放一些网络数据包用于测试安全设备告警情况,下面我将简述如何进行回放包测试。

qq_53146347的博客 663

linux 模块作用是什么,linux内核netfilter之ip_conntrack模块的作用举例

linux内核netfilter之ip_conntrack模块的作用举例--ftp为例 收藏很多协议的控制信息在应用层数据中被包含,这些信息直接影响到了链路的建立,比如ftp协议就是这样,ftp分为port模式和pass模式,port模式中,起初client连接server的21端口,然后当需要传输data的时候,client发送一个控制包给server,包中包含client端开启的端口和自己的i...

weixin_34757706的博客 271

数据包转发功能/proc/sys/net/ipv4/ip_forward

/home # cat /proc/sys/net/ipv4/ip_forward 0 出于安全考虑,Linux系统默认是禁止数据包转发的。 所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将包发往本机另一网卡,该网卡根据路由表继续发送数据包。配置Linux系统的ip转发功能,首先保证硬件连通,然后打开系统的转发功能 cat /proc/sys/net/i...

阿Sir问道 962
上一篇: 怎样发现Cisco路由器
下一篇: 命令行下装WinPcap
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值