返回
Featured image of post 使用 frp 进行内网穿透

使用 frp 进行内网穿透

进行内网穿透时,一个非常好用的反向代理

frp

我们先来看看介绍:

frp 是一个快速的反向代理,可将位于 NAT 或防火墙后面的本地服务器公开到 Internet。它目前支持 TCP 和 UDP,以及 HTTP 和 HTTPS 协议,使请求可以通过域名转发到内部服务。

我们需要的前置条件:

  • 一个公网 ip(可以购买各云服务商的云服务器获得)
  • 一个需要公开的宿主机(需要安装 frp)
  • 访问该宿主机的本地主机(根据 frp 的不同设置,可能需要安装 frp)

# 公网 ip(云服务器)

在 frps.toml 中设置如下:

bindPort = 5000

这里我们使用 5000 端口进行监听,需要在防火墙开放该端口号

# tcp 连接

如果使用 tcp 连接,则宿主机的 frpc.toml 的配置如下:

serverAddr = "云服务器公网 ip"
serverPort = 5000 #与 bindPort 的端口号一致

[[proxies]]
name = "tcp-test"
type = "tcp"
localIP = "127.0.0.1" #可以是 localhost 也可以是局域网地址
localPort = 9527 #需要暴露的端口号
remotePort = 9001 #在公网服务器中访问的端口号,需要在防火墙开放该端口
use_encryption = true #加密数据相关
use_compression = true

从而实现了 公网 ip:9001 -> localhost:9527 的绑定关系,我们外网环境下访问公网 ip:9001 即可

如果按照上述方法使用,相当于所有人只要知道了我们的公网 ip 和访问的端口号,就可以任意使用我们的宿主机,如果是联机打游戏,似乎可以接受,但是如果涉及到 ssh 连接,我们可能需要一种更为私密的方式,即我们的 stcp 连接

# stcp 连接

如果使用 stcp 连接,则宿主机的 frpc.toml 的配置如下:

serverAddr = "云服务器公网ip"
serverPort = 5000

[[proxies]]
name = "secret_server"
type = "stcp"
# 只有与此处设置的 secretKey 一致的用户才能访问此服务
secretKey = "123456789"
localIP = "127.0.0.1" #可以是 localhost 也可以是局域网地址,如果是学校服务器可能需要注意使用其公网 ip 地址,因为可能有防火墙拦截
localPort = 12345 #需要暴露的端口号

本地主机的 frpc.toml 的配置如下:

serverAddr = "云服务器公网ip"
serverPort = 5000

[[visitors]]
name = "secret_vistor"
type = "stcp"
# 要访问的 stcp 代理的名字
serverName = "secret_server"
secretKey = "123456789"
# 绑定本地端口以访问 SSH 服务
bindAddr = "127.0.0.1"
bindPort = 6000 #本地使用的端口号

从而实现了本地主机 127.0.0.1:6000 -> 宿主机 ip:12345 的绑定关系,我们在自己本地主机的环境下使用 127.0.0.1:6000 即可正常访问到宿主机的服务

tmux 脚本

每次手敲指令还是太累了,云服务器上可以一直挂载运行,但本机访问的时候,每次启动都要敲一堆指令来运行,为什么不写一个脚本呢?

使用 tmux 是因为即便关闭了终端,依然可以进行正常连接

最终的 frp.sh 脚本如下:

command="~/frp/frpc -c ~/frp/frpc.toml"

# 创建一个名为 "frp" 的 tmux 会话

tmux new-session -d -s frp

# 向 tmux 会话中发送执行命令

tmux send-keys -t frp "$command" ENTER
Licensed under CC BY-NC-SA 4.0
最后更新于 2024-05-29 15:30 +0800
Built with Hugo | 主题 StackJimmy 设计