0%

frp简单使用实录

前言

之前用过frp做过简单的dns解析处理,今天打算用点时间稍微整理下它的用法和使用场景。

官方readme

下载

frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,所以基于tcp和udp的协议都可以通过它来做反向代理。使用它,你只需要拥有一台具有公网ip的主机就可以了。

服务器端

由于只是简单使用,所以这里就用了最简单的配置,在frps.ini文件中:

1
2
3
[common]
bind_port = 7000
token = password

这段就是告诉frp的服务端去监听7000端口,然后密码是xxx,这个还是推荐设置上,不然就变成公交车了。

然后./frps -c ./frps.ini服务端就算启动了。当然如果要长期后台的话,使用nohup ./frps -c ./frps.ini &

当然frp还贴心写好了对应的系统service,稍微修改一下,放到/etc/systemd/system下面

1
2
3
4
5
6
7
8
9
10
11
12
Description=Frp Server Service
After=syslog.target network.target
Wants=network.target
[Service]
Type=simple
User=nobody
Restart=always
RestartSec=5s
ExecStart=/usr/bin/frps -c /etc/frp/frps.ini

[Install]
WantedBy=multi-user.target

当然对应的命令和对应的配置文件都要搞定,然后就可以使用systemctl来控制了。

SSH

对于我来说,较为常用的就是我的主机在内网里,同时在我的机器里又安装了虚拟机,那么我希望能够在家或者别的地方来访问我在内网里的主机的虚拟机。

我这里假设我的真实物理机在内网里的地址是192.168.2.2,而虚拟机则是192.168.200.2

虚拟机一般都是使用NAT的,所以其实理论上只要你的主机能够访问虚拟机,就很好办,这里提供两种办法:

  1. vmware这种软件提供了端口转发功能,只需要设置好就可以。比如设置任何发往你本机的45678端口的数据都会被转发到虚拟机上的22端口,这样就可以让局域网的别的主机访问了。所以客户端的配置就可以这么写:
1
2
3
4
5
6
7
8
9
10
[common]
server_addr = 服务器的ip
server_port = 7000
token = 刚刚设置的密码

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 45678
remote_port = 25123

此时,你在任何地方,只需要通过ssh root@服务器ip -p 25123就可以访问到你的虚拟机提供的ssh服务了。

  1. 【推荐】不需要vmware提供这种麻烦的转发,反正物理机能够访问虚拟机,那直接让物理机去访问就行了。具体配置如下:
1
2
3
4
5
6
7
8
9
10
[common]
server_addr = 服务器的ip
server_port = 7000
token = 刚刚设置的密码

[ssh]
type = tcp
local_ip = 192.168.200.2
local_port = 22
remote_port = 25123

此时,你在任何地方,只需要通过ssh root@服务器ip -p 25123就可以访问到你的虚拟机提供的ssh服务了。比较推荐这种方法是因为它适用性比较广,而且看得简单明了(能少一层是一层)。

FTP

我的内网里面搭建了ftp服务器,希望能够通过外网来访问。不过这里不是很推荐这种做法,主要是因为云服务器的带宽不怎么样….

首先我们需要确保ftp服务器里设置了被动连接,并且手动指定好了端口,我这里假设是50000-50002,注意需要在内网里进行测试下,因为会遇到防火墙拦截等问题。

接下来的配置也比较简单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[common]
server_addr = 服务器ip
server_port = 7000
token = 密码

[ftp]
type = tcp
local_ip = 127.0.0.1
local_port = 21
remote_port = 2121

[ftp1]
type = tcp
local_ip = 127.0.0.1
local_port = 50000
remote_port = 50000

[ftp2]
type = tcp
local_ip = 127.0.0.1
local_port = 50001
remote_port = 50001

[ftp3]
type = tcp
local_ip = 127.0.0.1
local_port = 50002
remote_port = 50002

这样你只需要在外网的情况下访问ftp://公网ip:2121就可以访问内网提供的ftp了。

服务器对外提供简单的文件服务

由于ftp还需要比较麻烦的设置,所以如果只是简单的文件分享,推荐用这种:基于http我们也可以做文件服务,所以只需要在客户端进行如下配置即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[common]
server_addr = 服务器ip地址
server_port = 7000

[file]
type = tcp
remote_port = 40000
plugin = static_file
# 要对外暴露的文件目录
plugin_local_path = /file
# 访问 url 中会被去除的前缀,保留的内容即为要访问的文件路径
plugin_strip_prefix = test
plugin_http_user = 账号名称
plugin_http_passwd = 密码

这样仅需要访问http://服务器ip:40000/test/就可以访问你对应客户端的/file文件夹下面的东西了。

这里有几个要注意的点,端口不可以随便设,我之前设置了6666,浏览器是不让这些特殊的端口转发的。其次是最后有一个斜杠…别忘记了….

DNS

这个更简单:

1
2
3
4
5
6
7
8
9
[common]
server_addr = 服务器ip
server_port = 7000

[dns]
type = udp
local_ip = 8.8.8.8
local_port = 53
remote_port = 6000

这样你的服务器就可以“当做”一台谷歌的域名解析来使用了,只不过别人需要访问你的6000端口来进行解析。

windows远程访问

Linux的远程访问就直接使用ssh就行了,实际中比较现实的是使用frp进行内网穿透,来连接家里的电脑。一个现成的解决方案是teamviewer,然而某次更新后居然只能支持两台设备了,而且还不怎么稳定,于是放弃了teamviewer,自己写了一个frp脚本,并且让windows启动的时候能够自动启动,这样相当于只要按下电源,就可以远程访问了。

批处理脚本

首先下载好对应的frp,然后在其中创建一个Windows的批处理脚本,假设就叫start.bat好了:

1
2
3
4
@echo off
:frp
frpc -c frpc.ini
goto frp

第一条关闭回显,第二条定义一个标号,第三条正式执行命令,第四条命令回到第二条命令,主要是为了让frp意外退出的时候能够重新启动。当然如果你不希望它会自动重启,直接把最后一条换成exit即可。

配置任务计划

直接在Windows的搜索框里输入任务计划程序,就能打开对应的程序:

image-20210316161226589

然后点击创建任务,照着图片的设置:

image-20210316161408317

image-20210316161515718

image-20210316161753916

按照这三张图片的红框设置,其中最后一张图片的起始于填写的是脚本所在的文件夹位置。

这样设置之后,这个脚本每次你启动电脑的时候它就会启动,噢对了,Windows的杀毒软件会把frp删除掉,记得加个白名单。

frpc配置文件

顺带把frpc.ini的配置也贴一下:

1
2
3
4
5
6
7
8
9
10
11
[common]
server_addr = 服务器的公网ip
server_port = 7000
authentication_method = token
token = 你自己设置的密码

[IIE]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 43389

访问

其中最后一样的remote_port我随便写的,这样你就可以通过访问公网ip:remote_port来访问你的主机了。

Windows的话只需要在搜索框里搜索远程桌面连接就可以了,Mac的话下个microsoft remote desktop即可。