公众号旧文

为什么连公共 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 通常:

  1. 放行 DNS
  2. 放行认证服务器
  3. 拦截 HTTP
  4. 对 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 都能做到统一弹登录页。