前一段时间参照这篇在Ubuntu上搭建OpenVPN服务器,并配合Mac和Windows的客户端 (一)在自己的 VPS 上装好 OpenVPN 服务器后使用一直不太正常,这两天花了点时间调试解决,结果总结如下。调试期间多次得到 @yegle @ChandleWEi @Greendamn@FretiaX 等推友的帮助,尤其是 @ChandleWEi 深夜还在我家现场调试 iptables,特此感谢。

MTU 太大造成的连接不稳定

症状

刚连接上 OpenVPN 只用浏览器打开一两个页面时速度很正常,但随着流量加大网络就会开始阻塞,直到完全无法连接任何服务器。而且与 OpenVPN 服务器之间的连接容易自动断开。

解决方案

在 OpenVPN 服务器的 server.conf 里加入 mssfix 1300。此方案由 @yegle 提供。数字应该是他多次测试得出的较优选择,我试过设为 mssfix 1400 自己的 PC 没问题,而朋友的机器会速度奇慢。

DNS 污染造成的部分墙外网站无法访问

症状

连接 OpenVPN 后 Twitter 可以正常访问,被严重 DNS 污染的 Facebook 则会被浏览器提示无法连接。

解决方案

在 OpenVPN 服务器上使用 iptables 强行劫持客户端对任何 DNS 服务器的查询请求,将请求的目标 IP 地址修改为墙外的 DNS 服务器,例如 Google 的公共 DNS 服务器 8.8.8.8 和 8.8.4.4。此方案参照 @yegle 的方案稍作修改,不需要 OpenVPN 服务器自己提供 DNS 服务。iptables 命令如下:

iptables -t nat -A PREROUTING -p udp --dport 53 -j DNAT --to-destination 8.8.8.8

残留问题

虽然这个近乎暴力的方式可以很有效并且是一劳永逸地从服务器端解决 DNS 污染问题,但还是有一种情况必须由客户端自己更改 DNS 地址。这种情况为,客户端的 DHCP 设备(一般就是共享上网用的路由器)为其分配的 DNS 地址与网关地址在同一个网段,或者通常就是同一个地址。这样就算是连接上 OpenVPN 后默认网关变成了 OpenVPN 服务器的 IP 地址,但由于 DNS 跟原网关在同一个网段,客户端的 DNS 查询请求还是会不进入 OpenVPN 而直接从原网关发出,导致得到被污染的错误结果。

解决方案

手动设置客户端的 DNS 地址为任意墙外 DNS 地址,例如 Google 的公共 DNS 服务器 8.8.8.8 和 8.8.4.4。

Windows UAC(用户帐户控制)导致 OpenVPN GUI 无法设置 OpenVPN 服务器为默认网关

症状

在服务器端解决了以上问题之后,客户端 OpenVPN GUI 可以连接成功。但仍然无法访问墙外网站,nslookup www.facebook.com 会得到明显被污染的 IP 地址。route print 可以观察到路由表中的默认网关没有 OpenVPN 服务器 IP 地址。

解决方案

关掉 UAC,或者以管理员身份启动 OpenVPN GUI。

标签:, , , ,

今天看到 Twitter 上有人讨论浏览器发送 HTTP_REFERRER header 导致民间 Twitter Web 客户端地址被泄露的问题。研究了一下,这个问题的最终解决都需要依靠浏览器,网站自己没有办法强制禁止浏览器发送 HTTP_REFERRER header。

Chrome/Chromium

Chrome/Chromium 的 WebKit 内核最新版支持 HTML5 里的 noreferrer link relation。这个功能允许网页作者在 a 和 area 元素里简单地使用值为 noreferrer 的 rel 属性来禁止浏览器向链接目标发送 HTTP_REFERRER header。例如:

<a href="http://evil.com" rel="noreferrer">Evil</a>

当用户点击这个链接访问 evil.com 时,对方只会收到一个空白的 HTTP_REFERRER header。在 Windows 版的 Chrome 4.0.295.0 dev 上测试通过。

Firefox

Firefox 的扩展 Adaptive Referer Remover 可以禁止指定的 URL 出现在 HTTP_REFERRER header 里。它使用正则表达式来匹配要保护的 URL。普通的 URL 转换成它需要的正则表达式很简单,只需要在前面加 ^ 并把 . 改成 . 即可。例如:

