文章
本文总阅读量

使用frp实现内网穿透

使用frp实现内网穿透

内网穿透是一种技术,它允许用户从外部网络访问内网中的服务。这在进行远程工作、家庭网络设置或开发测试时非常有用。本文将介绍如何使用frp(Fast Reverse Proxy)作为内网穿透工具。

frp简介

frp是一个高性能的反向代理应用,支持多种协议,包括TCP、UDP、HTTP、HTTPS等。它由服务端和客户端组成,通过在公网服务器上部署frp服务端,然后在内网环境中运行frp客户端,即可实现内网服务的穿透访问。

安装frp

  1. 下载frp:访问frp的GitHub发布页面,下载适合您操作系统的版本。

  2. 解压缩:下载完成后,解压缩文件到您希望的目录。

  3. 配置frp:frp的工作需要服务端和客户端的配置文件。您可以在解压缩的文件夹中找到示例配置文件frps.toml(服务端)和frpc.toml(客户端)。(旧版本为ini文件)

    配置frp ssh连接

    配置frp服务端

编辑frps.toml文件,一个基本的配置如下所示:

1
2
3
4
5
6
7
8
9
10
# 设置frp服务端监听的端口
bindPort = 7001

# 设置frp的Web管理界面监听的端口
webServer.port = 7500

# 设置frp的Web管理界面的监听地址,默认监听所有网络接口
webServer.addr = "0.0.0.0"
# 注意: dashboard 用户名密码在这个配置段落外设置,如果需要启用,请在配置文件中添加相应的dashboard用户名和密码配置项

这个配置指定了frp服务端监听的端口,几个端口均可以根据自己需求自由修改。

配置frp客户端

编辑frpc.toml文件,配置内网服务穿透的详细信息,例如:

1
2
3
4
5
6
7
8
9
serverAddr = "x.x.x.x"
serverPort = 7001

[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000

localIPlocalPort 配置为需要从公网访问的内网服务的地址和端口。 remotePort 表示在 frp 服务端监听的端口,访问此端口的流量将被转发到本地服务的相应端口。

启动frp

在服务端,运行./frps -c ./frps.toml启动frp服务端。
在客户端,运行./frpc -c ./frpc.toml启动frp客户端。
完成以上步骤后,您就可以通过配置的公网地址或域名访问内网服务了。
ssh -o Port=6000 test@x.x.x.x

配置stcp(secret tcp)进行ssh连接

在进行ssh连接时,我更推荐使用stcp的方式。某些内网服务,如果直接暴露在公网上,可能存在安全风险

配置stcp服务端

stcp的服务端于普通tcp连接的方式一样

1
2
3
4
5
6
7
8
9
10
# 设置frp服务端监听的端口
bindPort = 7001

# 设置frp的Web管理界面监听的端口
webServer.port = 7500

# 设置frp的Web管理界面的监听地址,默认监听所有网络接口
webServer.addr = "0.0.0.0"
# 注意: dashboard 用户名密码在这个配置段落外设置,如果需要启用,请在配置文件中添加相应的dashboard用户名和密码配置项

配置stcp客户端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 指定frp服务端的地址
serverAddr = "xx.xx.xx.xx"
# 指定frp服务端的端口
serverPort = 7001

# 定义一个代理配置
[[proxies]]
# 代理的名称,用于标识这个特定的代理配置
name = "secret_ssh"
# 使用stcp类型的代理,适用于SSH等场景
type = "stcp"
# 设置一个密钥,客户端和访问者必须匹配此密钥才能建立连接
secretKey = "xxxx"
# 内网服务的IP地址,这里是本机地址
localIP = "127.0.0.1"
# 内网服务的端口,这里是SSH服务的默认端口
localPort = 22

这部分内容是放在内网的客户端上,也就是要被ssh连接的机器上。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 访问者配置,用于从外网访问内网的SSH服务

# 指定frp服务端的地址
serverAddr = "xx.xx.xx.xx"
# 指定frp服务端的端口
serverPort = 7001

# 定义一个访问者配置
[[visitors]]
# 访问者的名称
name = "secret_ssh"
# 使用stcp类型的代理,与上面定义的代理类型相匹配
type = "stcp"
# 指定要访问的stcp代理的名称,必须与上面定义的代理名称相匹配
serverName = "secret_ssh"
# 设置一个密钥,必须与上面定义的代理的密钥相匹配
secretKey = "xxxx"
# 绑定本地地址,用于访问SSH服务
bindAddr = "127.0.0.1"
# 绑定本地端口,通过访问这个端口来连接内网的SSH服务
bindPort = 1022

启动

接着分别启动frps服务端,内网的frpc客户端,外网的frpc客户端。外网frpc客户端启动方式为:打开cmd,在frp目录下输入frpc.exe -c frpc.toml
这样就启动完成了。
使用以下命令通过 SSH 访问内网机器,假设用户名为 test:

1
ssh -o Port=6000 test@127.0.0.1

stcp相对于tcp多了一个于内网frpc密钥连接的操作,就是有了双重验证(ssh密码,secretKey),更为安全。

结语

使用frp实现内网穿透是一个简单而有效的方法,可以帮助您轻松访问内网中的服务。更多高级配置和使用技巧,请参考frp的官方文档

本文由作者按照 CC BY 4.0 进行授权