1
0
0

FRP将本地 AI API反代到公网

2026-09-28
2026-09-28
文章摘要
|

适用场景

适用于以下结构:

  • 本机运行 AI 服务(例如 Ollama、OpenAI 兼容 API 等)

  • AI 服务只监听 127.0.0.1

  • 有一台公网 VPS

  • 有一个解析到 VPS 的域名

  • 使用 FRP 建立内网穿透

  • 使用 Caddy 提供 HTTPS 和访问控制

最终访问方式:

外部 AI 客户端
        |
        | HTTPS :443
        v
公网 VPS Caddy
        |
        |
        | 127.0.0.1:18080
        v
公网 frps
        |
        | FRP 隧道 :7000
        |
        v
本地 frpc
        |
        | 127.0.0.1:8080
        v
本地 Caddy
        |
        | 127.0.0.1:11434
        v
本地 AI 服务

注意:必须拥有公网入口。

单独运行本地 FRP 客户端无法凭空获得公网访问地址,需要一台公网服务器运行 frps。


一、完整配置

以下配置是一套独立方案:

包含:

  • 公网服务器:

    • frps.toml

    • Caddyfile

  • 本地 AI 主机:

    • frpc.toml

    • Caddyfile.local

两端配置不能混用。


1. 公网服务器 frps 配置

# 公网服务器 frps 配置
# frps 0.59.0

bindAddr = "0.0.0.0"
bindPort = 7000

# FRP代理端口只绑定本机
proxyBindAddr = "127.0.0.1"

# FRP客户端认证
auth.method = "token"
auth.token = "REPLACE_WITH_SAME_LONG_RANDOM_FRP_TOKEN"

log.level = "info"
log.maxDays = 3

作用:

  • 7000

    • 给 frpc 连接


2. 本地 frpc 配置

# 本地AI电脑 frpc配置
# frpc 0.59.0

serverAddr = "YOUR_VPS_PUBLIC_IP_OR_DOMAIN"
serverPort = 7000

auth.method = "token"
auth.token = "REPLACE_WITH_SAME_LONG_RANDOM_FRP_TOKEN"

loginFailExit = false


[[proxies]]

name = "local-ai-api"
type = "tcp"

# 转发到本机Caddy
localIP = "127.0.0.1"
localPort = 8080

# VPS内部端口
remotePort = 18080

transport.useEncryption = true

3. 公网服务器 Caddy 配置

ai.example.com {
    # 转发到FRP
    reverse_proxy 127.0.0.1:18080
}

4. 本地 Caddy 配置

TARGET_HOST:TARGET_PORT 为本地可访问的AI服务的地址

window本地 caddy json 配置文件

{
    "apps": {
        "http": {
            "servers": {
                "proxy": {
                    "listen": [
                        ":8080"
                    ],
                    "routes": [
                        {
                            "handle": [
                                {
                                    "handler": "reverse_proxy",
                                    "upstreams": [
                                        {
                                            "dial": "TARGET_HOST:TARGET_PORT"
                                        }
                                    ],
                                    "headers": {
                                        "request": {
                                            "set": {
                                                "Host": [
                                                    "TARGET_HOST"
                                                ]
                                            }
                                        }
                                    },
                                    "transport": {
                                        "protocol": "http",
                                        "tls": {
                                            "insecure_skip_verify": true
                                        }
                                    }
                                }
                            ]
                        }
                    ]
                }
            }
        }
    }
}

Linux 本地Caddyfile 配置

:8080 {
    reverse_proxy TARGET_HOST:TARGET_PORT {

        header_up Host TARGET_HOST

        transport http {
            tls_insecure_skip_verify
        }
    }
}

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或者给予支持!

评论