Chips
运维笔记与踩坑记录 · Cloudflare Tunnel / Docker / Linux
这里存放我在维护一台自建服务器过程中真正踩过的坑:Cloudflare Tunnel 的服务收敛、Docker 与 UFW 的边界、SSH 的配置漂移与算法协商、以及 systemd 与包管理上那些「看起来没问题、其实一直在静默失效」的细节。
写法上尽量只留能复现的部分:现象、原因、验证手段。凡是靠猜的结论都会标明。
最近更新
- 为什么这个站没有 JavaScript
零脚本、零外链资源,CSP 才能收紧到 default-src 'none',不需要任何信任清单。文中给出用纯 CSS 替代脚本的具体做法、可审计性的收益、会失去的能力与替代方案,并说明 JSON-LD 这类 data block 为何不算脚本。
- 把 SSH 换个端口:一次完整的迁移流程
在只有一条 SSH 入口的机器上把端口从 22 换到 2222:为什么用 reload 而非 restart、Port 指令会叠加监听的坑、fail2ban 与防火墙必须同步改、先开后关的顺序,以及换端口为何只是降噪。
- UFW 管不到 Docker 发布的端口——原理与补法
容器发布端口走的是 FORWARD 而不是 INPUT,所以 ufw 的 deny incoming 对它完全无效。给出 DOCKER-USER 守卫的写法、验证因果的实验方法,以及三个已经踩过的坑。
- 用一条 Cloudflare Tunnel 收敛全部对外服务
把"逐个暴露端口 + 逐条挂 DNS"改成一条隧道统一出口后,宿主不再监听任何对外端口。记录 ingress 顺序、多副本 HA 的真实作用边界,以及 metrics 默认绑定带来的意外暴露。
- 三百个包与一次内核升级:什么时候必须重启
长期未更新的生产机做一次完整升级,实际要处理的是四件事:先算清包数与内核差距,用 full-upgrade 加非交互 conffile 策略跑完,判断"装了但没生效"并挑重启时机,最后清掉 rc 残留包和 depmod 生成的无主文件。
- iptables、nftables 与 legacy 表:一次封禁规则「消失」的排查
现代发行版里 iptables 命令指向的其实是 iptables-nft,规则被翻译进 nftables 表;fail2ban 的链则要到第一次封禁才创建。常有人说规则不见了,多半是观测后端选错,或链本就还没被创建。
- SSH 主机密钥漂移:声明了三个,只有一个存在
sshd_config 里声明了 ed25519/ecdsa/rsa 三种 HostKey,但实际只有 RSA 密钥文件存在,导致大量老客户端在密钥交换阶段就失败。记录判断依据,以及分批启用新主机密钥时避免把自己锁在外面的做法。
- OpenSSH 8.9 下 RSA 密钥还能不能用?实测三种协商策略
新版 OpenSSH 禁用的是 SHA-1 签名,不是 RSA 本身。用同一把 RSA 密钥强制三种不同算法策略,得到明确结论:默认可用、强制 rsa-sha2-256 可用、强制 ssh-rsa 被拒。
主题
- docker5
- security5
- troubleshooting5
- cloudflare4
- fail2ban3
- method3
- ssh3
- systemd3
- agent2
- apt2
- architecture2
- debian2
- firewall2
- iptables2
- linux2
- openssh2
- self-hosting2
- tunnel2
- ufw2
- access1
- automation1
- cryptography1
- csp1
- dns1
- email-auth1
- fstab1
- kernel1
- key-management1
- monitoring1
- napcat1
- networking1
- nftables1
- qq1
- rsa1
- silverbullet1
- static-site1
- tmux1
- unattended-upgrades1
- upgrade1