用 C 语言修改和发送原始套接字后的数据包复制(无 iptables)

问题描述 投票:0回答:1

我目前正在用 C 语言开发一个项目,在该项目中,我捕获网络数据包,修改它们的标头(例如更改目标 IP),然后将修改后的数据包发送到新的目的地。但是,我遇到一个问题,在修改并发送数据包后,它最终被传递到原始目的地和新目的地。

项目设置:

  • 平台: 该项目正在为 Linux 开发。
  • 环境:我在一个VM上运行程序,该虚拟机被配置为另一个VM的默认网关,实际上充当路由器。
  • 数据包转发:我还确保在此虚拟机上启用数据包转发以方便路由。

问题描述:

尽管修改了捕获数据包的目标 IP,但修改后的数据包最终会被传送到原始目的地新目的地

到目前为止我尝试过的:

方法1:libpcap用于数据包捕获,原始套接字用于发送

  • 我使用 libpcap 捕获数据包。
  • 修改header(主要是修改目的IP地址)。
  • 使用原始套接字发送修改后的数据包。

这会导致修改后的数据包同时到达原始目的地和新目的地。

方法 2:用于捕获和发送的原始套接字

  • 我仅使用 原始套接字(无 libpcap)捕获数据包并修改它们。
  • 我再次更改目标 IP 并使用相同的原始套接字发送数据包。

这种方法仍然会导致数据包到达两个目的地。

我确保数据包的标头(包括校验和)在修改后正确更新。

我确实不想想在这个项目中使用iptables或任何其他外部工具——我严格使用C库并且希望完全用代码来控制这个过程。

我不确定这个问题是否是由于我管理数据包捕获和修改的方式引起的,或者原始套接字与网络堆栈交互的方式是否有问题。

我已经在网上寻找解决方案好几天了,但我还没有找到任何真正解决我面临的问题的帖子。

有没有人遇到过类似的问题,或者有没有人对如何确保只有修改后的数据包发送到新目的地而不是原始数据包有任何建议?

在原始套接字行为或 Linux 内核如何在这种情况下处理路由方面,我可能会忽略一些具体的东西吗?

预先感谢您的帮助!

c linux sockets packet libpcap
1个回答
0
投票

创建一个tun接口,给它一个静态ip为10.0.0.1,设置系统路由以将所有数据包导入tun接口。

© www.soinside.com 2019 - 2024. All rights reserved.