自从09年开始使用systeminplace的VPS来FQ后,一直都使用的很正常。但在10年kernel被升级后。VPS的路由功能就突然失效了。
通过检查发现,问题不在VPN上,因为PPTP可以正常建立连接。通过tcpdump抓包发现,VPN客户端的请求已经从VPS的Internet口转发出去了。但却没有任何的数据包返回。如果从对端的服务器上也做tcpdump,发现数据包已经到了对端服务器,但不知道为什么,对端服务器直接把数据库丢弃。并没有返回数据。问题好像十分诡异。
与systeminplace的support team讨论得知,他们的新kernel并没有把所有的iptables功能编译进去,比如mangle表就没有被编译进去。导致数据包虽然被SNAT并转发出去了,但由于没有managle表帮忙更新数据包的checksum。所以被对端服务器当成非法数据包而丢弃(他们的原话:the reason why this happens is because the NAT target mangles the IP header as it should, but does not update the checksum. normally, this is fine because the NIC driver will recalculate the checksum, but instead it gets summarily rejected by the firewall and never makes it to the router as xen’s netback does not support checksum offloading obviously.)。
得知这个结果后,开始以为没有救了,只能换VPN的Vendor了(systemplace的support team一直强调,他们不支持关于VPN的support,我猜是因为很多像我这样的人买了他们的VPS做FQ工具了。他们不胜其烦,就只能通过kernel限制路由使用减少我们这些用户量了)。但昨天百无聊赖时,翻查了他们的资料库(Library),虽然只有4篇文章,但里面却找到了一个很重要的资料。就是《Using PV-GRUB with CentOS and RapidXen (to use CentOS official kernels)》。这文章介绍怎么可以使用CentOS自带的Kernel,而不是他们提供的Kernel。这个非常的重要,因为本来问题就在他们编译的kernel上。如果使用CentOS的官方Kernel,那么所有限制就可以解决了。
按照他们的资料介绍,方法十分简单。
(1) 先通过 yum升级所有补丁包和安装grub(这是为了能够通过yum安装kernel后没有兼容性问题)
yum update
yum grub

(2) 安装CentOS的kernel for xen
yum –enablerepo=centosplus install kernel-xen

(3) 重新编译启动镜像,让它可以预装载(preload)jfs和xenblk两个模块。这里必须要注意了,由于时间不同,我们在(2)中安装的kernel-xen的版本号也不同,所以下面的命令中的kernel版本号(2.6.18-194.11.3.el5.centos.plusxen)要改为我们刚刚安装的kernel的版本号才行。
/sbin/mkinitrd -f –preload jfs –preload xenblk /boot/initrd-2.6.18-194.11.3.el5.centos.plusxen.img 2.6.18-194.11.3.el5.centos.plusxen

(4) 添加一个新文件(/boot/grub/menu.lst),内容如下:(系统本来是没有/boot/grub这个目录的,因此要先通过mkdir /boot/grub创建。并且kernel的版本号也要改成相应的内容,就如(3)一样)
#############################
timeout 5

title           CentOS 5, kernel 2.6.18-194.11.3.el5.centos.plusxen
root            (hd0)
kernel          /boot/vmlinuz-2.6.18-194.11.3.el5.centos.plusxen root=/dev/xvda1 ro quiet
initrd          /boot/initrd-2.6.18-194.11.3.el5.centos.plusxen.img
#############################

(5)  给刚才生成的文件建立一个软链接到/boot/grub/grub.conf
ln -sf /boot/grub/menu.lst /boot/grub/grub.conf

(6)通过下面的命令,检查上面的操作是否成功(如果成功,系统会显示/boot/vmlinuz-2.6.18-194.11.3.el5.centos.plusxen)
grubby –default-kernel

(7) 登录到systeminplace的后台,选择my server –〉manage –> advance settings –> PV-GRUB,并点击change kernel profile。 (请注意,PV-GRUB是分32bit和64bit的。请根据你们的VPS的CentOS的版本自己选择。如果不知道自己的OS是32bit还是64bit,可以登录到系统,并输入uname –all,如果得到的结果有i686,就是32bit的,如果是x86_64,就是64bit的了)。

(8) 选择my server –〉manage –> advance settings –〉dashboard , 选择Stop,再选择Start重启VPS。 (请不要再OS中输入reboot重启VPS,没有用的,系统还是会启动之前的Kernel)。

当启动完毕后,输入uname –all 就可以看到系统已经使用我们自己的Kernel了。这时候你会发现,路由的功能又回来了。启动openvpn也不会出错了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Post Navigation