我的需求
我家里的服务器上部署了很多的服务,比如 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 的基本工作原理
- 客户端 (frpc):通常在内网运行,负责将本地服务的请求通过代理转发到公网。
- 服务端 (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.gzcd 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 = userdashboard_pwd = passwordenable_prometheus = true
# frp日志配置log_file = ./frps.loglog_level = infolog_max_days = 3
可选项: 创建 systemd 服务
sudo nano /etc/systemd/system/frps.service
添加以下内容:
[Unit]Description=FRP ServerAfter=network.target
[Service]Type=simpleExecStart=/opt/frp_0.61.1_linux_amd64/frps -c /opt/frp_0.61.1_linux_amd64/frps.tomlRestart=on-failureUser=root
[Install]WantedBy=multi-user.target
启动服务
sudo systemctl start frpssudo 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 来启动服务。
Terminal window
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 查看服务状态。
这时应该可以通过 8.218.x.x:5244 访问我的 alist 服务了。
但是到这一步还没有到达我的最终需求,还需要在使用 Nginx Proxy Manager 将 5244 端口反向代理到 https://alist.mihouo.com。