嗨,大家好!在这个信息时代,远程访问和安全性变得愈发重要。你是否曾想过如何在不暴露服务器的入站端口的情况下,在互联网上提供SSH服务?别担心,今天我将为你介绍如何通过Cloudflare Zero Trust实现这一目标,确保你的SSH服务器安全可达。废话不多说,让我们开始吧!
步骤1:在GCP上设置SSH服务器
首先,我们需要在Google Cloud Platform(GCP)虚拟机上设置一个SSH服务器。这里以GCP为例,但你可以在支持SSH连接的任何机器上进行设置。
1. 创建SSH密钥对
在创建VM实例之前,你需要创建一个SSH密钥对。打开终端并运行以下命令:
ssh-keygen -t rsa -f ~/.ssh/gcp_ssh -C <你在GCP中的用户名>
在提示时输入你的密码。需要输入两次。
命令行中运行:
cat ~/.ssh/gcp_ssh.pub
复制输出内容,这将在创建GCP VM实例时使用。
2. 在GCP上创建VM实例
现在,SSH密钥对已经创建,你可以创建一个VM实例了。
- 在Google Cloud控制台中,创建一个新项目。
- 转到Compute Engine > VM实例。
- 选择“创建实例”。
- 为你的VM实例命名,例如ssh-server。
- 滚动到“高级选项” > “安全性” > “访问管理”。
- 在“手动添加生成的SSH密钥”下,选择“添加项目”,并粘贴之前创建的公钥。
- 选择“创建”。
一旦你的VM实例运行起来,点击SSH旁边的下拉菜单,选择在浏览器窗口中打开。为了能够建立SSH连接,不要在VM实例上启用OS登录。
步骤2:使用WARP隧道连接SSH服务器
你可以使用Cloudflare Tunnel来创建从服务器到Cloudflare边缘的安全出站连接。这需要在服务器上运行cloudflared守护程序。用户通过在其设备上安装Cloudflare WARP客户端并加入你的Zero Trust组织来访问该服务。远程设备可以像在你的私有网络上一样连接。默认情况下,所有加入你组织的设备都可以访问该服务,除非你构建策略来允许或阻止特定用户。
1. 连接服务器到Cloudflare
通过按照我们的仪表板设置指南为你的服务器创建一个Cloudflare隧道。你可以跳过连接应用程序的步骤,直接转到连接网络。
在隧道的“私有网络”选项卡中,输入服务器的私有IP地址(或包括服务器IP的范围)。在GCP中,服务器IP是VM实例的内部IP。
(可选)设置Zero Trust策略以微调对服务器的访问。
2. 设置客户端
要将你的设备连接到Cloudflare:
- 在设备上以WARP模式部署WARP客户端。仅当你想要显示自定义阻止页面或过滤HTTPS流量时才需要Cloudflare证书。
- 创建设备注册规则,以确定哪些设备可以加入你的Zero Trust组织。
3. 通过WARP路由私有网络IP
默认情况下,WARP客户端将RFC 1918空间的流量排除在Split Tunnel功能之外。例如,WARP自动排除10.0.0.0/8,这些IP地址通常用于私有网络,无法从互联网访问。为了让WARP将流量发送到你的私有网络,你需要在Split Tunnel配置中包括你为Cloudflare隧道指定的IP/CIDR。
要配置私有网络访问的Split Tunnel,请按照以下步骤:
- 首先,检查你的Split Tunnel模式是否设置为排除或包括模式。
- 如果你使用的是包括模式,请将你的网络IP/CIDR范围添加到列表中。
- 如果你使用的是排除模式:
- 从列表中删除你的网络IP/CIDR范围。例如,如果你的网络使用默认的AWS范围172.31.0.0/16,请删除172.16.0.0/12。
- 重新添加没有被你的私有网络明确使用的IP/CIDR范围。对于上面的AWS示例,你需要为172.16.0.0/13、172.24.0.0/14、172.28.0.0/15和172.30.0.0/16添加新的条目。这确保了只有流向172.31.0.0/16的流量通过WARP。
通过缩小WARP中包含的私有IP范围,你可以降低用户访问本地资源的风险。
4. 作为用户进行连接
一旦你设置了应用程序和用户设备,用户现在可以使用其私有IP地址通过SSH连接到机器。如果你的SSH服务器需要SSH密钥,该密钥应包含在命令中。
ssh -i ~/.ssh/gcp_ssh <用户名>@<服务器IP>
通过cloudflared访问SSH服务器
Cloudflare隧道还可以将应用程序路由到公共主机名,允许用户在不使用WARP客户端的情况下连接到应用程序。这需要在服务器机器和客户机器上都安装cloudflared,以及在Cloudflare上拥有活动区域。流量通过此连接代理,用户使用Cloudflare Access凭
证登录到服务器。
公共主机名方法可以与通过WARP进行路由一起实施,以便有多种连接服务器的方式。你可以重复使用同一个隧道用于私有网络和公共主机名路由。
1. 连接服务器到Cloudflare
按照我们的仪表板设置指南创建一个Cloudflare隧道。
在“公共主机名”选项卡中,选择下拉菜单中的域名,并指定任何子域名(例如,ssh.example.com)。
对于“服务”,选择SSH,并输入localhost:22。如果SSH服务器与你安装隧道的机器不在同一台机器上,请输入<服务器IP>:22。
选择“保存主机名”。
(建议)添加一个自托管应用程序到Cloudflare Access,以管理对服务器的访问。
2. 作为用户进行连接
用户可以通过通过cloudflared进行身份验证,或者从浏览器呈现的终端进行连接。
本地终端
在客户机器上安装cloudflared。
对你的SSH配置文件进行一次性更改:
vim ~/.ssh/config
输入以下值;替换ssh.example.com为你创建的主机名。
Host ssh.example.com
ProxyCommand /usr/local/bin/cloudflared access ssh --hostname %h
cloudflared的路径可能因你的操作系统和包管理器而异。例如,如果你使用Homebrew在macOS上安装了cloudflared,路径是/opt/homebrew/bin/cloudflared。
现在,你可以通过运行一个命令来测试连接到服务:
ssh <用户名>@ssh.example.com
当运行命令时,cloudflared将启动一个浏览器窗口,提示你在建立连接之前使用身份提供者进行身份验证。
浏览器呈现的终端
终端用户可以在不进行任何配置的情况下,使用Cloudflare的基于浏览器的终端连接到SSH服务器。当用户访问公共主机名URL(例如https://ssh.example.com)并使用他们的Access凭证登录时,Cloudflare将在他们的浏览器中呈现一个终端。
结束语
通过Cloudflare Zero Trust,我们可以确保SSH服务器的安全可达性,而无需在服务器上打开入站端口。这为远程访问提供了更高的安全性,同时保持了便利性。希望本教程能对你有所帮助,让你的SSH服务器更安全,更容易访问。如果你有任何问题或疑虑,请随时在评论中分享。