前言

过年在家,闲来无事到处翻一翻,竟然发现一台十年前的老机子,准备搞一波事情 —— 内网穿透。思索良久,最终选择了 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 设置,可是怎么按都不顶用,F12FN+F12Shift+F12…… 一堆组合键都尝试过,后来不知按到哪个键突然弹出启动项选择,进入并成功安装系统后才发现键盘坏了,思考一下,应该是按到了 F9😀。算是一个小插曲。
由于是全盘安装,安装过程基本无脑,Windows 式的 “下一步”,不再赘述。
20220204190003

NAT 穿透

系统安装完成,此时这台机子却只有个 “单向门”—— 只能出不能进,需要配置公网 IP,才能满足成为服务器的这一需求,CloudFlare 的 Argo Tunnel 服务可以完成对端口的监听和响应,关键还免费。

准备

在 CloudFlare 上新建网站并在域名服务商将域名的 DNS 配置成 CloudFlare 所提供的 DNS 服务器。等待响应完成。

1
2
arely.ns.cloudflare.com
memphis.ns.cloudflare.com

安装 CloudFlared

官方在 Linux 上的支持很全面。

Typeamd64/x86-64x86(32-bit)ARM ARM64
.debDownloadDownloadDownload
.rpmDownloadDownloadDownload
  • .deb 安装
    1
    wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb dpkg -i cloudflared-linux-amd64.deb
  • .rpm 安装
    1
    wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-x86_64.rpm

Cloudflared 验证

通过执行命令行登录 CloudFlare ,进行账户验证。

1
cloudflared tunnel login

创建隧道

通过 CloudFlared 应用创建隧道并命名。

1
cloudflared tunnel create <NAME>

此时会在.cloudflared/ 目录下生成一个 JSON 文件,前缀为 UUID<UUID>.json

单隧道执行

如果执行单隧道,可通过 cloudflared 创建 DNS 解析记录,并采取映射方法实现对本机端口的监听(支持多种协议)。

1
2
cloudflared tunnel route dns <UUID or NAME> <hostname>
cloudflared tunnel --hostname *.example.com --url http://localhost:port

多隧道执行

.cloudflared/ 目录下创建 config.yml 文件。

1
vim config.yml
1
2
3
4
5
6
7
8
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

启动隧道:

1
cloudflare tunnel run <NAME or UUID>

通过 hostname 即可访问部署的网络应用或本机应用。

关于 HTTPS

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

实例

站点搭建

大学一年级时,一向对 “无脑化” 的操作表示反感,拒绝一键式的操作,往底层挖,越挖越深…… 但是经过一两年的 “磨练”,才知道时间就是金钱,不然真得熬夜啊!宝塔真香

搭建宝塔,安装 Nginx,建立站点,修改 config.yml 配置文件,重启 cloudflared 服务。

1
2
3
# Nginx 80 端口
- hostname: *.example.com
service: http://localhost:80

20220207230333

SSH 远程连接

配置文件 config.yml 新增:

1
2
3
# SSH 22 端口
- hostname: ssh.example.com
service: ssh://localhost:22

服务器端重启 cloudflared 服务,主机也需安装 cloudflared ,并在 C:\Users\<name>\.ssh\config 新增:

1
2
Host ssh.example.cf
ProxyCommand C:/Program Files (x86)/cloudflared/cloudflared(cloudflared安装位置) access ssh --hostname %h

20220207231232

简单 Web 应用

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

总结

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