需要公网访问的路径
只开放实际用到的功能,各行互不依赖。
Probe Agent 上传的产物由 MoleSignal 校验租约 Token、大小和内容哈希后写进对象存储,Probe Agent 拿不到对象存储的凭据,对象存储不用开放到公网。Probe Agent 还要连
5084(注册)和 5085(控制流)两个 gRPC 端口。这两个端口由 MoleSignal 自己终止 TLS,只能在四层(TCP)直通,不能交给 HTTP 代理;外部地点的 Probe Agent 从公网连进来时,把它们单独映射出去,并把 probe.register_endpoint 和 probe.control_endpoint 设为对外地址,见配置。
网页文件
状态页和分享页是网页,公网入口还要放行它们的静态文件:/assets/ 开头的文件、/favicon.ico 和 /favicon.svg。只放行 /status/、/shared 这些页面路径和静态文件时,登录页和其他页面在公网入口上仍是 404。
状态页的自定义域名
状态页绑定自己的域名后,这个域名也指向公网入口。域名上的页面在根路径:/、/history、/uptime 和 /incidents/ 开头的路径,数据来自 /api/v1/public/status-pages/ 开头的接口。对这个域名只放行这些路径和网页文件。证书可以在公网入口上管理,也可以交给 MoleSignal 自动签发,见自定义域名与 TLS。
两种入口做法
内外网解析到不同入口
推荐的做法。内网 DNS 把molesignal.example.com 解析到内网入口,公网 DNS 把同一个域名解析到公网入口。内网入口转发全部路径,公网入口只转发上表的路径。http.external_url 设为这个域名:页面上显示的接入地址、发给发送方的回调地址、IM 和邮件里的链接,在内网和公网都能用,员工从内网访问完全不受影响。
同一个入口按来源地址区分
只有一个入口时,上表的路径对所有来源开放,其他路径只允许公司网络和 VPN 的地址段访问。这种做法要求入口看得到真实的客户端地址:入口前面还有负载均衡时,用 PROXY 协议或X-Forwarded-For 把原始地址传进来。
加固清单
- 只用 HTTPS。 公网入口只监听 443,证书由公共 CA 签发。Teams 只往 https 地址投递。
- 按接口设请求体上限。 外部告警 4 MiB,心跳打卡 64 KiB,Jira 的工单 Webhook 1 MiB,用户体验的事件 5 MiB、会话回放 8 MiB,Probe Agent 的产物 10 MiB,其他接入接口 2 MiB。超过上限时 MoleSignal 返回
413,入口上的上限不要比这些小。 - 在公网入口限流。 按来源地址限制每秒请求数。
standalone节点不对接入限流,见速率与大小限制。 - 访问日志不记查询串。 阿里云云监控只能把 Token 放在地址的
token参数里,公网入口的访问日志只记路径。心跳打卡和值班日历订阅的 Token 在路径里,这两类路径只记前缀,配置示例里用map把 Token 换掉了。MoleSignal 自己的链路只记路由,不记查询串。 - 让 MoleSignal 看到真实地址。 在
_sys组织的 设置 → 客户端 IP 识别 里选择转发链,并把公网入口的地址列为受信任的代理,见客户端 IP 识别。用户体验的地理信息和登录限速都依赖它:不配置时所有用户都算成入口的地址,私有地址不计数,公网地址上的用户会互相锁定。 - 可选:按来源地址收紧。 发送方公布了出口地址的,可以只放行这些地址:Datadog 按站点在
ip-ranges.<站点域名>的webhooks一节公布,PagerDuty 分美区和欧区,阿里云云监控在报警回调文档里列出,Teams 用 Azure 服务标记AzureBotService。这些地址会变,要跟着更新,Token 仍是主要防线。 - 上线前验证。 从公网请求
/和/api/v1/auth/signin应返回404;不带 Token 请求POST /api/v1/intake/alerts应返回401,说明请求到了 MoleSignal。从内网打开/应看到登录页。
配置示例
nginx
两个 server:内网转发全部,公网只转发回调和公开页面。
Kubernetes Ingress
两个 ingress-nginx 控制器,公网那个只列出要开放的路径。
Gateway API
两个 Gateway,公网那个的 HTTPRoute 按路径和方法匹配。