加固与暴露面
家庭机架最常见的失守方式不是被打穿,而是某个管理面板被转发到了公网。所以先看端口:下面是全部已发布服务里对公网开放的端口——目前只有反向代理和 VPN 两个入口,其余一律只监听局域网或用 WireGuard 进来。
对公网开放
| 服务 | 端口 | 用途 |
|---|---|---|
| WireGuard (wg-easy) | :51820 | the tunnel itself; the only UDP port forwarded at the router |
| Caddy | :80 | ACME HTTP-01 challenge and the permanent redirect to https |
| Caddy | :443 | every web front end on the rack, one hostname each |
出现最多的加固规则
- 1×关闭注册,账号只能由管理员创建
- 1×git 的 SSH 端口是 2222 而不是 22,这样被封锁或被误转发的 22 端口永远不会意外打到仓库服务上
- 1×管理员账号强制开启双因素;在用的 API 令牌除备份任务那一个外全部只读
- 1×启用了 LFS 但对象存储保持在本地;大二进制文件在贡献说明里被劝阻,而不是悄悄把固态盘填满
- 1×匿名访问关闭,管理员密码在首次启动时由环境变量提供
- 1×数据源使用只读的 Prometheus 账号,被攻陷的仪表盘也写不了指标
- 1×面板受代理层的仅局域网规则保护,从不做端口转发
- 1×关闭公开仪表盘功能,这里没有任何需要公开分享的东西
- 1×建完家庭成员的账号后关闭注册,任何人找到这个网址也进不来
- 1×上传只在局域网内或通过 WireGuard 进行,不做端口转发
- 1×数据库只在容器网络内监听,完全不发布端口
- 1×机器学习容器不发布端口,除首次启动下载模型外不需要外网
- 1×后台只在局域网可达,并在代理层再加一道基本认证,从不做端口转发
- 1×一台设备一个客户端配置,并且命名,这样手机丢失时只需删掉对应的那一份
三条不写在 compose 里的规矩
- 管理面板默认只监听 127.0.0.1,需要时用 SSH 端口转发过去看,不做 0.0.0.0 转发
- 密码与 API key 只放在 /srv/homelab/.env 里,权限 600,compose 用 env_file 读,不写进仓库
- 每季度做一次演练:随机停掉一个容器,只用备份把它恢复到新 SD 卡上