Grafana仪表盘对于快速获得关键指标的反馈,或者只是浏览生产系统上用户行为的有趣统计数据来说是非常好的。
在这篇文章中,我将向你展示如何使用inlets PRO作为安全隧道,在你的笔记本电脑、私人数据中心或本地网络上暴露你的私人Grafana仪表盘。inlets PRO将使用TLS提供链接级加密,以防止对隧道流量的窥探。由于Grafana默认不带有TLS,我们将使用Caddy为Grafana获得一个证书,通过隧道输出80和443端口,而不是明文HTTP端口3000。
你的Grafana仪表盘可以部署在Kubernetes内部,或者作为一个Docker容器。我将向你展示如何用一个样本仪表盘进行设置,你可以跟着做,然后将其用于你可能有的任何现有部署。
这里的说明并不是严格针对Grafana的,所以如果你有一个运行在5000端口的flask应用,只要在你看到3000
的地方替换该端口即可。同样,如果你在8080端口上运行OpenFaaS,用8080
替换3000,依此类推。
概述
以下是本教程的工作流程:
- 在Docker中运行Grafana或指向我们网络上的现有安装程序
- 安装
inlets-pro
和inletsctl
- 创建一个隧道和一个有公共IP的出口服务器
- 使用我们的公共IP获得一个域名或添加一个新的子域名
- 安装Caddy
- 运行Caddy,为我们的仪表盘获得一个漂亮的绿色锁。
然后你就可以从任何地方享受你的仪表盘了。
我还会告诉你如何从一个隧道访问多个仪表盘或服务。
你需要一个inlets-pro许可证,你可以在store.openfaas.com购买一个供个人使用,或者使用inlets文档中的链接获得免费试用。
Grafana的快速启动
- 安装Docker
- 运行一个Grafana容器
docker run -d -p 3000:3000 \
--name grafana \
--restart=always \
grafana/grafana:latest
复制代码
现在你在http://127.0.0.1:3000,但是你不能通过互联网访问这个,而且它没有TLS来保护它。
请确保在进一步行动之前,将默认密码从admin/admin改为admin。
获得一个公共IP
运行一个私人仪表盘的问题是,它不能被路由,而且你的管理员不太可能为你打开一个端口。如果你在家里,想用你的ISP和端口转发来做这件事,请再想想,你可能会泄露你的个人信息,并使你的家庭网络成为目标。
让我们得到一个没有附加条件的公共IP。
下载inletsctl并使用它来获取inlets-pro
客户端:
curl -sSLf https://inletsctl.inlets.dev | sudo sh
sudo inletsctl download --pro
# or run without sudo, and move the binary after
复制代码
现在为你喜欢的云创建一个退出服务器(又称退出节点)。我将使用DigitalOcean,它恰好是最快和最便宜的。其他支持的供应商包括:Packet, ec2, scaleway, civo, gce和azure。
运行以下命令,并确保你有一个来自你的仪表盘的访问令牌,保存为~/access-token.txt
注意--remote-tcp
标志,它告诉inlets client
,将流量发送到哪里:
inletsctl create \
--provider digitalocean \
--access-token-file ~/access-token.txt \
--region lon1 \
--remote-tcp 127.0.0.1
复制代码
当程序完成运行后,你会看到一个命令,你可以运行它来连接到隧道并开始代理流量。
你需要将--tcp-ports
标志设置为一个以逗号分隔的端口列表,以冲出隧道,或一个单一的端口。在我们的例子中,我们不会直接暴露Grafana,但我们会暴露Caddy(一个反向代理),它将通过LetsEncrypt启用TLS。
设置export TCP_PORTS=
到80,443
,这是普通HTTP服务ACME挑战所需的两个端口,以及443来服务之后的加密流量:
export TCP_PORTS="80,443"
export LICENSE=""
inlets-pro client --connect "wss://134.122.101.204:8123/connect" \
--token "67462dccc691fd58c485ab5e631c6b69af594572" \
--license "$LICENSE" \
--tcp-ports $TCP_PORTS
复制代码
这是我的客户端程序在运行:
为仪表板准备一个域名
这一步我们需要一个域名,它们的价格低至1美元,所以请不要抱怨。到namecheap.com去买一些有趣的东西,你可以重复使用它,而且不会伤害你的口袋。
如果你已经有一个域名,我们将使用一个子域名。
使用退出服务器的IP地址,用DNS A记录创建一个子域:
dashboard.example.com 134.122.101.204
复制代码
如果你是DigitalOcean的用户,你可以使用doctl
,用这个地址来创建。doctl compute domain create --ip-address $IP $SUB_DOMAIN
.
安装一个反向代理
我们需要一个可以获得TLS证书的反向代理。我发现Caddy 1.0对我们来说足够快速和容易使用。Caddy 2也可以使用,但如果你决定使用它,你需要学习新的Caddy文件格式。
下载MacOS、Linux或Windows的二进制文件:v1.0.4
解压缩或解压缩下载的文件,你会发现caddy
或caddy.exe
。
- 创建一个Caddy文件
dashboard.domain.com
proxy / 127.0.0.1:3000 {
transparent
}
复制代码
第一行告诉Caddy在获取TLS证书时要使用哪个域名
第二个代码块说,任何发送到这个域的请求应该被代理到我们本地机器的3000端口。
试试吧
我们就快成功了,我们需要做的就是运行Caddy,然后打开我们的URL。
- 运行Caddy
如果你是在MacOS上,你需要以sudo
,以访问本地主机的80、443端口。
sudo ./caddy -disable-tls-alpn-challenge
复制代码
注意,你会被要求提供你的域名的电子邮件,输入它然后继续。
https://dashboard.domain.com
复制代码
检查绿色的锁:
更进一步
现在我们有了一个单一的仪表盘,有了自己的域名,我们可以用同样的方法和我们的Caddy服务器添加其他的仪表盘和服务。
在一个不同的端口上运行第二个仪表板:
docker run -d -p 3001:3000 \
--name grafana \
--restart=always \
grafana/grafana:latest
复制代码
编辑Caddyfile
,重新启动caddy:
dashboard1.domain.com {
proxy / 127.0.0.1:3000 {
transparent
}
}
dashboard2.domain.com {
proxy / 127.0.0.1:3001 {
transparent
}
}
复制代码
不需要重启隧道或隧道服务器。
把事情搁置起来
当你不再需要隧道时,只需停止inlets-pro client
和caddy
,并在你需要时再次启动它们。出口服务器可以保持供应,或者你可以用inletsctl create
所给的命令完全删除它。
收尾工作
你现在有了一个安全的隧道,因为inlets-pro在其控制平面上使用了TLS,并通过Caddy提供的TLS证书为Grafana仪表板提供了额外的安全保障。
接下来,你为什么不试试运行另一个Docker容器,并把它放在你的Caddy代理后面,使用不同的DNS名称,比如`openfaas.example.com?