1Panel + FRP 内网穿透建站遇到的问题

前言:这两天我朋友打算迁移他的博客到内网。这我当然要推荐1Panel和Halo了。于是在我的强烈推荐下,我朋友入手了1Panel 和 Halo的专业版。由于我朋友使用的是FRP进行内网穿透,遇到了一点小问题找我帮忙解决,我顺便也记录一下。

1. 文章无法发布

这个小意思啦,WAF设置一下就好了。

2. 当部署到公网后,发现无法登录Halo控制台。

这里就求助我了,我看了一下登录请求,返回500. 提示未知错误。我心想,这不就是WAF的问题吗,于是又去帮他弄WAF规则,结果很显然 不行。不然也不会有这一条了。

具体步骤:

  1. 关闭WAF规则中的 SQL 注入 XSS防御 参数规则。无法登录
  2. 关闭当前网站的WAF功能。 无法登录
  3. 关闭WAF功能总开关。成功登录

你不会以为到这就结束了吧,我当然不甘心。到底是哪里出问题了呢。

于是我本地搭了环境开始测试,非常明显刚搭好用FRP完成穿透就无法登录了。

这次没有关闭WAF 直接去看网站日志。

发现请求全部都是127.0.0.1而不是我访问的真实IP 这个很正常 FRP 都这样。

看错误日志。果然让我找到了端倪看下面的报错

2024/04/29 00:20:54 [error] 853#853: *715034 lua entry thread aborted: runtime error: ./waf.lua:148: Expected value but found invalid token at character 1
stack traceback:
coroutine 0:
	[C]: in function 'decode'
	./waf.lua:148: in function 'waf_api'
	./waf.lua:172: in main chunk, client: 127.0.0.1, server: halo.broue.cn, request: "POST /login HTTP/1.1", host: "halo.broue.cn", referrer: "https://halo.broue.cn/console/login?login-type=password"

很明显 报错还是WAF的问题。最近1Panel刚发布专业版 问题还是蛮多的。

到这里问题就结束了该去给1Panel提issues了。
当然 还有一种解决方案。这个就刚好涉及到上面提到的一个问题了。那就是如何获取用户真实ip
不能打开日志一瞧全部都是127.0.0.1吧。

3. FRP内网穿透获取用户真实IP

解决方案。
OpenResty配置文件中的 http 块添加下面两行,这个是获取CDN真实IP的方法。到这里也是同样的。
这两行代码是Nginx配置中的两个指令,用于获取用户的真实IP地址。

set_real_ip_from 0.0.0.0/0;
real_ip_header X-Forwarded-For;
  1. set_real_ip_from 0.0.0.0/0;:这个指令设置了允许从哪些IP地址范围获取真实IP。在这里,0.0.0.0/0表示允许从任何IP地址获取真实IP。实际上,这个值可以根据实际情况进行修改,例如只允许从本地局域网内的IP地址获取真实IP。
  2. real_ip_header X-Forwarded-For;:这个指令指定了从哪个HTTP头部字段获取真实IP。在这里,X-Forwarded-For是一个常见的头部字段,用于表示客户端的真实IP地址。当客户端通过代理服务器访问时,代理服务器会在请求头中添加一个名为X-Forwarded-For的字段,其中包含了客户端的真实IP地址。因此,通过设置这个指令,Nginx可以从X-Forwarded-For头部字段中获取到用户的真实IP。

Clip_2024-04-29_00-51-56.png

Clip_2024-04-29_00-52-27.png

Clip_2024-04-29_00-53-22.png

按照上面的配置后。服务器就可以获取到客户端的真实IP了。当然 X-Forwarded-For是可以伪造的,针对一些场景需要做其他的方式来获取用户真实ip 这里不做讨论。

很巧的是 这样配置后 上面遇到的无法登录的问题也解决了