#frp #内网穿透

前提:需要一个有公网 ip 的服务器


好吧,可能看完第一句就直接结束了。确实,大部分人都没有这样的服务器,所以本文是不适用于这种情况的。

先介绍下我的情况吧。之前租了一台云服务器,但是受限于服务器孱弱的性能,一直不知道拿来干什么,吃灰了相当长的时间。后来家里组了个 All in Boom 的小服务器,各方面都比那个云服务器强,所以在这个小服务器上装了很多服务。Nas、图床、博客、甚至 git 仓库都在上面,用着也挺舒服,唯一的缺点就是只能在家用,在外就用不了了。
后来在上面装了 1 panel,就随便逛应用,发现有个内网穿透的应用 frp。了解了下,发现刚好可以适合。
FRPC1727597578202
原理就不讲了,就讲一下怎么使用吧。可以看到这个是客户端,既然有客户端就一定有服务端。使用方法的话就是在有公网 ip 的服务器上运行 frp 的服务端 frps,然后在你需要暴露出去的设备上运行客户端 frpc,做好端口映射,然后就可以通过访问 frps 的端口来访问客户端 frpc 的对应服务了。
Pasted image 20240929162148
拿个场景举例:在外访问 Windows 桌面。
服务端

  1. 在服务器启动 frps 服务,从 github 下载自己适合自己服务器的二进制文件https://github.com/fatedier/frp/releases
  2. 将下载好的压缩包上传到服务器上并解压,解压后可以看到 frps 和 frpc 的几个文件,服务端的话只需要 frps 的文件就行。
    QQ_1727598695552 1
    分别是 frpc 的可执行文件、frpc 的配置文件、frps 的可执行文件、frps 的配置文件还有 LICENSE 文件。
    把用不着的 frpc 文件都删掉,然后修改 frps 的配置文件 frps.toml
bindAddr = "0.0.0.0" // 绑定ip,这个就默认0.0.0.0

bindPort = 7080 // 绑定的端口号,也就是frps服务使用的端口

webServer.addr = "0.0.0.0" // 可选,web页面的访问地址

webServer.port = 7088 // web页面的访问端口

webServer.user = "alps" // web页面的访问用户

webServer.password = "alps" // web页面的用户密码

log.to = "/home/frp/log/frps.log" // 日志文件路径

log.level = "info" // 日志级别

log.maxDays = 3 // 日志天数

auth.method = "token" // 可选,认证方式,默认使用token,可选token或oidc

auth.token = "alps123"

其它配置参考 https://gofrp.org/zh-cn/docs/reference/server-configures/#authserverconfig
把文件移动到 /home/frp 目录。
mv frps* /home/frp/
3. 启动 frps 服务
执行 ./frps -c ./frps.toml 启动。
启动后可以通过访问 ip:7088 访问 frps 的监控面板。
FrpsWeb_1727599280698

  1. (可选,最好配上)配置为系统服务
    目前,我们的 frps 服务是直接运行的,如果关闭终端,服务就会停止。所以最好配置成服务项,并配置成开机自启,这样服务就比较稳定。
    我的服务器是 Ubuntu 系统,所以就以 Linux 的配置方式为例,Windows 版自行查找。
    先看下系统有没有安装 systemd,如没有安装需要先安装 systemd:apt install systemd
    然后在 /etc/systemd/system 目录下创建 frps.service 文件,需要管理员权限。
cd /etc/systemd/system
vim ./frps.service

将下面的配置写入:

[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# 启动frps的命令,需修改为frps的安装路径
ExecStart = /home/frp/frps -c /path/to/frps.toml

[Install]
WantedBy = multi-user.target

输入 :wq 保存文件,然后就可以使用 systemd 命令管理 frps 服务了:

# 启动frp
sudo systemctl start frps
# 停止frp
sudo systemctl stop frps
# 重启frp
sudo systemctl restart frps
# 查看frp状态
sudo systemctl status frps
# 设置开机自启动
sudo systemctl enable frps

服务端到此配置完毕,可以看下服务状态。
FRP_Status1727599979304
active (running) 表示正在运行。
客户端

  1. 安装客户端
    我的客户端是 Windows 机器,所以简单一点直接使用 exe 安装包安装客户端程序。
    https://github.com/koho/frpmgr/releases
    下载最新的 exe 安装包,然后双击安装,这个简单就不讲了。
  2. 客户端配置
    安装完成后桌面看不到图标,需要到开始菜单,搜索就能看到
    FRPC_app_1727600319952
    打开程序,点击新建配置
    FRPC_add_config_1727600383017
    填入我们服务端的 ip 和端口,然后点上面的"认证"选项卡,填入 token,然后点击确定。
    frpc_config_ui_1727600443209
    QQ_1727600526545
    添加配置后,点击刚添加的配置,然后点"快速添加"添加一个远程桌面。端口映射为 13389。
    QQ_1727600692969
    QQ_1727600793109
    添加好后点启动。
    QQ_1727600827602
    看到这个就表示连上了。
    QQ_1727601410750
    在服务端的监控页面也可以看到这个客户端上线了。
    frp_SUCCESS_1727601482836

试一下通过 Windows 的远程桌面连接。我这边只有 Mac 所以用 Mac 连接了。
可以正常连上,并且速度也还行。
QQ_1727602080955

其它
类似的,这种方式不仅可以做到在外访问家里的电脑,还能在家访问公司电脑。具体实现方式就不操作了。而且如果云服务器带宽不高的话,可以试试自己折腾一下把废旧电脑或手机装 Linux 系统,安装 frp 服务,然后使用 ipv 6 地址进行穿透。当然前提是可以使用 ipv 6。(不过都有公网 ipv 6 了,直接访问更方便,这只适用于被代理的设备有内网 ipv 6 地址但是没有没有公网 ipv 6 地址的情况)。