linux tcp header更改,Linux Netfilter中修改TCP/UDP Payload的方法

来自linux-2.6.36/net/ipv4/netfilter/nf_nat_helper.c

注:该代码可以移植到ebtables中使用,但需要注意struct rtable *rt结构在ebtables中是没有的。

修改UDP payload的代码:

/* Unusual, but possible case. */

static int enlarge_skb(struct sk_buff *skb, unsigned int extra)

{

if (skb->len + extra > 65535)

return 0;

if (pskb_expand_head(skb, 0, extra - skb_tailroom(skb), GFP_ATOMIC))

return 0;

return 1;

}

/* Frobs data inside this packet, which is linear. */

static void mangle_contents(struct sk_buff *skb,

unsigned int dataoff,

unsigned int match_offset,

unsigned int match_len,

const char *rep_buffer,

unsigned int rep_len)

{

unsigned char *data;

BUG_ON(skb_is_nonlinear(skb));

data = skb_network_header(skb) + dataoff;

/* move post-replacement */

memmove(data + match_offset + rep_len,

data + match_offset + match_len,

skb->tail - (skb->network_header + dataoff +

match_offset + match_len));

/* insert data from buffer */

memcpy(data + match_offset, rep_buffer, rep_len);

/* update skb info */

if (rep_len > match_len) {

pr_debug("nf_nat_mangle_packet: Extending packet by "

"%u from %u bytes\n", rep_len - match_len, skb->len);

skb_put(skb, rep_len - match_len);

} else {

pr_debug("nf_nat_mangle_packet: Shrinking packet from "

"%u from %u bytes\n", match_len - rep_len, skb->len);

__skb_trim(skb, skb->len + rep_len - match_len);

}

/* fix IP hdr checksum information */

ip_hdr(skb)->tot_len = htons(skb->len);

ip_send_check(ip_hdr(skb));

}

/* Generic function for mangling variable-length address changes of UDP packet's payload

*

* Takes care about all the nasty sequence number changes, checksumming,

* skb enlargement, ...

*

* match_offset: the payload's start point to be mangled

* match_len: the payload's length to be mangled, when 0 means insert some data into the payload

* rep_buffer: the new data to be inserted.

* rep_len: the new data's length to be inserted.

*/

static int

mangle_udp_packet(struct sk_buff *skb,

unsigned int match_offset,

unsigned int match_len,

const char *rep_buffer,

unsigned int rep_len)

{

struct rtable *rt = skb_rtable(skb);

struct iphdr *iph;

struct udphdr *udph;

int datalen, oldlen;

/* UDP helpers might accidentally mangle the wrong packet */

iph = ip_hdr(skb);

if (skb->len < iph->ihl*4 + sizeof(*udph) +

match_offset + match_len)

return 0;

if (!skb_make_writable(skb, skb->len))

return 0;

if (rep_len > match_len &&

rep_len - match_len > skb_tailroom(skb) &&

!enlarge_skb(skb, rep_len - match_len))

return 0;

iph = ip_hdr(skb);

udph = (void *)iph + iph->ihl*4;

oldlen = skb->len - iph->ihl*4;

mangle_contents(skb, iph->ihl*4 + sizeof(*udph),

match_offset, match_len, rep_buffer, rep_len);

/* update the length of the UDP packet */

datalen = skb->len - iph->ihl*4;

udph->len = htons(datalen);

/* fix udp checksum if udp checksum was previously calculated */

if (!udph->check && skb->ip_summed != CHECKSUM_PARTIAL)

return 1;

if (skb->ip_summed != CHECKSUM_PARTIAL) {

if (rt && !(rt->rt_flags & RTCF_LOCAL) &&

skb->dev->features & NETIF_F_V4_CSUM) {

skb->ip_summed = CHECKSUM_PARTIAL;

skb->csum_start = skb_headroom(skb) +

skb_network_offset(skb) +

iph->ihl * 4;

skb->csum_offset = offsetof(struct udphdr, check);

udph->check = ~csum_tcpudp_magic(iph->saddr, iph->daddr,

datalen, IPPROTO_UDP,

0);

} else {

udph->check = 0;

udph->check = csum_tcpudp_magic(iph->saddr, iph->daddr,

datalen, IPPROTO_UDP,

csum_partial(udph,

datalen, 0));

if (!udph->check)

udph->check = CSUM_MANGLED_0;

}

} else {

inet_proto_csum_replace2(&udph->check, skb,

htons(oldlen), htons(datalen), 1);

}

return 1;

}

修改TCP payload的方法:

/* Generic function for mangling variable-length address changes inside

* NATed TCP connections (like the PORT XXX,XXX,XXX,XXX,XXX,XXX

* command in FTP).

*

* Takes care about all the nasty sequence number changes, checksumming,

* skb enlargement, ...

*

* */

