什么是内网穿透?简单的说,内网穿透就是使用一台具有公网 IP 地址的电脑(服务器)作为“中间人”来与没有公网 IP 的设备建立连接,实现数据连通。

现实中,我们一般并没有公网 IP,要想实现内网穿透我提供了下面两种可行的方案:

  1. 购买别人提供的内网穿透服务。如花生壳提供的 ddns 动态域名解析服务,好处就是方便不折腾,费用相对也够亲民。对于一部分只想不花钱的小伙伴,这里推荐的是另一种穿透方案 Sakura Frp——花费 1 元 实名认证后可获得两条免费的隧道。(免费版的带宽速度上限10 M,流量一个月 10 GB)
  2. 如果想拥有更好的体验那么就需要花费一定的价钱购买一台具有公网 IP 的云主机部署内网穿透服务,像这种通过自建服务实现内网穿透的方案好处就是有更多的自定义空间,不受服务商的约束。缺点同样也是比较明显的,资费更高同时也受限于云服务器的带宽。

两种常用的内网穿透方案简单的说了一下,具体怎么去实现我也会在下文配上图文教程,此教程是我写的第一篇教程系列文章,因为缺乏经验会有很多的不足,希望读者朋友能够理并给予指正。 本教程不涉及内网穿透的底层实现方法,如果想要了解内网穿透的底层原理还请自行 Google。

方案一

Windows 平台

通过购买 Sakura Frp 服务来实现内网穿透。Sakura Frp 官方文档其实写的也很详细了,新手朋友也可以直接去官网看文档能获得更好的体验。

注册 Sakura Frp 账号

Sakura Frp 注册入口 https://openid.13a.com/register

打开注册页面

screely-1665633364893.png
注册页面

用户中心(在用户中心点击 Sakura Frp 跳转链接)

screely-1665641998416.png
用户中心

注:要想使用 Sakura Frp 服务需要我们支付 1 元来购买实名认证服务。(只要点击用户菜单下的实名认证就可以跳转到实名认证的页面)

进行实名认证

我已经实名认证过了在此就不展示详细的认证的步骤。

screely-1665642047462.png
实名认证

认证成功后可以创建两条免费的隧道了,要想使用隧道还需要在官网下载客户端了,Sakura Frp 的客户端几乎覆盖了当前所有平台(linux mac windows),可以按需下载安装。(教程演示的是官方推荐的 Sakura Frp 启动器)

安装 Sakura Frp 启动器

下载 Sakura Frp 启动器

screely-1665649089053.png
下载软件

我这里下载的是官方推荐的Windows 版 Sakura Frp 启动器,一路回车使用默认配置进行安装。安装完毕后打开。需要输入官网提供的秘钥,然后才能点击登录,秘钥的查看方法如下:

获取秘钥

秘钥查看页面!!!

screely-1665649189806.png
查看密钥

输入秘钥然后登录

screely-1665649298852.png
登录界面

输入秘钥登录后我们就可以试着创建一条隧道了,例如我们在本地搭建了一个博客开启的web端口为 80,现在我们在外面或者在公司想要访问这个博客,我们应该像如下这样配置隧道:

添加隧道

按照图文所示添加隧道:

screely-1665650120147.png

根据实际填写配置信息,然后点击创建,这样第一条隧道就成功创建好了。

screely-1665650321933.png

如何使用刚刚创建的隧道?当我们创建好隧道后,在回到隧道的页面发现刚刚创建的隧道已经出现了,但是这时候还不能够使用,需要我们收到点击开启的按钮这条隧道才算是成功开启了。成功开启的隧道也可以在 Sakura Frp 网站 隧道列表菜单下看到。

screely-1665650481973.png

测试连通性

screely-1665650491535.png

在浏览器输入 cn-zz-bgp-4.natfrp.cloud:43067或者 223.247.140.116:43067可以成功访问内网的博客页面了。

Linux 平台(这部分教程我写的不够详细,如果有疑问请参考下面链接)

linux 平台安装时需要注意的是自己平台的架构,正常选择 adm64 即可。

  • 在软件下载页面选择自己的平台,复制下载链接即可。
image.png
  • 使用下面的命令进入 /usr/local/bin 目录并下载文件:
cd /usr/local/bin

# 一般来说只需要使用这条命令:
wget -O frpc <下载地址>

# 如果上面的命令报错,请尝试这条:
curl -Lo frpc <下载地址>

# Linux frpc 通常已经过 UPX 压缩,如需下载未压缩的版本请在下载地址尾部加上 _noupx
  • 然后设置权限并校验文件是否有损坏:
chmod 755 frpc
ls -ls frpc
md5sum frpc

使用 frpc

通过本文档中介绍的方法安装后,您应该可以在任何目录直接输入 frpc <参数> 运行 frpc ,不需要 输入完整路径。

Systemd 配置 frpc 服务

Systemd 是 Linux 系统的一种初始化系统实现,它管理的各种服务叫做 Unit,每个服务对应一个 Unit 配置文件

在本教程中,frpc 会被注册为一个服务,我们让 Systemd 来自动管理 frpc,借此实现开机自启和后台运行。

编写启动文件

vim /etc/systemd/system/frpc@.service

[Unit]
Description=SakuraFrp Service
After=network.target

