声明: 请理解文件命令再操作,风险需自己承担;
总结
- 版本: fnos v1.1.23
- 功能: 对通过fnconnect的三级域名(如xxx.fnos.net)的请求校验
- 缺陷: 域名情况下只能在网页端访问, 手机APP用不了
- 补充:
- 对通过fnconnect的四级域名(如yyy.xxx.fnos.net)的请求不校验, 目前我了解的是这类请求都需要先登录三级域名, 比如docker的端口映射项目;
- 可能会出现fnconnect无法开启或域名访问提示服务不可用, 多试几次;
- 局域网的网页和APP通过IPV4访问不受影响, 但是如果经过[::1]:5666,那么会受到影响;
- 请求过程:
- 调整前:
浏览器->fn服务器->本机的pxy程序->[::1]:5666(nginx)
- 调整后:
浏览器->fn服务器->本机的pxy程序->(目标端口被iptables更改)->[::1]:6010(nginx)->(nginx检查header)->127.0.0.1:5666(nginx)
- 效果图

分析
# 先用域名访问一下, 然后执行
sudo lsof -i :5666 -n
# 输出如下,可以观察到建立的连接
pxy [::1]xxxxx <> [::1]:5666
# 如果你的输出的目标地址不是[::1]:5666,那么本文只能提供参考,不能直接使用
sudo tcpdump -i lo -s 0 -w b.pcap host ::1 and port 5666
curl -v -H "Cookie: mode=relay" https://更换为你的域名/static/app/icons/trim.file-manager/icon.png
实现
mkdir -p /vol1/1000/App/nginx-pxy
cd /vol1/1000/App/nginx-pxy
echo 'no token? no page!' > no_token.html
chmod o+r no_token.html
touch default.conf
- 登录网页版,在我的文件下找到default.conf, 用文本编辑器打开,填入下面的内容
server {
listen [::1]:6010; # pxy程序用
listen 6011; # 本地调试用,后期可删除
# 修改这个配置值,不能被别人知道
set $v_my_token_value "a8f09a95";
set $v_302_prefix "/";
if ($http_x_forwarded_host){
set $v_302_prefix https://$http_x_forwarded_host;
}
# my_token_page这个地址也要修改,不能被别人知道
location = /my_token_page {
add_header Set-Cookie "x_my_token=$v_my_token_value; Path=/; Max-Age=3600; SameSite=Strict; HttpOnly";
return 302 $v_302_prefix;
}
location = /no_token.html{
alias /etc/nginx/conf.d/no_token.html;
}
location / {
if ($cookie_x_my_token != $v_my_token_value) {
add_header Set-Cookie "mode=relay; Path=/; HttpOnly";
return 302 $v_302_prefix/no_token.html;
}
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://127.0.0.1:5666;
}
}
-
拉取最新的nginx的docker镜像
-
创建nginx容器
- 端口设置: 删除预设的80端口映射
- 存储位置: /vol1/1000/App/nginx-pxy 映射到 /etc/nginx/conf.d
- 网络: 选host,不选bridge
-
启动nginx容器
-
先局域网访问6011端口,验证代理是否正常,校验是否生效
- chrome打开一个访客/隐私窗口, 访问 设备IP:6011
- 修改地址,访问 设备IP:6011/my_token_page (my_token_page替换为前面修改后的值)
-
关键, 最好在局域网操作,可能会丢失连接,移花接木,将pxy流量重定向到新建nginx的6010端口
ip6tables -t nat -I OUTPUT 1 -p tcp --dport 5666 -d ::1 -j DNAT --to-destination [::1]:6010
-
通过域名访问验证效果
-
记得修改 v_my_token_value的值 和 my_token_page这个字符串 , 只能你自己知道
-
对于有WAF的人来说,只需最后一个命令, nginx的就不用了