Android VpnService原生库写入tun接口后终端应用收不到数据包咨询
问题排查结论与方向
从你提供的路由配置信息判断,当前策略路由配置本身符合预期,出网流量已正确指向tun0接口,问题大概率出在数据包回注合法性、VpnService配置或系统转发规则环节,可按以下顺序排查:
- 校验写入tun_fd的数据包合法性
确认写入的IP数据包源目地址是否正确反转:例如收到的ping请求为10.10.20.3 -> 8.8.8.8,回写的响应必须是8.8.8.8 -> 10.10.20.3,源目地址错误的数据包会被内核直接丢弃。同时校验IP头、传输层(TCP/UDP/ICMP)头的校验和是否正确,可临时执行命令关闭tun接口校验和校验验证问题:ethtool -K tun0 rx off tx off - 检查VpnService的socket protect配置
确认原生库中用于物理网卡通信的socket已经调用VpnService的protect()方法,未做protect的 socket 会导致物理网卡的出站流量被再次路由到tun0形成环路,响应无法正常回传。 - 检查iptables拦截规则
执行iptables -L -n -v查看filter表INPUT、OUTPUT链,nat表POSTROUTING链是否存在拦截tun0入站流量的规则,重点关注tun0对应流量的包计数是否有丢弃记录。 - 验证应用UID路由匹配规则
你当前执行ip route get返回的uid为2000(shell用户),需确认测试用的终端应用、ping工具对应的UID是否已被加入tun0对应路由表的匹配规则中,未被VpnService允许的应用流量不会走tun接口,自然无法收到tun回写的响应。 - 链路抓包验证
执行tcpdump -i tun0 -vv抓包确认你write的响应包是否正常出现在tun0的入站方向,再抓lo接口包验证数据包是否被转发到上层应用。
内容的提问来源于stack exchange,提问作者nsim
相关产品推荐
相关产品推荐