[Service]
Type=idle
User=nobody
Restart=on-failure
RestartSec=60s
ExecStart=/usr/local/bin/frpc -f %i

[Install]
WantedBy=multi-user.target

执行下面的命令重载 Systemd,这样服务就配置完成了。

systemctl daemon-reload

!!!请记住后续操作中用到的 Unit 名称 是 frpc@<启动参数>,例如 frpc@wdnmdtoken666666:12345

启动/停止 隧道

启动/停止隧道非常简单,使用下面的命令即可,start 是启动,stop 是停止

systemctl <start|stop> <Unit名称>

举个例子,开启访问密钥为 wdnmdtoken666666 的用户所拥有的 ID 为 12345 的隧道:

systemctl start frpc@wdnmdtoken666666:12345

查看隧道状态

systemctl status frpc@wdnmdtoken666666:12345

查看隧道日志信息

journalctl -u frpc@wdnmdtoken666666:12345

配置开机自启

systemctl enable frpc@wdnmdtoken666666:12345

方案二

第二种方案是购买云服务器自建内网穿透服务,适合一些有点 Linux 基础的,如果教程有写的不明白的地方也可以去官方文档查看。

frp.drawio.png
架构图

前置条件:

  1. 拥有公网 IP 的主机(记得在云服务器控制台开启端口策略)
  2. 可以访问 GitHub

仓库地址https://github.com/fatedier/frp

官方文档https://gofrp.org/docs/

在官方的仓库下载对应自己系统的程序,此教程以 Linux 为例:

screely-1665651967022.png

服务端配置

云服务器部署 Frp 服务端

  1. 将下载好的包上传至服务器解压
# 解压上传的 tar 包
tar -xzvf frp_0.44.0_darwin_amd64.tar.gz

# 将解压的包重命名为 frp
mv frp_0.44.0_darwin_amd64 frp

# cd 进入目录,目录内容如下:
[root@localhost frp]# tree
.
├── frpc
├── frpc_full.ini
├── frpc.ini
├── frps
├── frps_full.ini
├── frps.ini
└── LICENSE
# frps为可执行程序 frps.ini 为配置文件,服务端我们只需要这两个文件,frpc frpc.ini 为客户端文件。

在启动服务端之前我们要去修改一下 frps.ini 配置文件,这里使用了一个最简化的配置,设置了 frp 服务端接收客户端连接的端口:

vim frps.ini

[common]
bind_port = 7000

服务端的配置写好后就需要启动 frps 服务器了,但是为了方便控制 frps 的启动和停止我们需要利用 systemd 来管理 frps 服务,下面我们来做一下操作:

1.使用文本编辑器,如 vim 创建并编辑 frps.service 文件

vim /etc/systemd/system/frps.service

2.写入内容

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

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

[Install]
WantedBy = multi-user.target

3.使用 systemd 命令,管理 frps

# 启动frp
systemctl start frps
# 停止frp
systemctl stop frps
# 重启frp
systemctl restart frps
# 查看frp状态
systemctl status frps

4.配置 frps 开机自启

systemctl enable frps

到此服务端的配置已经完成,下面就是客户端的配置过程了。

客户端配置

客户端的配置要比服务端的复杂一点,因为针对场景的不同配置文件则也有相应的变化,下面我主要针对 远程 ssh 服务和 web 服务使用场景来做一个配置教学。

1.通过 ssh 访问内网机器

客户端的配置和服务端的配置大径相同,重复的操作这里就不演示了简单的用文字描述,将下载的 frp_0.44.0_darwin_amd64.tar.gz 包上传一份到客户端并进行解压,重复服务端的操作——将包重命名——然后编辑配置文件。(注意:客户端需要用到 frpc 和 frpc.ini 两个文件)

修改 frpc.ini 文件,假设 frps 服务端的公网 IP 为 100.100.1.100

vim  frpc.ini

[common]
server_addr = 100.100.1.100
server_port = 7000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

local_iplocal_port 配置为本地需要暴露到公网的服务地址和端口。remote_port 表示在 frp 服务端监听的端口,访问此端口的流量将会被转发到本地服务对应的端口。

在启动frpc 客户端之前,我们同样需要 让 systemd 来管理 frpc 的服务。

1.使用文本编辑器,如 vim 创建并编辑 frpc.service 文件

vim /etc/systemd/system/frpc.service

2.写入内容

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

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

[Install]
WantedBy = multi-user.target

3.使用 systemd 命令,管理 frps

# 启动frp
systemctl start frpc
# 停止frp
systemctl stop frpc
# 重启frp
systemctl restart frpc
# 查看frp状态
systemctl status frpc

4.配置 frpc 开机自启

systemctl enable frpc

测试连通性

至此,服务端和客户端都已经正常启动了,我们可以通过 ssh 访问内网机器,假设用户名为 opus:

ssh -p 6000 opus@100.100.1.100

frp 会将请求 100.100.1.100:6000 的流量转发到内网机器 22 端口。

示例(更多使用示例请参考文档)

最后:如果需要完全免费的可以试试Tailscale,用它来组建隧道免费的绝对够用,但是我体验了之后发现因为节点都是在国外延迟很高,不介意的可以自己试试。

本文参考文档均来自 Sakura Frp 官方文档 和 GoFrp 官方文档