7 万条短信的乌龙指

乌龙指离我们很远吗?非也。前一段时间 LUG 服务器出故障,就错误地发出了 7 万条短信,把学校短信平台的余额用完了,直到网络中心老师给我打电话才发现。

祸起服务监控脚本。它从数据库里获取站点信息,定时访问被监控的站点,如果发现问题,就会给网站所有者发短信报警。服务监控脚本连接数据库失败时,也会给我发报警短信。早先是不会尝试重连数据库的,因此只会发一次报警,不过监控服务不能在数据库恢复后自动恢复运行。这个 bug 在 blog 故障的时候被发现,于是改成自动重连了,但发报警短信的逻辑没有修改,因此如果一直连不上数据库,就会不停地发。

为防止短信轰炸,发出的短信本来都要经过我这里的“风控”,限制每24小时发往每个手机号的短信数。风控是查询数据库的短信日志表获取最近 24 小时向这个号码发送短信数的,当数据库挂掉的时候,查到的值是 NULL,在 PHP 中隐式类型转换成了0,因此认为没有超过限制,就发出去了。学校短信网关也没有任何“风控”,导致大量的短信涌入运营商网络。

继续阅读“7 万条短信的乌龙指”

Win Vista/7/8 的 VirtualStore

用过 Windows Vista/7/8 的同学可能有这样的经历:用 32 位程序(比如 cygwin)修改 C 盘下的某个文件后,再从 Windows 资源管理器里看,竟然是修改前的版本!难道文件系统还对不同的程序有不同的视图?您说对了,自从 Vista 引入了 UAC 和 VirtualStore,不要相信 32 位程序在 C 盘里做的改动。

Windows Vista 引入更强的安全机制后,一些重要的系统目录就不是谁都能修改了。这些目录包括 C 盘根目录,Program Files,Program Files (x86),Windows,注册表的 HKEY_LOCAL_MACHINE 等。但一些老的应用程序仍然假定这些目录是可写的,如果系统 API 简单返回访问拒绝,则这些程序都不能运行了。

因此,Vista 提供了 VirtualStore,对非管理员权限运行的 32 位程序,只要对这些目录有写操作,就会把被修改或添加的文件复制一份到这个用户的 VirtualStore。以这个用户身份运行的 32 位程序看到的这个路径就是 VirtualStore 里的对应文件,原始路径上的文件再怎么修改,它已经全然不知了。

继续阅读“Win Vista/7/8 的 VirtualStore”

让 OpenVPN 默认不走 VPN

LUG VPN 的一些用户希望仅对某些特定 IP 使用 VPN,而 OpenVPN 默认是全部走 VPN。也许是我的搜索能力太差,竟然没有 Google 到靠谱的答案。没有耐心的读者可直接看我的解决方案:

$ echo "script-security 2" >>/etc/openvpn/client.conf
$ echo "up /usr/local/bin/remove-ovpn-defroute" >>/etc/openvpn/client.conf

$ cat /usr/local/bin/remove-ovpn-defroute
#!/bin/sh
(
    sleep 2 # wait for routing table to be flushed
    ip route del 0.0.0.0/1 dev tun0
    ip route del 128.0.0.0/1 dev tun0
) &
exit 0

继续阅读“让 OpenVPN 默认不走 VPN”

互联网视频是怎样送进千家万户的

前些天同学聚餐,有人提了个问题:很多人同时看电视不卡,同时看网上的视频直播为什么就卡呢?电视是广播(跟收音机本质一样),而互联网视频走的是点对点的 IP 网络,多一个人看视频,服务器就要多发一份数据。

互联网视频究竟是怎样送到千家万户的呢?我从通信领域顶级学术会议 SIGCOMM 2013 里窃取了一些科普知识与大家分享。
继续阅读“互联网视频是怎样送进千家万户的”