一、简单说明
frp 可以实现内网穿透,让内网 web 服务器对外网环境提供 http 或 https 服务,并且 frp 支持自定义域名绑定;frp 还可以让内网服务器对外网环境提供 tcp 和 udp 服务,例如在家里通过 ssh 访问处于公司内网环境内的主机。
frp 以 cs 架构为实现基础,要实现内网穿透,需要一个外网服务器作为 server 端(公网 ip 地址需要固定,以云服务器作为 server 端最好),内网服务器则作为 client 端。
二、外网 ssh 访问内网服务器
1.服务器准备
server端: 云服务器一台, Centos7.6, 公网ip:47.112.208.161;
client端: vmware搭建, Centos7.6, 内网ip:192.168.3.12;
2.获取frp安装包
frp 最新安装包可在 github 上获取,上面也有详细的使用教程,地址:https://github.com/fatedier/frp
3.server 端安装
解压安装包:
[root@syztoo ~]# tar -zxvf frp_0.21.0_linux_amd64.tar.gz
将安装包移动到 /usr/local 路径下(习惯):
[root@syztoo ~]# mv frp_0.21.0_linux_amd64 /usr/local/frp
查看目录下文件:
[root@syztoo ~]# cd /usr/local/frp
[root@syztoo frp]# ls
frpc frpc_full.ini frpc.ini frps frps_full.ini frps.ini LICENSE
server 端只会用到二进制启动文件 frps 和 配置文件 frps.ini,其余文件可删除,frps_full.ini 是 frps.ini 所有配置的参考文档;
删除无关文件:
[root@syztoo frp]# rm -rf frpc*
编辑 frps.ini 文件:
[common]
bind_port = 7000 # 设置 server 端监听的端口;
如果是云服务器,比如阿里云服务器,还需在 ESC 实例的安全组规则里面添加 7000 端口的访问;
开启 frp 的 server 端:
nohup ./frps -c frps.ini &
4.client 端安装
解压:
[root@CentOs7 ~]# tar -zxvf frp_0.21.0_linux_amd64.tar.gz
将安装包移动到 /usr/local 路径下(习惯):
[root@CentOs7 ~]# mv frp_0.21.0_linux_amd64 /usr/local/frp
client 端只会用到二进制启动文件 frpc 和 配置文件 frpc.ini,其余文件可删除,frpc_full.ini 是 frpc.ini 所有配置的参考文档;
删除无关文件:
[root@CentOs7 ~]# cd /usr/local/frp
[root@CentOs7 frp]# rm -rf frps*
编辑 frpc.ini 文件
[common]
server_addr = 47.112.208.161 # 此处填写 server 端公网ip;
server_port = 7000 # 绑定 server 端监听的端口;
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000 # 设置 22 号端口的映射端口;
在 ESC 实例的安全组规则里面添加 6000 端口的访问;
开启 frp 服务的 client 端:
[root@CentOs7 frp]# nohup ./frpc -c frpc.ini &
5.测试外网访问内网服务器
[root@oldtiaobj ~]# ssh [email protected] -p 6000
The authenticity of host '[47.112.208.161]:6000 ([47.112.208.161]:6000)' can't be established.
ECDSA key fingerprint is 60:19:1b:b0:0e:e0:9a:5a:f1:32:81:7d:0e:41:45:5e.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[47.112.208.161]:6000' (ECDSA) to the list of known hosts.
[email protected]'s password:
Last login: Thu May 23 07:53:18 2019 from 192.168.3.15
[root@CentOs7 ~]#
成功登录到内网服务器。说明:
-p 6000 # 指定6000端口
[email protected]'s password: # 这里输入内网服务器的密码
三、将内网 http 服务映射到外网
1. server 端配置
编辑 frps.ini 文件:
[common]
bind_port = 7000
vhost_http_port = 10080 # 内网 http 服务映射到 server 端的端口;
在 ESC 实例的安全组规则里面添加 10080 端口的访问;
再次启动:
[root@syztoo frp]# ps -ef | grep frps | awk 'NR<2{print $2}' | xargs kill -9
[root@syztoo frp]# nohup ./frps -c frps.ini &
2.client 端配置
已部署的 nginx 服务:
编辑 frpc.ini 文件:
[common]
server_addr = 47.112.208.161
server_port = 7000
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
[web]
type = http
local_ip = 127.0.0.1
local_port = 80 # 内网 web 服务器的端口号;
custom_domains = syztoo.com # 公网服务器绑定的域名;
再次启动:
[root@CentOs7 frp]# ps -ef | grep frpc | awk 'NR<2{print $2}' | xargs kill -9
[root@CentOs7 frp]# nohup ./frpc -c frpc.ini &
使用域名+映射的端口号访问 nginx 服务:
四、常见错误说明
[E] [control.go:236] authorization timeout
[W] [control.go:113] login to server failed: authorization timeout
authorization timeout
上面错误出现的原因:client 端 和 server 端之间时间差超过了默认值。
解决方式一:这个超时时间可以在配置文件中通过 authentication_timeout 这个参数来修改,单位为秒,默认值为 900,即 15 分钟,如果修改为 0,则 frps 将不对身份验证报文的时间戳进行超时校验;
解决方式二:同步 server 端和 client 端的时钟;