退役 PPTP/MS-CHAPv2:旧 VPN 的迁移操作手册
更长的密码并不能升级使用 MS-CHAPv2 的 PPTP。请按顺序完成清点、迁移、验证和凭据清理这几步。
每月轮换并存放于保险库的二十位密码,并不会让运行 MS-CHAPv2 的 PPTP 服务器变成现代 VPN。密码只是一次交换的输入,而弱点就在这次交换本身。本手册面向接手该服务器、又必须在不切断依赖站点的情况下迁走用户的人。请按顺序执行每一步,因为每一步都会留下记录,日后有人问起访问为何突然改变时正需要这些记录。
动手之前先写下这套栈
PPTP 这个词把三层叠在了一起,而每一层各自以不同方式失效。隧道是 PPTP 本身,即 GRE 加 TCP 1723。认证是服务器提供的某种 PPP 方法,这里是 MS-CHAPv2。链路保护是 MPPE,其密钥由那次认证交换派生。把这三层都点名,可以避免日后的修补落到错误的层上。
不要相信 wiki 页面,直接读取正在运行的配置,并记录配置文件、监听端口以及最近完成认证的会话。
grep -RniE 'mschap|mppe|require-mppe' /etc/ppp/options.pptpd /etc/pptpd.conf
ss -lntp 'sport = :1723'
journalctl -u pptpd -n 40 --no-pager
在 Windows 远程访问角色上,同样的清点来自两条命令,而第二条更重要:角色可以同时宣告多种方法,现场客户端却永远只协商最弱的那一种。
Get-VpnAuthProtocol
netstat -ano | findstr :1723
判断隧道今天真正承载的是什么
选择替代方案之前,先列出使用方:移动办公的笔记本电脑、分支机构路由器、支付终端、一组现场平板。只需要访问一台内网主机的使用方容易迁移。嵌在无法重刷的硬件里的使用方,也许需要一台中间网关而不是升级客户端,而这个决定属于方案,不该留到切换中途才拍板。
接着问:能观察甚至影响登录交换的攻击者会拿到什么。使用 MS-CHAPv2 时,答案包含可用于离线还原用户密码的材料,这正是长度和轮换修不好设计的原因:被还原的秘密,在用户复用过它的每个系统上都有效。
MPPE 继承了同样的弱点,因为它的密钥来自那次交换,而且它没有现代 AEAD 密码的逐包完整性与重放行为。一次干净通过认证的会话,只能证明它与所配置的检查相容,仅此而已。
短暂的午休和小规模用户数,都不会把密码学属性变成策略属性。
在一个维护窗口内完成迁移
先把替代方案立起来,用一个试点组证明它,然后停掉旧监听,而不是把它留成一条安静的退路。谁都能继续连上的退路不算迁移,它恰恰把弱交换留给了那些从不费力切换的用户。
sudo systemctl disable --now pptpd
sudo ss -lntp | grep -E ':(1723|1194|51820)\b'
sudo nft list ruleset | grep -i gre
在同一个窗口里封掉防火墙路径。GRE 没有需要记住的端口,所以按编号放行协议 47 的规则很容易被忽略,而它让服务在守护进程消失之后仍然可达。记录被删除的规则、原来的位置和原因,免得日后的变更评审不慎把它恢复。
凭据要跟配置分开处理。删除客户端配置文件不等于吊销,在别处仍能通过认证的账户也还没有退役。
验证替代方案确实承担了 PPTP 原来的工作
检查表问的不是“能不能连上”,而是认证、地址分配、DNS 解析、路由选择、重连行为和对端验证在替代方案下是否都还成立。按这个顺序在试点设备上逐项测试。把观察到的结果写在预期旁边。
ip -4 addr show tun0
ip route get 198.51.100.23
resolvectl query intranet.example.net
接口上有地址,只能证明协商完成了。它不能证明对端授权了你期待的路由,而上面的查询只对这台主机作答,不覆盖被转发的局域网。解析器给出应答,只证明解析器可达,并不能证明分离 DNS 策略把正确的名字发到了那里。
重连放到最后测,因为多数替代方案正是在这里退步:让笔记本休眠、更换网络,确认隧道能重新建立而不残留陈旧路由。
回滚、吊销,以及你留下的记录
回滚恢复的是服务,不是安全性,这个区别必须在窗口打开前说清楚。新路径若失败,就用第二个现代端点或临时网关把用户接回来,而不是给所有人重新打开 PPTP。在旧协议上留一条应急通道,会扩大你刚刚记录在案的风险面。
切换完成后,吊销曾通过 PPTP 认证的账户,让已保存的配置文件到期,并确认 GRE 规则已从每台边缘设备上移除,包括那份没人记得的灾备副本。
留下一份简短记录:发现的协议、每个监听的停止日期、替代方案支持的客户端版本,以及能够重新开启这项决定的责任人。之后密码卫生依然重要,但那是把它用在值得的协议上,而不是作为保留旧协议的理由。