使用云服务器进行内网穿透

吴诗涛 2024-06-17

有了新电脑后希望它也能像云服务器一样,在电脑开机并且连着家里 WiFi 的情况下能随时访问。于是想起了之前听说但没有实践过的内网穿透技术。

打个比方,内网穿透就是在内部网络(如家里的 WiFi)和外部网络(如移动网络)中间搭建一个桥梁,让外部网络中的设备可以连接内部网络中的设备。最常见的例子或许是智能家居:出门在外的时候可以用手机控制家里连接着 WiFi 的电器。

俺做内网穿透的目标也是如此:让出门在外的自己可以用手机、平板、电脑连接使用家里的电脑,目前看 ssh 连接和 http 访问某个端口即可满足我的需求。采用的工具是开源的 frp,除了电脑,还需要有一台带公网 IP 的云服务器。

分别下载适合操作系统的 frp 到电脑和云服务器上,由于我都是 Linux,下载了 amd64 的版本。

接下来需要在云服务器上设置 frps.toml,在电脑上设置 frpc.toml,详细可查看官方文档

云服务器配置

云服务器上需修改 frps.toml 文件,而后设置开机启动。要注意在云服务器的安全组打开对应的端口。

frps.toml 设置如下:

# frps.toml
bindPort = 9876
vhostHTTPPort = 1234  # 这是给其他应用开放的 http 端口,如没有可以跳过

webServer.addr = "0.0.0.0"
webServer.port = 4321           # 设置服务端 dashboard 端口
webServer.user = "xxxxxx"       # 服务端 dashboard 账号
webServer.password = "xxxxxx"   # 服务端 dashboard 密码
webServer.pprofEnable = true

使用 systemd 设置开机自启,按照官方文档的步骤操作即可:

# 在 /etc/systemd/system 目录下创建一个 frps.service 文件
sudo vim /etc/systemd/system/frps.service

frps.service 中写入以下内容:

# frps.service
[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# 启动 frps 的命令,需修改为您的 frps 的安装路径
ExecStart = /path/to/frps -c /path/to/frps.toml

[Install]
WantedBy = multi-user.target

启动 frps:

sudo systemctl start frps

而后设置 frps 开机自启动即可:

sudo systemctl enable frps

按照以上操作,服务端的 frps 就设置好啦!下面附上一些常用的 systemd 其他命令:

# 重启 frps
sudo systemctl restart frps

# 查看 frps 状态
sudo systemctl status frps

# 关闭 frps
sudo systemctl stop frps

# 关闭 frps 开机自启动
sudo systemctl disable frps

本地电脑设置

本地电脑需修改 frpc.toml 文件,而后设置开机启动。

目前 frpc.toml 设置如下:

# frpc.toml
serverAddr = "xxa.xb.xxc.xd"  # 云服务器的公网 IP
serverPort = 9876             # 和 frps.service 的 bindPort 一致

webServer.addr = "127.0.0.1"
webServer.port = 7400         # 设置本地 dashboard 端口
webServer.user = "admin"      # 本地 dashboard 账号
webServer.password = "admin"  # 本地 dashboard 密码

[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 5678             # ssh 访问端口

[[proxies]]
# 这个配置是让本地的 rstudio server 可以通过公网 IP + 1234 端口可以访问
name = "rstudio"
type = "http"
localPort = 8787                   # rstudio server 的本地端口,默认 8787
customDomains = ["xxa.xb.xxc.xd"]  # 没有域名可以直接写 IP

设置 frpc 开机自启动的方法同理:

# 在 /etc/systemd/system 目录下创建一个 frpc.service 文件
sudo vim /etc/systemd/system/frpc.service

frpc.service 文件中写入以下内容

# frpc.service
[Unit]
Description = frp client
After = network.target

[Service]
Type = simple
# 启动 frps 的命令,需修改为您的 frpc 的安装路径
ExecStart = /path/to/frpc -c /path/to/frpc.toml

[Install]
WantedBy = multi-user.target

启动 frpc:

sudo systemctl start frpc

设置 frpc 开机自启动:

sudo systemctl enable frpc

使用 ssh 连接和 http 访问特定端口

设置好 frps 和 fprc 后,即可通过外部设备访问连接本地电脑啦!

ssh 连接方式与访问云服务器一样,在终端输入:

ssh -p 5678 name@xxa.xb.xxc.xd 

name 为电脑登录用户名,5678 对应 frpc.toml 中的 remotePort 参数,xxa.xb.xxc.xd 为公网 IP。最后输入用户名对应的密码即可登录。

http 访问直接在外部设备的浏览器输入 xxa.xb.xxc.xd:1234xxa.xb.xxc.xd 为公网 IP,1234 对应 frps.toml 中的 vhostHTTPPort 参数。同样输入电脑用户名和对应的密码即可登录。