啊啊,记录一下,在中国大陆考 Linux Foundation 的线上考试,过于折腾。
坐标某南部沿海城市,我预约的是北京时间下午三点到五点之间考试,2:30PM 我准时打开PSI打算签到,发现连语言选择界面都加载不出来,反复重启重试到了快3点。
我把笔记本连接到了用中国电信澳门的流量开的手机热点,这时候可以进行checkin然后进入verify步骤了,开心开心,然后过完 verify 步骤就完成了 admission,本来应该进入考试了,但是卡在 Proctor is preparing your exam,很久很久远大于avg的五分钟,这时候live chat又让我重新刷新界面尝试;
但是重新刷新界面后居然又要重新走一遍环境验证流程!我当然只能再过了一遍。发现还是进不去考试,这时候livechat指示我打电话给它们客服问问,我用+44的号码打过去,结果对面是个印度口音的人,五句我听不懂两句(不知道印度口音是怎么回事,像捏住鼻子讲话),但是最后还是沟通成功,但只给了我一个POA开头的工单。然后让我重新打开浏览器,并且重启,再次经历验证步骤,但依然卡在preparing。
已经麻了,我又又重启了电脑然后重新打开了PSI,诶发现这次居然行了!这时候正常进入了远程桌面开始考试,此时已经是 16:55 距离预定考试时间过去了近两个小时,我再不进入考试的话就直接判定失败了,所以万幸。不过考试计时依然是两小时。我做着做着到了第五题,此时计时器还剩 108min,监考员突然打开了livechat说看不见我的桌面订阅源(可能就是桌面分享之类的,这个中文机翻我真的是),然后直接把我考试暂停了。然后我就按要求又在打电话给客服,再次创建工单,再次退出浏览器然后重启重连重开PSI,再次经历环境验证,再次卡在preparing,中途又成功进去了一次,没做两分钟又又给我暂停了,让我和技术协助人员沟通。沟通结果是又给了我一个工单,然后退出PSI重启电脑重复以上步骤。
我最后一次退出前还剩下100分钟左右,我提醒了它们 suspend 我的考试,然后我又开始了无尽的重试,累计八次重新进入验证环境步骤,给检查员端着笔记本满房间跑展示了八次房间和我的耳朵和我的桌面和手臂和手机。中途一度想放弃,reschedule的工单都提交了,但考虑到题都做一半了还是想再试试,只要能进考试我就是赢。最后一次!终于成功回到了考试,然后发现我的时间居然只剩下48分钟了!我说了给我暂停呢?服了
当然只剩48分钟也没什么大问题,我在还剩16分钟的时候完成了所有题目,12分钟的时候完成了一次检查,就和监考员汇报提早交卷了,此时已是头晕眼花。提交完想起来应该再检查一下,因为有一题 svc 的 name 疑似忘记改,肯定扣分了。不过无所谓,这考试只有二分的状态,过与不过,而我包过的。
提交考试退出session之后我无力地瘫坐在椅子上,仿佛目睹了一次原子弹爆炸。第二天我发现自己肌肉拉伤了。当然结果是毫无悬念的过了。这应该是除了我英语四级考试肚子疼之外最差的一次考试体验。从14:30折腾到19:00,其中接近4h都在尝试重启和检查考试环境。
另外 这个考试进入时千万不要选简体中文,livechat里的中文看起来像00年代的机翻,能看懂 30% 都算多的。而考试题目应该没有中文的版本?(我也没时间去注意),这就还好。我尝试过的网络环境是中国移动家宽和澳门中国电信移动流量热点,以及通过修改网关使用的单臂路由上的dae代理的日本vps网络。多次尝试后成功进入考试的只有中国移动家宽,不知道其中有没有什么说法可能只是凑巧。另不要使用手机热点,因为有一层NAT,经过测试会影响twilio的各向连接的性能。疑似和NAT类型关联也挺大,因为监考官后来暂停我考试的原因是看不见我的桌面,大概率就是WebRTC的连接断了。我的NAT类型是最夯的 Independent Mapping, Port Dependent Filter, random port, will hairpin。以上,供后人参考。
- psi的网络测试,一百次过不了五次 https://syscheck.bridge.psiexams.com/
- twilio 的网络测试 https://networktest.twilio.com/
实测 Azure JP 机器使用 hysteria2 Tproxy 作为网关代理,CKS考试全程无卡顿或掉线,非常顺畅。

define TPROXY_MARK=0x1
define HYSTERIA_TPROXY_PORT=12347
define TPROXY_L4PROTO={ tcp, udp }
define BYPASS_IPV4={
0.0.0.0/8, 10.0.0.0/8, 127.0.0.0/8, 169.254.0.0/16,
172.16.0.0/12, 192.168.0.0/16, 224.0.0.0/3
}
define BYPASS_IPV6={ ::/128, ::1/128, fe80::/10 }
table inet hysteria_tproxy {
chain prerouting {
type filter hook prerouting priority mangle; policy accept;
# 放行访问网关自身的流量 (例如内网机器访问路由器的 DNS 或 Web)
fib daddr type local counter return
# 已经由 TProxy 接管的流量直接 accept,跳过后续 tproxy 动作
meta l4proto $TPROXY_L4PROTO socket transparent 1 counter mark set $TPROXY_MARK accept
# 保护本机上的其他普通服务端进程不受干扰
socket transparent 0 socket wildcard 0 counter return
# 绕过私有和特殊 IP 地址
ip daddr $BYPASS_IPV4 counter return
ip6 daddr $BYPASS_IPV6 counter return
# 仅对公网 IPv6 地址启用代理
ip6 daddr != 2000::/3 counter return
# 对符合条件的新连接,重定向到 TProxy 监听端口
meta l4proto $TPROXY_L4PROTO counter tproxy to :$HYSTERIA_TPROXY_PORT meta mark set $TPROXY_MARK accept
}
}