目录导航
结果
在这篇文章结束时,您将能够:ssh $machine_name
使用 SSH 密钥从连接互联网的星球上的任何地方运行。它是免费的,不需要将来维护。本指南使用Cloudflare Tunnel,这是 Cloudflare 提供的一项免费服务。它将通过 Cloudflare 的网络过滤到您的计算机的流量,包括对您进行身份验证。因此,您的机器不会直接暴露给威胁参与者和“1337 haxors”。
原理
您可能有一台机器在您的本地网络中运行,并希望从世界任何地方进行访问。替代解决方案包括:
- 将您的路由器配置为端口转发到您的特定机器或将您的机器设置为非军事区 (DMZ)。缺点:您的家庭路由器的 IP 地址可能会更改,因此您需要使用新的 IP 地址。每个端口也仅限于一台机器,因此您必须为不同的机器选择不同的端口。您的 DNS 记录还会发布您的路由器的 IP 地址,该地址可用于定位您 –有点不可靠,具体取决于您的身份。
- anderspitman/awesome-tunnelling中列出了许多替代方案,包括Cloudflare Tunnel。其中很多都需要配置,而我上次尝试ngrok的时候,在free tier上无法选择域名。
我已经将 Cloudflare 用于该网站(Cloudflare Pages)、网络分析、配置 DNS 记录和注册我的域(除了管理员费用之外没有额外费用,例如 Verisign for.com
和 Nominet for .uk
)。嘿,英国域名所有者,Cloudflare Registrar 现在支持uk
和co.uk
TLD ?。
所以我曾经cloudflared
这样做,但意识到没有任何指南可以让我一步一步走向成功。有一个Cloudflare 官方指南,但有些步骤不是必需的,令人困惑(例如,将“应用程序”限制为 1 个月)并且缺少config.yml
架构。
先决条件?
- 免费的 Cloudflare 帐户
- 通过遵循设置您的第一个隧道来了解 Cloudflare 隧道。您最终将获得一个添加到 Cloudflare 的网站,在您的计算机上
cloudflared
安装并登录,并对 Cloudflare Tunnel 有较高的了解。您不必执行第 4 步(创建配置文件)或之后的步骤。
在目标机器上设置 SSH 服务器?
- 如果您已经这样做了,请跳过,例如,您已经可以通过 SSH 连接到您的机器。
- 对于 Ubuntu/Debian,
- 安装服务:运行
sudo apt install openssh-server
- 启动服务:运行
sudo systemctl start ssh
- 计划服务(在机器启动时启动):
sudo systemctl enable ssh
- 安装服务:运行
- 对于其他操作系统,请尝试使用搜索引擎。
快速检查:设置隧道和 SSH ?
- 这一步只是在您浪费时间配置内容之前快速检查您是否可以通过 SSH 连接到机器。
- 启动 cloudflare 隧道:运行
cloudflared tunnel --hostname machine.example.com --url ssh://localhost:22
- 提醒:编辑
example.com
您在 Cloudflare 上添加的内容,然后更新machine
为您喜欢的任何内容。cloudflared
将创建一个名为的 CNAME 记录machine.example.com
。
- 提醒:编辑
- 使用基于密码的身份验证通过 SSH 连接到您的机器:运行
ssh [email protected]
- 提醒:更新用户名和主机。

配置cloudflared
服务??
- 我们希望这个服务一直在运行(守护进程),而不仅仅是在我运行命令时。此外,Cloudflare: Run as a service中的一些步骤被破坏。
- 创建隧道:
cloudflared tunnel create $tunnel_name
,您可以在哪里$tunnel_name
引用它的名称。 - 更新 DNS 记录:
cloudflared tunnel route dns $tunnel_id phanteks.orth.uk
- 创建一个配置文件:
~/.cloudflare/config.yml
,包含:
tunnel: $tunnel_id
credentials-file: /home/$user/.cloudflared/$tunnel_id.json
url: ssh://localhost:22
- 运行隧道:`cloudflared tunnel run –url=ssh://localhost:22$ $tunnel_name
- 安装服务:
sudo cloudflared --config /home/ben/.cloudflared/config.yml service install
- 启动服务:运行
sudo systemctl start cloudflared
- 计划服务(在机器启动时启动):
sudo systemctl enable cloudflared
配置 SSH 客户端?
- 创建一个密钥对。私钥是给你的客户的,公钥应该给任何想要对你进行身份验证的人(你想要通过 SSH 连接到的机器,Phanteks)。我的密钥对称为
phanteks
(私钥)和phanteks.pub
(公钥):- 运行
ssh-keygen
。在此之前,最好cd ~/.ssh
将您生成的密钥存储在那里。
- 运行
- 复制公共SSH 密钥 (
$KEYNAME.pub
):运行ssh-copy-id -i ~/.ssh/KEYNAME.pub $machine_domain
- 将以下内容添加到
~/.ssh/config
. 如果文件不存在,则创建该文件。
# This only works when you are on the same local network
Host phanteksLocal
HostName Phanteks.local
IdentityFile ~/.ssh/phanteks
User ben
Port 22
# Cloudflare Tunnel
Host phanteks
HostName phanteks.orth.uk
IdentityFile ~/.ssh/phanteks
ProxyCommand cloudflared access ssh --hostname %h
User ben

安全的 SSH 服务器?
- 可选:更改 SSH 使用的端口,因为默认端口是众所周知的 (22)。您还必须更新
~/.ssh/config
并~/.cloudflared/config.yml
使用这个新端口。- 警告‼️:实际上是在安装服务时
cloudflared
将此文件复制到第一个。/etc/cloudflared/config.yml
如果您更改~/.cloudflared/config.yml
,请务必:- 手动更新文件,或
- 删除文件(运行
sudo rm /etc/cloudflared/config.yml
)并重新安装服务(运行sudo cloudflared --config /home/$USER/.cloudflared/config.yml service install
)。
- 警告‼️:实际上是在安装服务时
- 可选:禁用密码验证
- 这样做通常是为了提高安全性:缓解随机密码攻击,但这已经通过 Cloudflare Tunnels 得到缓解。
- 但本着“纵深防御”的精神,我们还是应该禁用它。我们应该假设攻击者可能仍然来自您的本地网络,包括成功使用 Cloudflare Tunnel 进行身份验证
- 重启服务:运行
sudo systemctl restart ssh cloudflared
用法:连接机器?
- 运行
ssh phanteks
结论?
- 也许有一种方法可以自动执行此操作,因此我将来使用的所有机器都将自动设置。值得庆幸的是,我不会在家里建造服务器场或经常搬家,所以这是一个非常低的优先级。昨天我只是快速浏览了一下 Ansible。
- 问题:您是否使用不需要维护或运行成本的不同工具?
转载请注明出处及链接