FRP-内网穿透来实现外网访问内网服务

Zss 发表于:

想实现在大网中来访问自己家里电脑的中服务,例如一些web服务或者家里路由的控制,公司的服务器的ssh,正常来说,可以在最顶端的出口公网ip的路由上设置端口的转发

但是这上面经过了多少层的路由,而且这个也不可能自己能去设置的,所以有另外一种方式,一台ecs作为代理服务器,将代理服务器和内网客户机打通,使用ecs的端口和ip来访问内网的设备

这个工具就是FRP,内网穿透的工具有很多,如花生壳等等,这是一个开源的,用来也很方便

一个最简单的SSH的实例:

Frp的下载地址:https://github.com/fatedier/frp/releases

文件:frp_0.20.0_linux_amd64.tar

当需要ssh多台机器时,可以选择在server端将配置文件cp一份,再修改端口,使用此份配置文件再次运行,与第二台机器通信

将云服务器作为服务端:

1.配置服务端 frps.ini

[common]
bind_port = 7500 #客户端和服务端之间通信的端口

2.启动:./frps -c ./frps.ini

3.配置客户端 frpc.ini

[common]
server_addr = 47.106.117.148
server_port = 7500

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 10000

4.启动客户端:./frpc -c ./frpc.ini

5.当两端的通信打通时可以看到两端的信息为,抓包看一下,通过默认tcp来保活,每三十秒一次由客户端向服务端进行的交互,将其客户端设置的远程端口号告诉服务器

[root@192 frp]# ./frpc -c ./frpc.ini 
2018/07/22 17:52:38 [I] [proxy_manager.go:300] proxy removed: []
2018/07/22 17:52:38 [I] [proxy_manager.go:310] proxy added: [ssh]
2018/07/22 17:52:38 [I] [proxy_manager.go:333] visitor removed: []
2018/07/22 17:52:38 [I] [proxy_manager.go:342] visitor added: []
2018/07/22 17:52:38 [I] [control.go:246] [0094667cfb5f7ef3] login to server success, get run id [0094667cfb5f7ef3], server udp port [0]
2018/07/22 17:52:38 [I] [control.go:169] [0094667cfb5f7ef3] [ssh] start proxy success


[root@izwz9edjck5sjotul6vfy6z frp]# ./frps -c ./frps.ini 
2018/07/22 17:52:36 [I] [service.go:128] frps tcp listen on 0.0.0.0:7500
2018/07/22 17:52:36 [I] [root.go:190] Start frps success
2018/07/22 17:52:38 [I] [service.go:305] client login info: ip [113.91.143.220:27852] version [0.20.0] hostname [] os [linux] arch [amd64]
2018/07/22 17:52:38 [I] [proxy.go:217] [0094667cfb5f7ef3] [ssh] tcp proxy listen port [10000]
2018/07/22 17:52:38 [I] [control.go:335] [0094667cfb5f7ef3] new proxy [ssh] success

6.客户端中设置的remote_port也是就客户端的ssh的入口,使用ecs的公网ip加此端口号进行访问

7.需要注意的是云服务器的中出入规则的设置,需要添加允许入端口

相关的一次实例及其配置:中文文档

服务端配置:

[必须]标识头

[common]
是不可或缺的部分

[必须]服务器IP

bind_addr = 0.0.0.0
0.0.0.0为服务器全局所有IP可用,假如你的服务器有多个IP则可以这样做,或者填写为指定其中的一个服务器IP,支持IPV6.

[必须]FRP通讯端口

bind_port = 7000
用于和客户端内网穿透传输数据的端口,可自定义。

用于KCP协议UDP通讯端口

kcp_bind_port = 7000
也可以和“bind_port”共用同一端口,如果没有设置,则kcp在frps中被禁用,可自定义。

UDP通讯端口

bind_udp_port = 7001
以帮助使UDP打洞穿透NAT,可自定义。

[必须]连接认证密钥-特权模式

token = www.nat.ee
客户端连接到本服务端的登录验证密钥,可自定义。

如果你想支持http,必须指定http端口监听

