简介
今天突然发现我的网站获取不到真实的访客地址了,后面想了一下大概率是frp的原因,因为之前是可以获取的,最近才不行的,但是最近就只更新过frp,所以大概率是frp
后面就在各个论坛里面翻了一下,终于解决了
网络结构
先说说我的网络结构
我的网站服务器是在家里面的,没有ipv4的公网ip,是使用的内网穿透(frp)映射出去的
我在云服务器上装了一个nginx和一个frps,使用frps来进行内网穿透,使用nginx来进行反向代理和ssl证书
本地服务器的前面有一个openwrt软路由,frpc是在软路由上的
解决方法
Opnwrt设置
首选需要在软路由上的frpc上设置,需要打开Proxy-Protocol,版本可以选V2或者是V1
如果你的frpc不是我这种在软路由上可以ui界面配置的,是需要改配置文件的,那么就在frpc的配置文件里面加下面这个代码
proxy_protocol_version = v2
这个代码是加在http隧道或者是https隧道里面的,例如
# frpc.toml
transport.tls.enable = true # 从 v0.50.0版本开始,transport.tls.enable的默认值为 true
serverAddr = "x.x.x.x"
serverPort = 7000 # 公网服务端通信端口
auth.token = "public" # 令牌,与公网服务端保持一致
[[proxies]]
name = "web"
type = "http"
proxy_protocol_version = v2
localIP = "127.0.0.1"
localPort = 80
customDomains = ["www.smzzt.top"]
修改完成后保存
修改网站的nginx配置文件
这里需要修改的是网站的nginx的配置文件,就是家里面的服务器的nginx配置文件
第一处修改
需要在server字段的listen xx后面添加proxy_protocol
例如原本的是
server
{
listen 80;
listen 443 ssl http2;
listen [::]:443 ssl http2;
listen [::]:80;
......后面配置省略
}
修改后是
server
{
listen 80 proxy_protocol;
listen 443 ssl http2 proxy_protocol;
listen [::]:443 ssl http2;
listen [::]:80;
......后面配置省略
}
正常情况下只有下面这两行
listen 80;
listen 443 ssl http2;
但是我的多了下面这两行
listen [::]:443 ssl http2;
listen [::]:80;
多出来的这两行是IPV6的,我的网站开启了IPV6,所以多出来了这两行,这两行不用管
第二处修改
继续修改同一个nginx配置文件,在在server字段里最后添加下面代码
real_ip_header proxy_protocol;
real_ip_recursive on;
set_real_ip_from 192.168.99.1;
这上面的代码里面有192.168.99.1这个地址,这个地址是frpc所在的设备的地址,如果你的frpc是和网站在同一个设备中的话就改成127.0.0.1,如果网站和frpc不是同一个设备那么就改成frpc所在的设备的地址
完成
完成上面的改动后,重启服务器或者是重载nginx配置,之后就会发现可以获取到真实的访客地址了
用frp来进行内网穿透的时候,ftp不成功是怎么回事呢?(默认21端口)
其他的端口可以正常
看一下是不是端口占用之类的
应该没有,在局域网内可以访问
防火墙呢?看过没有
防火墙全关了,服务器端客户端的
21端口是ftp的,很多地方的运营商会关闭这个端口
好的,谢谢,我去看看
没事,不客气
我改了2121端口还是不行
这是报错
https://upyun.525866.xyz/temporarily/2.png
在浏览器是设置里关闭这个选项后报错会改变,但是还无法访问
https://upyun.525866.xyz/temporarily/1.png
https://upyun.525866.xyz/temporarily/3.png
ftp服务还有主动模式和被动模式,21端口只是其中一个端口,穿透的话还需要把其他端口传出来,但是frp服务我没使用,不是很了解,我感觉你可以看看一下这个帖子看看https://www.cnblogs.com/LiuChang-blog/p/11973797.html
或者是找那种可以设置指定端口的ftp软件,手动指定主动端口和被动端口,然后把所有端口穿透出去