以RTL 8197为例,直接在内核实现了HTTP REDIRECT重定向功能:当下挂设备部在白名单范围内,则直接返回门户页面给用户。该功能可以被用于路由器用户上网认证需求的实现
主要外部接口:
/proc/http_redirect/enable 启用禁用
/proc/http_redirect/CaptivePortalURL TR98版本门户URL设定
/proc/http_redirect/AllowedList TR98版本允许列表不被强制门户:IP列表
/proc/http_redirect/url 非TR98版本门户URL设定
/proc/http_redirect/client_list 非TR98版本允许列表不被强制门户:mac列表
/proc/http_redirect/max_idle_time 非TR98版本允许列表成员超时时间:超过指定时间会被删除(配合外部功能实现为超时重新认证)
内部实现:
与DNS TRAP功能类似,主要实现部分在net bridge。当数据报文经过桥时br_handle_frame,在功能启用的情况下:
先检查是否为一个合法的http get请求,如果时则匹配是否不在白名单范围内,再检查当前的请求是否就是强制门户页面(子页通过url字段或host字段检测,目前没有用到refer字段) --refer字段在此主要用于级联信任,但当前的网络这种级联信任不太可靠,也与本身请求的页面相差太远
如果上述都是匹配的,在send_redirect中还做了路由安全检查,这样可以避免网络不通的情况下推送门户
接下来则是封装回报:
在原有报文的基础上copy一个新报文进行修改(data部分和newskb结构体)后发送
修改原有报文为rst报文,断开之前的连接 --这点较为重要