前言
过年在家,闲来无事到处翻一翻,竟然发现一台十年前的老机子,准备搞一波事情——内网穿透。思索良久,最终选择了 CloudFlare 家的 Argo Tunnel 服务,因为其配置较为方便,而且免费。其实一开始考虑使用 frp,但是其工作时需要一台具有公网IP的主机做监听和转发服务,集群式的应用场景不满足我目前的需求。
系统安装
系统选择
| OS | 选择 |
|---|---|
| Windows | 需求是内网穿透做服务器,2H2G 的小老机并不适合安装 Windows |
| Ubuntu | 服务器首选,但是在安装时总是卡死(猜测是硬件问题) |
| Arch | 安装配置较为繁琐,虽然有一键安装脚本,但是考虑到十年前的机器,还是算了 |
| Manjaro | 安装成功,却总因为网络问题卡死 |
| Mint | 安装成功,运行效果尚可 |
启动盘制作
Rufus、U盘(32GB)、Linux Mint 20.3 Cinnamon Edition
使用 Rufus 以 DD 方式制作镜像。
安装 Mint
进 BIOS 花费了本人不少时间(大无语事件),启动时左下角显示 F12 进入 BIOS 设置,可是怎么按都不顶用,F12、FN+F12、Shift+F12……一堆组合键都尝试过,后来不知按到哪个键突然弹出启动项选择,进入并成功安装系统后才发现键盘坏了,思考一下,应该是按到了F9😀。算是一个小插曲。
由于是全盘安装,安装过程基本无脑,Windows 式的“下一步”,不再赘述。

NAT 穿透
系统安装完成,此时这台机子却只有个“单向门”——只能出不能进,需要配置公网 IP,才能满足成为服务器的这一需求,CloudFlare 的 Argo Tunnel 服务可以完成对端口的监听和响应,关键还免费。
准备
在 CloudFlare 上新建网站并在域名服务商将域名的 DNS 配置成 CloudFlare 所提供的 DNS 服务器。等待响应完成。
arely.ns.cloudflare.com
memphis.ns.cloudflare.com
安装 CloudFlared
官方在 Linux 上的支持很全面。
| Type | amd64/x86-64 | x86(32-bit) | ARM ARM64 |
|---|---|---|---|
| .deb | Download | Download | Download |
| .rpm | Download | Download | Download |
- .deb 安装
wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb dpkg -i cloudflared-linux-amd64.deb
- .rpm 安装
wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-x86_64.rpm
Cloudflared 验证
通过执行命令行登录 CloudFlare ,进行账户验证。
cloudflared tunnel login
创建隧道
通过 CloudFlared 应用创建隧道并命名。
cloudflared tunnel create <NAME>
此时会在.cloudflared/目录下生成一个 JSON 文件,前缀为UUID<UUID>.json。
单隧道执行
如果执行单隧道,可通过 cloudflared 创建 DNS 解析记录,并采取映射方法实现对本机端口的监听(支持多种协议)。
cloudflared tunnel route dns <UUID or NAME> <hostname>
cloudflared tunnel --hostname *.example.com --url http://localhost:port
多隧道执行
在.cloudflared/目录下创建 config.yml 文件。
vim config.yml
tunnel: <Tunnel-UUID>
credentials-file: /root/.cloudflared/<Tunnel-UUID>.json
ingress:
- hostname: *.example.com
service: http://localhost:80
- hostname: *.example.com
service: ssh://localhost:22
- service: http_status:404
启动隧道:
cloudflare tunnel run <NAME or UUID>
通过 hostname 即可访问部署的网络应用或本机应用。
关于 HTTPS
关于 HTTPS,在李峰大佬博客中看到了这样的方法。

本人并未配置成功,在配置文件中加入noTLSVerify: true也无济于事,最后一顿捣鼓才发现,只要在 CloudFlare 站点配置中打开始终使用 HTTPS这一设置即可,无需有其他操作,可能官方为了简化 Tunnel 配置流程做了更新,好评👍。

实例
站点搭建
大学一年级时,一向对“无脑化”的操作表示反感,拒绝一键式的操作,往底层挖,越挖越深……但是经过一两年的“磨练”,才知道时间就是金钱,不然真得熬夜啊!
宝塔真香
搭建宝塔,安装 Nginx,建立站点,修改 config.yml 配置文件,重启 cloudflared 服务。
# Nginx 80 端口
- hostname: *.example.com
service: http://localhost:80

SSH 远程连接
配置文件 config.yml 新增:
# SSH 22 端口
- hostname: ssh.example.com
service: ssh://localhost:22
服务器端重启 cloudflared 服务,主机也需安装 cloudflared ,并在 C:\Users\<name>\.ssh\config 新增:
Host ssh.example.cf
ProxyCommand C:/Program Files (x86)/cloudflared/cloudflared(cloudflared安装位置) access ssh --hostname %h

简单 Web 应用
搭建了一个青龙面板,代理原理和操作过程同上,在配置文件 config.yml 新增 Web 应用的端口和指定域名。

总结
内网穿透,从思考、搜索到实践,前前后后折腾了一下午,期间也遇到了不少困难,但,有意义!从体验上来看,响应速度并不友好,尤其是在 SSH 远程连接时,有感知性的延迟,但是一想到十年老机、免费……还要什么自行车!
