FRP内网穿透实战:无公网环境下的服务映射》
由于我即将将服务器迁移到学校的无公网环境中,因此需要研究如何通过 FRP(Fast Reverse Proxy)内网穿透 来映射一些必要的服务到外部。然而,我发现网上大部分教程都是基于 Windows 环境的 INI 配置,而我使用的 TOML 配置与之差异较大。经过一段时间的摸索,我整理了这篇文章,希望对有类似需求的朋友有所帮助。
FRP 简介
FRP 是一款强大的内网穿透工具,分为 FRPS(服务端) 和 FRPC(客户端)。它可以转发多种类型的流量,但本文仅重点介绍最常用的两种:TCP 和 HTTP。
- TCP:类似于端口转发,直接将端口的流量进行透明传输。
- HTTP:类似于 Nginx 的反向代理,通过域名区分不同的后端服务,允许服务端使用单个端口转发多个网站。
FRPS(服务端)配置
Docker-Compose 配置
version: "3.3"services:
frps:
image: snowdreamtech/frps:0.61
container_name: frps hostname: frps restart: always network_mode: host volumes:
- /etc/localtime:/etc/localtime:ro - ./conf/frps.toml:/etc/frp/frps.toml:ro - ./logs:/frp/logs
frps.toml 配置
# 监听地址bindAddr = "0.0.0.0"# 监听端口bindPort = 7000kcpBindPort = 7000# HTTP/HTTPS 监听端口vhostHTTPPort = 8080vhostHTTPSPort = 4443# 允许代理绑定的服务端端口范围allowPorts = [
{ start = 2000, end = 3000 },
{ single = 3001 },
{ single = 3003 },
{ start = 4000, end = 50000 }]# 鉴权配置auth.method = "token"auth.token = "xxxxxxxxxx" # 请自行修改# 日志配置log.to = "/frp/logs/frps.log"log.level = "debug"log.maxDays = 180log.disablePrintColor = false# 子域名配置subdomainHost = "abc.com" # 请自行修改# 仪表盘配置webServer.addr = "0.0.0.0"webServer.port = 7500webServer.user = "admin"webServer.password = "xxxxxxxxx" # 请自行修改# Prometheus 监控接口enablePrometheus = true# 最大连接池大小transport.maxPoolCount = 1000
注意:
token
、域名
和 password
需要根据实际情况自行修改。域名填写一级域名即可,后续 HTTP 反向代理会使用该域名的二级域名来区分不同的网站。FRPC(客户端)配置
Docker-Compose 配置
version: '3.3'services:
frpc:
image: snowdreamtech/frpc:0.61
container_name: frpc restart: always network_mode: host volumes:
- /etc/localtime:/etc/localtime:ro - ./conf:/etc/frp:ro - ./logs:/frp/logs - /root/.acme.sh/xxxxxx:/etc/ssl # 证书路径请自行配置
frpc.toml 配置
# 连接服务端的配置serverAddr = "x.x.x.x" # 服务端 IPserverPort = 7000# 鉴权配置auth.method = "token"auth.token = "xxxxxxxxx"# 日志配置log.to = "/frp/logs/frpc.log"log.level = "info"log.maxDays = 30log.disablePrintColor = false# 动态加载配置文件includes = ["/etc/frp/confd/*.toml"]
说明:请根据服务端配置修改
token
和其他参数。在 /etc/frp
中新建 confd
文件夹,后续需要添加的配置文件可以在此文件夹内新建 xxx.toml
文件。配置示例
TCP 服务示例
[[proxies]]name = "Home Assistant" # 连接名称type = "tcp" # 连接类型localIP = "192.168.101.194" # 本地局域网 IPlocalPort = 8123 # 本地端口remotePort = 8122 # 远程端口transport.useEncryption = false # 是否启用加密transport.useCompression = false # 是否启用压缩
访问方式:通过
服务端IP:8122
访问本地的 192.168.101.194:8123
。HTTP 服务示例
[[proxies]]name = "EMBY" # 连接名称type = "https" # 连接类型subdomain = "emby" # 子域名localAddr = "192.168.101.236:8091" # 局域网 IP 和端口[proxies.plugin]type = "https2http"crtPath = "/etc/ssl/*.abc.com.cer" # 证书路径keyPath = "/etc/ssl/*.abc.com.key"hostHeaderRewrite = "127.0.0.1"requestHeaders.set.x-from-where = "frp"
访问方式:通过
https://emby.abc.com:4443
访问本地的 192.168.101.236:8091
。注意:建议使用通配符域名证书(如
*.abc.com
),以方便后续扩展。总结
通过上述配置,您可以轻松实现内网服务的外部访问。FRP 的强大功能和灵活配置使其成为内网穿透的绝佳选择。希望这篇文章能帮助您顺利完成配置。如有疑问,欢迎交流!
文章版权声明:除非注明,否则均为游戏人生原创文章,转载或复制请以超链接形式并注明出处。
还没有评论,来说两句吧...