以RTL 8197为例,直接在内核实现了dns劫持功能:即下挂设备如果请求的domain是匹配自定的domain,则dns封包直接返回br0的ip/ipv6地址给发送方。该功能目前被用于路由器自定义域名的解释
外部接口:
/proc/rtl_dnstrap/enable --启用禁用DNS劫持功能
/proc/rtl_dnstrap/domain_name --DNS劫持需要用到的匹配域名
内部实现:
主要实现部分在net bridge。当数据报文经过桥时br_handle_frame,在功能启用的情况下:
先校验是否是一个合法的dns query请求报文,如果是则取出域名比较,如果匹配,则在原有报文的基础上直接修改为dns response报文(改mac,改ip,改udp,改dns头部和dns正文)
注意以下几点需要特殊处理:
由于此时mac地址已经改变,需要跳过br_fdb_update表项的更新
由于此报文的源端口和目的端口是一样的,需要跳过should_deliver的检查
至于更底层的驱动层面处理(多数指加速相关),开启该功能后dns全部走slow path(标准linux内核协议栈)
HG DNS TRAP劫持功能简要了解
于 2022-08-13 18:36:57 首次发布