版本比较
标识
- 该行被添加。
- 该行被删除。
- 格式已经改变。
原理简介
类似于国内花生壳、Cpolar 的国外内网穿透服务,能够正常运行在国内的网络环境中。并且还免费。
Cloudflare Tunnel是Cloudflare零信任网络的一个产品,用于打通企业、员工、设备之间的边界,从而摒弃掉VPN之类的过时技术(其实也不是过时,只不过是相对来说安全性、可控性较差)
通过Cloudflare Tunnel,可以实现云与设备之间打通一条加密通道,这样Cloudflare的CDN就可以很方便的通过这条加密通道访问到部署在内网的服务,包括Web、SSH等。同时,还不用考虑电信、移动等ISP不提供固定IP地址、不能开放端口,甚至解决备案的问题。
所以,整套内网穿透的方案大致如下:
前置条件
- 登陆https://dash.cloudflare.com/并注册账号,开通 Cloudflare Zero Trust
- 将自己的 DNS 域名解析 NS 记录 改为 Cloudflare 提供的记录
- 能够连接外部网络的操作系统
安装 Cloudflared
代码块 | ||
---|---|---|
| ||
curl -L 'https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64' -o /usr/local/bin/cloudflared chmod +x /usr/local/bin/cloudflared |
登陆 Cloudflared
代码块 | ||
---|---|---|
| ||
cloudflared tunnel login |
输入命令后,终端会给出一个登陆地址,我们拷贝到浏览器里面打开,选择需要授权的网站。
代码块 | ||
---|---|---|
| ||
root@debian:/tmp# cloudflared tunnel login A browser window should have opened at the following URL: https://dash.cloudflare.com/argotunnel?aud=&callback=https%3A%2F%2Flogin.cloudflareaccess.org%2FDcPAeVobGywl1JXAa-IBTDA7FJ0d2RwAHfOOAX9S3x0%3D If the browser failed to open, please visit the URL above directly in your browser. 2024-02-16T07:59:25Z INF Waiting for login... 2024-02-16T08:00:18Z INF Waiting for login... 2024-02-16T08:01:11Z INF Waiting for login... 2024-02-16T08:02:04Z INF Waiting for login... 2024-02-16T08:02:57Z INF Waiting for login... 2024-02-16T08:03:49Z INF Waiting for login... 2024-02-16T08:04:42Z INF Waiting for login... 2024-02-16T08:05:35Z INF Waiting for login... 2024-02-16T08:06:28Z INF Waiting for login... 2024-02-16T08:07:21Z INF Waiting for login... Your browser will download the certificate instead. You will have to manually copy it to the following path: /root/.cloudflared/cert.pem |
信息 | ||
---|---|---|
| ||
注意:授权一次只能选择一个网站。如果存在多个不同域名的网站,请授权完成后不要关闭网页,点击第二个、第三个要授权的域名,进行多次授权。 |
创建隧道
授权完以后,我们需要创建隧道。一般建议一台服务器创建一个隧道。
代码块 | ||
---|---|---|
| ||
cloudflared tunnel create <隧道名字> # 比如 cloudflared tunnel create webserver-1 |
创建完以后,会输出隧道的一个UUID,记录下来
代码块 | ||
---|---|---|
| ||
root@debian:/tmp# cloudflared tunnel create webserver-1 Tunnel credentials written to /root/.cloudflared/11960f72-79cb-8a7d-27ad71ba9fbc.json. cloudflared chose this file based on where your origin certificate was found. Keep this file secret. To revoke these credentials, delete the tunnel. Created tunnel webserver-1 with id 11960f72-79cb-8a7d-27ad71ba9fbc |
域名指向
接着,我们需要把域名指向到对应的隧道
信息 | ||
---|---|---|
| ||
注意:下面的命令只会对第一个授权的顶级域名生效,比如abc.com和*.abc.com。如果有多个域名,比如123.com、456.com,需要手工添加CNAME记录。 |
代码块 | ||
---|---|---|
| ||
cloudflared tunnel route dns <隧道名字> <域名> # 比如一级域名(和Web界面不一样,不需要输入@) cloudflared tunnel route dns webserver-1 abc.com # 又比如二级域名 cloudflared tunnel route dns webserver-1 www.abc.com |
这时候,Cloudflare会自动添加一条CNAME记录到对应的域名。
对于多个其他域名,我们需要登录Cloudflare的Web控制台,对应添加CNAME记录,记录值是
配置 Cloudflared
先编辑一个配置文件
代码块 | ||
---|---|---|
| ||
vim ~/.cloudflared/config.yml |
代码块 | ||
---|---|---|
| ||
tunnel: <隧道UUID> credentials-file: /root/.cloudflared/<隧道UUID>.json protocol: h2mux ingress: # 第一个网站,连接到本地的80端口 - hostname: <域名1.com> service: http://localhost:80 # 第二个网站,https协议,连接到本地的443端口,禁用证书校验(用于自签名SSL证书) - hostname: <域名2.com> service: https://127.0.0.1:443 originRequest: noTLSVerify: true originServerName: <域名2.com> # 第三个网站,8012端口,泛域名 - hostname: <*.域名3.com> service: http://localhost:8012 # 第四个,反代MySQL sock服务 - hostname: <mysql.域名4.com> service: unix:/tmp/mysql.sock # 第五个,反代SSH服务 - hostname: <ssh.域名5.com> service: ssh://localhost:22 - service: http_status:404 |
更多支持的服务和配置方式,参考帮助文档:Supported protocols
配置完以后,我们测试下配置文件有没有问题
cloudflared tunnel ingress validate
还可以再测试下规则是否命中
cloudflared tunnel ingress rule https://<域名1.com>
SSH 访问配置
默认情况下无法直接通过 SSH 工具访问,在 Linux 环境中可以利用 cloudflared 设置 ssh 配置文件的方式方法【应该是利用自有的工具获取实际访问地址实现类似代理访问的操作】。详细的配置可以参考 https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/use-cases/ssh/
代码块 | ||
---|---|---|
| ||
vim ~/.ssh/config Host ssh.example.com ProxyCommand /usr/local/bin/cloudflared access ssh --hostname %h |
测试运行
如果没问题,开始测试
cloudflared --loglevel debug --transport-loglevel warn --config ~/.cloudflared/config.yml tunnel run <隧道UUID>
终端会输出一大堆log,但没有红色报错,那就没问题。
登陆Cloudflare Zero Trust的Web控制台,左边选择Access-Tunnels,可以看到隧道已经跑起来了,状态是Active。
创建系统服务
为了让服务能每次系统启动的时候都跟着启动,我们需要把 Cloudflared 注册成系统服务。不然系统一重启,就歇菜了。
代码块 | ||
---|---|---|
| ||
cloudflared service install systemctl start cloudflared systemctl status cloudflared |
跑完这三条命令,应该就可以看到服务有正常输出,并且Web控制台也可以看到状态是 Active。
信息 | ||
---|---|---|
| ||
注意:创建系统服务后,配置文件会被拷贝到 /etc/cloudflared/config.yml,后续修改配置必须修改新文件 |
使用 Cloudflare Tunnels 通过 Web SSH 访问服务器
Cloudflre 的 Zero Trust 支持通过 Tunnels 访问 SSH 类型的应用,可以通过 Web SSH 的方式访问服务器;支持多种登陆认证方式,安全性远高于直接暴露公网端口
创建 SSH 应用
- 创建应用
在 Cloudflare 控制台 > Zero Trust > Access > Applications 选择 Add an application 创建新的应用;应用类型为 Self-hosted
Image Added
- 配置应用信息
指定应用名称,并为应用配置域名;session 的过期时间可以按需配置
Image Added
- 指定访问策略
需要配置访问策略,只允许特定的邮箱登陆;如果需要使用其他的认证方式,如 GitHub/Google SSO 等,可以在 Cloudflare 控制台 > Zero Trust > Settings > Authentication > Login Methods 中添加
Image Added
- 修改应用类型
在 Additional settings 中,将 Browser rendering 的类型改为 SSH;然后选择保存,这样就配置好 SSH 应用了
Image Added
访问
访问刚才配置的 SSH 服务的域名;会提示使用邮箱或者配置的方式进行登陆
Image Added
目录 |
---|