处理360路由器不能通过代理在外网访问的问题

处理360路由器不能通过代理在外网访问的问题

朱治龙
2023-06-29 / 0 评论 / 160 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2023年06月29日,已超过304天没有更新,若内容或图片失效,请留言反馈。

缘起

2020年的时候,感觉家里的路由实在是太慢了,正好360新出的360WiFi6全屋路由 天穹 V6 路由感觉还蛮不错,就入手了。
ljfugkpo.png

使用至今整体还算稳定,功能也能满足大部分使用场景,而且系统自带「自定义hosts」功能,在内网想要使用域名访问部署的服务也就方便多了,虽说不支持泛域名解析,一个一个配有些繁琐,但好歹也省去另外部署DNS的繁琐操作了。

只是官方自带的 app 在功能上有不少阉割,像「功能扩展」下的大部分功能就只能通过PC 网页端访问。今年618屯了台配置还不错的迷你主机,准备放在家里长期开机做内网开发服务器用。当然作为一个程序员长期开机的机器,内网穿透肯定是要部署的。

上下求索

所有准备工作就绪后,想着方便随时配置路由,便把路由通过内网穿透在外网可以随时远程访问。配置好FRPnginx代理后,登录页面可以正常访问,但是登录后,跳转到主界面,闪一下便又回到登录界面了。问题既然出了,先看看有没有碰到同样问题的小伙伴。
便通过360路由官方的社区链接,看看有没有用户反馈相同的问题,于是找到下面这几个反馈同类问题的帖子:

看了一圈,始终没有一个能解决问题的答复,而且看一些标注为「产品答疑师」的回复都不能解决实际反馈的问题,看来是时候施展混迹IT圈多年所学的三脚猫功夫啦。毕竟原理上都是HTTP访问,浏览器发起的HTTP请求只要跟内网请求头信息一致,理论上都是可行的。

开始折腾

于是通过nginx 代理的地址,真发现如下问题:
登录后,发起了「GET /router/get_router_device_capability.cgi」ajax 请求,但是,该接口响应的是302,又重定向到/login.htm登录页面。初步以为是后端对 Host 或 Referer这些头信息做了校验,遂配置nginx相关头信息:

  proxy_set_header Host http://192.168.0.1;
  proxy_set_header Referer http://192.168.0.1/login_pc.htm;

重启 nginx 再次访问,发现问题依旧。进一步发现请求头中有一个token_id的头信息,值为 undefined,根据 token_id 字符串搜了下网页代码,发现从url获取参数存在问题:
ljfviv0v.png
该导致了请求的时候根本没获取到用户认证所需的 token_id,导致请求失败。进一步深挖,发现头信息中的 Cookie 是存在 token_id 的:

ljfvp9h7.png
这样的话,是不是可以考虑nginx代理的时候,从Cookie中获取token_id然后设置一个 名为token_id的头请求后端呢?说干就干,一翻摸索后,在nginx配置信息中加入如下信息:

set $TOKEN_ID "";
if ($http_cookie ~* "token_id=(.+?)(?=;|$)") {
    set $TOKEN_ID "$1";
}
proxy_set_header token_id "$TOKEN_ID";

完整nginx虚拟主机配置信息如下:

server {
        listen        80;
        server_name  router.home.zhuzhilong.cn;
        location / {
            proxy_set_header Referer http://192.168.0.1/login_pc.htm;
            proxy_pass http://192.168.0.1;
            set $TOKEN_ID "";
            if ($http_cookie ~* "token_id=(.+?)(?=;|$)") {
                set $TOKEN_ID "$1";
            }
            proxy_set_header token_id "$TOKEN_ID";
        }
}

重启路由器,验证成功!!

圆满收场

最终实现后的效果录屏如下:

0

评论 (0)

取消