【问题标题】:Send a ping through a specific next hop in linux userspace C通过 linux 用户空间 C 中的特定下一跳发送 ping
【发布时间】:2023-11-08 01:01:01
【问题描述】:

如何发送icmp 请求并控制我正在编写的 Linux C 用户空间应用程序的下一跳。

我有一个网卡 (192.168.1.10/24),它连接到同一子网中的 2 个路由器(192.168.1.1192.168.1.2)。

我想通过192.168.1.1192.168.1.2 访问互联网(8.8.8.8),并根据延迟结果决定我的默认路由。

有没有办法可以控制用户空间 C 中的直接下一跳?我正在使用原始套接字。

【问题讨论】:

  • 我建议您对与ping 密切相关的实用程序进行一些研究,即traceroute 实用程序。如果你这样做了,你会发现它是如何逐跳“追踪”到目的地的路线。
  • 你需要设置目标MAC地址来匹配你的下一跳。不确定原始套接字的确切含义,如果您想在以太网标头中四处寻找,您应该使用a packet socket
  • 跟踪/跟踪路由对我有帮助吗?它只是每跳递减 TTL。
  • 好吧,我想我看错了你的问题......你想在两条路线之间切换(以编程方式),但不知道你的数据包正在走哪条路线?
  • @Someprogrammerdude 。几乎。我知道如何切换路线。我想通过 R1 (192.168.1.1) 和 R2 (192.168.1.2) 不断测试延迟,并根据它改变路由能力。

标签: c linux sockets ping icmp


【解决方案1】:

你可以使用source-routing:

在计算机网络中,源路由(也称为路径寻址)允许数据包的发送者部分或完全指定数据包通过网络所采用的路由。[1]相比之下,在传统路由中,网络中的路由器会根据数据包的目的地逐步确定路径。

但请注意,源路由数据包被立即和静默丢弃是很常见的,因为接收者无法相信它们来自它们似乎来自的地方而没有改变。

声波墙has this to say about their firewall configuration:

丢弃源路由 IP 数据包 -(默认启用。)如果您正在测试两个特定主机之间的流量并且您正在使用源路由,请清除此复选框。

IP Source Routing 是 IP 中的一个标准选项,它允许数据包的发送者指定用于将数据包发送到其目的地的部分或全部路由器。

这个 IP 选项通常被阻止使用,因为它可以被窃听者使用,通过插入一个选项来接收数据包,通过路由器 C 从 A 向 B 发送数据包。路由表应该控制数据包所采用的路径,所以它不会被发送者或下游路由器覆盖。

【讨论】:

    最近更新 更多