^http://rainux.org
^http://search\.twitter\.com

另一个更简单但比较极端的做法是在 about:config 里将 network.http.sendRefererHeader 设置为 0,这样会完全禁止 Firefox 向任何网站发送 HTTP_REFERRER header。

Opera

Tools-> Preferences-> Advanced-> Network-> Send referrer information 去掉勾选。(感谢 vvoody 补充)

Internet Explorer

别开玩笑了,IE 的漏洞都导致 Google 重要服务被攻破 而被迫退出中国了,你还敢用它?

标签:

Intel Mac 安装多系统的方法网上有很多文章介绍,已经不神秘了。本文解释整个过程背后的原理以及提供关键问题的解决方案,同时介绍我自己的分区方案和实践经验。以下内容基于在一台 MacBook 上安装运行 Mac OS X 10.5、Debian GNU/Linux lenny 分支和 Windows XP 的三系统实践,所以某些细节可能会不适用于其它情况。

背景

理论上,所有基于 Intel CPU 的 Mac 计算机(包括 MacBook,Mac Mini 等)在安装过 Mac OS X 10.4.6 或更高版本的 combo update 和 firmware update 后都应该可以安装运行 GNU/Linux 和 Windows 2000 以上版本,但是有一些限制。

众所周知 PC 使用 BIOS 作为硬件 firmware 和操作系统的中间层,并且使用 MBR 分区表作为硬盘分区方案。而 Intel Mac 与普通 PC 最大的区别就是使用了 BIOS 的下一代替代品 EFIGPT 分区方案。EFI 和 GPT 都分别向后兼容于 BIOS 和 MBR 分区表,所以可以支持基于 BIOS 和 MBR 的操作系统,例如 GNU/Linux 和 Windows。

简单地说,GPT 通过包含一份 MBR 分区表来兼容 MBR 分区方案(参考 Wikipedia 上的 GPT 页面)。GPT 的内容可以被同步到 MBR 分区表中,所以当硬盘使用 GPT 分区方案时,GPT 里的分区可以通过 MBR 分区表被访问到——这是在 Intel Mac 上安装基于 MBR 分区表方案的操作系统的关键。但是 MBR 分区表只能包含最多 4 个主分区(扩展分区相当于一个主分区,可以在其上划分多个逻辑分区),而 GPT 没有扩展分区和逻辑分区的概念,现有的工具在同步 GPT 到 MBR 分区表时也不会做额外的转换,所以实际上只能同步 GPT 上的前 4 个分区到 MBR 分区表中。而 Intel Mac 上运行 Windows 有一个奇怪的限制,Windows 必须被安装到 MBR 分区表中的最后一个分区上,否则会在启动时提示找不到 %SystemRoot%\system32 目录下的某文件

虽然 Mac OS X 附带的 Disk Utility 可以对 GPT 分区方案的硬盘进行分区,但是不够稳定,不建议使用。GNU Parted 是我的选择,它对 GPT 分区方案支持比较好。另外还需要 rEFIt 中的 Partitioning Tool 来同步 GPT 和 MBR 分区表,同时我也使用 rEFIt 作为多系统引导管理器,相对于目前的 GRUB2 来说,它更成熟并且非常容易使用,还拥有很漂亮的图形界面。

GNU/Linux 内核支持 GPT,因此启动之后可以访问 GPT 上的所有分区。但是 GRUB 不支持 GPT,所以 GRUB 和 GNU/Linux 内核必须被安装到一个 MBR 分区表里的分区上。Windows 完全不支持 GPT,所以始终只能访问 MBR 分区表上的 4 个分区。

双系统的特殊情况

在典型的双系统情况下,你可能只有三个分区,Mac OS X 占用两个,Windows 占用一个。使用 rEFIt 同步 GPT 和 MBR 分区表后,工作很正常。然而如果你在 Mac OS X 里创建了另外一个分区,导致同步 GPT 和 MBR 后 Windows 安装分区不再是 MBR 分区表中最后一个分区,此时 Windows 就会像上文中提到那样无法启动。解决方法很简单,使用不支持 GPT 的分区工具将这个新创建的分区在 MBR 分区表中删掉即可。注意,仅仅是在 MBR 分区表中删掉,在 Mac OS X 里通过 GPT 你仍然可以访问它。

