背景

  内网穿透:网络连接中的一种术语,也称作NAT(毕竟NAT导致了内外网的划分)穿透,是一种用在外网(相对局域网而言,包括公网和其它局域网)计算机访问局域网内计算机节点及其服务的通信连接技术。

  内网穿透依赖的核心原理是公私网地址的映射转换,转换结果就是NAT表项的建立。按照穿透结构来说,主要包含基于服务器数据中转的穿透(穿透内网穿透解法)和点对点穿透(UDP/TCP打洞)两种,两种方法的都需要中间服务器的参与,但后者只需作为集中服务器参与协商即可(两端安装工具,服务集中协商作为服务提供),而前者的压力较大。简单而言,就是A客户端要访问B客户端,通过一台服务器进行桥接,桥接有两种方式,一种是相互转发,另一个是告诉对方的地址,自己就当一个介绍人的角色。

  内网穿透传统方式会出现服务器和客户机之间的数据传输全部经过中转服务器,传输速度将受制于中转服务器的上下行带宽,不过稳定性很好,要求云主机带宽大。相比之下,点对点穿透能解决大流量带来的困扰,可以实现服务器和客户机之间打洞直接进行数据通信。然而,这种方式需要服务器和客户机都安装穿透工具,对用户访问端不够方便,而且这种方式受复杂网络环境影响较大,不能100%实现,稳定性欠缺。

  关于穿透原理分析,详情可参考:内网穿透原理分析

  内网穿透除了可能需要云主机外,还需要穿透工具协助,几款主流的工具包括frp(开源)、ngrok(开源)、zerotier(开源/商业)、花生壳(商业)、向日葵(远程桌面)、VPN(加密穿透)等等。就各自特点而言,商业款有专业团队维护,且使用简单方便,但数据包会流经第三方,因此数据安全是一大隐患。而对于个人有动手能力的用户或者中小型企业的小规模使用可以选择开源方式。

  综合软件配置复杂度、穿透能力等因素,个人觉得目前最好的选择就是 frp 用于对流量转发不大的场景,而需要大量 udp 传输的场景可以选择zerotier。

  需求来自UCAS课程,此处作记录复盘。本文演示基于 frp 的实现,也可参考:frp内网穿透

基于 Frp 的内网穿透实现:以内网文件共享为例

1. frp 源码获取

git:https://github.com/fatedier/frp/releases 解压:tar -zxvf frp_0.61.2_linux_amd64.tar.gz
文件中包含 frpc、frpc.toml;frps、frps.toml;以及LICENSE文件,分别对应客户端和服务端的配置项设置,可删去相对的内容

2. 配置 frps 服务端设置项:中转服务器

  1. frps.toml文件配置:这里的用户和密码主要用于登录frp访问面板
1
2
3
4
5
6
7
8
9
bindPort = 7000

webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "admin"

auth.method="token"
auth.token = "passtoken"

 配置后启动即可,成功会显示初始化日志:./frps -c frps.toml,随后可以访问公网IP:7500网站查看访问面板,这步相当于将公网服务器的7000端口和frp转发绑定,通过用户登录限制,限制了可以访问共享服务的公网节点。需要注意的是,在服务器,必须开启以下端口(6000和6001是为内网节点共享服务配置):

服务端开放端口

  启动服务端之后,可以进入访问面板进行登录,并简单查看,当前绑定在7000端口:

frp访问面板激活

  1. 后台挂载进程

 利用systemd启动后台进程挂载,创建文件:vim /etc/systemd/system/frps.service,文件内容如下(指定了访问面板的信息和绑定端口):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
[Unit]
Description = frp server
After = network.target syslog.target
Wants = network.target

[Service]
Type=simple
ExecStart = /dev-ops/frp/frps -c /dev-ops/frp/frps.toml

ExecStop=/bin/kill $MAINPID
Restart=always
RestartSec=5

[Install]
WantedBy = multi-user.target

 文件创建成功后,启动即可:

1
2
systemctl start frps
systemctl status frps

3. 配置 frpc 客户端设置项:局域网节点

  1. 配置frpc.toml文件,向外网共享文件服务,向外网暴露什么服务由内网节点决定,因此上面服务端没有这部分配置
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#你的云服务器公网ip
serverAddr = "x.x.x.x"
#连接到云服务器端口,需要和frps.toml配置文件中端口一致
serverPort = 7000

auth.method = "token"
auth.token = "passtoken"

#开放端口连接
[[proxies]]
name = "test-tcp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8080
remotePort = 6100
# 服务器需要开放该端口

#共享文件访问
[[proxies]]
name = "d_drive"
type = "tcp"
remotePort = 6001  # 服务器上用于访问的端口,需要开放该端口
[proxies.plugin]
type = "static_file"
localPath = "D:\\"  # 要对外暴露的目录(这里相当于向外网暴露文件服务)
stripPrefix = "d_drive"  # 访问路径名,此处即http://x.x.x.x:6001/d_drive/
httpUser = "username"  # 用户名
httpPassword = "password"  # 密码

4. 连接客户端与服务端

  1. 确保 frpc.exefrpc.toml 位于同一目录。

  2. 切换到 frpc.exe 所在目录:cd path\to\frp

  3. 执行以下命令启动客户端:.\frpc.exe -c frpc.toml

  4. 执行命令启动服务端: .\frps -c frps.toml

  5. 两端连接可以访问frp面板访问内网的文件内容;此时再次访问服务面板,共享的服务映射更新

    共享服务面板

  6. url访问共享的文件服务,此时可以看到局域网节点D盘符下的文件内容,支持访问下载

    frp访问内网节点文件服务

Frp 流量分析

  在局域网节点,采集 frp 连接访问过程中的流量,分析其连接、数据传输过程的特点,寻找可能的风险问题

监听采集访问流量

refer