内网穿透

内网穿透的作用简单来说就是跨网段访问另一个局域网中的一台主机。

image-20231123092952316

如上图,假设我们想要通过主机A访问主机C,但是主机A和主机C绑定的都是私有ip地址,所以它们之间是无法直接进行通信的。要想使得A和C能够进行通信,就需要用到内网穿透的技术。

这里我们就可以通过下面讲到的frpsfrpc来实现内网穿透,从而实现主机A和主机C之间的通信。

frp简介

frp可以通过有公网IP的的服务器将内网的主机暴露给互联网,从而实现通过外网能直接访问到内网主机;frp有服务端和客户端,服务端需要装在有公网ip的服务器上,客户端装在内网主机上。

frp下载地址:https://github.com/fatedier/frp/releases/

frp支持多种协议类型的内网穿透,包括SSH,rdp和socks,下面我们详细讲讲frp的使用方法

配置讲解

在上面的官网中,下载下来的frp目录如下

image-20231123110558002

服务端配置

将frps.ini文件和frps文件上传到服务器,即主机B中

在主机B中,按照如下格式编辑frps.ini文件

[common]
# 客户端与服务端要连接的端口
bind_port = 7000

# ui仪表板的端口,账号,密码
# 想用ui界面时取消注释即可
# dashboard_port = 7500	       
# dashboard_user = admin
# dashboard_pwd = admin

# 客户端与服务端连接口令设置
# 想设置验证时取消注释即可
# authentication_method = token 
# token = pass123456

使用如下命令

./frps -c frps.ini

image-20231123093217749

这样就成功开启了服务端的frps配置即开启

注意:如果提示没有权限,就加上执行权限即可。提示没有权限是因为你的frps程序是直接上传的,而不是上传压缩包进行解压得到的frps程序

客户端配置

在客户端,即主机C中,上传frpc和frpc.ini文件

编辑frpc.ini文件,格式如下:

[common]

# 设置建立连接的服务端的信息
server_addr = x.x.x.x#公网ip地址
server_port = 7000

# 设置验证信息,frps文件设置了这里才设置
# authentication_method = token
# token = pass123456


# 建立SSH穿透规则
# 公网的20022端口接收的流量会转发到当前主机的22端口
[Fusion-ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 20022

# 设置rdp穿透规则
# 即公网的23389端口接收的流量会转发得到当前主机的3389端口
[Fusion-rdp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 23389

# 设置socks穿透规则
# 把公网的8989设置为当前主机的socks代理
[Fusion_socks]
type = tcp
remote_port = 8989
plugin = socks5

再执行如下命令

./frpc -c frpc.ini

image-20231123093734906

此时客户端的配置和连接也完成了,我们的内网穿透到这里就算配置好了

使用详解

师傅们看完上面的配置可能还是有点迷糊,例如配置信息为什么这么多?配置完之后怎么用?

没关系,下面我们通过几个例子,简单讲一下

这里假设我的公网vps(B主机)的ip是101.34.31.153

一、A主机SSH登录C主机(无校验)

服务端配置

这里B主机的frps.ini配置如下

[common]
# 客户端与服务端要连接的端口
bind_port = 7000
  • 因为无校验,所以这里不设置校验,即token
  • 我想实现的是SSH登录C主机,自然没必要用到ui仪表盘,所以也不设置

最终就形成了这样一个简单的配置文件,即只需要指定通信的端口

客户端配置

C主机的frpc.ini配置如下

[common]

# 设置建立连接的服务端的信息
# 公网ip地址
server_addr = 101.34.31.153
server_port = 7000

# 建立SSH穿透规则
# 公网的20022端口接收的流量会转发到当前主机的22端口
[Fusion-ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 20022
  • 我们的目的是实现ssh登录,所以就不需要设置rdp和socks协议的穿透
  • B主机的frps没有设置验证,自然C主机的frpc文件也不用设置用于连接的验证

最终就形成了这样的配置文件

使用

B主机(服务端)执行

./frps -c frps.ini

C主机(客户端)执行

./frpc - c frpc.ini

即可成功建立连接,此时在A主机执行如下命令

ssh user@101.34.31.153 -p 20022

即可成功登录到主机C,实现目的

注意:如果在是windows,就使用xshell等工具使用ssh协议来连接即可

二、在B主机建立C主机的socks代理

服务端配置

同上

客户端配置

[common]

# 设置建立连接的服务端的信息
server_addr = 101.34.31.153
server_port = 7000

# 设置socks穿透规则
# 把公网的8989设置为当前主机的socks代理
[Fusion_socks]
type = tcp
remote_port = 8989
plugin = socks5

使用

客户端与服务端执行如上的命令建立连接即可

此时C主机的socks5代理会映射到B主机的8989端口,从而其他机器就可以使用B主机的socks代理访问C主机所在的局域网

此时的代理规则如下

socks5://101.34.31.153:8989

其他主机挂上这个代理即可访问C主机所在的局域网,即实现内网穿透

三、A主机RDP登录C主机

服务端配置

如上

客户端配置

[common]
# 设置建立连接的服务端的信息
server_addr = 101.34.31.153
server_port = 7000

# 设置rdp穿透规则
# 即公网的23389端口接收的流量会转发得到当前主机的3389端口
[Fusion-rdp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 23389

这种方法适用于C主机开启了Windows远程桌面(3389)服务

  • 因为不需要ssh和socks,所以这两个都不用配置
  • 同理,也不用设置验证

使用

服务端与客户端执行如上命令建立连接

下面分为A主机为Linux和A主机为Windows两种情况下,如何访问C主机的远程桌面

Linux使用如下指令

rdesktop -u <用户名> -p <密码> <目标Windows系统的IP地址或主机名>

Windows步骤如下

1、WIN + R
2、mstsc
3、输入账密
4、连接

这样就能访问C主机的远程桌面了

拓展

多协议隧道

刚才的rdp,ssh,socks三个协议,其实可以一起使用的,在frpc.ini文件中正常配置即可,并不会发生冲突,前提是端口没有冲突。

后台命令

直接执行时会占据当前终端页面,可以使用下面的命令把frp放到后台运行

nohup ./frps -c frps.ini & #后台运行

加入nohup之后终端关闭之后也会继续运行,不加的话也可以,&也是放到后台,但是终端关闭就会停止,看个人选择