记一次frp内网穿透

记一次frp内网穿透

前言

最近和外校合作,需要传一批数据到我们的服务器上,但是我们的服务器都在学校内网,所以就想到临时架一个frp穿透出去,传完了数据就关掉

注意:内网穿透首先需要一台拥有公网ip的服务器作为服务端,在内网需要穿透的服务器作为客户端

安装&启动

由于之前做过树莓派的内网穿透,所以比较熟悉frp的使用

首先根据机器的cpu架构下载对应的frp,如果不清楚自己的机器是什么架构,可以用以下命令查询

uname -m

查询好架构后,去github下载对应版本的frp,我这一次使用的服务器都是x86的,所以使用amd64版本

wget https://github.com/fatedier/frp/releases/download/v0.22.0/frp_0.22.0_linux_amd64.tar.gz

然后解压

tar -zxvf frp_0.22.0_linux_amd64.tar.gz

服务端

解压出的文件中,frps和frpc分别是服务端(frps, s for server)和客户端(frpc, c for client)的执行文件,frps.ini和frpc.ini是他们对应的配置文件。

首先在公网的服务器上写好服务端的配置文件

vim frps.ini

打开后把配置文件写成如下格式

[common]
bind_port = 7000
dashboard_port = 7001
token = token@12345
dashboard_user = admin
dashboard_pwd = admin

其中bind_port是frp服务监听的端口,dashboard_port是frp控制台的端口,token是frp客户端和服务端通信的token,可以不加,下面两个是登录dashboard时候的用户名和密码

这里要注意服务端的这台服务器要开放配置文件中使用到的端口,不然无法使用

设置好后保存退出,然后启动服务端

./frps -c frps.ini

输入如下内容说明启动成功

2019/01/12 15:22:39 [I] [service.go:130] frps tcp listen on 0.0.0.0:7000
2019/01/12 15:22:39 [I] [service.go:172] http service listen on 0.0.0.0:10080
2019/01/12 15:22:39 [I] [service.go:193] https service listen on 0.0.0.0:10443
2019/01/12 15:22:39 [I] [service.go:216] Dashboard listen on 0.0.0.0:7500
2019/01/12 15:22:39 [I] [root.go:210] Start frps success

这个时候如果关闭shell,frp服务就会退出,如果要让这项服务在后台执行,可以通过nohup命令或者screen命令,具体内容本篇就不写了,相关博客很多,大家自己查一下

客户端

在需要做穿透的机器上下载解压frp后,修改客户端配置文件

vim frpc.ini

客户端的配置文件就比服务端要复杂一点,由于我们只需要用到ssh连接,所以写如下配置文件

[common]
tls_enable = true
server_addr = 服务端ip
server_port = 7000
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

以上配置中[common]是基础配置,server_addr写服务端的ip地址,server_port写服务端的bind_port

[ssh]是ssh服务使用的配置,其中要注意的是local_port是客户端的ssh登录端口,如果没有改过默认是22,remote_port是设置通过服务端的哪个端口访问客户端,例如我设置remote_port=6000,我服务端的ip是10.24.99.2,那么我通过10.24.99.2:6000就可以连接到客户端

配置好后保存退出,启动客户端

./frpc -c frpc.ini

如果输出以下内容,则启动成功

2019/01/12 16:14:56 [I] [service.go:205] login to server success, get run id [2b65b4e58a5917ac], server udp port [0]
2019/01/12 16:14:56 [I] [proxy_manager.go:136] [2b65b4e58a5917ac] proxy added: [rdp smb]
2019/01/12 16:14:56 [I] [control.go:143] [smb] start proxy success
2019/01/12 16:14:56 [I] [control.go:143] [rdp] start proxy success

问题

上节中我说,如果输出以下内容,则启动成功,本来根据穿透树莓派的经验,这篇博客到上一节就结束了,可是这次出了问题。

服务端的启动还是很正常,启动客户端的时候,输出

2019/01/12 16:14:56 [W] [service.go:82] login to server failed: EOF
EOF

Wft???

首先排除一下网络问题,通过

telnet ip地址 端口号

如果输出

Escape character is '^]'.

则说明端口连接成功,不是网络出了问题

既然不是网络的问题,那就一定是服务的问题了

根据查询,发现是因为防火墙识别出了frps并组织了frps的链接,解决方法也很简单,开启frp的TLS加密

服务端和客户端[common]下添加一行tls_enable = true即可,但是有些像我一样的倒霉蛋在添加这行代码并重启客户端和服务端后会看到

2019/01/12 16:14:56 [W] [service.go:82] login to server failed: EOF
EOF

Wft???

怎么还这样,但是别着急,还有另一个办法。

防火墙检测的是tcp链接,我们可以把链接换成udp,通过udp底层的kcp作为通信协议

把服务端[common]中的bind_port改成kcp_bind_port

客户端[common]中加入protocol=kcp即可

然后别忘了在服务端把对应端口的udp服务打开!!!

finally

2019/01/12 16:14:56 [I] [service.go:205] login to server success, get run id, server udp port [0]
2019/01/12 16:14:56 [I] [proxy_manager.go:136] proxy added: [ssh]
2019/01/12 16:14:56 [I] [control.go:143] [ssh] start proxy success

终于结束了

最后的最后

我公网的服务器流量包只有1000G,不够传文件,最后还是用了寄硬盘的方法,哈哈,***

参考文献

https://github.com/fatedier/frp/issues/810

https://blog.phpgao.com/frp_tcp_reset.html

https://sspai.com/post/52523


文章作者: keevinzha
版权声明: 咳咳想白嫖文章?本文章著作权归作者所有,任何形式的转载都请注明出处。 https://www.keevinzha.com !
  目录