使用 frp 进行内网穿透 —— 在图书馆连接家里的台式机

前言

前年刚搬家来北京的时候,花了大价钱组了一个台式机,结果很长时间在家中闲置,没起到什么作用。这么高的配置不能放着浪费,于是想着以后去国图的时候,可以通过笔记本连接到家里的电脑,写代码玩。

 
查了若干资料,发现这本质上是个 内网穿透 任务。通过此教程,你可以从外网侧(图书馆,咖啡厅 etc.) 远程连接到内网侧(寝室,家里的电脑)。

 
我们采用的方案是使用 frp,通过它可以方便地完成此项任务

frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

 
为了方便,我们做如下几个定义:

  • 你拥有的公网 ip 服务器,下文中代称: 设备 A

  • 处在内网的机器(在你寝室里,家里的机器;你希望连接到的机器),下文中代称:设备 B

  • 处在外网的机器(你带去室外,咖啡厅,图书馆的机器;你希望通过它连接到设备 B 的机器),下文中代称:设备 C

1. 得到一个公网 ip

第一步,你需要固定的公网 ip。翻译成人话就是,你需要一台自己的公网服务器。

 
如果你还没有自己的服务器或域名,可以参照这篇文档购买,并顺便完成一些基本设置。

2. 下载 frp

首先下载 frp。进入到 frp 的 github release 页面,在这里你需要下载两个版本,分别为 设备 A设备 B 下载。我的设备 A 是一台 Debian 10 机器,设备 B 是 Ubuntu 机器,因此我下载了 frp_0.36.2_linux_amd64.tar.gz

 
你需要根据自己的设备操作系统选择合适的版本下载。

 
如果你用的也是 Linux 的发行版,但不清楚应该下载具体什么版本,可以通过命令:

uname -a

 
你看到的输出类似下文,可见我需要下载的是 amd64 的版本。

#Output
Linux vultr.guest 4.19.0-16-amd64 #1 SMP Debian 4.19.181-1 (2021-03-19) x86_64 GNU/Linux

 
下载完成后,将文件分别放置到设备 A B 合适的路径下。如果你的设备 A 用的是命令行操作界面,那你可以使用 ftp 软件或者 命令来将传送文件。

3. frp 的配置

配置设备 A

我们先来配置设备 A。我们要在设备 A 上配置 frps,s 的意思是服务端(server)。

 
解压压缩包,并进入到解压后的文件夹中

tar -xzvf frp_0.36.2_linux_amd64.tar.gz
cd frp_0.36.2_linux_amd64

 
我们修改 frps.ini 文件,如下示例(可能不需要修改):

[common]
bind_port = 7000

 
如果你配置了防火墙 ufw,则需要打开对 7000 端口的连接:

sudo ufw allow 7000

 
修改完成后,运行 frps 软件:

./frps -c ./frps.ini

 
如果配置成功,则会有如下的输出:

# Output
2021/05/15 11:10:47 [I] [root.go:200] frps uses config file: ./frps.ini
2021/05/15 11:10:47 [I] [service.go:192] frps tcp listen on 0.0.0.0:7000
2021/05/15 11:10:47 [I] [root.go:209] frps started successfully

配置设备 B

接着我们配置设备 B。我们要在设备 B 上配置 frpc,c 的意思是客户端(client)。解压后,我们需要修改 frpc.ini 文件,如下所示:

[common]
server_addr = your_ip
server_port = 7000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 1234 // your_port
remote_port = 1234 // your_port

注意,上面的文本段中,你需要把 your_ip 改成你设备 A 的 ip 地址,并且可以将 your_port 修改成你喜欢的数字

 
编辑完成后保存并关闭。同样如果你配置了防火墙 ufw,则需要打开对端口的连接:

sudo ufw allow 1234 // 注意要修改成上面你自定义的值

 
然后在设备 B 上运行 frpc。注意,即便你是 windows 系统的电脑,你也需要通过 cmd 或者 powershell 的命令行运行:

./frpc -c ./frpc.ini

 
如果配置成功,则会在设备 B 的控制台看到如下输出:

2021/05/15 19:12:50 [I] [service.go:304] [2bfa3eba36fbba03] login to server success, get run id [2bfa3eba36fbba03], server udp port [0]
2021/05/15 19:12:50 [I] [proxy_manager.go:144] [2bfa3eba36fbba03] proxy added: [ssh username]
2021/05/15 19:12:50 [I] [control.go:180] [2bfa3eba36fbba03] [ssh username] start proxy success

 
若此时设备 B 和设别 A 连接成功,你还会在设备 A 的控制台中看到如下输出:

2021/05/15 11:15:26 [I] [service.go:449] [082d0699be4cc6da] client login info: ip [222.129.5.229:7947] version [0.36.2] hostname [] os [linux] arch [amd64]
2021/05/15 11:15:26 [I] [tcp.go:63] [082d0699be4cc6da] [ssh username] tcp proxy listen port [your_port]
2021/05/15 11:15:26 [I] [control.go:446] [082d0699be4cc6da] new proxy [ssh username] success

尝试用设备 C 连接设备 B

最后,让我们尝试通过设备 C,以 ssh 的方式连接:

ssh -oPort=your_port username@your_ip

该命令需要注意以下几点:

  • your_port 需要改成你在 frpc.ini 中设置的 remote_port 的值;
  • your_ip 是你设备 A 的 ip 地址
  • username 是你设备 B 的用户名
  • 运行命令后需要输入密码,该密码是你设备 B 上 username 对应的密码

 
如果没有意外发生,则此时就会成功连接到设备 B 中,开始使用吧!

设置 frp 的开机自启动

这里仅介绍 Linux 设备上的自启动配置,我们使用 systemctl 来控制开机自启。

 
配置设备 A 上 frps 服务端的自启动,首先编辑一个配置文件:

sudo vim /lib/systemd/system/frps.service

 
然后在配置文件中写入

[Unit]
Description=fraps service
After=network.target network-online.target syslog.target
Wants=network.target network-online.target

[Service]
Type=simple

#启动服务的命令,需要替换成你放置 frps 的实际路径
ExecStart=/your/path/frps -c /your/path/frps.ini

[Install]
WantedBy=multi-user.target

 
接着启动 frps:

sudo systemctl start frps 

 
最后,设置开机自启:

sudo systemctl enable frps

 
设备 B 上的 frpc 客户端配置方式相同,把上述文件名,配置内容,以及命令名称修改成 frpc 对应的即可。