跳转到内容

使用FRP实现内网穿透

frp-poster

frp 是一款高性能的反向代理应用,专注于内网穿透。它支持多种协议,包括 TCP、UDP、HTTP、HTTPS 等,并且具备 P2P 通信功能。使用 frp,您可以安全、便捷地将内网服务暴露到公网,通过拥有公网 IP 的节点进行中转。

详细配置或更多内容请参考官方文档网站

下载github releases页面中的frpc和frps,分别为客户端和服务端。客户端运行在需要暴露的服务所在内网服务器,服务端运行在有公网IP的服务器上。

在 Linux 系统下,使用 systemd 可以方便地控制 frps/frpc 的启动、停止、配置后台运行以及开机自启动。

  1. 如果您的 Linux 服务器上尚未安装 systemd,可以使用包管理器如 yum(适用于 CentOS/RHEL)或 apt(适用于 Debian/Ubuntu)来安装它:
Terminal window
# 使用 yum 安装 systemd(CentOS/RHEL)
yum install systemd
# 使用 apt 安装 systemd(Debian/Ubuntu)
apt install systemd
  1. 使用文本编辑器 (如 vim) 在 /etc/systemd/system 目录下创建一个 frps.service 文件,用于配置 frps 服务。
[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart = /path/to/frps -c /path/to/frps.toml
[Install]
WantedBy = multi-user.target
  1. 现在可以轻松地使用 systemd 来管理 frps/frpc 服务,实现启动、停止、自动运行和开机自启动。确保替换路径和配置文件名称以匹配您的实际安装。
Terminal window
# 启动frp
sudo systemctl start frps
# 停止frp
sudo systemctl stop frps
# 重启frp
sudo systemctl restart frps
# 查看frp状态
sudo systemctl status frps
# 设置开机自启
sudo systemctl enable frps

在Windows系统下,可以使用NSSM将FRP运行为系统服务。NSSM(Non-Sucking Service Manager)是一款轻量级的 Windows 服务管理工具。它能将普通的第三方 .exe 程序、脚本或 Java 应用封装为标准的 Windows 系统服务,并在程序崩溃时自动重启,确保服务稳定运行。

  1. 官网下载nssm应用,双击可查看应用程序使用方式。

  2. 找一个目录存放nssm可执行文件,并在资源管理器路径栏输入powershell打开powershell

  3. 执行.\nssm.exe install frpc吊起安装GUI

Terminal window
# 其他常用命令
#修改服务:
.\nssm.exe edit <服务名>
# 启动服务:
.\nssm.exe start <服务名>
# 停止服务:
.\nssm.exe stop <服务名>
# 删除服务:
.\nssm.exe remove <服务名>
  1. 执行文件路径选择frpc存放路径,arguments中填入-c \path\to\frpc.toml来指定配置文件
# 监听的IP
bindAddr = "0.0.0.0"
# 服务端口
bindPort = 3000
vhostHTTPPort=80
vhostHTTPSPort=443
# 认证信息,与客户端一致
auth.method = "token"
auth.token = "xxxxxxx"
# web后台,浏览器可访问
webServer.addr = "0.0.0.0"
webServer.port = 4000
webServer.user = "xxxxxxx"
webServer.password = "xxxxxxx"

需要保证外界可访问bindPortwebServer.port端口,可能需要调整服务器安全组。

# 服务端信息
serverAddr = "x.x.x.x"
serverPort = 3000
# 认证信息,与服务端一致
auth.method = "token"
auth.token = "xxxxxx"
# 一些优化配置,详情参考https://gofrp.org/zh-cn/docs/reference/client-configures/
transport.poolCount = 100
transport.heartbeatInterval = 30
transport.heartbeatTimeout = 90
# 日志
log.to = "/path/to/frp/log"
log.level = "info"
# 代理示例
# 将本地9999的服务暴露为x.x.x.x:21999
[[proxies]]
name = "proxy_tcp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 9999
remotePort = 21999
# 将域名访问通过插件代理到内网
[[proxies]]
name = "https2http"
type = "https"
customDomains = ["example.com", "*.example.com"]
[proxies.plugin]
type = "https2http"
localAddr = "127.0.0.1:80"
crtPath = "/etc/nginx/cert.d/ssl.pem"
keyPath = "/etc/nginx/cert.d/ssl.key"
requestHeaders.set.x-from-where = "frp"