## 它是什么?干嘛用的?

先假设这样一个场景,在仅有的IPV4的环境下,你身处外面使用手机数据流量,想访问家里的路由器界面(如192.168.1.1),但奈何路由设备仅仅存与家庭局域网中,无法访问,怎么让路由器管理界面在世界各地都可以访问呢?Frp内网穿透工具就是为了解决这样一个问题的,可以在有网络的任何地方访问到你家庭的设备。家里头无法在外面访问的网络,我们以下称为`内网`
公网:与内网相反,为什么我们都可以在任何地方访问百度?因为百度的服务器放在了一个大家都可以访问到底网络,公共使用的网络--公网

## Frp工具是如何做到的?

简单的说转发,它需要一台在公网设备的帮助转发;借助下面的图就懂了
Frp服务器部署在公网中,它是一个中间商,你想发数据给路由,先发给Frp服务器,Frp再转发给路由,路由发你的数据也是如此

IP:网络地址,字面意思,网络的地址,有地址才找到一个地方

域名: 方便访问,为什么我们输入"baidu.com"就能访问百度呢?为什么大家不直接通过百度IP访问呢?不是所有人都能记住那一串数字的{IP地址:xxx.xxx.xxx.xxx}

## 部署所需

* 一台具有公网IP的设备(服务器)
* 一个属于你的域名

## 进行部署

1、根据你的服务器或设备类型选择对应 `frp` 压缩包
FRP Github Release
本地备份下载

* windows 64位:XXX_windows_amd64.zip
* windows 32位:XXX_windows_386.zip
* linux 64位:XXX_linux_amd64.tar.gz
* linux 32位:XXX_linux_386.tar.gz

2、然后使用ftp或sftp或者scp等方式,将frp压缩包上传到你的服务器中(也可以直接在服务器使用wget进行下载)

3、对frp压缩包进行解压,里面会有几个文件

其中包括有frpc(客户端),frpc.ini(客户端配置),frps(服务器),frps.ini(服务器配置)

假设上传到了服务器的root路径下,对frp文件夹进行权限设置

```
chmod 777 -R /root/frp
```

4、配置frp服务器参数
使用vim编辑: vim frps.ini

```
[common]
bind_addr = 0.0.0.0
bind_port = 服务器监听端口(10000)
bind_udp_port = UDP端口(10001)
kcp_bind_port = KCP端口(10002)
vhost_http_port = 80
vhost_https_port = 443
subdomain_host = 你的域名(如:limons.cn)
dashboard_addr = 0.0.0.0
dashboard_port = 后台管理端口(11000)
dashboard_user = 管理用户名(root)
dashboard_pwd = 管理密码(你自己填一个)
token = 链接密钥(你自己想一个,别照抄啊!如:ABCDEFG)
max_pool_count = 100
log_file = ./frps.log
log_level = info
log_max_days = 3
tcp_mux = true
```

如果你的服务器已经部署了网站那些,也就是80跟443端口已经被占用,那么 `vhost_http_port` 和 `vhost_https_port` 这两个端口也需要改变。总之,frps.ini 中的任何端口不能跟 其他frp 或 其他程序 冲突,否则服务启动失败

## 启动frp

所有配置完成后,正常使用frp的话,肯定是要让frp在后台运行的,以下有几种后台启动方式

### nohub命令:

```
# 在root根目录下执行
nohup /root/frp/frps -c /root/frp/frps.ini
```

### screen命令:

```
# 在frp目录下执行
screen -S frp
./frps -c ./frps.ini
```

### rc.local

修改`/etc/rc.local`文件,加入启动命令

```
/root/frp/frps -c /root/frp/frps.ini &```
```

### systemctl

创建并编辑 `frps.service` 文件,执行代码:

```
vim /lib/systemd/system/frps.service
```

然后在该文件输入以下代码,并保存退出:

```
[Unit]
Description=Frp Server Service
After=network.target

[Service]
Type=simple
User=root
Restart=on-failure
RestartSec=5s
ExecStart=/存放frp的目录/frps -c /存放frp的目录/frps.ini
LimitNOFILE=1048576

[Install]
WantedBy=multi-user.target
```

「**操控命令**」

启动服务 `systemctl start frps`

开机自启动 `systemctl enable frps`

重启服务 `systemctl restart frps`

停止服务 `systemctl stop frps`

查看日志与状态 `systemctl status frps`

客户端自启动与服务端相同,只需要创建 `frpc.service` 并把 `ExecStart` 路径改为存放frpc的路径,操控命令将 `frps` 改为 `frpc`

不同的系统自启动会不太一样,ubuntu,debian,centOS,windows等等,可自行百度

### Openwrt

进入 /etc/init.d 文件夹中,创建一个名为 frp 的文件,写入以下代码:

```
#!/bin/sh /etc/rc.common

