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

时间:2011-11-11 13:21:06

标签: c linux icmp arp

我正在使用

打开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 reply / ICMPv6 msgs?我们需要调用一些ioctl调用吗?

修改

以下是分接设备“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数据包也是如此。

编辑2:

网络看起来像这样。有两个外部盒子配置为冗余。其中只有一个是活跃的。它们通过物理网卡连接到PC。我正在编写的应用程序在这台PC上运行,并在每个NIC上打开一个原始套接字。它还打开了一个TAP设备。 NIC未配置IP地址。 TAP设备配置有IPv4和IPv6地址。一个标准的应用程序,比如mozilla,通过点击设备打开一个插座,并希望连接到活动盒。为此,内核在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

1 个答案:

答案 0 :(得分:0)

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

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

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

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