localhost使用ipv4_使用 blackbox exporter 实现域名证书过期监控
個人網站我一般使用 [Let's Encrypt](https://letsencrypt.org/) 的免費 CA 證書,當網站一多管理這些證書就顯得比較麻煩,所以我非常希望有一個工具,能夠將這些域名服務狀態都列出來,包括證書過期時間、訪問延遲、以及請求狀態碼等。
恰好上周看到 Grafana Labs 的一篇博客 [How we eliminated service outages from ‘certificate expired’ by setting up alerts with Grafana and Prometheus](https://grafana.com/blog/2020/11/25/how-we-eliminated-service-outages-from-certificate-expired-by-setting-up-alerts-with-grafana-and-prometheus/) 中講到了使用 Grafana 的 表格視圖來展示域名證書監控信息,覺得非常受用,驚呼這不就是我長期想要的東西嗎?
Grafana 監控面板效果圖
迫不及待,我立馬在本地搭建了一套測試環境體驗了一下,下面是整個測試過程。
本地測試環境搭建
我是在 Mac 上使用 Docker 搭建的測試環境,網絡拓撲如下:
因為服務之間要相互訪問,為了防止重啟 container 導致IP地址變化,故創建了一個叫做 `mynetwork` 網段為 `172.18.0.0/16` 的自定義網絡。創建容器的時候可以通過 `--ip` 手動分配靜態 IP,各容器分配的 IP 地址如上圖。
啟動 nginx 容器
啟動 nginx 之前我們需要創建測試域名的證書和配置文件,本次測試涉及三個域名(www.test01~3.com)。
創建域名證書
使用?`genrsa.sh` 腳本批量創建自簽名證書,腳本內容如下:
#!/bin/bash#1、該腳本支持自動生成私有證書# ,用$1,$2....表示,第1,2...個參數,分表表示域名和過期時間if [ "$#" -ne 2 ]; then echo "genrsa.sh www.test01.com 60" exit 1fireadonly DOMAIN=$1readonly EXPIRATION=$2openssl genrsa -out $DOMAIN.key 2048openssl req \ -subj "/C=CN/ST=Beijing/L=Beijing/O=Tester/OU=Tester Software/CN=$DOMAIN/emailAddress=test@prometheus.show" \ -new \ -key $DOMAIN.key \ -out $DOMAIN.csropenssl x509 \ -req \ -days $EXPIRATION \ -in $DOMAIN.csr \ -signkey $DOMAIN.key \????-out?$DOMAIN.crt運行效果:
創建 nginx 配置文件
# touch nginx/conf.d/www.test01.com.confserver { listen 443 ssl; server_name www.test01.com; ssl_certificate ssl/www.test01.com.crt; ssl_certificate_key ssl/www.test01.com.key; location / { return 200; }}# touch nginx/conf.d/www.test02.com.confserver { listen 443 ssl; server_name www.test02.com; ssl_certificate ssl/www.test02.com.crt; ssl_certificate_key ssl/www.test02.com.key; location / { return 403; }}# touch nginx/conf.d/www.test03.com.confserver { listen 443 ssl; server_name www.test03.com; ssl_certificate ssl/www.test03.com.crt; ssl_certificate_key ssl/www.test03.com.key; location / { return 200; }}創建了三個域名所需的證書和配置文件。
網站 www.test02.com 返回 403 狀態碼,其它返回 200。
執行容器啟動命令
docker run -d --name nginx \ --net mynetwork --ip 172.18.0.2 \ -v `pwd`/nginx/ssl:/etc/nginx/ssl:ro \ -v `pwd`/nginx/conf.d:/etc/nginx/conf.d \ nginx到此為止用于測試的 nginx 容器就啟動起來了,它包了 www.test01~3.com 三個測試域名,每個域名都有自己的證書,每個證書過期時間不同。
啟動 blackbox exporter
用于測試的網站已經部署完成,接下來部署 blackbox exporter。
創建 blackbox.yml
modules: http_2xx: prober: http http: preferred_ip_protocol: "ip4" tls_config: insecure_skip_verify: true這里使用 blackbox exporter 的 http 探針。
當執行 http 探測的時候,指定使用 ipv4 協議,因為是自簽名證書,故配置?`insecure_skip_verify: true`。
執行啟動命令
docker run -d -p 9115:9115 \ --name blackbox_exporter \ --net mynetwork --ip 172.18.0.3 \ --add-host www.test01.com:172.18.0.2 \ --add-host www.test02.com:172.18.0.2 \ --add-host www.test03.com:172.18.0.2 \ -v `pwd`:/config \ prom/blackbox-exporter:v0.18.0 --config.file=/config/blackbox.yml要探測 www.test01~3.com 這三個域名,所以需要通過 `--add-host` 手動指定其解析的 IP 為 nginx 容器地址。
啟動 Prometheus
當 blackbox exporter 部署完成后,我們需要部署 Prometheus 來抓取和存儲數據。
更新 prometheus.yml 配置文件
scrape_configs: - job_name: 'blackbox' metrics_path: /probe params: module: [http_2xx] static_configs: - targets: - https://www.test01.com - https://www.test02.com - https://www.test03.com relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__????????replacement:?blackbox01.com:9115通過靜態 static_configs 指定需要探測地址為 www.test01~03.com。
通過 relabel_configs 將實際的 metrics 獲取地址重定向到 blackbox exporter 的地址,即我們配置的 172.18.0.3,這里使用了 `blackbox01.com` 域名來代替。
執行容器啟動命令
docker run -d -p 9090:9090 \ --name prometheus \ --net mynetwork --ip 172.18.0.4 \ --add-host blackbox01.com:172.18.0.3 \ -v `pwd`/prometheus.yml:/etc/prometheus/prometheus.yml \????prom/prometheus:v2.23.0啟動并配置 Grafana
經過上面的操作,已經能夠在 Prometheus 的 graph 頁面查看到 probe_ 開頭的相關指標,我們可以更進一步,使用 Grafana 來展示。
啟動?Grafana 容器
docker run -d -p 3000:3000 \ --name=grafana \ --net mynetwork --ip 172.18.0.5 \ --add-host prometheus01.com:172.18.0.4 \ grafana/grafana這里將 promtheus 地址映射為 `prometheus01.com` ,這樣在 grafana 可以直接使用該域名來創建數據源。
創建 Grafana 監控面板
使用 admin/admin 初始密碼登錄 http://localhost:3000 ,并使用 `prometheus01.com:9090` 創建默認 Promethues 數據源。
導入 ID 為 `13230` 的模板:
導入結果:
可以看到我們用于測試的這三個網站的探測信息都展示到 Grafana 圖表了,展示內容包括我們想要的證書過期時間、狀態碼、連接各階段耗時。
告警配置
除了可以通過 Grafana 面實時查看域名探測結果,我們可以配置 Prometheus rules 并結合 Alertmanager 實現告警監控。
告警配置如:
- name: ssl_expiry rules: - alert: Ssl Cert Will Expire in 7 days expr: probe_ssl_earliest_cert_expiry - time() < 86400 * 7 for: 5m labels: severity: warning annotations: summary: "域名證書即將過期 (instance {{ $labels.instance }})" description: "域名證書 7 天后過期 \n VALUE = {{ $value }}\n LABELS: {{ $labels }}"可能需要監控的指標:
expr: probe_ssl_earliest_cert_expiry - time() < 86400 * 7 實現域名過期檢測,比如這里過期時間小于 7 天告警。
expr: probe_http_status_code != 200 實現狀態碼不為 200的告警。
expr: sum(probe_http_duration_seconds) by (instance) > 1 實現總耗時大于 1 秒的告警。
總結
今天我們在本地通過 Nginx 容器搭建了三個過期時間為 3d、60d 、365d 的測試域名,然后通過容器啟動 Blackbox exporter 和 Prometheus 來探測和收集這三個域名的 metrics,最后通過 Grafana 的 13230?模板統一展示這個三個域名的探測結果。
通過測試可以看到,使用Blackbox Exporter 和 Prometheus 實現域名證書的探測和監控是非常方便的,而且 Grafana 的顯示效果非常好,值得大家試試。
總結
以上是生活随笔為你收集整理的localhost使用ipv4_使用 blackbox exporter 实现域名证书过期监控的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 安卓耗电监控app_Android系统十
 - 下一篇: 如何查个人征信