START=90
TOP=90
SERVICE=frpc
USE_PROCD=1
PROC="/存放frp的目录/frps -c /存放frp的目录/frps.ini"

start_service(){
procd_open_instance
procd_set_param command $PROC
procd_set_param respawn
procd_close_instance

}

service_triggers(){
procd_add_reload_trigger "rpcd"

}
```

## 解析一个域名到服务器

比如解析了个 frp.example.com 到你的服务器

## 在浏览器中访问frp管理后台

在自己电脑打开浏览器,输入frp后台管理地址,比如本例子中:

域名是:frp.example.com

面板端口:11000

那浏览器地址栏就写 `frp.example.com:11000` 域名后面的端口就是`frps.ini`中的`dashboard_port`。用户名就是`dashboard_user`,密码是`dashboard_pwd`

如果frps.ini中没有配置 subdomain_host 那么就使用 `服务器IP:FRP面板端口` 形式访问,客户端配置时也使用服务器IP

如果访问frp管理后台无法打开,那就是你的服务没启动或者端口没有开放。重新检查`frps.ini`文件,并确定该文件中的`bind_port`、`dashboard_port`在你的防火墙(服务器安全组)中放行了

## 客户端连接服务器

这个客户端是你要被控制的设备,下载frp程序,下载回来后,frps相关的可以删掉了,只有frpc才是客户端使用的

编辑 frpc.ini

```
[common]
server_addr = frp.example.com(刚刚设置的域名解析)
server_port = 服务器监听端口(10000) / bind_port
token = frp服务器中你设置的token
user = 客户端名称(可以随便填一个英文字符串,给这个客户端命名)

[web] //代理内网的网站
type = http //类型http
local_ip = 127.0.0.1 //内网设备IP
local_port = 80 //端口
subdomain = http //子域名:如此时填入的是http,则浏览器输入(http.limons.cn)就会访问到此设备

[ssh]
type = tcp //内网TCP代理
local_ip = 127.0.0.1 //内网设备IP
local_port = 22 //要代理的端口
remote_port = 11022 //代理所生成的端口,远程ssh链接需要指定为这个端口
```

## 被控设备为Windows电脑

如果要被控制的设备是`Windows`,比如公司的电脑,下载`frp`相对应的压缩包,解压后将文件夹名字改为`frp`,删掉`frps`相关文件,只留`frpc`文件,用记事本打开`frpc.ini`进行配置

```
[common]
server_addr = 你的服务器域名或者IP
server_port = 服务器监听端口(10000) / bind_port
token = frp服务器中你设置的token
user = 给本次客户端取一个名(全英文名)
tls_enable=true

[windows]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 33890(映射端口,可随便设置,但不能和其他frp客户端冲突,并且服务器防火墙要放行这个端口)
```

在`frp`文件夹内,按住`shift`键盘并`右键鼠标`,点击右键菜单栏中的powershell,输入命令:

```
./frpc.exe -c frpc.ini
```

如果你看到`start proxy success`的字样,则表示成功了,如果没有,则表示`frpc.ini`配置有问题

按`ctrl+C`停止程序运行,现在程序可以正常运行,但我们需要将其设置`开机自启动`

需要一个叫winsw的工具,Github下载 本地备份下载

下载后放到`frp`的文件夹中,并改名为`winsw.exe`,并且新建一个文件`winsw.xml`

用记事本打卡`winsw.xml`,填入下面内容,需要修改的是要运行的frp程序绝对路径,根据你的实际路径填写

```

frp

frp_0.37.0_windows_amd64

frpc客户端 - 实现内网穿透

C:\frp\frpc.exe

-c frpc.ini





append

logs


```

在frp文件夹中,按住`shift`并点击鼠标右键,可以在右键菜单栏中看到`powershell`,输入`.\winsw.exe install`,如下图

如果提示下面,则成功!

成功!重启电脑(被控制设备)后用手机端试试能不能远程桌面吧

下载`Remote Desktop`安装,PC name(电脑名)那里输入FRP服务器域名/IP:端口(上面的remote_port = 33890),比如:

```
frp.example.com:33890
```

最后修改:2022 年 04 月 11 日
如果觉得我的文章对你有用,请随意赞赏