我想设计一个减少数据包传输时间的系统,实际情况是我从客户端发送一个 SYN 位,该位通过路由器传输到服务器,服务器回复 SYN+ACK 也通过路由器传输到客户端。
所以我只想做一些其他的事情,比如如果客户端将SYN发送到路由器,路由器然后将其发送到服务器并复制此数据包,将SYN修改为SYN + ACK,并在服务器将此SYN + ACK发送到路由器后发送回客户端之前,服务器可以发送,路由器只是接受它(在回复到来时看到它)并丢弃它
为了实现上述目标,我设计了一种设置,其中一台笔记本电脑从两个以太网接口发送和接收数据包,另一台是充当路由器的台式机(数据包即将到来,它仅将其转发到目的地)我设置了从双方的路由表并启用桌面上的IP转发(充当路由器)。
一切都工作正常,在笔记本电脑上我有服务器和客户端程序发送数据包并接收它,但问题是我想将数据包发送到它的来源(源本身),所以我修改路由上的数据包使用 netfilter 模块,复制整个 skb(使用 skb_copy)并交换其 ip 源和目标(我在 NF_INET_PREROUTING 上执行此操作)并交换端口号,但数据包始终发送到目的地。
我还需要进行哪些其他修改才能将数据包发送到其源本身?
答案1
TCP 在连接的两端使用不同的序列计数器。因此,如果您只是发回一个完整的数据包,它将具有错误的序列号,并在另一端被拒绝,因为另一端认为这是一个被延迟的重复数据包等。
不过,您可以发送内容一个数据包回来,如果这是你想要的。一个简单的方法是使用socat
.在两个终端窗口中测试以下内容。合而为一,做
socat TCP-LISTEN:9990 SYSTEM:"cat"
这将侦听传入连接,当建立连接时,将传入数据通过管道传输到cat
,这将输出相同的数据,然后通过 TCP 连接获取输出。
在另一个中,做
socat - TCP:localhost:9990
这将连接到第一个socat
端口 9990,发送stdin
给它,并将响应写入stdout
。输入几行(stdin 仅发送 CR 上的行)并观察它们返回。
因此,如果这是想法的话,您可以使用它来测试您的设置。您还可以使用类似的方法将所有内容发送回服务器:
socat TCP:server.com:1234 SYSTEM:"cat"
但这需要服务器在连接时实际发送一些内容。
如果这不能解决您的问题,请编辑您的问题并解释为什么你想发回“数据包”,并且什么问题你想通过发回“数据包”来解决吗? (测试您的设置?测试服务器?还有其他事情吗?)。
这看起来非常像XY问题。
答案2
由于问题完全改变了,另一个答案:
在服务器实际收到 SYN 之前,将 SYN+ACK 发送回客户端是一种什么操作?同步代理做。谷歌现有的实施。
这与“发回数据包”无关,它只是关于初始 SYN/ACK 处理。
不,不可能使用防火墙规则来做到这一点,因为它必须保持状态(或至少保持一定数量的状态)。