1187 字
6 分钟
FRP 内网穿透

我的需求#

我家里的服务器上部署了很多的服务,比如 alist、openwebui、以及一些我的小项目。

我之前才用的方案是使用 DDNS 将我的动态公网 IP 地址固定下来,然后使用 Nginx Proxy Manager 来反向代理到我的内网服务。

但是由于家庭宽带的一些端口的限制,比如 http(80)、https(443) 等端口被封锁,导致我只能使用 https://alist.mihouo.com:8443 来访问我的 alist 服务。

因为 443 端口被封锁了,所以我在使用 Nginx Proxy Manager 的时候,使用 8443 端口代理 443 端口。

我的最终需求也很简单,就是消灭掉 8443 端口,让我可以像 https://alist.mihouo.com 一样访问我的 alist 服务。

什么是 FRP#

FRP (Fast Reverse Proxy) 是一个高性能的反向代理应用,主要用于内网穿透。它能够帮助用户将局域网内的服务暴露到公网上,解决 NAT 和防火墙限制的问题。FRP 由两个部分组成:frps(服务端)和 frpc(客户端)。其原理类似于将一个内网服务通过代理的方式暴露到外网,让外部网络能够访问内网服务。

FRP 的基本工作原理#

  1. 客户端 (frpc):通常在内网运行,负责将本地服务的请求通过代理转发到公网。
  2. 服务端 (frps):通常运行在有公网 IP 的服务器上,负责接收来自客户端的请求,并将请求转发到对应的本地服务。

frpc 和 frps 之间通过一个 TCP 连接进行通信,frps 作为代理服务器,接收来自外部的请求,转发到内网的对应服务上,而 frpc 则接收来自 frps 的请求并将其传递给本地服务。

FRP 配置#

FRP 版本:v0.61.1

首先需要在两个服务器上分别下载 FRP

wget https://github.com/fatedier/frp/releases/download/v0.61.1/frp_0.61.1_linux_amd64.tar.gz

解压下载的文件,并进入解压后的文件夹。

tar -zxvf frp_0.61.1_linux_amd64.tar.gz
cd frp_0.61.1_linux_amd64
TIP

注意自己的服务器是 windows、linux、macos(darwin) 等,然后选择对应的版本下载。

也需要注意自己的 CPU 架构,比如 arm64、amd64 等,然后选择对应的版本下载。

配置 FRPS#

使用 nano 命令编辑 frps.toml 文件,并添加以下内容:

[common]
# frp监听的端口,默认是7000,可以改成其他的
bind_port = 7000
# 授权码,请改成更复杂的 # 这个token之后在客户端会用到
token = token

# frp管理后台端口,请按自己需求更改
dashboard_port = 7500
# frp管理后台用户名和密码,请改成自己的
dashboard_user = user
dashboard_pwd = password
enable_prometheus = true

# frp日志配置
log_file = ./frps.log
log_level = info
log_max_days = 3

可选项: 创建 systemd 服务#

sudo nano /etc/systemd/system/frps.service

添加以下内容:

[Unit]
Description=FRP Server
After=network.target

[Service]
Type=simple
ExecStart=/opt/frp_0.61.1_linux_amd64/frps -c /opt/frp_0.61.1_linux_amd64/frps.toml
Restart=on-failure
User=root

[Install]
WantedBy=multi-user.target

启动服务#

sudo systemctl start frps
sudo systemctl stop frps

查看服务状态#

sudo systemctl status frps

如果启动失败可能是没有权限,使用 sudo chmod +x /opt/frp_0.61.1_linux_amd64/frps 赋予权限。

TIP

启动状态为 active (running),则表示服务启动成功。启动失败可使用 journalctl -u frps.service 查看详细日志。

想要开机自启动,可以执行 sudo systemctl enable frps

进入 frp Dashboard#

通过你的公网 IP 和 dashboard_port 访问 frp Dashboard。

http://8.218.x.x:7500

FRPC 配置#

在你的另一台需要进行穿透的服务器上,使用 nano 命令编辑 frpc.toml 文件,并添加以下内容:

#【公网服务端地址】
serverAddr = "8.218.x.x"
#【公网服务端端口】
serverPort = 7000
#【令牌,与公网服务端保持一致】
auth.token = "token"

[[proxies]]
name = "alist"
type = "tcp"
# 本地服务地址
localIP = "127.0.0.1"
# 本地服务端口
localPort = 5244
# 穿透的端口
remotePort = 5244

可选项: 创建服务#

根据 frps 的配置,创建 frpc 的 systemd 服务。(基本只需要将 frps 更改为 frpc 即可)

我这里的终端设备是 macos,因此我使用的是 launchd 来创建用户级服务。

nano ~/Library/LaunchAgents/frpc.plist

添加以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs$
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>com.frpc</string>
    <key>ProgramArguments</key>
    <array>
      <string>~/opt/frp_0.61.1_darwin_arm64/frpc</string>
      <string>-c</string>
      <string>~/opt/frp_0.61.1_darwin_arm64/frpc.toml</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
    <key>StandardErrorPath</key>
    <string>/tmp/frpc.err</string>
    <key>StandardOutPath</key>
    <string>/tmp/frpc.out</string>
  </dict>
</plist>

加载服务#

launchctl load ~/Library/LaunchAgents/frpc.plist

卸载服务#

launchctl unload ~/Library/LaunchAgents/frpc.plist

启动服务#

launchctl start com.frp.client

停止服务#

launchctl stop com.frp.client

查看服务状态#

launchctl list | grep frpc
TIP

不知为何,我使用 launchctl 启动服务后,总是提示 failed: 5: Input/output error,但是我的配置文件并无问题,最终我使用 tmux 来启动服务。

frp error log

tmux new-session -d -s frpc '~/opt/frp_0.61.1_darwin_arm64/frpc -c ~/opt/frp_0.61.1_darwin_arm64/frpc.toml'

如果 frpc 启动正常,则可以通过 Dashboard 查看服务状态。

frp Dashboard

这时应该可以通过 8.218.x.x:5244 访问我的 alist 服务了。

但是到这一步还没有到达我的最终需求,还需要在使用 Nginx Proxy Manager 将 5244 端口反向代理到 https://alist.mihouo.com。

Nginx Proxy Manager 配置参考

FRP 内网穿透
https://www.mihouo.com/posts/network/frp-intranet-penetration/
作者
发布于
2025-02-19
许可协议
CC BY-NC-SA 4.0