FRP内网穿透
FRP就是一个反向代理软件,体积轻量但功能很强大,使用 Go 语言开发,可以让外网访问到你的本地应用,将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。支持TCP、UDP、HTTP、HTTPS 等众多协议。

工作原理
服务端运行,监听一个主端口,等待客户端的连接;
客户端连接到服务端的主端口,同时告诉服务端要监听的端口和转发类型;
服务端fork新的进程监听客户端指定的端口;
外网用户连接到客户端指定的端口,服务端通过和客户端的连接将数据转发到客户端;
客户端进程再将数据转发到本地服务,从而实现内网对外暴露服务的能力。
使用场景
现实环境中我们大部分的电脑都是在局域网的环境里,要想连接互联网都是需要路由器的公网ip来进行转发的,所以如果我在本地部署了一个服务,如果没有公网ip的话,别人是访问不到的,因为本地的服务只能在内网的环境中被访问到。这个时候如果两台主机要通信,只能由内网部署服务的主机向目标主机发送信息,但是目标主机无法主动的向处于内网的主机回信。
这个时候就需要用到内网穿透或者端口映射了,内网穿透也叫TCP打洞,这个了解的不是太多。
这里说一下端口映射,实现端口映射的软件工具有很多,比如花生壳、frp等,其实本质上都是端口的映射。frp的实现方式是需要有一台有公网ip的主机,将frp的服务端和客户端安装好进行连通后,在配置中将本地服务的端口(比如80),映射到有公网ip的主机上(比如30001),那么这台有公网ip的主机就会监听这个端口,只要有客户端通过这个公网ip+30001的端口访问,请求就会被转发到本地服务的80端口上,就实现了内网的服务可以被外网访问到。
名词解释:端口映射&端口转发
端口映射与端口转发实现的功能类似,但又不完全一样。
端口映射是将外网的一个端口完全映射给内网一个地址的指定端口,可以实现外网到内网和内网到外网双向的通信。
端口转发是将发往外网的一个端口的通信完全转发给内网一个地址的指定端口,只能实现外网到内网的单向通信。
部署安装
前提条件:要部署frp,首先必须需要有一台能被公网访问到,有公网 ip 的服务器,这里使用的是阿里云的ECS。
下载解压安装包
在github中下载最新版的frp安装包。
https://github.com/fatedier/frp/releases
将安装包导入到阿里云的ECS中并解压,可以看到有如下的文件。
haiyang@haiyang:/data/frp/frp_0.60.0_linux_amd64$ ll
总计 31996
drwxr-xr-x 2 1001 127 4096 9月 21 00:32 ./
drwxr-xr-x 3 root root 4096 9月 18 00:37 ../
-rwxr-xr-x 1 1001 127 14483608 8月 19 13:50 frpc*
-rw-r--r-- 1 1001 127 235 9月 21 00:31 frpc.toml
-rwxr-xr-x 1 1001 127 18243736 8月 19 13:50 frps*
-rw-r--r-- 1 1001 127 153 9月 13 23:45 frps.toml
-rw-r--r-- 1 1001 127 11358 8月 19 13:54 LICENSE
编辑frps配置,启动服务端
编辑frps.toml
[common] [[标题]]
bind_port = 7000 [[服务端监听端口]]:接收 frpc 的连接
dashboard_user = admin [[frp网页端控制面板登录用户名]]
dashboard_pwd = admin [[frp网页端控制面板登录密码]]
dashboard_port = 7500 [[启用]] Dashboard 监听的本地端口
enable_prometheus = true [[是否提供]] Prometheus 监控接口:需要同时启用了 Dashboard 才会生效
token = rthrth1541gege54545 [[鉴权使用的]] token 值:客户端需要设置一样的值才能鉴权通过
启动frps服务端
配置完成后,启动frps,出现类似下图的内容即说明服务端启动成功。
./frps -c frps.toml
[root@hywang frp_0.60.0_linux_amd64]# ./frps -c frps.toml
WARNING: ini format is deprecated and the support will be removed in the future, please use yaml/json/toml format instead!
2024-09-22 16:20:03.259 [I] [frps/root.go:105] frps uses config file: frps.toml
2024-09-22 16:20:03.642 [I] [server/service.go:237] frps tcp listen on 0.0.0.0:7000
2024-09-22 16:20:03.642 [I] [frps/root.go:114] frps started successfully
2024-09-22 16:20:03.642 [I] [server/service.go:351] dashboard listen on 0.0.0.0:7500
编辑frpc配置,启动客户端
解压编辑frpc.toml
将安装包导入到内网的本地主机中并解压,编辑frpc.toml,frp client的配置文件。
[common] [[标题]]
server_addr = 47.97.100.110 [[连接服务端的ip地址]]
server_port = 7000 [[连接服务端的端口]]
token = rthrth1541gege54545 [[鉴权使用的]] token 值
[web] [[标明以下是什么的配置,标题名唯一,一个配置文件中不能重复]]
type = tcp [[连接类型:tcp]]
local_ip = 127.0.0.1 [[本地服务ip:需要被代理的本地服务的ip地址,可以为所在frpc能访问到的任意]] ip地址;
local_port = 80 [[本地服务端口]]:配合 local_ip
remote_port = 30001 [[远程端口:ECS服务器监听的端口,接收到请求后会通过frp转发到内网服务器的80端口;]]
启动frpc客户端
配置完成后,启动frpc,出现类似下图的内容即说明客户端启动成功。
./frpc -c frpc.toml
root@haiyang:/data/frp/frp_0.60.0_linux_amd64# ./frpc -c ./frpc.toml
WARNING: ini format is deprecated and the support will be removed in the future, please use yaml/json/toml format instead!
2024-09-22 16:58:37.378 [I] [sub/root.go:142] start frpc service for config file [./frpc.toml]
2024-09-22 16:58:37.379 [I] [client/service.go:295] try to connect to server...
2024-09-22 16:58:37.525 [I] [client/service.go:287] [084c84322b58ecfe] login to server success, get run id [084c84322b58ecfe]
2024-09-22 16:58:37.526 [I] [proxy/proxy_manager.go:173] [084c84322b58ecfe] proxy added: [web ssh]
2024-09-22 16:58:37.551 [I] [client/control.go:168] [084c84322b58ecfe] [web] start proxy success
2024-09-22 16:58:37.552 [I] [client/control.go:168] [084c84322b58ecfe] [ssh] start proxy success
查看frp仪表盘
打开frp dashboard仪表盘查看 在浏览器输入47.97.100.110:7500/,输入用户名和密码后,可以看到连通成功。