不支持 GPT 的分区工具包括 Linux 里的 fdisk,Windows 的 compmgmt.msc 里的磁盘管理,以及各种 Windows 下第三方工具的较老版本,例如 Paragon Partition Manager 7.0。

我的分区方案

Mac OS X 的常规安装需要占用两个分区,第一个是预留的 EFI System,有文章说可以安全地删除它,不过我没有尝试。GNU/Linux 和 Windows 各自需要占用一个分区,刚好达到 MBR 分区表中 4 个主分区的限制。这是大多数文章中介绍的方案,但是这样 GNU/Linux 和 Windows 都没有一个专门存储数据的分区,GNU/Linux 也没有 swap 分区,使用上并不方便。

以下是我的分区方案,使用 GNU/Linux 的设备描述方式:

/dev/sda1 200.00MB  EFI System
/dev/sda2 43.83GB   HFS+ 文件系统,Mac OS X 安装分区
/dev/sda3 13.50GB   ext3 文件系统,同时作为 GNU/Linux 的 /boot,/home 和 Windows 里的 D: 盘
/dev/sda4 5.00GB    NTFS 文件系统,Windows 安装分区 C: 盘
/dev/sda5 10.00GB   reiserfs 文件系统,GNU/Linux 的安装分区 / 目录
/dev/sda6 2.00GB    linux-swap 文件系统,GNU/Linux 的交换分区

使用 rEFIt 的 Partitioning Tool 进行同步后,/dev/sda4 刚好是 MBR 分区表中的最后一个分区,符合上面提到的 Intel Mac 运行 Windows 的必要条件。

在 Windows 里安装 Ext2 IFS 或者 Ext2fsd 即可将 ext3 文件系统的 /dev/sda3 当成 ext2 文件系统挂载为 D: 盘。要注意的是目前主流发行版里的 mkfs.ext3 默认会创建 inode 为 256 字节的 ext3 文件系统,而 Ext2 IFS 只支持 inode 大小为 128 字节的 ext3 文件系统,Ext2fsd 则没有问题。或者也可以使用 mkfs.ext3 -I 128 来创建 inode 大小为 128 字节的 ext3 文件系统。

Windows 还可以通过安装 MacDrive 来访问安装 Mac OS X 的 HFS+ 分区,它对 HFS+ 文件系统支持很好。和 Ext2 IFS 及 Ext2fsd 一样,安装它以后你可以将 HTFS+ 文件系统的分区挂载为 Windows 下的一个逻辑盘。与 Ext2 IFS 和 Ext2fsd 不同的是,这个逻辑盘的盘符只能在 Windows 自己的磁盘管理工具里修改。但是它可能跟 Ext2fsd 有冲突,每次安装 Ext2fsd 后都会由 MacDrive 的某个驱动程序导致 Windows 蓝屏。与 Ext2 IFS 同时安装使用就没有问题。MacDrive 是本文提到的第三方工具中唯一一个商业软件。

Mac OS X 也可以通过安装 Mac OS X Ext2 Filesystem 来访问 /dev/sda3,并将其作为单独的个人数据分区。不过我没有这么做,因为事实上我几乎不使用 Mac OS X,我觉得 Debian GNU/Linux 提供的类 Unix 环境比 Mac OS X 的更友好,保留它只是因为这台 MacBook 的主人需要它。

这个方案的好处是 Windows 可以有 D: 盘来将系统和个人数据分开,GNU/Linux 也可以有多个分区来分离系统和个人数据。实际上因为 GNU/Linux 内核 支持 GPT,后面可以创建更多分区给 GNU/Linux,不过我使用的 MacBook 硬盘只有 80GB,分区太多各个分区空间利用率反而降低,所以 /dev/sda3 身兼了三职。这样做还有个好处,Windows 里的 Cygwin 和 GNU/Linux 可以很容易的共享同一个 $HOME 目录,不管是 TM2008、Pidgin 还是 OpenSSH、zsh、Vim/gVim 都可以很方便地在两个系统共享同一套配置和数据文件。

