frp内网穿透安装及配置

frp内网穿透安装及配置

下载安装包

frp-release

本次的演示环境为:

服务端:Alibaba Cloud Linux

客户端:Windows 11 x86_64

配置

服务端 frps.toml

# frps.toml
bindAddr = "0.0.0.0"  # 服务端绑定的 IP 地址,0.0.0.0 表示监听所有网络接口
bindPort = 7000       # 服务端监听的 TCP 端口,客户端通过此端口连接
kcpBindPort = 7000    # 服务端监听的 KCP 端口,用于加速连接
vhostHTTPPort = 8080  # 服务端监听的 HTTP 端口,用于支持虚拟主机功能
subdomainHost = "baizesz.com"  # 虚拟主机的域名后缀,客户端可以通过子域名访问服务
userConnTimeout = 60  # 用户连接超时时间(单位:秒),客户端在指定时间内未完成连接则会被断开

auth.method = "token"  # 鉴权方法,此处使用 token 方式进行身份验证
auth.token = "123456"  # 鉴权 token,客户端需要使用此 token 才能连接到服务端

webServer.addr = "0.0.0.0"  # Web 服务器的绑定地址,0.0.0.0 表示监听所有网络接口
webServer.port = 7500       # Web 服务器的监听端口,用于访问 Web 管理界面
webServer.user = "admin"    # Web 管理界面的用户名
webServer.password = "admin"  # Web 管理界面的密码

#log.to="./frps.log"  # 日志输出路径,注释掉表示不启用文件日志输出
log.level = "trace"   # 日志级别,trace 表示记录所有日志信息,包括调试信息
log.maxDays = 3       # 日志文件保留的最大天数

#allowPorts = [  # 允许客户端使用的端口范围,注释掉表示不限制端口
#    { start = 6000, end = 7000 },
#]

客户端 frpc.toml

serverAddr = "120.24.191.53"  # 服务端的 IP 地址,客户端连接的目标地址
serverPort = 7000             # 服务端的监听端口,客户端通过此端口连接服务端
loginFailExit = true          # 登录失败时是否退出客户端,true 表示登录失败则退出

#log.to = "./frpc.log"        # 日志输出路径,注释掉表示不启用文件日志输出
log.level = "trace"           # 日志级别,trace 表示记录所有日志信息,包括调试信息
log.maxDays = 3               # 日志文件保留的最大天数

auth.method = "token"         # 鉴权方法,此处使用 token 方式进行身份验证
auth.token = "123456"  # 鉴权 token,客户端需要使用此 token 才能连接到服务端

transport.dialServerTimeout = 60  # 连接服务端的超时时间(单位:秒)

webServer.addr = "127.0.0.1"  # Web 服务器的绑定地址,仅监听本地访问
webServer.port = 7400          # Web 服务器的监听端口,用于访问 Web 管理界面
webServer.user = "admin"       # Web 管理界面的用户名
webServer.password = "admin"   # Web 管理界面的密码

# 定义代理服务,用于将本地服务暴露到公网
[[proxies]]
name = "django"               # 代理服务的名称
type = "http"                 # 代理类型,此处为 HTTP 代理
localIP = "127.0.0.1"         # 本地服务的 IP 地址
localPort = 8000              # 本地服务的端口
subdomain = "api"             # 子域名,通过 <subdomain>.<subdomainHost> 访问服务

[[proxies]]
name = "webui"                # 另一个代理服务的名称
type = "http"                 # 代理类型,此处为 HTTP 代理
localIP = "127.0.0.1"         # 本地服务的 IP 地址
localPort = 7860              # 本地服务的端口
subdomain = "webui"           # 子域名,通过 <subdomain>.<subdomainHost> 访问服务

子域名映射

就是设置公网DNS的解析,这里以阿里云的域名为例

操作路径:公网DNS解析 >> 权威域名解析 >> 解析设置 >> 添加记录

如果 frpc.toml 文件中配置了多个子域,则一个个依次添加

记录类型:A

主机记录:api.baizesz.com // 添加api这个子域

记录值:填写你服务器的ip地址

其它使用默认值就行

防火墙设置

云服务器端口授权

在阿里云服务器控制台 >> 安全组 >> 入方向 >> 添加对应的规则 》协议类型 tcp, 端口填上上面frps.toml配置文件中所有的商品号,源选择所有IPv4(0.0.0.0/0)

系统防火墙设置

若在云服务器端口授权后,使用下面命令无法连通,则需要设置云服务系统的防火墙端口放行

测试端口连通性:

# 改成云服务器的 ip 以及端口号
telnet 120.24.191.53 8080
# 或者用下面这个命令
Test-NetConnection -ComputerName 120.24.191.53 -Port 7500

如果能连通,则不需要设置,否则按下面命令在服务器端进行设置

# 查看所有允许的端口
sudo firewall-cmd --list-all
# 添加一个7400端口
sudo firewall-cmd --add-port=7400/tcp --permanent
# 刷新防火墙配置
sudo firewall-cmd --reload

启动

服务端

cd xxx/frps_path/ # 进入 frps 的目录
./frps -c ./frps.toml # 用frps.toml 文件配置启动 frps

启动成功就可以看到下信息(根据你映射的端口不一样,信息会有差别)

