在不丢失关键线索的前提下删改 VPN 日志
删掉一切可利用的内容,为每个真实值保留同一个标签,并保持顺序与版本。删改后的日志仍应让陌生人能够跟着还原故障。
你把日志贴进求助帖,有人回复指出里面带着你的私钥,而这次粘贴是永久的。更安静的那种失败稍后才出现:所有地址都变成了 X,文件不再能证明客户端和服务器是两台不同的主机。删改一遍要移除授予访问权限或指向个人的内容,保留解释故障的内容。这是一次有规则的转换,而不是用搜索框做删除。
删改是转换,不是删除
日志既承载值,也承载结构:这个地址在那个时刻与那个地址通信,握手停在这一步。让文件不敢公开的是值。让文件值得公开的是结构。
整行删除会把两者一起抹掉,所以删减过的日志常常什么也回答不了。把所有值压成一个记号则会以另一种方式失败:两个不同的对端变成了同一个角色。两种做法都可能看着整齐,却毁掉了证据。检验标准是:一个从没见过你网络的人,能否顺着顺序走到你得到的结论。
先截取,再清理
动手改之前先切出故障附近的那一段。片段越小越容易检查,也越不容易带上你忘了它就在文件里的东西。在问题关闭前,把未改动的原件放在受保护的存储里。删改是有损的,原始文件才是回答后续问题的唯一途径。
在相信导出命令已经去掉私密部分之前,先把片段当纯文本读一遍,因为导出工具只是汇总和轮换字段,并不会做净化。调试与详细模式最可能出现密钥块或内联凭据。用能显示整行的编辑器打开文件,而不是用会折行、把末尾藏起来的查看器。
哪些必须删,按什么顺序
先处理授予访问权限的材料,因为这里漏一个,整件事就白做了:私钥块、口令、预共享密钥、API 令牌、恢复码。它们不只是身份信息;读到帖子的人都能直接使用。删掉其余一切却留下其中一项,这一遍就是失败的。
然后是身份层:用户名、证书主体与序列号、账户标识,以及任何包含人名在内的路径。单看每一项都不可用,合起来却能指向一个人,而公开帖并不需要这一部分。
然后是拓扑层,判断就出现在这里。公网地址、内网段和主机名,在披露它们对诊断没有帮助时都可以替换,稳定的标签胜过留空。顺序之所以重要,是因为前几层是绝对的,最后一层是判断。按这个顺序做,也能避免你在密钥块还躺在第四十行时,先花一小时折腾主机名。
| Original kind | Replace with | Keep |
|---|---|---|
| Client address | CLIENT_A | Which side initiated |
| Server address | SERVER_B | Port and protocol |
| Username | USER_1 | The failure that mentions it |
| Hostname | HOST_1 | Resolution order |
不要破坏对应关系
每个真实值只给一个占位符,并且每次出现都复用同一个。如果两个地址原本不同,删改之后必须仍然不同,否则读者会得出客户端连上了自己的结论。一致性就是全部机制:读者靠看到同一个标签反复出现来学会对应。两个角色共用一个记号,是让日志变得无法阅读的最快方式。
顺序和时间属于同一套结构。保持先后不变;如果平移时间戳,就把它们全部平移同一个量,并用一行说明。混用改过的时间与真实时间,比直接删掉更糟,因为那些空隙看起来就像某件从未发生之事的证据。
端口、协议和方向保持原样。地址上有占位符,并不意味着端口也要有。
守住日志必须回答的那个问题
开始编辑前,先写下帮忙的人需要的东西:准确而非机密的报错原文、客户端与服务器版本、传输方式,以及是哪一侧发起的尝试。正是这些让陌生人认出故障。把清单放在手边,这一遍才是核对,而不是碰运气。
发送文件时,加一行说明替换了什么,免得有人花一小时去诊断一个占位主机名。OpenVPN 的诊断日志文档列出了它日志所带的字段,那正是你即将改动的清单。发送内存转储或抓包之前先问一句,并使用你能核实的求助渠道。那些产物包含的内容远多于文本日志,其中有些并不该由你公开。
把改好的片段从第一行读到最末一行,开头和结尾也不要跳过。截图比文本更该被怀疑,因为它会带上别的窗口、账户名和菜单项。