如何通过RAW套接字发送修改后的IPv6数据包?

2024-04-23

我正在尝试通过 C Linux 中的 RAW 套接字发送自定义 IPv6 标头。
我已经使用 IP_HDRINCL 套接字选项在 IPv4 中取得了成功,但是,IPv6 没有等效的选项。
我找到了解决方法here http://lists.openwall.net/netdev/2009/01/15/168建议使用socket(AF_INET6, SOCK_RAW, IPPROTO_RAW)与启用 IP_HDRINCL 套接字选项具有相同的效果。

套接字已成功创建,并且在使用之前没有收到任何错误sendto与我修改后的标题一起使用。

我这样设置套接字:

static int socketFd = 0;
static struct sockaddr_in6 remote;

int main()
{
    socketFd = socket (PF_INET6, SOCK_RAW, IPPROTO_RAW);

    if (socketFd < 0)
    {
        printf ("An error ocurred while creating the socket.\n");
        exit (2);
    }

    remote.sin6_family = AF_INET6;
    remote.sin6_port = htons (25000);

    if (inet_pton (AF_INET6, "fd00:c0de::70d6:4ab9:115d:8cda", &(remote.sin6_addr)) != 1)
    {
        close (socketFd);
        printf ("Unable to parse IPv6 address.\n");
        exit (2);
    }

 /*More code */
  ...

  return 0;
}

然后,我有这个回调函数,它应该发送我的自定义 IPv6 数据包,但是sendto失败返回 EINVAL。

static void sendPacket ()
{
    char buffer[BUFSIZ];
    const size_t len = sizeof(struct ip6_hdr) + sizeof(struct UDP_hdr);
    struct ip6_hdr *ip6 = (struct ip6_hdr*) (buffer);
    struct UDP_hdr *udp = (struct UDP_hdr *) (buffer + sizeof(struct ip6_hdr));

    memset (buffer, 0, BUFSIZ);

    ip6->ip6_ctlun.ip6_un2_vfc = 0x60;
    ip6->ip6_dst = remote.sin6_addr;
    ip6->ip6_flow = 60;
    ip6->ip6_hops = 64;
    ip6->ip6_nxt = 17;
    ip6->ip6_plen = sizeof(struct UDP_hdr);

    if (inet_pton (AF_INET6, "fd00:c0de::62a4:4cff:1234:5678", &(ip6->ip6_src)) != 1)
    {
        printf ("Error while parsing spoofed IPv6 address.\n");
        return;
    }

    // Fabricate the UDP header. Source port number, redundant
    udp->uh_sport = htons (21000);
    // Destination port number
    udp->uh_dport = remote.sin6_port;
    udp->uh_ulen = htons (sizeof(struct UDP_hdr));

    if (sendto (socketFd, buffer, len, 0, (struct sockaddr *) &remote, sizeof(remote)) < 0)
    {
        perror ("sendto");
        printf ("Error while sending packet.\n");
    }
}

我已经调试了程序,并且 ip6_hdr 结构中的所有值似乎都是正确的,结构 UDP_hdr 中的值也是正确的。我错过了什么吗?


对于谁可能有帮助,我有一个类似的代码可以工作,但是打开套接字

socket(test->state.addr_family, SOCK_RAW, IPPROTO_UDP);

设置选项

int val = 1; ret = setsockopt(test->state.sockfd, IPPROTO_IPV6, IPV6_HDRINCL, &val, sizeof (val));