准备工具

  • 一台 Intel Mac。
  • Mac OS X 10.4 以上安装光盘,如果 Intel Mac 上已经安装好了 Mac OS X,则不需要。
  • Windows 安装光盘,原始版本或者 Ghost 版本都可以。
  • 一张包含 GNU Parted 的 GNU/Linux 安装光盘或者 Live CD,例如我使用的 Debian 安装光盘。
  • rEFIt 安装程序。

因为 Intel Mac 对 USB 存储设备的 BIOS 兼容启动支持很差,所以上面提到的都是光盘。

安装步骤

  1. 按照常规的方式将 Mac OS X 安装到一个分区上。建议将安装光盘的 dmg 镜像使用 Disk Utility 恢复到一块移动硬盘的某个主分区上,再用它启动安装程序,这样安装过程会比较快。如果你的 Intel Mac 上已经有一个正常使用的 Mac OS X 10.4 以上版本,这一步可以直接忽略。

  2. 使用 Mac 主菜单里的 Software Update 安装最新的 combo update 和 firmware update。

  3. 在 Mac OS X 里使用命令行工具 diskutil 将 Mac OS X 安装分区动态缩小(也可以使用 BootCamp),为其它系统预留出足够的空间。这一步的目的只是留出空间,详细的分区过程将使用 GNU Parted。命令格式如下,第一个 45G 是 Mac OS X 安装分区 disk0s2 将要被缩小到的大小。第二个 30G 只是用来占位的分区,必须提供,否则 diskutil 完成工作之后你会发现 disk0s2 大小没有变化。在这么做之前请使用 diskutil list 查看 GPT,确保你的 Mac OS X 是安装在 disk0s2

    sudo diskutil resizeVolume disk0s2 45G "MS-DOS FAT32" "Windows" 30G
    
  4. 在 Mac OS X 里安装多系统引导管理器 rEFIt。安装完成以后每次启动时都可以看到 rEFIt 的图形界面,通过它可以选择启动不同的系统,以及访问 rEFIt 的 Partitioning Tool 进行 GPT 和 MBR 分区表的同步。

  5. 使用 Debian 安装光盘(或者其它包含 GNU Parted 的 LiveCD)启动 Intel Mac,在硬盘分区步骤即可以使用 GNU Parted 工具。删掉刚才预留的 30G 占位分区,将空闲空间按照上面提到的方案分成 4 个分区。此处 GNU Parted 不能创建 NTFS 文件系统,所以 /dev/sda4 暂时使用 ext3 或者其它文件系统,将来可以用 Windows 安装程序重新格式化为 NTFS。我在这一步直接安装好了 Debian GNU/Linux,你也可以在分区完成后取消安装过程,安装你喜欢的其它发行版。我猜测大多数的发行版使用的分区工具都应该是 GNU Parted,因此这一步你应该可以直接使用你喜欢的发行版的安装光盘。

  6. 重新启动后在 rEFIt 的图形界面里进入 Partitioning Tool,按提示进行 GPT 和 MBR 的同步。

  7. 使用 Windows 安装光盘启动 Intel Mac 并将最后一个分区(Windows 安装程序看到的最后一个分区只是 MBR 分区表中的最后一个分区,即 /dev/sda4)格式化为 NTFS,安装 Windows。

  8. 也可以用国内常见的各种 GhostXP 光盘来安装 Windows,但是必须要使用带有 Windows PE 的版本。因为 Intel Mac 几乎完全不能运行 DOS 下的任何程序,所以必须使用光盘上的 Windows PE 启动,然后使用 GHOST32 来恢复光盘上的 .GHO 文件到预留的 Windows 安装分区 /dev/sda4。这里还可能会遇到一个问题,如果执行 GHOST32 之前你已经将 /dev/sda4 格式化成了 FAT32 文件系统(也可能是 NTFS),很有可能在 GHOST32 中选择目标分区时看不到它,而保留在第 5 步中选择的 ext3 或者 reiserfs 文件系统则没有问题

参考资料

标签:, , , , , , , , ,

前言

腾讯已经发布了官方的 QQ for Linux,虽然有很多问题,例如没有 amd64 版本,功能太弱,聊天记录格式与 Windows 下的 QQ/TM 格式不一致等等,但无疑是 Linux 里使用 QQ/TM 最简单的方案。如果它已经能满足你的需求了,那么不必浪费时间看本文。

精简版本

