【内网穿透】使用frp把内网服务提供到公网

众所周知,我们的互联网环境是层层封装的。如果你想要在户外访问家中某台设备上的服务,如果厂家没有提供中继服务,那就要自己想办法解决了。

今天要介绍的就是一款帮你实现内网穿透的工具——frp。

通过安装frp,我们的服务就能开放到公共互联网上,供大家访问。

【内网穿透】使用frp把内网服务提供到公网
原理图

这个访问过程中访问者是无感的,他们的设备上不需要安装额外的东西,他只需要通过公网IP访问你提供的服务就可以。

同时,由于frp是端口级别的代理,你也不必担心整个内网设备都被暴露于互联网上。

工作原理

它的文档里这样解释。

frp 主要由两个组件组成:客户端(frpc) 和 服务端(frps)。通常情况下,服务端部署在具有公网 IP 地址的机器上,而客户端部署在需要穿透的内网服务所在的机器上。
由于内网服务缺乏公网 IP 地址,因此无法直接被非局域网内的用户访问。用户通过访问服务端的 frps,frp 负责根据请求的端口或其他信息将请求路由到相应的内网机器,从而实现通信。

官方中文文档

安装条件

  • 一台具备公网IP的设备,一般是云服务器
  • 一点基础的计算机知识

下载

从github下载适配自己系统的软件压缩包。

【内网穿透】使用frp把内网服务提供到公网下载frp

除了windows和linux系统,这里还提供了安卓(Android)版本,Mac系统则需要选择darwin。同时还要注意系统架构,win用户通常都是amd64架构,mac用户如果是M系列芯片就选arm64。(linux用户应该都懂自己的系统吧🐶)

【内网穿透】使用frp把内网服务提供到公网
不同的系统版本

配置安装

下文以linux版本的安装包为例,解压后我们将看到以下几个文件,我们要分别把前两个文件放在内网设备上,后两个文件放在公网服务器上。

【内网穿透】使用frp把内网服务提供到公网
压缩包内容

其中后缀.toml的文件就是配置文件了,我们需要在这里面配置内外网通信的参数。

首先看frps.toml,默认只有一个bindPort = 7000,这是frp默认的通信端口。这里提供一个模板。

bindAddr = "0.0.0.0" #服务端监听地址,用于接收 frpc 的连接,默认监听 0.0.0.0。
bindPort = 7000 #【必填】服务端监听端口,防火墙需要开放该端口

# 管理面板 通过<ip地址>:<端口号> 可以查看连接和流量情况
webServer.addr = "0.0.0.0"
webServer.port = 7500
# 管理员账号
webServer.user = "admin..." # 引号内替换成你想要设置的用户名
webServer.password = "密码"  # 引号内替换成你想要设置的密码

[auth] #鉴权配置
method = "token" #鉴权方式,可选值为 token 或 oidc,默认为 token。
token = "xxxxxxxx.." #替换成你设置的值,尽量复杂,客户端需要设置一样的值才能鉴权通过。

[log] #日志配置,不需要的可以在前面加#注释掉
to = "/frpslog/frps.log" #日志输出文件路径,如果不填写,则会将日志打印在标准输出中。
level = "info" #日志级别,可选值为 trace, debug, info, warn, error,默认级别为 info。
maxDays = 3 #日志文件最多保留天数,默认为 3 天

[[allowPorts]] #allowPorts的第一种写法,此写法用于单一添加
single = 5678 #要代理的端口号

[[allowPorts]] #allowPorts的第二种写法,用于端口范围
start = 3200 #端口范围的起始值
end = 3399 #端口范围的结束值

然后来看frpc.toml文件,这个文件被放置在内网设备上,配置示例如下:

user = "user1" #设置一个本设备的用户名,作为标记
serverAddr = "1.1.1.1" #你所拥有的服务器的公网ip,网址也行
serverPort = 7000 #frps与frpc交互用的端口,记得打开服务器防火墙

[auth] #鉴权配置
method = "token" #鉴权方式,可选值为 token 或 oidc,默认为 token。
token = "xxxxxxx..." #在 method 为 token 时生效,客户端需要设置一样的值才能鉴权通过。


[[proxies]]
name = "ssh"
type = "tcp"
localPort = 22  #本地服务的端口号
remotePort = 6001 #从公网访问的端口号,在公网服务不占用该端口的情况下,两个端口号也可以一样
transport.useEncryption = true
transport.useCompression = true

这两个配置文件结合阅读,应该比较容易理解。

运行软件

在Linux服务器上,我把frps及其配置放在 /usr/local/frp文件夹内,启动命令为:

./frps -c ./frps.toml

但如果不想让他占用你的命令行,可以这样执行:

nohup ./frps -c ./frps.toml &

客户端上的操作类似:

nohup ./frpc -c ./frpc.toml &

自动运行

如果想要这个软件每次开机后都能自启动,可以这样做。

  1. 使用vim创建文件,此处的文件名称决定了服务的名称。
vim /etc/systemd/system/frps.service

2. 写入frps.service内容并保存,注意执行命令的路径

[Unit]
#服务描述
Description=frps service
After=network.target syslog.target
Wants=network.target
[Service]
Type=simple
#执行命令
ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.toml
[Install]
WantedBy=multi-user.target   

3. 重载systemctl

systemctl daemon-reload

4. 设置开机自动启动

sudo systemctl enable frps

使用systemctl命令管理frps

#启动
sudo systemctl start frps
#关闭
sudo systemctl stop frps
#重启
sudo systemctl restart frps
#查看状态
sudo systemctl status frps

查看frp进程

ps -aux|grep frp| grep -v grep

frpc的操作与上面类似,不再赘述。

windows系统中的启动需要在cmd中进行,命令类似:

【内网穿透】使用frp把内网服务提供到公网
windows下执行
阅读剩余
THE END