使用frp通过ssh访问公司内网服务器

  • 2020-01-10
  • 106
  • 2

简介

frp 是一个高性能的反向代理应用,可以帮助您轻松地进行内网穿透,对外网提供服务,支持 tcp, udp, http, https 等协议类型,并且 web 服务支持根据域名进行路由转发。
这里主要说下怎么内网穿透,实际按照教程,自己将 NAT VPS 做端口转发之类的也是完全一样的。

原理

frp 的原理挺容易理解的:公网服务器和内网客户端建立连接,外网用户先去访问公网服务器特定端口,触发公网服务器和内网的互动,并返回信息给外网用户。具体的可以看之前 Ngrok 那里写的 NAT 穿透原理

frp的原理解析:

frp请求流程

首先,frpc 启动之后,连接 frps,并且发送一个请求 login(),之后保持住这个长连接,如果断开了,就重试
frps 收到请求之后,会建立一个 listener 监听来自公网的请求
当 frps 接受到请求之后,会在本地看是否有可用的连接( frp 可以设置连接池),如果没有,就下发一个 msg.StartWorkConn 并且 等待来自 frpc 的请求
frpc 收到之后,对 frps 发起请求,请求的最开始会指名这个连接是去向哪个 proxy 的
frps 收到来自 frpc 的连接之后,就把新建立的连接与来自公网的连接进行流量互转
如果请求断开了,那么就把另一端的请求也断开

目的:

在外网想通过ssh能够访问到公司内网的某一台服务器.执行对应的ssh操作.
大体模型如下:

实现步骤:

中转服务器

作为frp服务的服务端.

下载frp软件.
官网查看release

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

解压压缩包并命重命名文件夹:

tar -xzvf frp_0.20.0_linux_amd64.tar.gz

配置服务端的配置文件:

# frps.ini
[common]
bind_addr=0.0.0.0   //本地IP
bind_port = 7000    //绑定本地服务端口,确保中转服务器该端口是放行的,中转服务器本身防火墙没有关闭此端口.

以上参数也叫: Server端的ip和Server端的监听端口.

之后启动frps:

# 控制台式启动,按ctrl+C停止
./frps -c ./frps.ini //指定配置文件前台运行启动

# 后台启动,日志保存在nohup.out
nohup ./frps -c ./frps.ini &  //指定配置文件后台运行启动

frps服务端启动后,显示如下:

内网服务器

内网服务器实际是作为frp的客户端,链接到中转服务器[frp服务端]上,由中转服务器和内网服务器进行交互.
下载frp软件,见上.

修改配置文件:

# frpc.ini
[common]
server_addr = x.x.x.x     \\要跟server端地址保持一致
server_port = 7000         \\跟server端口保持一致

[ssh]
type = tcp             \\使用的协议
local_ip = 127.0.0.1
local_port = 22        \\本地ssh的服务端口
remote_port = 6000     \\对外端口访问公网的此端口就相当于访问client的22端口,代理端口
  • remote_port理解: 内网服务器和中转服务器通信的端口.
  • local_port: 可以理解为内网服务器中被中转服务器代理的端口.(中转服务器通过6000接收到的请求,会全部转发到内网服务器的此端口22上.)

可以看到配置文件是分块的:
– common是 frp专用配置.
– ssh是给ssh的配置

所以: 一定要保证 中转服务器 的 6000 和 7000 代理端口是放行的.

启动内网服务器上的frp客户端

./frpc -c ./frpc.ini &   \\指定客户端配置文件后台运行

OK,frps服务端也有链接提示:

表示当前内网服务器已经通过frps客户端做了代理.
代理规则: 就是将中转服务器上的 6000 端口 转发到 内网服务器的22端口上.

这么理解:
– 6000端口其实是中转服务器代理的内网服务器的端口(代理端口).
– 7000是frp软件监听的端口.

中转服务器将我们的ssh指令通过6000全部转发给内网服务器的22端口.
代理: 我们访问中转服务器的代理端口(6000),就好像我们在访问内网服务器被代理的端口(22)一样.

验证

  1. 在其他有ssh命令的机器上运行:
ssh -oPort=6000 user@x.x.x.x

x.x.x.x 是 中转服务器 的IP

user是 内网服务器 的用户.

  1. 使用Xshell 链接

中转服务器的代理端口: 也就是我们配置的ssh模块下的remote_port: 6000
对于客户端来说,不需要关注 7000端口(中转服务器和内网服务器通信端口).

易混点:
在使用linux使用ssh先链接内网服务器时,页面展示的一直是中转服务器的IP,提示输入密码,极易混淆,输入成了中转服务器的密码. 此时ssh其实链接的是内网服务器.

Notice: 如果遇到链接超时等情况 !

Connecting to 中转服务器:6000...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
Connection closing...Socket close.

Connection closed by foreign host.

很容易在链接的时候报错,其实原因就是因为内网服务器防火墙没有关闭.

参考:
使用frp通过ssh访问公司内网机器

使用frp实现内网穿透,访问内网web服务以及ssh内网服务器

1+

评论

  • 回复

    大佬牛逼

    1+
    • 有点小惊呆回复

      一起学习啊

      0