为什么 Linux TAP 设备不处理 ARP 或 ICMPv6 数据包

2024-05-01

我正在使用以下命令打开 TAP 设备

p->fd = open("/dev/net/tun", O_RDWR);

// skipping error handling code

ifr.ifr_flags = IFF_TAP | IFF_ONE_QUEUE | IFF_NO_PI;
strncpy(ifr.ifr_name, p->name, IFNAMSIZ-1);
result = ioctl(p->fd, TUNSETIFF, &ifr);

// skipping error handling and setting ipv4 address & netmask code

ifr.ifr_flags = (IFF_UP | IFF_RUNNING);
result = ioctl(dummySock, SIOCSIFFLAGS, &ifr);

我面临的问题是,当应用程序(比如 mozilla)想要通过 Tap 设备发送数据包时,它需要获取 dst mac 地址。于是内核发出了一个ARP请求。我正在编写的应用程序转发 arp 请求(通过物理 eth 设备上的原始套接字)并获取 arp 回复。这个arp回复被转发回tap设备,但是内核拒绝接受这个。如果我手动添加 arp 条目,则不会生成 arp 请求,并且有两种方式的 ip 数据包交换(mozilla 很高兴)。

Wireshark 能够接收数据包并且没有发现任何错误。 ICMPv6 数据包(邻居请求和通告)的情况也是如此。设备上侦听的任何应用程序都会完整地获取数据包。但内核不对其进行 ARP/ICMP 处理。

我的问题是,为什么内核不接受 arp 回复/ICMPv6 消息?我们需要调用一些 ioctl 调用吗?

Edit:

以下是在 Tap 设备“ethgress”处捕获的数据包(tshark 输出)的详细信息

  9  16.548328    fc00:1::2 -> ff02::1:ff00:1 ICMPv6 86 Neighbor Solicitation
 10  17.243247  fc00:1::100 -> fc00:1::2    ICMPv6 86 Neighbor Advertisement
 11  17.548652    fc00:1::2 -> ff02::1:ff00:1 ICMPv6 86 Neighbor Solicitation
 12  17.668736  fc00:1::100 -> fc00:1::2    ICMPv6 86 Neighbor Advertisement

这是“ethgress”的 ifconfig 输出

ethgress  Link encap:Ethernet  HWaddr 00:01:02:03:04:05
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:83 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:10000
          RX bytes:0 (0.0 b)  TX bytes:7062 (6.8 KiB)

可以看出,内核拒绝接受收到的 ICMPv6 数据包。但 tx 数据包会增加。

Tap 设备“ethgress”配置有 IPv6 地址 fc00:1::2,应用程序希望与 fc00:1::1 进行通信。 fc00:1::1 与 fc00:1:100 位于同一接口,后者使用正确的 MAC 地址响应邻居通告(目标 IP 是该数据包中的 fc00:1::1)。 Tcpdump 能够捕获它,wireshark/tshark 能够解码它,并表示它是一个正确形成的数据包。但 Rx 计数器不会由内核递增,也不会更新其 arp 缓存。 ARP 数据包的情况也是如此。

Edit 2:

网络看起来像这样。有两个外部盒被配置为冗余。只有其中之一会处于活动状态。它们分别通过物理网卡连接到一台电脑。我正在编写的应用程序在这台电脑上运行,并在每个网卡上打开一个原始套接字。它还会打开 TAP 设备。 NIC 未配置 IP 地址。 TAP 设备配置有 IPv4 和 IPv6 地址。一个标准应用程序,比如 mozilla,通过 Tap 设备打开一个套接字,并希望连接到活动盒。为此,内核在 Tap 设备上生成 ARP 请求/邻居请求消息。应用程序读取此消息并将其转发到两个 NIC。活动框使用 ARP 回复来响应 ARP 请求,应用程序将其读取并将其写入 TAP 设备。这个arp回复数据包被tcpdump捕获,但内核不会更新其arp缓存。两个 NIC 和 TAP 设备的 MAC 地址相同。

要求的其他参数。

cat /proc/sys/net/ipv4/conf/all/log_martians
0
cat /proc/sys/net/ipv4/conf/all/rp_filter
1
cat /proc/sys/net/ipv4/conf/all/arp_filter
0

这个问题现在已经很老了。

