华硕路由器导致离奇的智能家居设备掉线问题排查
把遇到的一次智能家居设备(我主要基本都是米家设备)离线的问题分析讲一下 因为不想写太长,所以涉及的名词请自行搜索了解……不作科普 解决方式 该问题应该普遍存在于ASUS包括刷了merlin固件的ASUS路由器 关闭“系统管理->开启 WAN 中断的浏览器导页通知”,可以完全避免触发该Bug 问题现象 有时从手机客户端发现智能设备离线,但从路由器管理界面能看到智能设备的WiFi正常链接,从同局域网内Ping该设备也正常 从路由器端使用tcpdump抓包,发现设备发送DNS请求解析域名,但路由器应答了10.0.0.1,导致设备后续的连接服务器均失败 问题原因 当使用路由器中的“开启 WAN 中断的浏览器导页通知”功能时,在 WAN 中断时(如每48小时重新拨号等),路由器内的firewall会修改iptables(代码地址:O网页链接),将所有的DNS请求REDIRECT到18018端口,wanduck监听18018,对所有DNS请求都应答10.0.0.1用于引导用户访问到路由器断网的提示页面(代码地址:O网页链接) 当 WAN 恢复时,上述iptables规则会被删除,按设计预期流量应正常通过路由器访问互联网,但可能程序猿忘了个事情…… REDIRECT涉及到conntrack,只需要一个链接的第一个包匹配iptables规则,接下来无论iptables规则如何变化,只要conntrack内的对应条目仍然有效,REDIRECT就会起效,而 wanduck 是一个持续运行的程序,即使 WAN 正常,只要有DNS请求发到18018端口,它就会应答,再加上智能家居设备因为连不上服务器会不断的发送DNS解析请求。而对于conntrack来说,它看到了智能设备的DNS请求,也看到了wanduck的DNS应答,那么它认为链接是活动状态REDIRECT则一直生效。 于是只要 WAN 中断时,有设备发送了DNS解析请求,wanduck应答了DNS解析,设备发现自己连不上真正的服务器于是不断的尝试重新解析,重复得到错误DNS应答,导致该REDIRECT关系永远不会过期移除,设备也就永远跳不出这个死循环了(其实只要此时两边有一方停下来一段时间,或者 WAN 恢复时谁来flush conntrack就好)