Android强制门户检查

时间:2014-06-11 15:37:58

标签: android linux nginx

我们在Linux机器上配置了自己的强制网络门户(nginx + iptables + hostapd)。所以现在我们正在测试它。

配置Nginx,以便来自移动客户端(实际上不是127.0.0.1)的任何请求都将重定向到特定页面。没有互联网访问或登录等。每个80端口的所有请求仅指定页面。

iptables -t nat -A PREROUTING -p tcp ! -d 192.168.198.1 --dport 80 -j REDIRECT --to-port 80

和nginx

if ($remote_addr != 127.0.0.1)
set $mobile_rewrite perform; }

if ($request_uri !~* "/designer/upload.php")
set $url A; }

if ($mobile_rewrite = "perform") {
set $url "${url}B"; }

if ($request_uri !~* (\.js|\.css|\.gif|\.png|php)$) {
set $url "${url}C"; }

if ($request_uri !~* "/designer/ajax.php*") {
set $url "${url}D"; }

if ($url = "ABCD") {
rewrite ^(.*)$ /designer/upload.php redirect; }

Ajax.php和js | css | gif | png | php需要上传工具。

所以现在当热点启动并从iPhone连接到wifi时,它的工作就像一个魅力。浏览器打开窗口并重定向到上传工具。

如果我尝试与Android三星TAB3 Android 4.1.2一样,没有浏览器窗口弹出,我们需要手动打开任何页面。只有在这些步骤之后,才会显示上传页面。

来自nginx的一些日志

192.168.198.11 - - [11/Jun/2014:08:19:38 +0000] "HEAD / HTTP/1.1" 302 0 "-" "Mozilla/5.0 (Linux; Android 4.1.2; SM-T210 Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36"
192.168.198.11 - - [11/Jun/2014:08:19:38 +0000] "HEAD / HTTP/1.1" 302 0 "-" "Mozilla/5.0 (Linux; Android 4.1.2; SM-T210 Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36"
192.168.198.11 - - [11/Jun/2014:08:19:38 +0000] "HEAD / HTTP/1.1" 302 0 "-" "Mozilla/5.0 (Linux; Android 4.1.2; SM-T210 Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36"
192.168.198.11 - - [11/Jun/2014:08:19:38 +0000] "HEAD /designer/upload.php HTTP/1.1" 200 0 "-" "Mozilla/5.0 (Linux; Android 4.1.2; SM-T210 Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36"
192.168.198.11 - - [11/Jun/2014:08:19:38 +0000] "HEAD /designer/upload.php HTTP/1.1" 200 0 "-" "Mozilla/5.0 (Linux; Android 4.1.2; SM-T210 Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36"
192.168.198.11 - - [11/Jun/2014:08:19:38 +0000] "HEAD /designer/upload.php HTTP/1.1" 200 0 "-" "Mozilla/5.0 (Linux; Android 4.1.2; SM-T210 Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36"
192.168.198.11 - - [11/Jun/2014:08:19:39 +0000] "GET /generate_204 HTTP/1.1" 302 160 "-" "Dalvik/1.6.0 (Linux; U; Android 4.1.2; SM-T210 Build/JZO54K)"
192.168.198.11 - - [11/Jun/2014:08:19:53 +0000] "GET / HTTP/1.1" 302 160 "-" "Mozilla/5.0 (Linux; Android 4.1.2; SM-T210 Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36"
192.168.198.11 - - [11/Jun/2014:08:19:53 +0000] "GET /designer/upload.php HTTP/1.1" 200 843 "-" "Mozilla/5.0 (Linux; Android 4.1.2; SM-T210 Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.141 Safari/537.36"

所以在日志中我看到页面/ generate_204不是第一个打开的。 iPhone首先检查wispr的successs.html并出现弹出窗口。但Android没有这样做。

那么我们有没有机会像iPhone那样让android工作?

1 个答案:

答案 0 :(得分:0)

回答一个老问题,但我遇到了一个非常类似的问题。

有一个没有互联网连接的Linux机器人运行nginx,在ap模式下运行wpa_supplicant(模式= 2),iptables和dnsmasq。

Iphone在连接到盒子的WiFi AP后立即自动检测并显示Captive Portal。但是,运行Android 4/5的三星手机无法做到这一点。

经过一番调查,我认为 Android希望 clients3.google.com 解析为公共IP地址,即A,B,C类私有IP地址范围之外。

所以我做了以下事情:

1)配置dnsmasq以将到达wlan0端口的所有DNS请求解析为随机选择的公共IP地址(例如A.B.C.D)。所以在/etc/dnsmasq.conf中,设置:

address=/#/A.B.C.D

2)创建了几个iptables规则,将到达wlan0端口的所有HTTP数据包的目的IP地址转换为接口的IP地址192.168.1.1:

iptables -t nat -L PREROUTING -i wlan0 -p tcp -dport 80 -j DNAT --to-destination 192.168.1.1
iptables -t nat -L POSTROUTING -i wlan0 -j MASQUERADE

然后,Android手机会自动检测并在浏览器弹出窗口中显示强制网络门户。

希望这有帮助。