记录一些常用的函数和瞎折腾的过程……

使用frp内网穿透时获取用户的真实ip

我在docker环境下安装好了frp内网穿透服务,访问内网中的网站,但我查看nginx的日志时,发现记录的ip全是内网ip,没有获取到真实的访问ip。

查了一下frp文档,文档中简单的说了下,需要在frpc.ini配置文件中 ,需要增加一行 proxy_protocol_version = v2,便可以开启记录真实ip的功能。

在frpc.ini中修改如下:

[https web]
type = https
local_port = 443
custom_domains = onet.yourdomain.com
# 目前支持 v1 和 v2 两个版本的 proxy protocol 协议。
proxy_protocol_version = v2

以为万事大吉,重启frp,结果网站直接打不开了,建立连接失败,总感觉哪里少了些配置,网上翻了一遍,发现在nginx中还需要添加配置。

我的nginx也是docker跑起来的服务,在listen段添加proxy_protocol,然后配置real_IP_header为 proxy_protocol,具体如下:

server {
  listen 443 ssl http2 proxy_protocol;
  real_ip_header proxy_protocol;
  real_ip_recursive on;
  set_real_ip_from 172.18.0.1;
  ……
}

其中set_real_ip_from的ip为frp客户端的内网IP,我填写的是docker桥接网络的网关地址。

好了,保存nginx的网站配置文件后,重启Nginx,再查看nginx的日志,就已经可以获取用户的真实IP地址了。

更新2024年11月14日:

目前在frp0.6版本中,仅做如下修改即可在nginx的日志中显示真实ip:

在对应的server{}段里添加“real_ip_header X-Forwarded-For;set_real_ip_from 127.0.0.1; ”具体如下 :

server
{
    listen 8002;
    real_ip_header X-Forwarded-For;
    set_real_ip_from 127.0.0.1;  # 允许任何 IP 段传递真实 IP  	
    server_name localhost;
    index index.html index.htm index.php;
    root D:/AIO/web/AriaNg;

重启nginx,即可看到日志里已经是真实ip而不全都是127.0.0.1了

具体的frp0.6配置为,其中“requestHeaders.set.x-from-where”必须,它等同于“header_x_forwarded_for = true”:

[[proxies]]
name = "Box"
type = "https"
subdomain = "home"
[proxies.plugin]
type = "https2http"
localAddr = "127.0.0.1:8001"
crtPath = "./certs/fullchain.cer"
keyPath = "./certs/domain.com.key"
hostHeaderRewrite = "127.0.0.1"
requestHeaders.set.x-from-where = "frp"