下面我们就来看几个常用的例子,通过这些例子来了解下 FRP 是如何实现内网服务穿透的。
身份验证服务端和客户端的 common 配置中的 token 参数一致则身份验证通过。
公网服务端 frps.ini 配置文件、内网客户端 frpc.ini 配置文件
[common]
token = www.nasge.com
通过 TCP 访问内网机器
这里以访问 SSH 服务为例,Linux系统环境下设置
公网服务端配置首先修改 FRP 公网服务端 frps.ini 配置文件,默认文件无需修改,直接下一步使用命令启动 frps 服务端
root@U-NAS:~/frp# vi frps.ini
# frps.ini 内容
[common]
bind_port = 7000
在frp目录下输入【./frps -c ./frps.ini】命令启动 frps
root@U-NAS:~/frp# ./frps -c ./frps.ini
2019/12/18 13:29:34 [I] [service.go:141] frps tcp listen on 0.0.0.0:7000
2019/12/18 13:29:34 [I] [root.go:205] start frps success
出现【Start frps success】代表运行成功
内网客户端配置这里以访问 SSH 服务为例, 修改 FRP 内网客户端配置文件 frpc.ini 文件内容:
root@U-NAS:~/frp# vi frpc.ini
[common]
# server_addr 为 FRP 服务端的公网 IP
server_addr = 192.168.44.130
# server_port 为 FRP 服务端监听的端口
server_port = 7000
[ssh]
type = tcp
# local_ip 为 内外客户端IP
local_ip = 127.0.0.1
# local_port 为 内外客户端端口
local_port = 22
# remote_port 为 公网服务端映射端口
remote_port = 6000
[web]
type = tcp
local_ip = 127.0.0.1
local_port = 80
remote_port = 6001
在frp目录下输入【./frpc -c ./frpc.ini】命令启动 frpc
root@U-NAS:~/frp# ./frpc -c ./frpc.ini
2019/12/17 17:33:31 [I] [service.go:249] [35481b55cd500a76] login to server success, get run id [35481b55cd500a76], server udp port [0]
2019/12/17 18:33:31 [I] [proxy_manager.go:144] [35481b55cd500a76] proxy added: [ssh web]
2019/12/17 18:33:31 [I] [control.go:164] [35481b55cd500a76] [ssh] start proxy success
2019/12/17 18:33:31 [I] [control.go:164] [35481b55cd500a76] [web] start proxy success
这样就可以成功在 FRP 公网服务端上成功建立一个内网客户端连接,在 FRP 服务端上成功注册了一个端口为 6000、6001 的服务,接下来我们就可以通过这两个端口访问内网客户端上 SSH 22端口、WEB:80端口服务。
- 公网服务端 192.168.44.130:6000 定向为 内网客户端 127.0.0.1:22【SSH端口】
- 公网服务端 192.168.44.130:6001 定向为 内网客户端 127.0.0.1:80【WEB端口】
有时需要在公有网络通过域名访问我们在本地内网环境搭建的 Web 服务,但是由于本地环境机器并没有公网 IP,无法将域名直接解析到本地的机器。
现在通过 FRP 就可以很容易实现这一功能,这里以 HTTP 服务为例
公网服务端配置首先修改 FRP 公网服务端 frps.ini 配置文件,通过 vhost_http_port 参数来设置 HTTP 访问端口,这里将 HTTP 访问端口设为 8090
root@U-NAS:~/frp# vi frps.ini
[common]
bind_port = 7000
# vhost_http_port 参数来设置 HTTP 访问端口,此处示例:8090
vhost_http_port = 8090
在frp目录下输入【./frps -c ./frps.ini】命令启动 frps
root@U-NAS:~/frp# ./frps -c ./frps.ini
2019/12/18 13:59:34 [I] [service.go:141] frps tcp listen on 0.0.0.0:7000
2019/12/18 13:59:34 [I] [service.go:183] http service listen on 0.0.0.0:8090
2019/12/18 13:59:34 [I] [root.go:205] start frps success
出现【Start frps success】代表运行成功
内网客户端配置其次我们在修改 FRP 内网客户端 frpc.ini 配置文件并增加如下内容:
这里通过 local_port 和 custom_domains 参数来设置本地机器上 Web 服务对应的端口和自定义的域名,这里我们分别设置端口为 80,对应自定义域名 例如:www.666.com
# frpc.ini 内容
[common]
server_addr = 192.168.44.130
# 对应公网服务端的IP
server_port = 7000
# 对应公网服务端的端口
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
[web]
type = http
# local_port 为本地机器上 Web 服务对应的端口
local_port = 80
# custom_domains 为本地机器上 Web 服务对应的自定义的域名
custom_domains = www.666.com
在frp目录下输入【./frpc -c ./frpc.ini】命令启动 frpc
最后将自定义域名 例如:www.666.com
- A记录 解析到【frpc.ini 配置文件内 server_addr 对应的 IP】
- CNAME 解析到【frpc.ini 配置文件内 server_addr 对应的域名】
现在便可以通过【 http://www.666.com:8090 】这个 URL 访问到处于内网机器上对应的 Web 服务。
- 8090端口对应的是 公网服务端 frps.ini 配置文件中 vhost_http_port 对应的 8090 端口
通过密码保护你的 Web 服务HTTPS 服务配置方法类似
公网服务端 frps.ini 配置文件 将 vhost_http_port 替换为 vhost_https_port
内网客户端 frpc.ini 配置文件 将 type = http 替换为 type = https
由于所有客户端共用一个 FRP 公网服务端的 HTTP 服务端口,任何知道你的域名和 URL 的人都能访问到你部署在内网的 Web 服务,但是在某些场景下需要确保只有限定的用户才能访问。
FRP 支持通过 HTTP Basic Auth 来保护你的 Web 服务,使用户需要通过用户名和密码才能访问到你的网页服务。需要实现此功能主要需要在 FRP 内网客户端 frpc.ini 配置文件中添加用户名和密码的设置。
该功能目前仅限于 HTTP 类型的代理。
# frpc.ini 内容
[common]
server_addr = 192.168.44.130
# 对应公网服务端的IP
server_port = 7000
# 对应公网服务端的端口
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
[web]
type = http
# local_port 为本地机器上 Web 服务对应的端口
local_port = 80
# custom_domains 为本地机器上 Web 服务对应的自定义的域名
custom_domains = www.666.com
# 设置认证的用户名
http_user = 666
# 设置认证的密码
http_pwd = 123456
在frp目录下输入【./frpc -c ./frpc.ini】命令启动 frpc
这时访问 http://www.666.com:8090 这个 URL 时就需要输入配置的用户名和密码才能访问。
效果演示
给 Web 服务增加自定义子域名托管在多人同时使用一个 frps 时,通过自定义二级域名的方式来使用会更加方便。
公网服务端配置首先修改在 FRP 公网服务端 frps.ini 配置文件,通过 subdomain_host 参数来设置自定义域名,这里将参数设置为 例如:777.com
# frps.ini 内容
[common]
bind_port = 7000
# vhost_http_port 参数来设置 HTTP 访问端口,此处示例:8090
vhost_http_port = 8090
# subdomain_host 参数来设置 Web 服务增加自定义二级域名
# 将泛域名 *.777.com 解析到 frps 所在公网服务器的 IP 地址
subdomain_host = 777.com
Bash
Copy
通过在 frps 的配置文件中配置 subdomain_host,就可以启用该特性。
之后在 frpc 的 http、https 类型的代理中可以不配置 custom_domains,而是配置一个 subdomain 参数。
只需要将 *.{subdomain_host} 解析到 frps 所在公网服务器。
例如:
- subdomain_host = 777.com、公网服务器IP为 192.168.44.130
- *.777.com A记录 泛解析为 192.168.44.130
在frp目录下输入【./frps -c ./frps.ini】命令启动 frps
root@U-NAS:~/frp# ./frps -c ./frps.ini
2019/12/18 17:42:17 [I] [service.go:141] frps tcp listen on 0.0.0.0:7000
2019/12/18 17:42:17 [I] [service.go:183] http service listen on 0.0.0.0:8090
2019/12/18 17:42:17 [I] [service.go:240] Dashboard listen on 0.0.0.0:7500
2019/12/18 17:42:17 [I] [root.go:205] start frps success
出现【Start frps success】代表运行成功
内网客户端配置其次我们在修改 FRP 内网客户端 frpc.ini 配置文件并增加如下内容:
[web_test]
type = http
local_port = 80
# subdomain 为 frps.ini 配置文件内 subdomain_host = 777.com 对应自定义子域名前缀
subdomain = test
在frp目录下输入【./frpc -c ./frpc.ini】命令启动 frpc
FRP 服务端 和 FRP 客户端都启动成功后,通过 test.777.com 就可以访问到内网的 Web 服务。
同一个 HTTP 或 HTTPS 类型的代理中 custom_domains 和 subdomain 可以同时配置。
需要注意的是如果 FPR 服务端配置了 subdomain_host,则 custom_domains 中不能是属于 subdomain_host 的子域名或者泛域名(subdomain_host,custom_domains 两个参数内域名不能相同)。