vhost_http_port = 80
指定端口为http网页协议,可自定义。

如果你想支持https,必须指定https端口监听

vhost_https_port = 443
指定端口为https网页协议,可自定义。

限制只能使用服务端的指定端口

allow_ports = 2000-3000,3001,3003,4000-50000
只允许客户端绑定你列出的端口,如果你什么都不设置的话,不会有任何限制。可自定义!
开放这些端口,给客户端使用,包括tcp、udp、kcp、

自定义二级域名

subdomain_host = frps.com
通过在 frps 的配置文件中配置 subdomain_host,就可以启用该特性。之后在 frpc 的 http、https 类型的代理中可以不配置 custom_domains,而是配置一个 subdomain 参数。
只需要将 *.{subdomain_host} 解析到 frps 所在服务器。之后用户可以通过 subdomain 自行指定自己的 web 服务所需要使用的二级域名,通过 {subdomain}.{subdomain_host} 来访问自己的 web 服务。

每个内网穿透服务限制最大连接池上限

max_pool_count = 5
每个内网穿透可以创建的连接池上限,避免大量资源占用。可自定义。

客户端最大可用端口,tcp/udp远程端口

max_ports_per_client = 0
最大端口可用于每个客户端,默认值为0表示无限制。

如果使用tcp流复用,默认值为true

tcp_mux=true
不开启则,false
客户端和服务器端之间的连接支持多路复用,不再需要为每一个用户请求创建一个连接,使连接建立的延迟降低,并且避免了大量文件描述符的占用,使 frp 可以承载更高的并发数。

心跳配置,不建议修改,默认值是90

heartbeat_timeout = 90
可自定义。

客户端与服务端时间相差验证

authentication_timeout = 900
假如客户端设备的时间和服务端的时间相差大于设定值,那么拒绝客户端连接。
如果设置为0,则不验证时间,默认值为900秒,可自定义。

通过浏览器查看 frp 的状态以及代理统计信息展示。

绑定服务端IP
dashboard_addr = 0.0.0.0
0.0.0.0为服务器全局所有IP可用,假如你的服务器有多个IP则可以这样做,或者填写为指定其中的一个服务器IP,支持IPV6.

WEB端口
dashboard_port = 7500
访问WEB服务端IP:端口,可自定义。

用户名
dashboard_user = admin
自定义WEB管理用户名,如果没有设置,默认值是admin。

登录密码
dashboard_pwd = admin
自定义WEB管理密码,如果没有设置,默认值是admin。

记录日志

日志存放路径
log_file = /etc/frp/log/frps.log

日志记录类别
log_level = info
可选:trace, debug, info, warn, error

最多保存多少天日志
log_max_days = 7
可自定义保存多少天。

 

客户端配置:

[必须]标识头

[common]
是不可或缺的部分

[必须]frps服务端IP

server_addr = 0.0.0.0
0.0.0.0为FRP服务端IP,客户端要填写为服务端已配置的对应的IP,或者是服务端的服务器(VPS)IP。

[必须]frps服务端通讯端口

server_port = 7000
客户端连接到服务端内网穿透传输数据的端口,请改为服务端已配置的对应端口。

[必须]连接认证密钥-特权模式

token = www.nat.ee
客户端连接到FRP服务端的登录验证密钥,请改为服务端已配置的对应密钥。

记录运行日志

日志存放路径
log_file = /etc/frp/log/frps.log
请改为需要存放在那里的正确路径。

日志记录类别
log_level = info
可选:trace, debug, info, warn, error

最多保存多少天日志
log_max_days = 7
可自定义保存多少天。

你的内网穿透名称,将显示为 {名称}.{对应服务名称}

user = your_name
请填大小写字母和数字,不要用中文填写。

决定第一次登录失败时是否退出程序,否则连续登录到frps服务端

login_fail_exit = true
可选:false,true
默认是true,否则可以不填此参数或者改为false,则持续连接登录到frps而不退出。

用于连接frps服务端的通讯协议

protocol = tcp
支持tcp和kcp,默认是tcp
注意:kcp需要服务端配置参数已开启,才支持。

