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 &

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端口来进行解析。