(你也有TUN和TAP设备之间的区别https://security.stackexchange.com/questions/46442/openvpn-tap-vs-tun-mode https://security.stackexchange.com/questions/46442/openvpn-tap-vs-tun-mode )

如果您的设备确实是包含 ARP、硬件寻址等的 TAP 设备: 您的流量转储不包括以太网帧。这些 ARP 和 ICMPv6 数据包的两个重要详细信息是 HW dst 和 src 地址。 RP 过滤器是其中的一部分,但可能不允许所有可能的组合通过。

对于TUN设备:应该不需要ARP等,该设备是“盲”IP设备

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

为什么 Linux TAP 设备不处理 ARP 或 ICMPv6 数据包 的相关文章

随机推荐

  • 如何确定 WPF 中的光标大小?

    在 Windows 窗体中 有一个 Cursor Size 属性 允许您获取光标对象的大小 宽度 高度 如何在 WPF 中确定此信息 SystemParameters 类公开光标宽度 http msdn microsoft com en u
  • 在 MATLAB 中高效地形成动态窗口

    有人可以帮助我提供一种有效的方法 或者帮助我执行提供的代码 以尽可能少的步骤获得相同的结果 我将感激你 我有一个原始数组 A 1 1 1 4 3 4 5 4 4 3 3 1 0 0 2 6 2 6 3 6 6 2 7 4 8 7 2 2 2
  • 如何将急切执行中的模型转换为静态图并保存在 .pb 文件中?

    想象一下我有模型 tf keras Model class ContextExtractor tf keras Model def init self super init self model self get model def cal
  • 按名称查找控件的父级

    当在 xaml 代码中设置名称时 有没有办法通过名称找到 WPF 控件的父级 尝试这个 element VisualTreeHelper GetParent element as UIElement 在哪里 元素是 Children 您需要
  • 如何在Java程序中调用DLL中的方法

    我正在尝试使用 JNA 调用 DLL 中的方法 到目前为止已经使用加载了DLL Runtime getRuntime load myworkspace test dll 该 dll 包含我需要访问的方法 如何在我的 Java 文件中执行 D
  • MVC T4 MvcTextTemplateHost 和定制的“控制器”T4 模板

    我正在创建自己的自定义 T4 模板 该模板与我的 MVC Web 应用程序中包含的 ADO NET 实体框架模型 edmx 文件 集成 以供参考 请简单浏览一下以下两个网址 斯科特 汉塞尔曼 T4 代码生成 Visual Studio 最保
  • 为什么我的代码中总是大写?

  • 如何以编程方式锁定 Windows 工作站? [复制]

    这个问题在这里已经有答案了 可能的重复 使用 C 以编程方式锁定 Windows 工作站 https stackoverflow com questions 1263047 lock windows workstation programm
  • 将 Magick::Image 转换为 cv::Mat

    我正在尝试将通过 Magick 从 GIF 加载的图像转换为cv Mat 我已经从cv Mat to Magick Image但似乎无法找到如何从 Magick 中的图像中提取数据以便将其加载到 Mat 中 最好的方法是什么 供参考 反过来
  • 确定 WPF 元素相对于某个父元素的边界矩形

    我认为这是一个非常简单的请求 但我似乎无法在搜索中找到确凿的答案 如何确定窗口中特定视觉元素相对于其他父元素的边界 我尝试过使用LayoutInformation GetLayoutSlot但这似乎只是返回一个Rect在 0 0 处并且不反
  • 如何在python日志模块中获取当前日志级别

    我正在尝试创建一个基本记录器 无需外部包即可着色 these have to be the first functions so I can use it in the logger settings def create log name
  • 为什么 Jupyter 突然将数据框显示为基于文本的?

    我已经使用 jupyter 笔记本有一段时间了 如果我这样做的话df head 它总是返回一个格式良好的表格格式 现在我调用了数据 我得到了这个 为什么 我该如何解决它 import pandas as pd df pd read csv
  • 如何循环用户输入直到输入整数?

    我想运行一个交互式程序 提示用户输入学生人数 如果用户输入除整数之外的字母或其他字符 则应再次询问他们 输入学生人数 我有以下代码 public int createArrays Scanner s int size System out
  • Neo4j 的 Cypher 查询语言是开源的吗?

    Neo4j的语言Cypher的现状如何 我真的很喜欢它 但我想避免 Neo4j 锁定 是否还有像 Gremlin 中那样的其他 Cypher 界面 Regards Cypher 完全是 OSS 请参阅https github com neo
  • 如何使用 Perl 从纯文本中提取 URL?

    我需要 Perl 正则表达式来解析纯文本输入并将所有链接转换为有效的 HTML HREF 链接 我已经尝试了在网上找到的 10 个不同版本 但没有一个可以正常工作 我还测试了 StackOverflow 上发布的其他解决方案 但似乎都不起作
  • 带有 dplyr::do 的匿名函数 - 使用 rle 的结果来过滤数据

    我有按主题 id 分组的时间序列数据 这些数据保留在某个 站点 上 并且在每个 时间 步骤中都有某个 阶段 有时受试者从一个站点切换到另一个站点 并且可能会再次返回 如果个人更换站点来回 例如 从站点 a 到站点 b 然后返回站点 a an
  • 比较两个序列是否相等

    在因其标题而将其标记为重复之前 请考虑以下简短程序 static void Main var expected new List
  • Google 文档自动保存如何工作?

    好吧 我知道这听起来很普通 但我指的是 AJAX 级别 我尝试过使用 Firebug 来跟踪 NET 连接和帖子 但这是一个谜 有谁知道他们如何在不破坏网络 浏览器的情况下不断进行即时自动保存 我的猜测 这只是一个猜测 是谷歌使用推送服务
  • try/catch 块中的完整代码

    我想知道 这是一个good practice放置complete code里面一个try block或者我应该放置only the code which I feel it will cause a specific exception 我
  • 为什么 Linux TAP 设备不处理 ARP 或 ICMPv6 数据包

    我正在使用以下命令打开 TAP 设备 p gt fd open dev net tun O RDWR skipping error handling code ifr ifr flags IFF TAP IFF ONE QUEUE IFF