FRP 内网穿透


一、简单说明

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 服务:

FRP 内网穿透_第1张图片

编辑 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 服务:

FRP 内网穿透_第2张图片

 


四、常见错误说明

[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 端的时钟;

 

 

 


 

你可能感兴趣的:(Linux)