# ./frps -c ./frps.toml
2025-01-22 21:22:37.390 [I] [frps/root.go:105] frps uses config file: ./frps.toml
2025-01-22 21:22:37.646 [I] [server/service.go:237] frps tcp listen on 0.0.0.0:7000
2025-01-22 21:22:37.646 [I] [server/service.go:246] frps kcp listen on udp 0.0.0.0:7000
2025-01-22 21:22:37.646 [I] [server/service.go:305] http service listen on 0.0.0.0:8080
2025-01-22 21:22:37.646 [I] [frps/root.go:114] frps started successfully
2025-01-22 21:22:37.646 [I] [server/service.go:351] dashboard listen on 0.0.0.0:7500

客户端

cd xxx/frpc_path/ # 进入 frps 的目录
./frpc -c ./frpc.toml # 用frps.toml 文件配置启动 frps

启动成功就可以看到下信息(根据你映射的端口不一样,信息会有差别)

# .\frpc.exe -c .\frpc.toml
2025-01-22 21:25:30.085 [I] [sub/root.go:142] start frpc service for config file [.\frpc.toml]
2025-01-22 21:25:30.089 [I] [client/service.go:295] try to connect to server...
2025-01-22 21:25:30.089 [I] [client/service.go:174] admin server listen on 127.0.0.1:7400
2025-01-22 21:25:30.121 [I] [client/service.go:287] [9adf4570a2ac6630] login to server success, get run id [9adf4570a2ac6630]
2025-01-22 21:25:30.121 [I] [proxy/proxy_manager.go:173] [9adf4570a2ac6630] proxy added: [django webui]
2025-01-22 21:25:30.121 [T] [proxy/proxy_wrapper.go:200] [9adf4570a2ac6630] [webui] change status from [new] to [wait start]
2025-01-22 21:25:30.121 [T] [proxy/proxy_wrapper.go:200] [9adf4570a2ac6630] [django] change status from [new] to [wait start]
2025-01-22 21:25:30.131 [I] [client/control.go:168] [9adf4570a2ac6630] [webui] start proxy success
2025-01-22 21:25:30.131 [I] [client/control.go:168] [9adf4570a2ac6630] [django] start proxy success

防火墙设置

以下是详细步骤指导如何在Windows防火墙中允许frp客户端(frpc.exe)及本地服务端口通过防火墙,确保内网穿透正常工作:

允许frpc.exe通过防火墙
  • 打开Windows Defender 防火墙

    • 按下 Win + S,输入 防火墙,选择 Windows Defender 防火墙 > 高级安全
  • 创建入站规则

    • 右侧点击 入站规则 > 新建规则...

    • 规则类型:选择 程序 > 下一步。

    • 程序路径:点击 浏览,找到 frpc.exe 的路径(如 D:\Baizesz\frp\frpc.exe)> 下一步。

    • 操作:选择 允许连接 > 下一步。

    • 配置文件:勾选 专用公用(全选)> 下一步。

    • 名称:输入规则名称,如 允许frpc客户端 > 完成。

  • 创建出站规则(可选,通常frpc需主动连接服务器)

  • 重复上述步骤,在 出站规则 中为 frpc.exe 创建允许规则。
允许本地服务端口通过防火墙

如果本地服务(如Ollama的11434端口、ComfyUI的8188端口)被防火墙阻止,需单独放行:

  • 打开高级安全防火墙

    • 同上,进入 入站规则 > 新建规则
  • 放行指定端口

    • 规则类型:选择 端口 > 下一步。

      • 协议和端口:
        • 选择 TCP,输入 特定本地端口(如 11434,8188,多个用逗号分隔)> 下一步。
    • 操作:选择 允许连接 > 下一步。

    • 配置文件:勾选 专用公用 > 下一步。

    • 名称:输入规则名称,如 允许本地服务端口 > 完成。

验证防火墙是否放行

测试本地服务访问

  • 在浏览器访问 http://localhost:11434(Ollama)和 http://localhost:8188(ComfyUI),确认服务正常响应。

使用Telnet测试端口连通性

  • 打开命令提示符(cmd),执行:

    telnet 127.0.0.1 11434
    telnet 127.0.0.1 8188
    
  • 若显示空白窗口或连接成功,表示端口已放行;若失败,检查防火墙规则是否启用。

查看连接状态

刚才已经配置了 frp 的 web 服务,打开下页链接就可以查看连接状态

http://120.24.191.53:7500

验证连接

在网页中打开刚才我拉映射的两个 http 端口

没有配出的话是能正常访问的,更多属性配置查看官网,另外配置文件的写法,其实有两种,下面以 webServer 举例:

写法一:

webServer.addr = "127.0.0.1"   # Web 服务器的绑定地址,仅监听本地访问
webServer.port = 7400          # Web 服务器的监听端口,用于访问 Web 管理界面
webServer.user = "admin"       # Web 管理界面的用户名
webServer.password = "admin"   # Web 管理界面的密码

写法二:

[webServer]
addr = "127.0.0.1"   # Web 服务器的绑定地址,仅监听本地访问
port = 7400          # Web 服务器的监听端口,用于访问 Web 管理界面
user = "admin"       # Web 管理界面的用户名
password = "admin"   # Web 管理界面的密码

上面两种写法是等价的,但是如果两种写法混合使用的话,不建议这样做,因为从[]开始它会一直找往下,直到到下一组[],不然它都会认为是当前组的,例如:

[webServer]
addr = "127.0.0.1"    # Web 服务器的绑定地址,仅监听本地访问
port = 7400           # Web 服务器的监听端口,用于访问 Web 管理界面
user = "admin"        # Web 管理界面的用户名
password = "admin"    # Web 管理界面的密码
auth.token = "123456" # 这里就会报错,它会被认为是webServer的子配置
posted @ 2025-01-22 23:25  热血文码士  阅读(1319)  评论(0)    收藏  举报