我的需求
我家里的服务器上部署了很多的服务,比如 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.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 来启动服务。
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。