使用tcp流复用,默认为true

tcp_mux = true
可选:false,true
必须与frps服务端已经配置参数相同,否则服务端没有,可以不填此参数。

内网穿透服务限制最大连接池上限

pool_count = 5
限制本客户端内网穿透可以创建的总连接池上限,避免大量资源占用。可自定义。默认为0不限制,或者不填此参数。
注意:假如服务端已配置了限制,而你设置的高于服务端的,则按服务端的为准采取限制。

指定DNS解析

dns_server = 8.8.8.8
指定一个DNS服务器,frpc将使用这个进行解析,而不是系统默认的。

通过http api设置管理frpc动作的管理地址,例如reload

admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_pwd = admin

 


对应穿透服务名称

[name]
建立每个穿透服务,都需要命名一个此服务的名称,不能和其他已建立的相同。

穿透协议类型

type = tcp
可选:tcp,udp,http,https,stcp,xtcp
你要穿透什么应用要搞清楚,此应用是用什么协议的。

本地监听IP

local_ip = 127.0.0.1
可以是本地的局域网IP,也可以是本机的127.0.0.1 IP,
例如你的局域网是互通的,你可以在本设备建立穿透局域网其他IP的应用。

本地监听端口

local_port = 22
0.16.0版本以上支持批量端口绑定
local_port = 21,22,3389,10010-10020
使用小写逗号【,】分隔,或者一段范围端口的用【-】小写横杠符号编写范围。
用于监听本地设备需要穿透的端口,比如我要穿透到本机的SSH端口,而SSH端口为22,则这样理解。

远程监听端口

remote_port = 6001
0.16.0版本以上支持批量端口绑定
remote_port = 6001,6002,8080,50010-50020
使用小写逗号【,】分隔,或者一段范围端口的用【-】小写横杠符号编写范围。
用于frps服务端的,分配建立穿透到内网对应应用的公网端口。
需要frps服务端已开放此端口给frpc客户端允许对接使用。
例如我可以连接到此(frps服务端IP:端口),则可以穿透到我的内网对应应用服务。

穿透通讯加密

use_encryption = false
可选:false,true
默认为false则不开启,或者不填此参数,为true则开启frps服务端和frpc客户端之间通讯加密。

穿透通讯压缩

use_compression = false
可选:false,true
默认为false则不开启,或者不填此参数,为true则开启frps服务端和frpc客户端之间通讯压缩。

分配自定义域名访问穿透服务

custom_domains = demo.com
支持填写多个域名
custom_domains = demo.com,abc123.com,test.com
使用小写逗号【,】分隔每个域名
用于你的穿透服务的唯一访问域名,假如没有域名,则此处请填为frps服务端的服务器(IP)
自己有多个域名,可以配置不同穿透应用服务,用不同域名,只需要将对应域名解析到frps服务端的服务器(IP)既可。
也支持泛解析识别,例如将(demo.com)域名已经泛解析到frps服务端的服务器(IP)
而想通过(abc123.demo.com)访问到对应穿透服务
则在对应穿透服务,custom_domains参数中填abc123.demo.com

分配对应穿透应用服务唯一的子域名,用于访问

subdomain = abc123
假如frps服务端已经配置了subdomain_host参数域名,并且已经泛(*)解析到frps服务端的服务器(VPS)IP,则可以使用此参数,否则不能用。
例如已经泛解析(demo.com)域名并且frps服务端配置好的,使用此subdomain参数,只需要填子域名,而不需要填(demo.com)
subdomain = 填abc123,则可以通过(abc123.demo.com)访问

为HTTP协议,添加HTTP用户名和密码安全认证

http_user = admin
自定义用户名
http_pwd = admin
自定义密码
仅支持http,https类型协议。
例如我的WEB页面,访问前,需要进行验证,才可以访问。可以添加此参数。

安全地暴露内网服务

对于某些服务来说如果直接暴露于公网上将会存在安全隐患。
sk = abcdefg
可自定义
此参数用于进一步验证,本地访问穿透服务的安全连接,需要双方frpc客户端都需要配置,仅适用于stcp和xtcp协议类型。