公众号旧文
为什么连公共 WiFi 会自动弹出认证页面?
上一篇文章中提到,这机制叫:Captive Portal(强制门户)
本文再详细的说一下 Captive Portal(强制门户)的核心机制:
用户连上 WiFi → DHCP 获得 IP → 访问任意 HTTP 网站 → 网关发现未认证 → 返回 302 → 跳转登录页面 → 用户认证 → 放行
以 Windows 的检测流程为例:
1. Windows 连上 WiFi
首先:
DHCP Discover
↓
DHCP Offer
↓
获得:IP地址、网关、DNS服务器
例如:
IP: 192.168.1.100
Gateway: 192.168.1.1
DNS: 192.168.1.1
此时 Windows 还不知道这个网络能不能上网。
2. Windows 发起探测
Windows 会访问:
http://www.msftconnecttest.com/connecttest.txt
正常情况下服务器返回:
HTTP/1.1 200 OK
Microsoft Connect Test
Windows 判断:网络正常
3. 公共 WiFi 怎么做?
比如酒店,当网关看到:
源IP:
192.168.1.100
目标:
www.msftconnecttest.com
状态:
用户未认证
于是酒店网关,不让请求出去。
而是伪造一个 HTTP 响应:
HTTP/1.1 302 Found
Location:
https://hotel-login.com
浏览器收到:
访问 msftconnecttest.com
|
↓
302
|
↓
hotel-login.com
4. Windows 看到什么?
Windows 网络检测服务(NCSI)请求:
http://www.msftconnecttest.com/connecttest.txt
收到:
302 Redirect
但是它期待:
200 OK
Microsoft Connect Test
所以判断:
Internet = 不可用
网络存在认证门户
然后就显示:需要登录
那是不是 DNS 劫持?
可能,但不是必须。
Captive Portal 有几种实现方式:
方法1:HTTP透明代理
例如:
用户
|
|
WiFi AP
|
|
网关
|
|
HTTP拦截模块
|
|
302跳转
只针对:
TCP 80
HTTP
方法2:DNS劫持
例如用户访问:
www.baidu.com
DNS返回:
hotel-login.com IP
于是:
www.baidu.com
|
↓
酒店登录页
但是这种现在越来越少,因为 HTTPS 会暴露问题。
方法3:防火墙策略
例如 iptables:
iptables -t nat -A PREROUTING \
-p tcp \
--dport 80 \
-j DNAT \
--to 192.168.1.1:8080
意思是所有 HTTP 请求:
目标80端口
全部送到:
认证服务器
HTTPS怎么办?
比如用户访问:
https://google.com
不能简单302,因为TLS握手发生在HTTP之前。
流程:
客户端
|
TLS ClientHello
|
google.com
|
服务器证书
网关不能伪造 google.com 证书。
所以现在 Captive Portal 通常:
- 放行 DNS
- 放行认证服务器
- 拦截 HTTP
- 对 HTTPS 使用系统检测机制诱导用户打开登录页
公共 WiFi 本质上就是用户身份状态机
类似:
UNAUTHENTICATED
|
|
访问网络
|
↓
REDIRECT_LOGIN
|
|
提交账号密码
|
↓
AUTHENTICATED
|
|
放行公网
网关里面维护:
MAC地址
IP地址
认证状态
过期时间
例如:
AA:BB:CC:DD:EE:FF
IP:192.168.10.23
状态:已认证
有效期:24小时
所以是不是在 WiFi 层面做了劫持?
答案:
不是 WiFi 无线层劫持,而是在 WiFi 接入后的二层/三层网关位置,通过 DNS、HTTP透明代理、防火墙NAT等方式实现强制门户。
如果画网络拓扑,就是:
手机/电脑
|
| WiFi
|
AP无线接入点
|
|
认证网关 ← 核心位置
|
|
Internet
真正动手脚的地方,是这个认证网关。
这也是为什么酒店、机场、商场 WiFi 都能做到统一弹登录页。