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

我打开使用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电话吗?

编辑:

这里是在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”configuration了IPv6地址fc00:1 :: 2,它的应用程序想要与fc00:1 :: 1进行通信。 fc00:1 :: 1与fc00:1:100的接口相同,该接口使用正确的mac地址响应邻居通告(目标ip在该数据包中为fc00:1 :: 1)。 tcpdump能够捕获它,wireshark / tshark能够解码它,并说它是一个正确形成的数据包。 但是Rx计数器不会被内核增加,也不会更新它的arpcaching。 ARP数据包的情况也是如此。

编辑2:

networking看起来像这样。 有两个外部盒子被configuration为冗余的。 只有其中一个会积极。 他们每个都通过物理网卡连接到一台电脑。 我正在编写的应用程序运行在这台电脑上,并在每个网卡上打开一个原始套接字。 它也打开一个TAP设备。 网卡没有configurationIP地址。 TAP设备configuration了IPv4和IPv6地址。 一个标准的应用程序,比如说mozilla,通过水龙头设备打开一个sockets,并且想连接到活动盒子。 为此,内核在水龙头设备上生成ARP请求/邻居请求消息。 应用程序读取此消息并将其转发给两个NIC。 活动框通过应答读取并写入TAP设备的ARP应答来响应ARP请求。 这个ARP响应数据包被tcpdump捕获,但是内核不更新它的arpcaching。 两个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 

Solutions Collecting From Web of "为什么不是由Linux TAP设备处理的ARP或ICMPv6数据包"

这个问题现在很老了。

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

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

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