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