摘要
解释Captive Portal是什么、为什么连上WiFi后会自动弹出认证页面。同时,说明主流操作系统的支持情况。
Captive Portal
中文通常译作“强制主页”或“强制登录门户”。是一个登录Web页面,通常由网络运营商或网关在用户能够正常访问互联网之前拦截用户的请求并将一个强制登录或认证主页呈现(通常是通过浏览器)给用户。该页面可能要求用户输入认证信息、支付、接受某些条款或者其他用户授权等,随后用户才能被授权访问互联网。该技术广泛用于移动和个人宽带服务,包括有线电视、商业WiFi、家庭热点等,也可用于访问企业和住宅区有线网络。
实现策略
实现Captive Portal的方法有很多,常见的几种方式有:
- DNS拦截:拦截所有DNS请求且返回认证主机IP地址(设置了强制主页),这样用户访问任何网站都会看到同一个强制主页。
- HTTP重定向:利用HTTP重定向功能将所有的HTTP请求重定向到认证主机,如此一来,用户的发出的任何HTTP请求都会得到重定向后的强制主页。当用户通过认证后,便不再重定向用户请求。
- IP跳转:把所有IP包里的目标地址改为认证主机地址,在认证主机上进行404跳转,当然是跳转到强制主页了。
- 内核层劫持:当网关收到一个访问外网地址(80端口)的TCP SYN请求包后,立即伪造一个来自外网地址的TCP ACK包。客户端收到此伪造的响应后会误认为外网主机可以连接便再次发送ACK,此时TCP握手成功。客户端发起请求,网关再次劫持后回应ACK+PUSH包,其中就包含强制主页。
连接WiFi后自动弹出认证页面
单单网关实现了Captive Portal还不够,还不能自动弹出认证页面。需要操作系统支持才能实现在网络连接后主动弹出认证页面的功能。本人对iOS、Android、macOS以及Windows的测试结果如下:
- iOS从3.0开始支持,主动弹出窗口显示认证页面(非浏览器窗口)。
- Android从4.0以上开始支持,主动弹出窗口显示认证页面(非浏览器窗口)。
- macOS(OS X EI Capitan)支持,主动弹出窗口显示认证页面(非浏览器窗口)。
- Windows 7也支持。但并不是主动弹出认证页面,而是在网络图标上显示消息,提示打开浏览器。然后你需要随便访问一个页面(例如:
http://www.163.com
)即可在浏览器上显示认证页面。
一种简单的基于HTTP重定向的Captive Portal实现
当网关收到来自客户端的HTTP请求,例如:
GET http://www.example.com/
网关可以返回如下内容给客户端:
<meta HTTP-EQUIV='REFRESH' content='0; url=http://<your auth server ip>/login'>
浏览器或操作系统会重新加载url页面内容(就是认证页面)。