将TCP数据包发送到同一源

时间:2018-08-06 07:33:18

标签: linux-kernel router tcp-ip netfilter

我想设计一个减少数据包传输时间的系统,实际上,我是从客户端发送一个SYN位,该位通过路由器传输然后到达服务器,然后服务器回复SYN + ACK,这也通过路由器到达客户端。

所以我只想要其他类似的东西,如果客户端将SYN发送到路由器,然后路由器将其发送到服务器,然后将此数据包复制,将SYN修改为SYN + ACK,并在服务器发送完SYN +之后再发送回客户端,直到服务器可以发送对路由器进行ACK,路由器只接受它(在收到答复时就看到它)并丢弃它。

为了实现上述目标,我设计了一种设置,其中有一台笔记本电脑可以从两个以太网接口发送和接收数据包,另一台是台式机,它可以充当路由器(数据包来了,只将其转发到目的地)。从双方建立路由表,并在台式机(充当路由器)上启用IP转发。

一切正常,在笔记本电脑上,我有服务器和客户端程序可以发送数据包并接收数据包,但问题是我想将数据包从发送位置发送到(发送源),因此我修改了使用Netfilter模块在路由端发送数据包,复制整个skb(使用skb_copy)并交换其ip源和目标地址(我在NF_INET_PREROUTING上执行此操作),还交换端口号,但数据包始终到达目标地址。

我还需要进行其他哪些修改才能将数据包发送到其来源?

1 个答案:

答案 0 :(得分:0)

首先,您必须在此处处理一些细节。

首先,在SYN-ACK数据包上,服务器发送其序列。因此,如果您在路由器中修改了数据包并发送回客户端,那么您的序列是什么?就像服务器将发送并且服务器还没有发送任何东西一样。

第二,在握手过程中,有多个协议,例如MSS,启用SACK等。因此,您不能代表服务器使用它。

关于问题本身,您应该在PRE_ROUTING中进行操作,更改IP地址和端口,并修复IP和TCP的校验和。