如果你没时间看我唠叨,精简的版本是:TM2008 Beta 运行需要 Unicode 版本的 IE6、rpcrt4.dll、Visual C++ 2005 SP1 运行库,安装程序需要 GDI+。不可以使用 IEs4Linux,因为它安装的 IE6 及相关运行库是 Win9x 的 ANSI 版本。必须使用 CrossOver Games 里的 rpcrt4.dll,然后用 winetricks 安装 msxml3 gdiplus riched20 riched30 ie6 vcrun6 vcrun2005sp1 即可安装运行 TM2008 Beta。

详细版本

只看精简版没搞定?请看详细的(唠叨的)版本:

安装 Wine,运行一下 winecfg,让它生成一个干净的 ~/.wine 目录。如果要使用已有的 ~/.wine,请先将其备份。同时确保 winecfg 里设置的 Windows 版本至少是 Windows 2000(我用的是 Wine 1.x 默认的 Windows XP)。

获取一份 CrossOver Games 里的 rpcrt4.dll,将其复制为 ~/.wine/drive_c/windows/system32/rpcrt4.dll(覆盖已有的文件),运行 winecfg,在 Libraries -> DLL Overrides 里将 rpcrt4 设置为 Native (Windows)。

下载 winetricks,使用它安装 IE6 和一些重要的运行库。如果这个过程失败,删除 ~/.wine(或者恢复备份的 ~/.wine)并从头再来。

sh winetricks msxml3 gdiplus riched20 riched30 ie6 vcrun6 vcrun2005sp1

此时如果你有 Windows 上安装好的 TM2008,它已经可以运行了,但是无法登录,会提示“网络连接失败,请检查网络。”。所以还是老老实实用安装程序装一次吧。这里有个很莫名的问题,如果直接使用 Wine 运行 TM2008 安装程序,它很可能会直接崩溃,看不到任何图形界面的提示。而使用 Wine 运行一个其它的程序,例如 cmd.exe 或者 Total Commander,再用这个程序去启动 TM2008 安装程序则不会有任何问题。

中文乱码(空心方框)问题

好吧,终于看到 TM2008 的安装界面了,不过很可能你又会头大了——所有的中文全是空心方框。原因是安装程序界面的字体是被指定为 Tahoma 的,而实际上 Tahoma 字体并不包括中文字符。有两个办法解决,都是 Windows 的技术,把 Tahoma 字体替换成某个中文字体,或者把某个中文字体链接到 Tahoma 上。照这两个片段修改 ~/.wine/system.reg,只需要其中一个。别忘了把中文字体名改成你自己需要的。

[Software\Microsoft\Windows NT\CurrentVersion\FontSubstitutes]
"MS Shell Dlg"="Microsoft YaHei"
"MS Shell Dlg 2"="Microsoft YaHei"
"Tahoma"="Microsoft YaHei"

[Software\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink]
"Tahoma"=str(7):"SimSun.TTC,SimSun\0"

最后还必须把你改的中文字体文件符号链接到 ~/.wine/drive_c/windows/Fonts 目录下,不这么做其它软件都没问题,就 QQ 或 TM 会乱码,该死的硬编码。

查看聊天记录时的性能问题

好了,现在不会有什么问题阻挡你了,TM2008 Beta 安装和启动都非常顺利,使用也很稳定。甚至 QQ2009 Preview4 都可以安装并启动,不过使用时很容易崩溃。但是如果你像我这样疯狂地保存了七八年的聊天记录,你会发现:

  • 每次启动 TM2008 后第一次给任何人发消息都会导致 TM2008 失去响应将近 20 秒钟,之后继续发消息则不会有问题。第一次接收到某人的消息也会同样如此。
  • 任何试图查看聊天记录的操作都会导致 TM2008 消耗 100% CPU 并且很长时间没有反应,等待足够长的时间后才可以看到聊天记录。

这是由于 TM2008 的聊天记录数据库使用了 Windows 的 Structured Storage 技术,而其 API 库 ole32.dll 的 Wine 实现还不完善或者可能性能太低。虽然可以用 winetricks 安装 dcom98 来获取一个 Win9x 的 ANSI 版本的 ole32.dll,但它没法让 Unicode 版本的 TM2008 运行起来。搜遍了网络也找不到在 Wine 里使用 Win2k 以上系统的 ole32.dll 的方法。没办法,为了保持聊天记录的一致性,只有两个选择。要么不在 Linux 里看聊天记录;要么把聊天记录数据库 Msg2.0.db 备份并从 QQ Profile 目录(我的文档\QQ Files\QQ 号码)里删除,让 TM2008 自己生成一个空白的 Msg2.0.db,暂时抛弃历史包袱,以后再到 Windows 下把新的记录导出为备份文件后合并到老的数据库里。