设置frp后台自动运行
由于 frps 和 frpc 一关闭xshell的页面就会停止,所以还需要做一下frp的后台自动运行。
nohup
这是frps的后台启动(路径写你服务器上的绝对路径),如果要查看日志的话,就直接使用cat nohup.out,就可以查看了。
nohup /path/to/your/fprs -c-c /path/to/your/frps.toml
这是frpc的后台启动
nohup /path/to/your/fprc -c-c /path/to/your/frpc.toml
systemctl
这个方法比较好用,很方便
sudo vim /lib/systemd/system/frps.service
在frps.service里写入以下内容
[Unit]
Description=fraps service
After=network.target syslog.target
Wants=network.target
[Service]
Type=simple
[[启动服务的命令(此处写你的frps的实际安装目录)]]
ExecStart=/your/path/frps -c /your/path/frps.ini
[Install]
WantedBy=multi-user.target
然后就启动frps
sudo systemctl start frps
再打开自启动
sudo systemctl enable frps
重启
sudo systemctl restart frps
停止
sudo systemctl stop frps
查看状态
sudo systemctl status frps
supervisor
首先先安装supervisor,我用的ubuntu
sudo apt install supervisor
创建 supervisor frps 配置文件,在 /etc/supervisor/conf.d 创建 frp.conf
[program:frp]
command = /your/path/frps -c /your/path/frps.ini
autostart = true
同样是你的绝对路径。
写完以后,要重新加载一下supervisor
# 重启supervisor
sudo systemctl restart supervisor
# 查看supervisor运行状态
sudo supervisorctl status
这是写的frps的后台启动,frpc的话,类比一下就可以了。