有了新电脑后希望它也能像云服务器一样,在电脑开机并且连着家里 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:1234
,xxa.xb.xxc.xd
为公网 IP,1234
对应 frps.toml
中的 vhostHTTPPort
参数。同样输入电脑用户名和对应的密码即可登录。