与 Windows 共享聊天记录

如果你还像我这样偶尔会切换到 Windows,希望跟 Windows 下的 TM2008 共享聊天记录数据库,那么有两个办法:

  • 直接在 Linux 里使用 ntfs-3g 读写存放 TM2008 聊天记录的 NTFS 分区。虽然 ntfs-3g 已经号称非常稳定可靠了,但对于聊天记录这种极度个人化的数据我还是宁可保守一些。
  • 创建一个 ext2 分区用来和 Windows 共享数据,在 Windows 下可以用 Ext2 IFS 驱动来访问它。比起私有文件系统 NTFS 的 Linux 版开源驱动来说,当然是开源的 ext2 文件系统的 Windows 版驱动更值得信赖。

用这两种办法都需要在 Linux 和 Windows 里创建 QQ Files 目录的符号链接,Linux 里不必说,ln -s 即可。Windows Vista 以前的版本可以用 Junction 来创建 NTFS 上的符号链接,Windows Vista 可以用自带的 MKLINK。

对于我这种非笔记本用户来说使用日志文件系统来抵御意外断电是必须的。按照 Ext2 IFS 的 FAQ,它也可以读写 ext3 分区。不过比较新的 Linux 发行版的 mkfs.ext3 创建的 ext3 分区 Ext2 IFS 是无法访问的,可能是 ext3 文件系统格式发生了变化。而 Windows 下一些分区工具如 Paragon Partition Manager 或 Acronis Disk Director 创建的 ext3 分区则没有问题。比较新的 Linux 发行版的 mkfs.ext3 默认创建的 ext3 分区 inode 大小是 256 字节,Ext2 IFS 不支持这样的 ext3 分区,使用 mkfs.ext3 -I 128 即可创建 inode 大小为 128 字节的能被 Ext2 IFS 支持的 ext3 分区。不建议使用 Paragon Partition Manager 等 Windows 下的工具创建 ext3 分区,至少 PPM 创建的 ext3 分区是没有目录 hash 的。Ext2fsd 支持 inode 大小为 256 字节的 ext3 分区,不过虽然相对 Ext2 IFS 它有 GPL 的优势,但似乎成熟度比 Ext2 IFS 低,而且我试用的感觉并不太好,所以没有选择它。

参考资料

标签:, , , , ,

Ctrl + 左键单击在后台打开新标签

打开首选项 -> 高级 -> 内容 -> JavaScript 选项,为“用户 JavaScript 文件”指定一个目录,然后从 这个帖子 里(需要穿墙)下载 allinbackground.js (本地镜像,无须穿墙)放到指定的目录,无需重启 Opera 即可生效。对于使用 https 的站点,在地址栏输入 opera:config,搜索“User JavaScript”,勾选“User JavaScript on HTTPS”(请自行确保你的 User JavaScript 都是无公害的)。

Shift + Enter 和 Ctrl + Shift + Enter 自动补全 .net 和 .org 网址

打开首选项 -> 高级 -> 快捷键,如果你以前修改过键盘快捷键,双击“Opera Standard (已修改)”,否则双击“Opera Standard”,定位到 Advanced -> Address Dropdown Widget。这里可以看到 “Enter ctrl” 对应的操作是 “Autocomplete server name, “http://www”, “com””,所以你要做的就是新建两个项目,分别设置快捷键为“Enter shift”和“Enter ctrl shift”,操作为“Autocomplete server name, "http://www", "net"”和 “Autocomplete server name, "http://www", "org"”。

搜索时自动打开新标签

打开首选项 -> 高级 -> 标签页,去掉勾选“重用当前标签页”。这里还可以顺便把“在使用 Ctrl + Tab 循环浏览标签页时”设置为“不显示列表循环”,以及勾选“在当前标签页旁边打开新标签”和“关闭标签页时”“激活下一个标签页”。

标签:, ,
Page 1 of 912345...Last »