前面讲过 frp配置与使用——Web 服务,在实际应用中使用 https -> https 模式转发数据会更安全一点。
一、架构图如下:
flowchart TD
A[客户端] -->|通过Https访问|B[公网frps服务器,监听443]
B-->|TCP 隧道转发|C[内网frpc(type=https)]
C-->D[后端Nginx(HTTPS验证)]
D-->E[内部 HTTP 应用]
二、分析
frp的https类型是TCP层转发,不解析HTTP内容,所以,没法通过 注入 X-Forwarded-For 方法来实现访问IP的传递。所以,我们可以添加PROXY协议,这时会在TCP连接建立时,在数据前面附加一行PROXY协议头,包含源IP和端口。
三、配置
frpc配置
# https->https 模式, 直接转发,可以不加载ssl证书
[[proxies]]
name = "https2https"
type = "https"
localIP = "127.0.0.1"
localPort = 443
customDomains = ["https2https.yourdomain.com"]
# 启用 proxy protocol v2
transport.proxyProtocolVersion = "v2"
后端Nginx配置
server {
# 注意:listen 必须加上 proxy_protocol
listen 443 ssl proxy_protocol;
# 告诉 Nginx:来自 frp 的连接才可信(通常是 127.0.0.1 或内网 IP)
set_real_ip_from 127.0.0.1; # 如果 frpc 和 Nginx 同机
# 或 set_real_ip_from 192.168.1.0/24; # 如果跨内网机器
real_ip_header proxy_protocol;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/privkey.pem;
# 转发配置
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header X-Real-IP $remote_addr; # 现在 $remote_addr 是真实 IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
}
}
评论区