frp内网穿透--------------------阿里云linux+本地linux虚拟机实现
为了实现外部主机能访问局域网服务器(私有ip),我选择了用frp来做内网穿透,当然还可以用ngrok、花生壳等等。
frp
frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https 协议
内网穿透讲解:
先租用一个阿里云vps,配置好frp服务端,再在局域网搭建一个web服务器, 并且web服务器配置好frp客户端,做到外网主机访问vps的8080端口时等于访问局域网的web服务器。
准备工作:
vps一台,公网ip
公网域名:xxx.xxx.com
局域网服务器:172.25.1.137
frps服务端配置 (centos7)
1、 首先到 frp 的 releases 页面下载最新版的对应 VPS 的处理器架构的压缩包https://github.com/fatedier/frp/releases
2、可以在主机上wget对应frp压缩包,也可以下载到本地用ftp工具(winscp)上传到云服务器
3、 tar -zxvf 解压对应压缩包
4、进入解压后的目录 frp_0.22.0_linux_amd64
5、编辑配置文件 vim frps.ini
[common]
frp服务端与客户端连接端口,frps和frpc必须一致
bind_port = 7000
服务端外部提供的端口
vhost_http_port = 8080
仪表盘端口,只有设置了才能使用仪表盘(即后台)
dashboard_port = 7500
仪表盘访问的用户名密码,如果不设置,则默认都是 admin
dashboard_user = admin
dashboard_pwd = admin
~
保存退出,
6、启动服务端
./frps -c frps.ini 后台启动为./frps -c frps.ini &
表示启动完成
frpc客户端配置(centos 7)
前提:先搭建好web服务器,我这里使用时Apache,也可以是nginx,这里自己搭建
上传frp压缩包,并解压
编辑vim frpc.ini 配置文件
[common]
服务端公网ip地址
server_addr = x.x.x.x
与服务端通信端口
server_port = 7000
[web]
type = http
本地Apache服务端口
local_port = 80
公网ip绑定的域名
custom_domains = xxx.xxx.com
启动服务
./frpc -c ./frpc.ini
用浏览器登录访问内部服务器,成功访问
配置多个内网主机
错误的多客户端配置
使用一台阿里云的公网服务器,我们可以配置很多内网机器的 frp 内网穿透,公网服务器上只需要按照上述的配置一次即可,但是内网机器的配置稍有不同,如果使用了一样的配置则后添加的内网机器是无法连接上公网服务器的。这里假设另一台内网机器2的 frpc.ini 配置如下,来说明会遇到的问题:
$ vi frpc.ini
[common]
server_addr = xxx.xxx.xxx.xxx <==这里还是按照上面的假设,公网服务器的ip为xxx.xxx.xxx.xxx
server_port = 7000
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6001 <==remote_port设置为另一个值
两个内网主机的配置除了 remote_port 不一样之外,都是一样的。但是在内网机器2上运行 frpc 后,公网服务器的 nohup.out 中会记录一下的错误:
[W] [control.go:332] [280d36891a6ae0c7] new proxy [ssh] error: proxy name [ssh] is already in use
1
后来发现,frp 中是通过 [ssh] 这个名字来区分不同客户端的,所以不同的客户端要配置成不同的名字。
正确的多客户端配置
内网机器1和内网机器2的配置应该区分如下:
内网机器1:
[ssh] <不同点
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000 <不同点
内网机器2:
[ssh1] <不同点
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6001 <不同点
在两个内网机器上分别运行 frpc 客户端程序后,一般就可以通过以下的方法 ssh 登录:
内网机器1:
$ ssh -p 6000 user_name1@server_addr
内网机器2:
$ ssh -p 6001 user_name2@server_addr
以上参数中,server_addr是公网服务器的公网ip;user_name1、user_name2 分别是内网机器1、2的用户名,之后分别使用登录密码就可以登录。
注意事项:
1、云服务器8080端口必须未占用
2、局域网web服务器(ftp客户端)能上网
3、阿里云服务器要开放上面用到的端口8080、7000、7500,在添加安全组规则放行这些端口