无法从TUN接口读取数据包 tshark抓包无流量是什么原因
问题根本原因
TUN是内核提供的虚拟点对点接口,只有内核判定需要发往该接口对端、不属于本地系统的数据包,才会被推入TUN设备对应的用户态可读取队列,也就是抓包工具、用户态TUN程序能拿到的流量,抓不到包的核心逻辑如下:
- ping的目标地址
10.0.0.138是直接配置在router0接口上的本地IP。内核处理发往本地IP的ICMP请求时,会直接在内核协议栈内部完成回包逻辑,全程不会把数据包下发到TUN接口的发送链路,自然抓不到任何包。ping能通本身就是内核本地处理的结果,和TUN接口的虚拟链路没有关系。 - 从
ip addr输出的NO-CARRIER标记可以确认,当前没有任何用户态程序持有router0设备的打开文件描述符,就算内核有要发往TUN对端的流量,也没有出口可以投递,接口本身的虚拟链路处于未连通状态。
抓包验证方法
- 先让一个用户态进程持有router0的设备文件描述符:可以写简单的测试程序打开该TUN设备,也可以用系统自带的TUN配置工具关联设备后保持运行,先清除接口的
NO-CARRIER标记,让接口链路进入正常连通的UP状态。 - 不要ping接口自身的本地IP,改为ping同网段内其他未被本地占用的地址,比如
ping 10.0.0.2。此时内核会匹配到10.0.0.0/24网段的路由指向router0口,将ICMP请求包下发到TUN队列,再用tshark抓包就能看到对应流量。
内容的提问来源于stack exchange,提问作者Happy Jerry
相关产品推荐
相关产品推荐