int __nf_nat_mangle_tcp_packet(struct sk_buff *skb,

struct nf_conn *ct,

enum ip_conntrack_info ctinfo,

unsigned int match_offset,

unsigned int match_len,

const char *rep_buffer,

unsigned int rep_len, bool adjust)

{

struct rtable *rt = skb_rtable(skb);

struct iphdr *iph;

struct tcphdr *tcph;

int oldlen, datalen;

if (!skb_make_writable(skb, skb->len))

return 0;

if (rep_len > match_len &&

rep_len - match_len > skb_tailroom(skb) &&

!enlarge_skb(skb, rep_len - match_len))

return 0;

SKB_LINEAR_ASSERT(skb);

iph = ip_hdr(skb);

tcph = (void *)iph + iph->ihl*4;

oldlen = skb->len - iph->ihl*4;

mangle_contents(skb, iph->ihl*4 + tcph->doff*4,

match_offset, match_len, rep_buffer, rep_len);

datalen = skb->len - iph->ihl*4;

if (skb->ip_summed != CHECKSUM_PARTIAL) {

if (!(rt->rt_flags & RTCF_LOCAL) &&

skb->dev->features & NETIF_F_V4_CSUM) {

skb->ip_summed = CHECKSUM_PARTIAL;

skb->csum_start = skb_headroom(skb) +

skb_network_offset(skb) +

iph->ihl * 4;

skb->csum_offset = offsetof(struct tcphdr, check);

tcph->check = ~tcp_v4_check(datalen,

iph->saddr, iph->daddr, 0);

} else {

tcph->check = 0;

tcph->check = tcp_v4_check(datalen,

iph->saddr, iph->daddr,

csum_partial(tcph,

datalen, 0));

}

} else

inet_proto_csum_replace2(&tcph->check, skb,

htons(oldlen), htons(datalen), 1);

if (adjust && rep_len != match_len)

nf_nat_set_seq_adjust(ct, ctinfo, tcph->seq,

(int)rep_len - (int)match_len);

return 1;

}

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

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

相关文章

Servlet跳转到JSP页面后的路径问题相关解释

一、现象与概念 1. 问题 在Servlet转发到JSP页面时&#xff0c;此时浏览器地址栏上显示的是Servlet的路径&#xff0c;而若JSP页面的超链接还是相对于该JSP页面的地址且该Servlet和该JSP页面不在同一个文件夹下时&#xff0c;则会出现路径混乱问题。 2. 绝对路径概念 相对于con…

linux7 kickstart,Linux运维知识之CENTOS 7 验证KICKSTART文件是否完整方法

本文主要向大家介绍了Linux运维知识之CENTOS 7 验证KICKSTART文件是否完整方法&#xff0c;通过具体的内容向大家展现&#xff0c;希望对大家学习Linux运维知识有所帮助。功能简介&#xff1a;CentOS 7 包含 ksvalidator 命令行程序&#xff0c;可使用该程序进行确认Kickstart文…

CI项目设计Redis队列

项目开发过程中需要设计提供可平衡的处理多个用户请求的队列。需求&#xff1a;当用户登录后&#xff0c;查看系统中已经登录的管理员队列&#xff0c;然后查看后台管理员的处理能力&#xff0c;如果已经不能处理新的请求&#xff0c;则把该管理员从处理队列中删除&#xff0c;…

c语言在函数中传递指针,[求助]关于文件指针在函数中传递的问题

[求助]关于文件指针在函数中传递的问题我写的一个程序中文件指针在各函数间传递。请各位整理一下思路。/**//* 。。。(开头部分省略) *//* 部分函数省略 *//* 打开号码文件&#xff0c;号码文件必须与该程序放在同一文件夹。*/void OpenFile(char * argv , FILE ** fin , FILE …

担当大任者的九大特征

一、忍得住孤独人生想要获得成功&#xff0c;必须忍得住孤独&#xff0c;尤其是在创业之初&#xff0c;很多时候为了达成目标&#xff0c;可能别人在休息时&#xff0c;我们还一个人在默默无闻的付出&#xff0c;这种过程是非常孤独的&#xff0c;但如果能挺得过去&#xff0c;…

c语言竖等于意思,C语言竖式问题

#include#includeint main(){char str[30];//键盘输入数组scanf("%s",str);int i,j;char sta[50];//字符串输入输出数组int count0;for(i1000;i<9999;i){for(j10;i<99;i){int proi*j;int pro1i*(j%10);int pro2i*(j/10);sprintf(sta,"%d%d%d%d%d",i,…

6章 Models

传统的MVC结构中&#xff0c;有模型这么一个概念。Django中&#xff0c;Models又是怎么一回事呢? 刚才生成的这些乱七八糟的数据迁移就是Django自带的一些应用 INSTALLED_APPS [django.contrib.admin,django.contrib.auth,django.contrib.contenttypes,django.contrib.sessio…

android activity之间传递对象,Android Activity之间的数据传递

一、通过startActivity来进行Activity的传值在Android中&#xff0c;如果我们要通过一个Activity来启动另一个Activity&#xff0c;可以使用 startActivity(Intent intent)方法来传入一个Intent对象&#xff0c;这个Intent对象我们可以精确的指定我们需要跳转的Activity上&…

I/O流

1.I/O流1.1 基本概念 I/O就是Input/Output的简写&#xff0c;也就是输入/输出的含义。 I/O流主要指像流水一样源源不断进行读写的状态/过程。 1.2 基本分类 以数据读写的单位不同分为&#xff1a;字节流 和 字符流。 其中字节流主要指以字节为基本单位进行读写的流&#xff0c;…

android蓝牙传输的是字符吗,Android蓝牙接收到的串行数据乱码

我已经通过以下线索了解我的疑问。但是&#xff0c;目前还不清楚。Android蓝牙接收到的串行数据乱码克里斯&#xff0c;这是一个不错的解决方法&#xff0c;你建议。在你提供的解决方案中&#xff0c;附加\ n的解决方案适合我&#xff0c;因为我纯粹将我的PC(MATLAB)中的浮点值…

请谈谈cookie,locaStorage的区别和特点

cookie和locaStorage有什么区别呢&#xff1f; 存储容量&#xff1a; Cookie存储的数据大小有限制&#xff0c;一般在4KB左右&#xff0c; LocaStorage可以存储更大的数据&#xff0c;一般在5MB甚至更多 存储位置&#xff1a; Cookie数据会随着每次HTTP请求自动发送到服务器端…

[UE4]更新UI的三种方式

一、函数绑定 二、属性绑定 只会列出匹配的数据类型。 三、事件驱动更新 啦啦啦啦啦 结论&#xff1a;函数和属性绑定的原理都是每帧都去调用绑定的函数/属性&#xff0c;效率比较低下&#xff0c;一般不推荐使用。事件驱动更新的效率最好&#xff0c;性能最好。 在正式的产品开…

使用handler倒计时

点击button暂停 public class MainActivity extends AppCompatActivity {BindView(R.id.button)Button button;BindView(R.id.first_textview)TextView textView;Handler mHandler;volatile boolean flagtrue;Object objectnew Object();MThread mThread;Overrideprotected voi…

android 编译主机,Android】源码编译 ---zzz

问题解决 参考1)/bin/bash: prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-gcc: 权限不够解决&#xff1a;chmod ax prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-gcc2)/bin/bash: build/core/find-jdk-tools-jar.sh: 权限不够/bin/bash: build/too…

C/C++ 面试题记录

1、new 、 delete 、 malloc 、 free 的区别与关系&#xff1f; new / delete 是C的运算符&#xff0c;malloc / free 是C的标准库函数。 new会调用对象的构造函数&#xff0c;delete会调用对象的析构函数。它们都可用于动态申请内存和释放内存。 对于非内部数据类型的对象而言…

android实现3种定位的切换,Android 滑动定位+吸附悬停效果实现

在前两篇文章中&#xff0c;分别介绍了tablayoutscrollview 和 tablayoutrecyclerview 实现的滑动定位的功能&#xff0c;文章链接&#xff1a;Android 实现锚点定位Android tabLayoutrecyclerView实现锚点定位仔细看的话&#xff0c;这种滑动定位的功能&#xff0c;还可以整体…

用JavaScript语言判断一个三位数是否为水仙花数

// 提示用户输入一个三位数// 如果不是三位数或者不是数字&#xff0c;则提示“非法输入”&#xff1b;// 如果输入合法&#xff0c;判断这个三位数是否为水仙花数。// &#xff08;每一位数的三次方之和等于这个数本身&#xff0c;就是水仙花数。例如&#xff1a;153 370 371 …

unity mmd不支持android,MMD模型导入Unity的解决方案

前言学了Unity后&#xff0c;总是感觉缺少资源&#xff0c;包括人物、物品模型、动作数据、贴图、特效&#xff0c;各种插件&#xff0c;还被骗去学了几天各种美术软件。说起模型和动作数据&#xff0c;就又想到MMD&#xff0c;毕竟有那么现成的资源&#xff0c;虽然不能商用&a…

关于windows cmd的一些便捷应用

在同事的指点下&#xff0c;我学会了一种非常方便的进入路径的方法 在windows文件夹中直接打开到要执行的文件的位置&#xff0c;然后在我的电脑那个路径当中输入cmd 之后&#xff0c;cmd的对话框会弹出来&#xff0c;并且显示在当前路径下&#xff0c;这样&#xff0c;有一些需…

android中的 listview,Android中ListView的初步认识(一)

ListView是安卓开发中常用的组件之一&#xff0c;它的作用是在一个垂直的列表中展现出所需的项目。接下来&#xff0c;我们看一下ListView的实现方法&#xff1a;第一种 是常见的在XML中定义然后在activity中使用findViewById来获取的方式(这个相当基础了&#xff0c;直接代码)…