and 将端口设置为零 with remote.sin6_port = 0;,如中所解释的here https://nick-black.com/dankwiki/index.php/Packet_sockets以避免EINVAL上的错误sendto call.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过RAW套接字发送修改后的IPv6数据包? 的相关文章

  • 为什么隐式类型转换没有警告?

    我终于发现了程序中的一个错误 该错误是由返回类型的隐式类型转换引起的 即使g Wall对此没有任何警告 我想知道是否有什么办法可以快速找出这种无意识的错误 include
  • Active Directory:获取用户所属的组

    我想找到用户所属的组列表 我尝试了几种解决方案http www codeproject com KB system everythingInAD aspx http www codeproject com KB system everyth
  • 配置错误:无法链接到 boost_system

    我正在尝试在 Debian 上安装一个软件包 足球模拟器 2d 当我进入目录并运行时 configure 我得到以下信息 reza debian soccer rcssserver 15 0 1 configure checking for
  • C++11 类型推导与 const char *

    In GotW 94 http herbsutter com 2013 08 12 gotw 94 solution aaa style almost always auto Herb Sutter 对 经典 C 声明进行了区分 const
  • fgetc,检查 EOF

    在书里Linux系统编程我读过一些这样的内容 fgetc返回读取为的字符unsigned char投射到int or EOF在文件末尾或错误 使用时的一个常见错误fgetc is char c if c fgetc EOF 该代码的正确版本
  • 知识树中的段错误

    我正在用 c 实现一个可以从文件中读取的知识树 我的 newStr 函数出现段错误 我无法用这个问题测试我的其余代码 我对 c 没有太多经验 任何帮助将不胜感激 我的 c 文件 包括 包括 include 动物 h 包括 包括 return
  • 在主窗体上使用 BeginInvoke 调用的网络任务未执行

    我使用 Visual Studio 2013 构建了一个具有单个表单的 C 应用程序 并且该应用程序有两个更新屏幕的例程 更新屏幕的例程需要在主线程上运行 因此我自己的线程 不与屏幕交互 在需要更新时调用主窗体上的 BeginInvoke
  • 使用 SFML 绘制文本时出现段错误

    我做了一个Button应该绘制一些顶点和字符串的类RenderWindow 这是删除了不相关部分的代码 here http pastebin com 4a5RuS2y是完整的代码 namespace game class Button pu
  • 如何在cmake中添加cuda源代码的定义

    我使用的是 Visual Studio 2013 Windows 10 CMake 3 5 1 一切都可以使用标准 C 正确编译 例如 CMakeLists txt project Test add definitions D WINDOW
  • 使用 perf 查找线程瓶颈并优化挂机时间

    对 cpu 周期进行采样perf record如果核心利用率大致恒定 则对于寻找优化候选非常有用 但对于具有并行性不同的多个阶段的代码 计算 cpu 周期将重点强调并行阶段 而低估影响挂机时间的顺序或有限并行阶段 简而言之 天真的 perf
  • Cmake 链接到共享库找不到​​库

    在 Ubuntu 上 我有两个目录 build and src In src my CMakeLists txt文件有以下几行 add executable Test main cpp target link libraries Test
  • C# - 当站点上没有活动时,Quartz 调度程序停止运行

    我用quartz调度器创建了asp net站点 该作业正在后台运行 站点上没有其他活动 Quartz 调度程序每 30 分钟调度一次 IIS启动后 Scheduler运行正常 但一段时间后 Scheduler 停止运行 大约 1 小时 如果
  • 无法使用Linux服务启动Archiva 2.1.0

    我正在尝试在 Linux 上启动最近发布的 Apache Archiva v2 1 0 独立版 出于测试目的 该 zip 已解压缩在 opt archiva 2 0 文档说 http archiva apache org docs 2 1
  • 消息在事务处理时未到达 MSMQ

    我在本地计算机中创建了一个私有 MSMQ 我使用以下 C 代码将消息发送到队列 当我将队列更改为事务性队列时 消息未到达 MSMQ 但是 Send 方法中没有抛出异常 我需要做出什么改变才能使其发挥作用 using System using
  • 仅使用 url 嵌入视频

    给定一个 youtube url 我如何使用 net c 将视频嵌入到页面中 只需添加如下一行 将 autoplay 设置为 0 或 1 取决于您是否希望人们真正留在您的页面上
  • GoogleTest:如何跳过测试?

    使用 Google Test 1 6 Windows 7 Visual Studio C 如何关闭给定的测试 又名如何阻止测试运行 除了注释掉整个测试之外 我还能做些什么吗 The docs https github com google
  • HTTP 错误 500.35 - ANCM 同一进程中的多个进程内应用程序 ASP.NET Core 3

    从今天早上开始 没有对项目代码进行任何更改 一个非常简单的 Web API 一个控制器和 3 个方法 使用 Swagger 它不再启动 我收到错误 HTTP 错误 500 35 ANCM 同一进程中有多个进程内应用程序 事件查看器报告最无用
  • 图像处理编程

    我想知道是否有任何方法可以使用某种编程语言检测图像中对象的位置 例如 如果我有一个球的图像 每 100 毫秒更新一次 是否可以通过某些程序使用某些东西来获取球的坐标 看一下OpenCV http opencv willowgarage co
  • 制作一个未知大小的数组 C# [重复]

    这个问题在这里已经有答案了 可能的重复 C 中未知长度的数组 https stackoverflow com questions 599369 array of an unknown length in c sharp 我想创建一个程序 用
  • JSON.NET 序列化 JObject,同时忽略 null 属性

    我有一个JObject它被用作template用于调用 RESTful Web 服务 这JObject通过解析器创建 并且由于它用作模板告诉用户端点架构是什么样子 所以我必须找到一种方法来保留所有属性 这就是为什么我将它们的值默认为null

随机推荐