为什么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 packet exchange(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 解决方法
这个问题现在很老了.
(你也有TUN和TAP设备之间的区别https://security.stackexchange.com/questions/46442/openvpn-tap-vs-tun-mode) 如果您的设备确实是包含ARP,硬件寻址等的TAP设备: 对于TUN设备:应该不需要ARP等,这个设备是“盲”IP设备 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |