星期五, 十二月 28, 2012

TunnelBroker不稳定情况一则


一直通过路由使用HE的tunnelbroker访问IPv6网络,开始用的dd-wrt设置的tunnel,非常稳定,但是由于硬件兼容问题,改为用原厂固件,改过后就出现V6不稳定的情况,困扰很久。具体表现是Win7经常找不到V6连接,通过test-ipv6.com测试时经常找不到IPv6地址,在linux下用ping6 ipv6.google.com测试时偶尔会出现Invalid Argument,但大多时间会成功。Goolge看到ping6在测试link local地址时没指定设备号会出现Invalid Argument的错误提示。检查当前tunnel创建命令:
ip tunnel add he-ipv6 mode sit remote 10.0.0.1 local 10.10.0.1 ttl 255
man 8 ip可以看到ip命令创建tunnel时支持通过dev参数指定绑定的设备,所以将创建命令改为:
ip tunnel add he-ipv6 mode sit remote 10.0.0.1 local 10.10.0.1 dev ppp0 ttl 255
经过一天测试,感觉比V6比原来稳定很多。猜测路由原版固件linux内核版本较老,在创建tunnel时不会同时绑定设备,在打开socket时会尝试不同设备发送,网络情况变化较多,可能造成某些尝试失败,而误报Invalid Argument。

星期三, 十一月 07, 2012

Chyrp在Safe Mode的PHP服务器上安装问题


Chyrp是个轻量级的CMS/Blog平台,可以用来在小项目和低配置机器上替代Wordpress。但是在设置了Safe Mode的平台上安装时,会遇到一些问题,需要手动调整。
Warning: glob() has been disabled for security reasons in /root_dir/chyrp_dir/includes/class/Theme.php on line 200
这是最严重的问题,系统设置禁用了glob函数,Chyrp无法获取当前目录下文件列表,会造成sytesheets路径出问题,页面显示不正常。解决方法是在chyrp_dir/include中创建文件sec_glob.php,内容为
<?php
/**#@+
 * Extra GLOB constant for safe_glob()
 */
define('GLOB_NODIR',256);
define('GLOB_PATH',512);
define('GLOB_NODOTS',1024);
define('GLOB_RECURSE',2048);
/**#@-*/

/**
 * A safe empowered glob().
 *
 * Function glob() is prohibited on some server (probably in safe mode)
 * (Message "Warning: glob() has been disabled for security reasons in
 * (script) on line (line)") for security reasons as stated on:
 * http://seclists.org/fulldisclosure/2005/Sep/0001.html
 *
 * safe_glob() intends to replace glob() using readdir() & fnmatch() instead.
 * Supported flags: GLOB_MARK, GLOB_NOSORT, GLOB_ONLYDIR
 * Additional flags: GLOB_NODIR, GLOB_PATH, GLOB_NODOTS, GLOB_RECURSE
 * (not original glob() flags)
 * @author BigueNique AT yahoo DOT ca
 * @updates
 * - 080324 Added support for additional flags: GLOB_NODIR, GLOB_PATH,
 *   GLOB_NODOTS, GLOB_RECURSE
 */
function safe_glob($pattern, $flags=GLOB_PATH) {
    $split=explode('/',str_replace('\\','/',$pattern));
    $mask=array_pop($split);
    $path=implode('/',$split);
    if (($dir=@opendir($path))!==false) {
        $glob=array();
        while(($file=readdir($dir))!==false) {
            // Recurse subdirectories (GLOB_RECURSE)
            if( ($flags&GLOB_RECURSE) && is_dir($file) && (!in_array($file,array('.','..'))) )
                $glob = array_merge($glob, array_prepend(safe_glob($path.'/'.$file.'/'.$mask, $flags),
                    ($flags&GLOB_PATH?'':$file.'/')));
            // Match file mask
            if (fnmatch($mask,$file)) {
                if ( ( (!($flags&GLOB_ONLYDIR)) || is_dir("$path/$file") )
                  && ( (!($flags&GLOB_NODIR)) || (!is_dir($path.'/'.$file)) )
                  && ( (!($flags&GLOB_NODOTS)) || (!in_array($file,array('.','..'))) ) )
                    $glob[] = ($flags&GLOB_PATH?$path.'/':'') . $file . ($flags&GLOB_MARK?'/':'');
            }
        }
        closedir($dir);
        if (!($flags&GLOB_NOSORT)) sort($glob);
        return $glob;
    } else {
        return false;
    }    
}

/**
 * A better "fnmatch" alternative for windows that converts a fnmatch
 * pattern into a preg one. It should work on PHP >= 4.0.0.
 * @author soywiz at php dot net
 * @since 17-Jul-2006 10:12
 */
if (!function_exists('fnmatch')) {
    function fnmatch($pattern, $string) {
        return @preg_match('/^' . strtr(addcslashes($pattern, '\\.+^$(){}=!<>|'), array('*' => '.*', '?' => '.?')) . '$/i', $string);
    }
}
?>
编辑chyrp_dir/include/Theme.php,在代码最前面加入
require_once("sec_glob.php");
查找并替换所有glob为safe_glob。对于其它不重要的函数调用可以通过给函数名前加@关闭警告信息,如替换opendir为@opendir即可。

星期一, 十月 29, 2012

安装MathType 5.2c到Office 2007


安装MathType 5.2c到Office 2007时安装程序会提示不支持的Office版本,让升级到新版本,安装完成后打开Word不出现MathType工具栏。事实上,可能通过手动安装实现MathType 5.2在Word 2007中运行。
Word安装是:找到MathType的Word支持文件MathType Commands 5 For Word.dot和MathPage.wll,手动放入Word启动加载文件夹中即可。两个文件所在路径分别是(根据安装路径调整)
C:\Program Files\MathType\Office Support\MathType Commands 5 For Word.dot
C:\Program Files\MathType\MathPage\MathPage.wll
找到后,复制并粘贴到(给所有用户安装)
C:\Program Files\Microsoft Office\Office12\STARTUP
如果是给单个用户安装,那么目标路径为
#Windows Vista & 7
C:\Users\[用户名]\AppData\Roaming\Microsoft\Word\STARTUP
#Windows XP
C:\Documents and Settings\[User Account Name]\Application
Data\Microsoft\Word\Startup
注意两个路径根据需要任选其一即可。
PowerPoint安装过程:打开PowerPoint 2007,单击左上角的Office图标打开菜单,在菜单最下面找到并打开PowerPoint选项对话框,对话框左侧选择加载项,在右侧下方找到管理,下拉列表中选择PowerPoint加载项,点旁边的转到按钮,在弹出的对话框中点添加按钮,找到并添加下面的文件即可(根据MathType安装路径调整)
C:\Program Files\MathType\Office Support\MathType AddIn (PowerPoint 2003).ppa
安装完成后如果菜单栏没有加载项的话,重启PowerPoint应该就可以了。

关闭Windows 7自动跃点功能实现指定多条默认路由选路顺序


在Win7下搭了个隧道,手动添加路由并设置了一个比较低的跃点数,开始使用的时候发现流量走隧道,但是过一会自动变成本地网卡。同样的设置在XP中从来没出现过。查资料后发现确实为Windows 7的(新)特性。
1. Windows 7下路由跃点值由两部分之和构成(设备跃点数和路由本身跃点数),所以当你用
netsh int ip add route 0.0.0.0/0 "Internet" 10.0.0.1 metric=10 public=yes store=active
这样的命令(或者route)添加路由时,再用route print看到的路由metric值并不是自己在命令中指定的值(比如上面的命令增加的路由metric可能为20)。这就是因为Win7给你指定的metric值上增加了设备本身metric。
2. 设备本身metric默认为自动生成,与此设备连接速度和带宽有关,而且使用过程中可能发生变化。这应该就是隧道时灵时不灵的原因了吧。
修改很简单,依次打开控制面板,网络和Internet,网络和共享中心,左侧找到更改适配器设置,找到本地网卡,右键点之,属性,选择IPv4,点属性,弹出对话框中点高级按钮,将自动跃点项前的对勾去掉,填入一个合适的值(如1000)。再用同样的方法修改隧道对应的适配器的跃点值(如100)。回来连接隧道上网,再不出现上网过程中路由自动改变的问题了。
这个方法同样适用于多网卡情况,有时需要用到多个网卡同时接入,但各有不同用途,就需要手动设置跃点(metric)值,可以参考官方论坛的文章。最后抱怨一下Win7这个功能,可能带来很大的问题,有时用户本来指望使用加密的VPN连接保护通信,结果因为其连接速度不如原生的本地网卡,在使用过程中由于Win7自动跃点,不知不觉所有流量改为通过本地网卡路由,结果数据在用户不知情的情况下变为明文传输。

星期二, 十月 23, 2012

证书和CA两则


再记录两则关于证书和CA的问题。
1. nginx中配置证书路径。自签名证书有个问题就是根证书本来没有在客户端中存储,所以需要在http服务器中配置证书路径(certificate chain)一次将证书和根证书发送给客户端。在Apache服务器中有专门的CA证书配置语法,但nginx则需要一个证书本身包含路径中的所有证书,生成命令为
cat servercert.pem > chaincert.pem
cat rootcert.pem >> chaincert.pem
#如果有intermediate certificate,则包含在rootcert之前,如下
cat servercert.pem > chaincert.pem
cat intercert.pem >> chaincert.pem
cat rootcert.pem >> chaincert.pem
2. windows xp和server 2003不支持证书散列算法sha-2(包含sha-256、sha-512等),所以,为了最大的兼容性,尽量服务器证书和根证书签名散列算法都sha1,否则查看证书时会提示invalid signature.

删除IE证书中其他人类别的证书


误导入一个证书到IE的其他人类别中,打开Internet选项发现竟然不能删除,就其他类别下的证书不能删除,不知道微软怎么想的。通过一翻折腾,终于找到方法。
首先用Win+R键打开运行对话框,输入mmc打开管理控制台,在菜单栏中选择文件->添加删除管理单元,打开对话框左侧找到证书,点添加按钮,弹出对话框中选择我的用户账户,点完成,确定回到程序主界面。
现在在左侧的证书中找到其他人的类别,找到要删除的证书,在右键菜单中即可删除。删除完成关闭程序时提示是否保存,可以选择不保存,不会影响操作结果。

使用openssl制作自签名的CA并签名自己的网站


Https可以很大程序上提高网站安全性,防止网站和用户通信被第三方获得。但是要使用https就必需要有证书,证书由可信CA(Certificate Authority)颁发,但是这种证书价钱非常高,一般每年收费100美元以上,而且,对于某些针对性很强的网站(比如机构内部网站),并不需要全局可信的证书,所以很多情况下,可以用自签名的证书代替。制作自签名的证书可以用Windows Server版自带的CA工具,更多的情况下,用的是openssl证书工具。使用openssl签名证书相关的工作主要有CA生成、证书请求生成和证书签名。使用工具主要是openssl自带的CA.pl工具,路径为/usr/lib/ssl/misc/CA.pl.
1. CA生成。自签名证书可以直接制作,但是首先制作一个自签名CA,然后再给网站签署证书,更便于管理,而且安全性也更有保证。使用命令
/usr/lib/ssl/misc/CA.pl -newca
可以生成一个自签名的CA. 首先要输入私钥保护密码(必须),然后是其他信息,主要需要用户输入的信息为:
  • Country Name - 国家名(美国US,中国CN)
  • State or Province Name - 行政省或州名 (Hubei, California)
  • Locality Name - 城市名(Wuhan, Los Angeles)
  • Organization - 公司名(My Company)
  • Organizational Unit Name - 公司中的部门名称(Network Security Department)
  • Common Name - 通用名(注意:这是最重要的部分,它是区分你跟其他CA的标记名,如果你在做一个自签名网站的话,这里应该输入网址。对于CA,输入XXX CA, My CA类似的名字)
  • Email Address - 管理员信箱不解释
下面除询问私钥密码时必须输入外(共三次密码输入中的第二次),其它问题应该都可以忽略。使用默认的配置生成的CA有效期有3年,修改可以在CA.pl中查找CADAYS设置。默认的签名证书有效期只有1年,在CA.pl中DAYS变量设置。
默认情况下证书加密使用的是1024bit,建议修改为2048bit以上,在/etc/ssl/openssl.cnf中
default_bits            = 1024
默认hash算法是sha1,如果需要可以选择更强的sha256或者sha512. 不建议使用md5. 也在此配置文件中修改。
2. 生成证书请求,不管是用自签名还是让可信CA签名,都需要首先生成证书请求。使用命令
/usr/lib/ssl/misc/CA.pl -newreq
输入信息方式同生成CA时。生成newreq.pem提交到自签名CA或者可信CA进行签名。不过为了后面安装设置方便,需要把当前私钥的保护密码删除(除非你想在每次apache启动时手动输入密码),命令为
openssl rsa -in newkey.pem -out newkey.nopass.pem
证书签名完成以后配置apache时,密钥文件使用应该使用newkey.nopass.pem,不要用newkey.pem.
3. 用自签名CA给签署证书请求,确保当前目录下存在demoCA和newreq.pem文件,命令为
/usr/lib/ssl/misc/CA.pl -sign
签名完成的证书在newcert.pem文件中。配置apache使用cacert.pem(demoCA文件夹内)、newcert.pem和newkey.nopass.pem三个文件即可实现https访问。
当然也可以直接在第一步的Common Name中输入网站名称,生成自签名证书,但是这样会有两个问题:一是管理不方便,机构内有几个网站,就需要用户导入几次证书,而使用CA的方式用户只需导入CA证书即可;二是密钥和证书在同一服务器上,如果安全出现问题比较麻烦,相比之下CA方式只要CA私钥安全吊销证书即可。

星期四, 十月 18, 2012

解决SMP平台程序GUI卡死问题,VirtualBox完美运行Mac OS X


VirtualBox提供Mac OS X比较完美的支持,选择单核时Lion安装上直接就能完美运行,速度相对来说还是比较快的。但是Mountain Lion在单核平台下却不能安装,安装进行到还剩4分钟时死机,双核安装没有问题。但是双核平台下不管是Lion还是Mountain Lion运行都不正常,程序GUI经常卡死,屏幕刷新不完全等错误,但是系统本身没有死机,强行退出程序后还能继续运行。原本以为是MAC的SMP调度算法和VirtualBox不兼容,但是根据这个帖子的说法,应该是很多Intel多核平台都存在的问题,而安装VoodooTSCSync这个插件可以解决此问题。
VoodooTSCSync可以在其官方主页下载,Multibeast没有提供(希望以后版本能集成),安装可以使用KextDrop(下载连接)。安装完后修改VoodooTSCSync的Info.php,找到IOCPUNumber字段,根据给虚拟机分配的核心数修改,双核如下:
<key>IOCPUNumber</key>
<integer>2</integer>
进入系统后可以用kextstat查看已经加载的kext列表,使用kextload -v [name.kext]可以手动加载内核模块,使用kextcache -system-prelinked-kernel和kextcache -system-caches可以重新生成kext cache,使用system_profiler|grep -i core可以看到核心数,Lion在/var/log/kernel.log中搜索tsc可以看到VoodooTSCSync模块加载输出的字符串,Mountain Lion在/var/log/system.log中
补充一点: 装了VoodooTSCSync后虽然卡死情况少了,但是并没有完全消失,所以对比下来还是单核平台下运行原生Lion稳定性最好。而且VoodooTSCSync好像只有当机器类型是Mac Pro的情况下才管用,机器类型在/Extra/smbios.plist内设置,相关内容如下
<key>SMfamily</key>
<string>Mac Pro</string>
<key>SMproductname</key>
<string>MacPro3,1</string>>

星期三, 十月 17, 2012

设置Xen网络让虚拟机通过NAT上网


在Debian6下安装Xen4,基本过程很顺利(参考相关debian文档xen文档),但是安装完成后设置nat网络让虚拟客户端上网费了不少神。据debian和xen的文档介绍,debian安装的xen虽然自带network-script用来设置各种类型的网络,但是这些脚本工作不是很好,所以建议用户采用debian的brctl工具手动设置bridge功能和nat,在此基础上设置虚拟机网络参数。
1. 设置主机bridge网络,将来虚拟机的网卡都连接到此网卡上(相当于插在一个交换机上)
#/etc/network/interfaces
#modify
auto lo xenbr0
#add
iface xenbr0 inet static
        bridge_ports none
        address 10.0.120.1
        broadcast 10.0.120.255
        netmask 255.255.255.0
配置文件中,auto lo xenbr0表示系统启动后设置的bridge网卡xenbr0自动启动,而不需要手动运行ifconfig xenbr0 up这样的命令。bridge_ports指定添加进bridge的系统现有的网卡(假如虚拟机有独立ip的话后面就不需要设置nat,这里添加本机网络端口,如:eth0)。其它参数根据需要设置。
2. 找到/etc/xen/xend-config.sxp,添加下面一句,可以实现虚拟机启动时网卡自动加入bridge网络
#/etc/xen/xend-config.sxp
(vif-script vif-bridge)
3. 添加iptables规则实现nat,网络地址和网络外部端口根据实际情况设定
#/etc/network/if-pre-up.d/xennat
#!/bin/sh
iptables -t nat -A POSTROUTING -s 10.0.120.0/24 -o eth0 -j MASQUERADE
iptables -I FORWARD -s 10.0.120.0/24 -j ACCEPT
iptables -I FORWARD -d 10.0.120.0/24 -j ACCEPT
同时打开内核forwarding,编辑/etc/sysctl.conf文件,加入或修改
net.ipv4.ip_forward=1
4. 为了简化虚拟机创建,可以把网络默认参数添加进xen-tools配置文件,修改/etc/xen-tools/xen-tools.conf
#/etc/xen-tools/xen-tools.conf
gateway    = 10.0.120.1
netmask    = 255.255.255.0
broadcast  = 10.0.120.255
nameserver=8.8.8.8
bridge = xenbr0
passwd = 1
arch=i386
vcpus=1
5. 虚拟机示例
debian虚拟机创建,使用xen-create-image命令
#debian domu
xen-create-image --hostname deb1 --ip 10.0.120.101 --pygrub
windows虚拟机类型为hvm(硬件虚拟机,需要cpu支持vt-x),需要手动创建配置文件
#windows hvm
#/etc/xen/xp1.cfg
kernel = '/usr/lib/xen-4.0/boot/hvmloader'
builder='hvm'
memory = 256
vcpus=1
name = "xp1"
#vif = ['bridge=xenbr0']
vif = [ 'ip=10.0.120.102,mac=00:16:3E:85:4A:60,bridge=xenbr0' ]
disk = ['file:/home/xen/domains/xp1/hd.img,hda,w','file:/home/xen/domains/xp1/xp.iso,hdc:cdrom,r']
acpi = 1
apic=1
device_model = '/usr/lib64/xen-4.0/bin/qemu-dm'  #lib for 32bit, lib64 for 64bit
boot="c"
sdl=0
serial='pty'
vnc=1
vnclisten=""
vncpasswd=""
usbdevice='tablet'    #needed, else mouse won't work right
需要注意的是Windows虚拟机必须使用USB鼠标(usbdevice='tablet'),否则鼠标光标工作不正常。配置文件指定的硬盘镜像hd.img使用命令dd生成
# 8G硬盘镜像
dd if=/dev/zero of=/home/xen/xp1/hd.img bs=1M seek=8192 count=0
启动虚拟机用xm create命令,虚拟机启动后,debian可以通过xm console deb1连接控制台;windows用vnc连接本地127.0.0.1可以连接到桌面。
#start vm
xm create /etc/xen/deb1.cfg
xm create /etc/xen/xp1.cfg
#us vncviewer on 127.0.0.1 for windows desktop

Debian6下安装Xen4后GRUB2菜单冗余项问题解决


Debian 6默认的bootloader是grub2,其启动菜单由一系列的/etc/grub.d中的脚本自动生成。其中默认包含10_linux脚本用来枚举本地linux内核生成启动项,安装xen后,20_linux_xen添加了自动枚举xen dom0内核的功能。但是,xen安装的dom0内核也能被10_linux检测到,于是启动菜单里dom0相关的启动项会出现两遍,而由于10_linux生成的项没有启动xen本身,所以这些多余的项目存在没有意义,需要将其删除。
让10_linux仿照20_linux_xen脚本用内核对应的config-XXXversion文件信息判断内核是否是dom0内核,如果是的话,则从生成列表中将其剔除,改动的代码如下:
--- 10_linux.bak 2012-10-16 22:30:43.893612434 +0800
+++ 10_linux 2012-10-17 09:16:09.192399881 +0800
@@ -51,6 +51,18 @@
   LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID}
 fi

+# check kernel's flavor to prevent xen kernel from booting natively without hypervisor
+is_not_xen ()
+{
+ basename=$(basename $1)
+ version=$(echo $basename | sed -e "s,^[^0-9]*-,,g") 
+ if grep -qx "CONFIG_XEN_DOM0=y" /boot/config-${version} ; then
+  false;
+ else
+  true;
+ fi
+}
+
 linux_entry ()
 {
   os="$1"
@@ -95,7 +107,7 @@
 }

 list=`for i in /boot/vmlinu[zx]-* /vmlinu[zx]-* ; do
-        if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi
+        if grub_file_is_not_garbage "$i" && is_not_xen "$i" ; then echo -n "$i " ; fi
       done`
 prepare_boot_cache=

星期二, 十月 16, 2012

Win7下设置gogo6 4in6 tunnel默认路由


gogo6的4in6 tunnel使用比较方便,XP下直接拨号连接上后所有数据就自动走tunnel了,但是win7下发现连接上后默认路由不变,数据还走原来路径。检查配置文件发现gogo6连接上后route相关参数设置在template\windows.cmd中,打开,找到
netsh int ip add route 0.0.0.0/0 "%TSP_TUNNEL_INTERFACE%" %TSP_SERVER_ADDRESS_IPV4% publish=yes %NETSH_PERS% > NUL
修改为
netsh int ip add route 0.0.0.0/0 "%TSP_TUNNEL_INTERFACE%" %TSP_SERVER_ADDRESS_IPV4% metric=1
也可以直接改成使用route命令,不过route命令前需要等待一段时间
rem wait 5 secs before add route
ping -n 5 ::1 > NUL
route add 0.0.0.0 mask 0.0.0.0 %TSP_SERVER_ADDRESS_IPV4%
即可实现使用gogo6的4in6 tunnel默认路由,建议同时增加DNS配置
netsh int ip set dnsservers "%TSP_TUNNEL_INTERFACE%" static 8.8.8.8 primary

星期日, 十月 14, 2012

Debian 6.0.6下设置使用rt2870无线网卡


手头有一块USB无线网卡,芯片是rt2870的,在win7和ubuntu下都是直接识别,不需要配置,但是在新装的debian 6.0.6下就是不能用。表现为用iwlist提示unable to scan,在gnome环境中networkmanger提示device not ready。google之发现主要是两个问题:
1. debian默认没有安装ranlink-firmware,虽然安装了驱动但是没有firmware,所以设备不能使用,依照debian官方手册的方法下载安装ralink-firmware即可解决。也可以手动在这里下载安装。
2. 安装好firmware后还不能用的话,可以用lsmod查看一下系统是否加载了rt2x00usb、rt2x00lib、rt2800usb三个模块。rt2870网卡只使用rt2870sta模块即可,其他三个会造成无法使用。解决方法是打开 /etc/modprobe.d/blacklist.conf,添加
blacklist rt2800usb
blacklist rt2x00usb
blacklist rt2x00lib
最后,如果在控制台可以手动设置连接,但是gnome环境下不能连接的话,把/etc/NetworkManager/NetworkManager.conf里面的managed=false改为managed=true应该可以解决。更详细的资料可以参考官方说明

Windows7+VirtualBox安装Mac OS X几个问题


经过两天折腾,无数遍重装,终于在Windows 7上的VirtualBox中安装好了Mac OS X 10.8.0 Mountain Lion,而且使用10.8.2 Combo升级包升级后直接可以继续使用。摸清了一些VB上安装Mountain Lion的规律,几个关键点写一下:
1. 安装介质尽量用PC专用的,刚开始以为App Store上的原装货就能安装,结果折腾了很久,换了无数引导盘,都不能成功。后来下载了一个Mountain Lion for PC DVD,一次就引导成功。
2. 安装过程中最重要的工具就是引导盘,Mac OS X启动需要EFI,但是VirtualBox原生的EFI并不支持,所以必须要用引导盘(bootloader)启动安装程序,一般常用的是chameleon,iboot,hackboot等几个。我用chameleon最新的2.1版本引导安装,一次就装好并进入成功的系统。
3. 为了简化使用,第一次启动后可以选择把bootloader安装到硬盘上,以后就能直接启动了。我同样用了chameleon 2.1,不过它有两个版本,iso版是用来安装了启动系统的,zip版在Mac系统下运行可以安装到硬盘上。
4. Mac系统不像Windows这样万金油系统,他是给专用硬件设计的,而且尽可能限制非苹果机器安装,所以网上有很多软件包用来解决兼容性问题和驱动不同的硬件,著名的有multibeast,可以一次安装解决很多问题。但是网上multibeast的教程一般都是针对真实硬件的,事实上,经过不懈的折腾发现,virtualbox对Mac的支持本来就很好。装好系统后只发现一个明显的问题,就是启动非常慢,有时候甚至跟死机一样,进不了登陆界面。这个问题可以通过安装multibeast中的fakesmc来解决。而且,virtualbox下装mountain lion只需要安装这一个额外的软件包即可。
5. 好像是VB和mac的多核调度机制兼容性的问题,虚拟机设置双核的时候,经常有程序卡死,改成单核后,虽然响应比较慢,但是程序没有响应这种问题没再出现过(不过单核的装不上Mountain Lion,只能装Lion)。
6. 默认VB分辨率是1027x768的,修改分辨率需要改两个地方,mac中/Extra/org.chameleon.Boot.plist,添加或者修改代码
<key>Graphics Mode</key>
<string>1920x1080x32</string>
同时需要进入命令行,到VirtualBox安装目录运行命令
vboxmanage setextradata "Name of virtual machine" "CustomVideoMode1" "1920x1080x32"
virtualbox下安装mac的好处是兼容性比较好,鼠标、键盘自动识别,而且升级系统后不用重新设置。但是速度比较慢,程序反应迟钝,经常卡死(Mountain Lion的问题,估计跟多核调度有关)。vmware下有第三方的显卡驱动(vmsvga2)和vmware-tools支持,据说性能高一些,具体我没有测试。
系统安装主要步骤参照:How to install OS X Mountain Lion in Virtualbox [Windows]。不同的地方是我的内存只有4G,所以只给虚拟机分配了1.5G(1536M)。

UPDATE: 使用iAtkOS L2安装的比较完美,安装时不需要其他引导程序,安装好后不需要添加任何其他软件包。配置参照上面链接的文章,CPU用单核即可。装好后,可以完美升级10.7.5。

星期四, 十月 11, 2012

HP Compaq pro 4300 SFF OEM 激活机制研究


Windows 7的OEM激活是微软给OEM厂商提供的一种可以量产化的激活方式,详细的基本原理可以参考BIOS之家的相关文章。厂商一般根据自己的情况实现OEM激活的具体方式,HP Pro 4300 SFF的BIOS全部自带SLIC 2.1,但是预装Windows的型号SLIC 2.1在ACPI表中是可见的,而无Windows预装的则不可见,也就不能实现安装HP版本Windows的自动激活。根据BIOS之家和其它网站的文章看,是HP在BIOS中设置了标记,程序根据标记决定是否在ACPI表中导出SLIC信息,在HP台式机中,这个标记是feature byte,本本不详。这个标记是可以用程序设置的,笔记本使用HP SLP Tools设置,而台式机则根据BIOS版本不同,设置方式不同。
根据hpfocus网站的信息,5.0以前的BIOS需要使用dmi503工具设置,6.0版本的开机用Ctrl+F10进入可以设置,而7.0的则是进入BIOS后通过Ctrl+A进入工程模式然后在Security->System IDs项目中设置。Pro 4300 sff的版本是7.0的,但是进入工程模式后发现feature byte不可写。Google之,在scribd上的文章里看到说feature byte只有当BIOS中type 11信息无效时才可写,否则只读。进一步Google看到Type 11信息是OEM String,Pro 4300 SFF使用的AMI BIOS可以使用amidebios.exe读写此信息。
使用amidebios /os命令打开oem string(type 11),可以看到实际上就是feature byte和BID合成的字符串。使用amidebios /os 1 ""和amidebios /os 2 ""将老信息清空,回到BIOS设置,发现feature byte变为可写。找一台预装Windows的PC的feature byte写入,再用SLIC Toolkit检查看到SLIC 2.1信息读取成功。
amidebios工具可以在网上搜HP DMI ToolKit,里面有。只可在DOS下运行。估计这个方法也适用于现在BIOS不太容易修改的8000系列、pro 6000系列等(未测试)。

强制WordPress直接访问文件系统更新


更新WP时经常会碰到提示输入ftp或者ssh用户密码信息,非常讨厌。即使设置group用户可写都不行,为了让它直接访问文件系统,有时需要将目录设置权限成777,这其实上不安全。
WP在更新时会根据一系统参数判断是否直接写文件系统,首先文件owner,其次是否可写,同时满足这两个条件才行,所以直接设置group写入权限会不正常。但是,为了系统安全着想,有时候并不想把文件用户设置成nobody或者www-data这类用户,所以就需要强制WP直接访问文件系统。做到这点,在wp-content目录权限设置正确的前提下,其实只需要在wp-config.php中添加define('FS_METHOD', 'direct');即可。完整设置如下:
chgrp www-data -R wp-content
chmod g+w -R wp-content/
echo -e "define('FS_METHOD', 'direct');" >> wp-config.php

星期日, 十月 07, 2012

免费VPS一枚


国外VPS供应商ChunkHost提供免费VPS给用户,为了防止滥用,要求使用Facebook账户登陆申请,配置128MB/3G/35G,虽然有点低,不过他们声称只要你在用就可以一直免费,如果长时间不用,会暂停系统但是保留数据。
有注册过的人说他们免费VPS放出很慢,注册后会把你放到一个waitlist中,等系统有名额再开通,可能要等比较久。9月18日开通过一批,不知道下一次什么时候。不过这样也有好处,比较难得到的也许能长久些。。。而且除了Facebook账号什么都不需要,所以有兴趣的可以试着注册了慢慢等。
他们还提供更高配置的VPS,可以免费试用14天,不过需要信用卡,看看就行。

星期六, 十月 06, 2012

还是niginx/premalinks/super cache问题


前篇WordPress/Nginx打开permalinks并安装Super Cache插件介绍了用if和rewrite实现wordpress的permalinks和super cache,但是,根据Nginx文档IfIsEvil的介绍,if语句由于实现的历史原因,在location上下文中工作并不正常。所以这里把if...set...放到location外的server上下文中,然后再用try_files标记代替原来的rewrite。
#首先还是WP/super cache配置文件wp-super-cache
set $cache_uri $request_uri;

# POST requests and urls with a query string should always go to PHP
if ($request_method = POST) {
        set $cache_uri 'null cache';
}

if ($query_string != "") {
        set $cache_uri 'null cache';
}

# Don't cache uris containing the following segments
if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
        set $cache_uri 'null cache';
}

# Don't use the cache for logged in users or recent commenters
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in") {
        set $cache_uri 'null cache';
}

location /blog {
        index  index.html index.htm index.php;
        try_files /blog/wp-content/cache/supercache/$http_host/$cache_uri/index.html $uri $uri/ /blog/index.php?$args ;
}
这里假设WP安装在/blog目录下。其次是网站配置文件,包含wp-super-cache到server上下文中,需要注意的是WP对应的location已经放到wp-super-cache中了,所以网站配置文件中不再需要。如果WP不是虚拟目录的话,建议将root标记也放到server上下文中,这样php只需要配置一次.网站配置文件完整的server块如下:
        listen   443;
        server_name  localhost.localdomain;

        root /var/www;
        include wp-permalinks-super-cache;

        location ~ \.php$ {
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include fastcgi_params;
        }
多网站/目录共享WP配置方法可以参考文档:http://codex.wordpress.org/Nginx

星期五, 十月 05, 2012

Nginx/php-fpm平台下增加php脚本运行时间解决504错误


在一个低配的VPS(cpu限制主频,php脚本执行时间长)上安装wordpress(平台是nginx/php-fpm/postgresql),总是出来504 Gateway Timeout,nginx提示php-fpm没有响应。修改php.ini中maximum_execution_time没有作用,于是想到nginx等待时间太短所致。在nginx的虚拟主机配置文件中php fastcgi相关的配置中添加fastcgi_read_timeout,延长nginx等待fastcgi的时间从默认的60s到120s,问题解决。
        location ~ \.php$ {
                #...其它配置信息
                include fastcgi_params;
                fastcgi_read_timeout 120s;
        }

星期四, 十月 04, 2012

Postgresql中创建Unicode(UTF8)编码的数据库


为了数据显示一致性,现在网站存储中文数据时一般都会用utf8编码,但是在postgresql中用以下命令创建数据库时,会出错
create database my_db encoding='utf8';
提示错误:ERROR: new encoding (UTF8) is incompatible with the encoding of the template database (SQL_ASCII)
这是因为Postgresql创建数据库时实际上是从已有模板中复制,系统默认使用template1,但是这个模板不支持utf8编码,所以命令稍做修改即可
create database my_db template template0 encoding='utf8';
关于postgresql中模板以及创建数据库更详细的信息可以参考:http://www.pgsqldb.org/pgsqldoc-8.1c/manage-ag-templatedbs.html

列出所有已安装软件

Debian、Redhat、OpenBSD、FreeBSD等有软件包管理概念的*nix系统中可以用命令列出所有已安装的软件包:
Debian:
dpkg --list
dpkg --list | grep 'package-name'
dpkg --list | grep -i '*php*'
Redhat:
rpm -qa
rpm -qa | grep 'package-name'
rpm -qa | grep -i '*httpd*'
OpenBSD/FreeBSD:
pkg_info
pkg_info | grep 'package-name'

星期五, 九月 21, 2012

WordPress/Nginx打开permalinks并安装Super Cache插件



WordPress的Super Cache插件通过缓存页面的方式极大提高服务器响应,降低服务器负载。Super Cache依赖permalinks功能的开启,而permalinks又依赖Apache服务器的mod_rewrite模块。因为原生不支持,所以在Nginx下安装Super Cache优化WordPress性能需要全程手动,是件很繁琐的事情。
首先和在Apache平台下一样,在后台设置,打开permalinks,安装并开启Super Cache插件,开启过程中需要修改wp-config.php文件,加入一句:
define('WP_CACHE', true);
在Apache下Wordpress开启permalinks时会生成一个.htaccess文件,自动或者手动写入rewrite规则,内容如下:
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
Nginx没有.htaccess文件,所以要通过在配置文件中写入重定向规则实现。在/etc/nginx下创建文件wp-super-cache文件,写入以下内容
        # enable search for precompressed files ending in .gz
 # nginx needs to be complied using –-with-http_gzip_static_module
 # for this to work, comment out if using nginx from aptitude
        gzip_static on;

 # if the requested file exists, return it immediately
        if (-f $request_filename) {
                break;
        }

        set $supercache_file '';
        set $supercache_uri $request_uri;

        if ($request_method = POST) {
                set $supercache_uri '';
        }

        # Using pretty permalinks, so bypass the cache for any query string
        if ($query_string) {
                set $supercache_uri '';
        }

        if ($http_cookie ~* "comment_author_|wordpress|wp-postpass_" ) {
                set $supercache_uri '';
        }

 # if we haven't bypassed the cache, specify our supercache file
        if ($supercache_uri ~ ^(.+)$) {
                set $supercache_file /wp-content/cache/supercache/$http_host/$1index.html;
        }

 # only rewrite to the supercache file if it actually exists
        if (-f $document_root$supercache_file) {
                rewrite ^(.*)$ $supercache_file break;
        }

 # all other requests go to Wordpress
        if (!-e $request_filename) {
                rewrite . /index.php last;
        }
这里假设wordpress的安装目录是/。然后打开文件/etc/nginx/site-enabled/default,在location /区块代码中加入include wp-super-cache;一句,加好的代码如下:
location / {
    #如果出现404,请检查此级或者更高一级server代码块中root标记是否正确
    #...other stuffs...
    include wp-super-cache;
}
以上工作完成了permalinks需要的路径重写,但是由于WordPress代码会检查mod_rewrite模块是否存在,如果不存在,permalinks访问路径中会包含index.php,比如原来访问/post-123,现在会变成/index.php/post-123,也就是不会完全开启permalinks。这会给Super Cache开启造成问题,所以需要修改代码,找一个开启的plugin,在其中源文件中加入代码:
add_filter( 'got_rewrite', '__return_true', 999 );
我是加在了wp-content/plugins/wp-super-cache/wp-cache.php的最后一行。做完这些后去WP后台删除已有的缓存文件,访问任何页面,打开页面源代码,检查是否存在Super Cache提示信息,信息看起来像下面这个样子:
<!-- Dynamic page generated in 0.156 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2012-09-21 06:09:29 -->
如果存在,恭喜你,Super Cahce已经在nginx平台上的WordPress中成功运行。Tip:在调试过程中,可以借助Super Cache的debug功能,很快发现问题。

星期四, 九月 20, 2012

不安装插件给WordPress编辑器添加按钮


WordPress自带的编辑器实在DT,想变一下文字背景颜色竟然都没有。装插件怕麻烦。于是Google之,发现可以用添加代码的方式给自带编辑器增加一排按钮。
要编辑的代码源文件在WordPress安装目录/wp-contet/themes/当前激活主题/functions.php。打开文件,在最后一行添加
function my_mce_buttons_3($buttons) { 
 /**
  * Add in a core button that's disabled by default
  */
 $buttons[] = 'sup';
 $buttons[] = 'sub';
 $buttons[] = 'backcolorpicker';

 return $buttons;
}
add_filter('mce_buttons_3', 'my_mce_buttons_3');
这样就给编辑器增加了第三行按钮,分别是上标、下标和背景颜色选择。

当然也可以添加其它按钮或者再添加第四行。全部支持的按钮代码在官网可以找到:http://www.tinymce.com/wiki.php/Buttons/controls

从Google博客搬家到Wordpress


一直都在用Google的blogger,觉得速度快,也很稳定,不过因为你懂的原因,访问是个大问题,有时候很郁闷。所以决定在其它地方找个WP替换之。本来挺简单的事,WP有个blogger importer plugin就可以完成,但是用的时候发现第一步google账户验证就过不去,估计是插件太久没更新用的接口过时所致。所以干脆手动。基本过程分三步:导出、转换、导入。

1. Blogger本身提供了数据导出功能,在管理界面下的Settings->Other->Blog tools下,导出文件为XML格式。

2. 为了能方便WP导入此XML数据,需要对数据格式进行转换,可以在网站:http://blogger2wordpress.appspot.com/ 做,上传blogger格式的文件,转换完成为Wordpress格式XML文件。需要注意的是因为Google App Engine自身的限制,此网站不支持2MB以上的文件转换。

3. 导入功能需要WordPress Importer插件支持,安装并激活Wordpress Importer插件。之后到Tools->Import下面导入,导入格式选择WordPress。

数据导入非常方便,但是有一点要说明,就是原贴内的图片和其它附件还会链接到原来的blogger网站,而且原贴内的链接目标也不会改变。如果希望完美,还需要手动一一修改,对大博来说,绝对不会是轻松的事情。

安装和使用pgadmin管理vps上的postgresql数据库

Postgresql管理和mysql稍有不同,尤其是开始的安装和设置。这里在debian 6上操作,默认的postgresql版本为8.4版。参考:http://wiki.debian.org/PostgreSql

安装:这个很简单,不过注意一下有些版本postgresql只有客户端,得额外安装server,有的名字是postgresql-server,我这个是postgresql-8.4
apt-get install postgresql-8.4 postgresql

设置:有关数据库运行参数配置在/etc/postgresql/8.4/main/postgresql.conf中,用户登陆相关在/etc/postgresql/8.4/main/pg_hba.conf中,一般默认就可以。
postgresql默认会添加本地用户postgres,数据库内置默认管理管理员用户也是postgres,使用本地用户postgres启动数据库客户端psql时,默认得到的就是管理员控制台,可以直接用sql语言操作数据库。不过默认情况下本地用户和数据库用户postgres都没有密码,不能直接登陆。要登陆数据库,需要在shell以root权限执行su postgres命令
su postgres     #root shell执行,不用密码切换到postgres用户
psql                 #登陆postgresql
\password       #更改当前用户(postgres)密码,之后可以通过网络连接
CREATE USER mypguser WITH PASSWORD 'mypguserpass';  #创建非管理员用户
CREATE DATABASE mypgdatabase;     #创建数据库
GRANT ALL PRIVILEGES ON DATABASE mypgdatabase to mypguser;   #给mypguser用户mypgdatabase数据库的管理权限
^D   #退出postgresql客户端

其它的使用跟mysql差不多,也可以用图形界面管理工具pgadmin管理,首先在官网下载:http://www.pgadmin.org/,安装并运行,打开菜单->File->Add Server,添加连接参数(postgres用户修改密码后也可以用它登陆管理)。如下图:



星期三, 九月 19, 2012

保存debian 6下的iptables设置

在debian 6下,可以用if-up脚本实现重启网络或者系统后iptables规则自动恢复。(以下操作需要root权限,有底纹为shell命令
首先确认iptables规则正确
iptables -L

保存规则
iptables-save > /etc/firewall.conf

创建if-up脚本以便重启网络恢复规则

echo "#!/bin/sh" > /etc/network/if-up.d/iptables 
echo "iptables-restore < /etc/firewall.conf" >> /etc/network/if-up.d/iptables 
chmod +x /etc/network/if-up.d/iptables 

星期二, 九月 18, 2012

用nginx/php-fpm/postgresql在低配VPS上建站

前贴减少小内存低配VPS上CentOS 6.2系统内存使用尝试优化LAMP服务器的内存使用,事实上,由于设计原因,apache和mysql都是耗内存大户,再优化在256MB以下的VPS上运行也不会很宽松。所以本篇尝试用nginx/php-fpm/postgresql的组合在低配VPS上建站。这里使用Debian 6系统。

以下操作需要root权限,有底纹的文字为代码或者配置文件内容
1. 添加必要的源
vi /etc/apt/sources.list
加入以下内容
deb http://packages.dotdeb.org stable all
导入dotdeb源密钥
wget http://www.dotdeb.org/dotdeb.gpg
cat dotdeb.gpg | sudo apt-key add -
rm dotdeb.gpg
调整源优先级,减小第三方源对系统稳定性的影响(参考:调整第三方软件源优先级减小对系统影响
cat > /etc/apt/preferences.d/dotdeb-org << EOF
Package: *
Pin: origin packages.dotdeb.org
Pin-Priority: 200
EOF
为了安装dotdeb上的php-fpm及其依赖包,需要以下命令为php相关软件包调整优先级,参考:
http://howto.biapy.com/en/debian-gnu-linux/system/software/setup-the-dotdeb-apt-repository-on-debian
#获得php相关包列表
PACKAGES=$(command wget "http://packages.dotdeb.org/dists/squeeze/php5/binary-$(command dpkg --print-architecture)" \
    --quiet --output-document=- \
    | command grep "href=" | command grep -v "h1" | command grep -v "\.\./" \
    | command sed -e 's/^[^>]*>\([^_]*\)_.*$/\1/' | command tr "\n" " ")
PECL_PACKAGES=$(command wget "http://packages.dotdeb.org/dists/squeeze/php5-pecl/binary-$(command dpkg --print-architecture)" \
    --quiet --output-document=- \
    | command grep "href=" | command grep -v "h1" | command grep -v "\.\./" \
    | command sed -e 's/^[^>]*>\([^_]*\)_.*$/\1/' | command tr "\n" " ")
#设置php相关包优先级
command echo "Package: ${PACKAGES} \\
    ${PECL_PACKAGES}
Pin: origin packages.dotdeb.org
Pin-Priority: 500" \
    > '/etc/apt/preferences.d/dotdeb-org-php5'
更新源
apt-get update
apt-get upgrade

2. 安装需要的软件包
apt-get install nginx php5 php5-apc php5-fpm php5-pgsql postgresql

3. 配置nginx
编辑/etc/nginx/nginx.conf,调整性能和安全性
#设置工作进程数,根据cpu数或者内核数调整(可以用cat /proc/cpuinfo看到)
worker_processes 1;
#关闭nginx版本提示,提高安全性
server_tokens off;
#为除ie6以外的浏览器打开数据压缩
gzip on;
gzip_disable "msie6";
编辑/etc/nginx/sites-enabled/default为默认站点添加php支持
location ~ \.php$ {
        root /var/www;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass 127.0.0.1:9000;
        # With php5-fpm:
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_index index.php;
        include fastcgi_params;
}

4. 配置php
编辑/etc/php5/fpm/php.ini
cgi.fix_pathinfo=0
编辑/etc/php5/fpm/pool.d/www.conf
#确定监听地址和端口
listen = 127.0.0.1:9000
#根据需要调整进程数

pm = dynamic                                     #dynamic:自动调节子进程数(建议,性能稍好),ondemand:只在需要时启动子进程(更省内存)
pm.max_children = 5
pm.start_servers = 1                           #ondemand未用
pm.min_spare_servers = 1                  #ondemand未用
pm.max_spare_servers = 1                 #ondemand未用
pm.max_requests = 500

pm.process_idle_timeout = 120s;        #dynamic未用

5. 配置postgresql,适当减小内存使用,编辑/etc/postgresql/8.4/main/postgresql.conf
shared_buffers = 8MB
根据需要同时可以修改temp_buffers, work_mem, maintenance_work_mem, max_stack_depth

6. 替换/bin/sh为dash,而不使用bash,这样可以减少shell脚本执行时的资源占用
apt-get install dash
dpkg-reconfigure dash
cd /bin
#用ll /bin/sh确认/bin/sh现在指向,如果不是dash用下面两个命令手动修改
ln -sf dash sh
ln -sf dash sh.distrib

7. 关闭mail daemon,dns server等非必要的服务,用syslog-ng替换rsyslog,其它轻量级的软件包替换原来的软件包等。

做完这些步骤后一个openvz上的debian 6的服务器运行时内存占用约为30M,如下图

用Dropbox备份VPS上的网站数据

用Dropbox做网站备份是一个老话题。基本思路就是把网站数据集中到用户目录下~/Dropbox目录内,然后通过Dropbox同步备份到服务器,为了减小资源占用,一般用cron脚本在用户量小时自动打开Dropbox,备份完成后再关闭。

除非特别指明,下面的操作不需要root权限,有底纹的文字为代码
1. 安装Dropbox
访问dropbox网站
https://www.dropbox.com/install?os=lnx
下载并安装dropbox,以普通用户安装时,程序会被安装到用户目录内~/.dropbox

2. 调整目录结构,把网站数据放到用户目录内
#创建日志文件
mkdir ~/log
#创建并进入Dropbox目录
mkdir ~/Dropbox
cd ~/Dropbox
# 创建db目录,用来放数据库备份
mkdir db
# 创建html目录,放网页文件
mkdir html
# 创建conf目录,放网站设置相关文件(建议把网站设置放到/etc/httpd/conf.d中的单独文件)
mkdir conf

3. 创建备份脚本文件,假设用户名为bob,网站数据库为bob_db
下载dropbox控制脚本程序
cd ~
wget http://www.dropbox.com/download?dl=packages/dropbox.py
chmod +x dropbox.py

备份开始文件backup_start.sh
#!/bin/sh
exec 2>&1
exec &>> ~/log/backup.log
date
echo "backup db daily..."
mysqldump --user bob -pdbpassword bob|gzip > /home/box/db/bak/dbbak_`date +'%m%d%Y'`.sql.gz
echo "removing backups older than 3 days..., DB has versioning system, no more backups needed"
find /home/box/db/bak/ -name "dbbak_*.sql.gz" -mtime +3 -exec rm {} \;
echo "starting dropbox..."
/home/bob/dropbox.py start
以上脚本自动备份mysql数据库内容到db目录下,删除超过3天的备份(这是安全的,因为dropbox默认有版本系统,可以找回删除文件,这样可以省空间),并启动dropbox进行备份

为了节省资源,备份完成后用脚本关闭dropbox,编写脚本backup_stop.sh
#!/bin/sh
exec 2>&1
exec &>> ~/log/backup.log
/home/bob/dropbox.py stop
date
echo "dropbox stoped."

4. 添加crontab项,需要root权限
0 3 * * * bob /bin/sh /home/bob/backup_start.sh
0 5 * * * bob /bin/sh /home/bob/backup_stop.sh
凌晨3:00-5:00访问量应该是比较小的

Dropbox备份网站比较方便,但是资源占用较大,不适合低端vps用。而且dropbox网站本身数据并不加密,所以对数据安全性敏感的谨慎使用。

调整第三方软件源优先级减小对系统影响

使用redhat和debian的时候,经常需要安装一些第三方软件源的包。但是考虑到系统稳定性,有时候又不想安装这些源上其它软件的更新。这时,就需要通过源优先级调整来实现。

以下操作需要root权限,底纹文字为代码
1. CentOS
参考官方文档:http://wiki.centos.org/PackageManagement/Yum/Priorities
需要安装yum priority plugin
yum install yum-plugin-priorities
确认/etc/yum/pluginconf.d/priorities.conf文件中enable=1

Redhat的yum中数值越低,优先级越高,调整官方源到高优先级,编辑/etc/yum.repos.d/CentOS-Base.repo,根据官方文档,分别把base, addons, updates, extras, centosplus调整为1,即增加字段priority=1

给第三方源添加优先级99,即增加字段priority=99,这样在升级时,已经安装的包只从原有官方源升级,即使第三方源有更新的包。

2. Debian
官方文档:http://manpages.debian.net/cgi-bin/man.cgi?sektion=5&query=apt_preferences&apropos=0&manpath=sid&locale=en
Apt系统不需要安装新的软件包,其系统本来就内置优先级管理,直接设置即可,不过apt中数值越高的优先级越高。默认的官方源优先级好像是500,可以在官方文档确认一下。为了减小第三方包对系统的影响,直接设置新添加的包优先级即可。比如dotdeb是比较常用的第三方包,在source.list中添加源
deb http://packages.dotdeb.org stable all
添加文件/etc/apt/preferences.d/dotdeb-org指定给此源一个比较低的优先级200
cat > /etc/apt/preferences.d/dotdeb-org << EOF
Package: *
Pin: origin packages.dotdeb.org
Pin-Priority: 200
EOF

更详细的资料可以参照官方文档

星期三, 九月 12, 2012

避免弱口令,配置putty使用密钥认证登陆CentOS 6.2服务器,提高服务器安全性

几个月前的中文版putty后门事件和国内几大论坛密码泄漏事件可能让很多人至今记忆犹新。事实上,即使密码存放是安全可靠的,密码安全本身也不一定可靠,电脑处理速度越来越快,弱口令的破解也越来越简单,参照前贴:怎样构建安全的密码,如何安全地存储及使用密码。所以,选密码本身就是一个头疼的问题,密码太简单,容易被破解,密码很复杂,自己容易忘。尤其对站长来说,服务器密码丢失,损失将是巨大的。幸运的是,对于Linux服务器,我们可以选择用非对称密钥认证,整个过程私钥永远只在本地存贮,只要本地数据安全,服务器就是安全的。而密码本身只在需要root权限时使用,双重认证,很大程度上增加了服务器的安全。

有底纹的文字为配置文件内容或者shell命令
1. 准备工作
下载必需的软件,putty和puttygen。如果你有服务器,相信你已经有putty了,不过这里还是提醒一下,putty应该从官方网站下载,而且尽量使用英文原版,不要使用翻译的,中文版putty血淋淋的教训就在眼前,下载地址:
http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe
puttygen是用来生成密钥对的工具,同时它还可以在openssh和putty所有的密钥格式间进行转换,下载地址:
http://the.earth.li/~sgtatham/putty/latest/x86/puttygen.exe

2. 生成登陆密钥对
打开puttygen,点击下边第一个按钮Generate生成密钥,点击后,生成密钥时,可以在程序上边部空白面板处快速移动鼠标,这样能加快密钥生成。程序完成后如下图:
程序上半部分不可编辑文本框“Public key for pasting into OpenSSH authorized_keys file”里面就是需要用到的公钥,后面设置的时候会上传到服务器上。保存生成的公钥和私钥,点"Save public key",选择保存路径,命名为"pub.txt",注意是文本文件,为了下面设置时方便使用:点"Save private key"按钮,选择存放路径,命名为"pri.ppk"。

3. 上传公钥到服务器
用putty连接并登陆服务器,注意用你自己的普通用户登陆。运行如下命令
mkdir -p ~/.ssh
cat > ~/.ssh/authorized_keys
ssh-rsa <这里粘贴pub.txt的内容,跳过前两行和最后一行,只粘贴密钥本身,也就是第2步public key编辑框内的内容,确保密钥数据只有一行,删除puttygen添加的换行符>
EOF
接下来是必须步骤,设置权限,不能忽略
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

测试登陆,打开putty,按常规填入服务器地址。先不要连接,在左侧选择Connection->Data,在右侧对话框"Auto login username"中填入用户名(注意,是你自己刚才上传过密钥的普通用户名,不是root)。继续在左侧选择Connection->SSH->Auth,在右侧找到"Private key file for authentication",点Browse按钮,选择你刚才生成的密钥文件"pri.ppk". 如下图:

再check一下设置,服务器、用户名、私钥文件都无误,点击Open连接。如果登陆成功,祝贺你,密钥登陆已经工作了。到此你可以把上面的设置保存成一个session,下次登陆时直接选择session名就能连接,非常方便。到此安全设置还没结束,耐心继续。

以下工作需要root权限
4. 增加安全性,禁用密码登陆
接第3步,现在用su命令直接切换到root用户获得root shell。如果你已经logout,请重新用root用户登陆,原来怎么做现在就怎么做,系统登陆方式到现在还没有改变,旧的东西都还在。用vi或者其它编辑器打开文件/etc/ssh/sshd_config,找到PasswordAuthentication,改为
PasswordAuthentication no
注意,做完此项后,将只可以使用密钥方式登陆。如果你想直接登陆root用户,请按照3步骤给root生成并上传密钥

[建议]同时禁止root用户直接登陆,即使是密钥方式。方法是,找到PermitRootLogin字段,去掉注释,改为
PermitRootLogin no
重启服务器,或者sshd。
/etc/init.d/sshd restart
注意,做完此项后,root用户将无法登陆,即使给root用户上传密钥也无法登陆。唯一获得root shell的方法是使用su命令进行用户切换。

5. [可选]进一步的安全限制
做完第4步后,你就给自己的服务器上了双保险,唯一获得root权限的方法是同时取得普通用户的登陆私钥和root用户的密码。在以上的设置中,整个过程没有传输私钥,所以只要你本地密钥和root密码两个之一是安全的,你的服务器一般来讲就是安全的。
不过,如果你的服务器有多位用户,让多位用户同时持有root用户密码可能不是很好的安全选择,所以可以采用开启sudo选项给相关用户root权限。(需要root权限)
编辑/etc/sudoers文件,centos下不要直接用vi编辑此文件,用visudo命令,程序会自动处理相关权限和其它问题
visudo
找到"root    ALL=(ALL)       ALL"一行
在其下添加(假设bob是你的用户名)
bob    ALL=(ALL)       ALL
保存退出(ESC + :wq)

测试sudo功能,使用普通用户登陆(bob)
sudo -i
输入此用户(bob)的密码,如果成功获得root shell,那么sudo功能设置成功。以后有sudo权限的用户不需要root的密码,直接用自己的密码sudo -i命令即可获得root权限。更多sudo的用法请在网上查询。

[可选]禁用root用户。如果你的服务器上有用户只有普通权限,为了防止他们破解root口令获得root权限,你可以选择禁用root用户。方法是在root shell下运行命令
usermod -L root
注意:此项做完后将不能使用su命令切换用户获得root权限。所以,一定确保系统中存在可用的有sudo权限的普通用户,否则你将把自己锁在系统外!!!

结贴:网络安全永远不会过度。根据需要,建议读者至少将第4步设置做完。

减少小内存低配VPS上CentOS 6.2系统内存使用

内存有多大,程序就有多长。程序日渐增长的内存需求让我等用低端VPS的吊丝情何以堪。此贴介绍限制mysql、apache等内存消耗大户的方法,虽然这么做会降低性能,不过相较于可怜的128M甚至64M的系统内存来说,可能性能瓶颈本来就不是这里吧。

需要root权限,有底纹的文字为shell命令或配置文件内容
1. 使用mysql小内存配置
进入/etc,备份原my.cnf
mv my.cnf my.cnf.old
使用小内存版的设置文件,x.xx.x为机器实际安装mysql版本
cp /usr/share/doc/mysql-server-x.xx.x/my-small.cnf /etc/my.cnf
编辑my.cnf,关闭innodb
在[mysqld]字段下增加
skip-innodb

2. 修改apache参数,编辑/etc/httpd/conf/httpd.conf
减少进程数,找到下面几个参数并修改
StartServers       1
MinSpareServers    1
MaxSpareServers    5
ServerLimit       64
MaxClients        64
MaxRequestsPerChild  4000
减小超时时间
Timeout 30
打开keepalive选项,增加连接复用
KeepAlive On
减小保持连接的超时时间,减小浪费
KeepAliveTimeout 3

3. php相关优化
安装php缓存模块,减少php重新编译的需要,运行命令安装
yum install php-pecl-apc
[可选]减少php可用最大内存,编辑/etc/php.ini
memory_limit = 64M
注意:此选项设置过小可能导致某些程序运行不正常

4. 减小本地控制台console个数为1个
对VPS来说,本地控制台应该没有用,编辑/etc/sysconfig/init
ACTIVE_CONSOLES=/dev/tty[1-1]

5. 将sshd、ftp等可以使用xinet的服务使用xinet共享开启,而不要用独立进程(请参考其它资料)

6. 关闭不必要的服务
使用chkconfig --list查看所有服务
chkconfig service_name off关闭相当服务

做过所有这些后,我的vps,256M内存,开机大概占用70M内存,长时间运行也使用swap也不会太多。

星期二, 九月 11, 2012

CentOS 6.2 架设l2tp/ipsec服务器

VPN服务器经常用到,有时为了访问办公室网络,有时为了你懂的原因。这里介绍一下l2tp/ipsec VPN服务器在CentOS 6.2下的架设。L2TP服务器使用UDP协议,对防火墙兼容好,IPsec实现加密,实现安全通信。而且IOS和Android原生支持此协议,因此比OpenVPN来得方便些。

这里参考了:http://wiki.nikoforge.org/L2TP/IPSec_VPN_Setup_on_Centos_6_(64-bit)_for_use_with_Android_ICS_and_iOS_5_Clients
并对过程做了少量修改,增加了必需了小步骤,增加了NAT的设置。

开始之前请确认现在登陆用户为root,否则会提示权限不足。有底纹的文字为在shell中直接输入的代码。
1. 必要软件包的安装
整个过程需要4个软件包:libpcap、ppp、ipsec-tools和xl2tpd(debian 6下安装需要增加racoon),其中前两个centos官方源就有,后两个需要从其它网站下载,先安装前两个
yum libpcap
yum ppp
下载并安装后两个包,此时版本分别为0.8.0-3和1.3.1-4
wget http://repo.nikoforge.org/redhat/el6/i386/ipsec-tools-0.8.0-3defpsk.el6.i386.rpm
rpm -i ipsec-tools-0.8.0-3defpsk.el6.i386.rpm
wget http://vesta.informatik.rwth-aachen.de/ftp/pub/Linux/fedora-epel/6/i386/xl2tpd-1.3.1-4.el6.i686.rpm
rpm -i xl2tpd-1.3.1-4.el6.i686.rpm

安装完成编写必要的脚本和配置文件
2. 环境初始化脚本,在shell下输入
cat > /etc/racoon/init.sh << EOF
#!/bin/sh
# set security policies
echo -e "flush;\n\
        spdflush;\n\
        spdadd 0.0.0.0/0[0] 0.0.0.0/0[1701] udp -P in  ipsec esp/transport//require;\n\
        spdadd 0.0.0.0/0[1701] 0.0.0.0/0[0] udp -P out ipsec esp/transport//require;\n"\
        | setkey -c
# enable IP forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s  192.168.123.0/24 -o eth0 -j MASQUERADE
iptables -I FORWARD -s  192.168.123.0/24 -j ACCEPT
iptables -I FORWARD -d  192.168.123.0/24 -j ACCEPT
EOF
更改权限:chmod 750 /etc/racoon/init.sh

3. IPsec设置
cat > /etc/racoon/racoon.conf << EOF
path include "/etc/racoon";
path pre_shared_key "/etc/racoon/psk.txt";
path certificate "/etc/racoon/certs";
path script "/etc/racoon/scripts";
remote anonymous
{
        exchange_mode    aggressive,main;
        passive          on;
        proposal_check   obey;
        support_proxy    on;
        nat_traversal    on;
        ike_frag         on;
        dpd_delay        20;
        proposal
        {
                encryption_algorithm  aes;
                hash_algorithm        sha1;
                authentication_method pre_shared_key;
                dh_group              modp1024;
        }
        proposal
        {
                encryption_algorithm  3des;
                hash_algorithm        sha1;
                authentication_method pre_shared_key;
                dh_group              modp1024;
        }
}
sainfo anonymous
{
        encryption_algorithm     aes,3des;
        authentication_algorithm hmac_sha1;
        compression_algorithm    deflate;
        pfs_group                modp1024;
}
EOF
设置权限:chmod 600 /etc/racoon/racoon.conf

设置共享密钥
cat >/etc/racoon/psk.txt  << EOF
* mysharedkey
EOF
设置权限:chmod 600 /etc/racoon/psk.txt

4. 设置L2TP服务
cat > /etc/xl2tpd/xl2tpd.conf << EOF
[global]
ipsec saref = yes
force userspace = yes
[lns default]
local ip = 192.168.123.200
ip range =  192.168.123.201- 192.168.123.210
refuse pap = yes
require authentication = yes
ppp debug = yes
length bit = yes
pppoptfile = /etc/ppp/options.xl2tpd
EOF

5. 配置PPP
cat > /etc/ppp/options.xl2tpd << EOF
ms-dns 8.8.8.8
require-mschap-v2
asyncmap 0
auth
crtscts
lock
hide-password
modem
debug
name l2tpd
proxyarp
lcp-echo-interval 10
lcp-echo-failure 100
EOF

设置拨号用户密码
cat > /etc/ppp/chap-secrets << EOF
# client       server    secret       IP addresses
  vpnuser      *         vpnpassword     *
EOF

6. 启动服务
/etc/racoon/init.sh
/etc/init.d/racoon start
/etc/init.d/xl2tpd start
如果需要开机自动启动,把/etc/init.d/xl2tpd加入/etc/rc.local,并运行下面两个命令
chkconfig racoon on
chkconfig xl2tpd on

已知问题:
1. 如果系统无法连接,可以查看日志找出错误原因,如果是找不到ppp设备,尝试手动创建
mknod /dev/ppp c 108 0

2. Windows XP由于IPsec实现于标准不一致,拨号会失败。查看日志能看到:“ERROR: Expecting IP address type in main mode, but FQDN.”,这样的错误信息。解决办法只能是自己重新编译ipsec-tools,去掉标准检查部分的代码,patch代码如下:
--- src/racoon/ipsec_doi.c.orig Thu Feb  2 23:37:17 2006
+++ src/racoon/ipsec_doi.c Sun Sep 24 23:28:42 2006
@@ -3277,10 +3277,9 @@
     iph1->approval->authmethod == OAKLEY_ATTR_AUTH_METHOD_PSKEY) {
  if (id_b->type != IPSECDOI_ID_IPV4_ADDR
   && id_b->type != IPSECDOI_ID_IPV6_ADDR) {
- plog(LLV_ERROR, LOCATION, NULL,
+ plog(LLV_WARNING, LOCATION, NULL,
  "Expecting IP address type in main mode, "
  "but %s.\n", s_ipsecdoi_ident(id_b->type));
- return ISAKMP_NTYPE_INVALID_ID_INFORMATION;
  }
  }

Debian 6下架设的不同处:
1. 需要安装软件包为5个,增加racoon
2. ipsec在debian下有自己的配置文件,可以不需要/etc/racoon/init.sh文件
ipforwarding在/etc/sysctl.conf中设置
net.ipv4.ip_forward=1
setkey在/etc/ipsec-tools.conf中设置
flush;
spdflush;
spdadd 0.0.0.0/0[0] 0.0.0.0/0[1701] udp -P in  ipsec esp/transport//require;
spdadd 0.0.0.0/0[1701] 0.0.0.0/0[0] udp -P out ipsec esp/transport//require;
iptables规则用if-up脚本设置,参照:保存debian 6下的iptables设置

附:Iphone设置L2TP拨号方法
进入设置->通用->网络->VPN
点击添加VPN设置类型选择L2TP,输入参数如下:

星期四, 九月 06, 2012

免费顶级域名注册

.tk(talk的缩写) 域名现在被越来越多的人关注。按官方网站的说法,tk域名的注册数比整个.cn和.ru域名加起来都多。。。

原来注册.tk域名有比较多的限制,比如说3个月必须有至少25个访问数,还有必须显示它的广告,这都限制了tk域名的发展。现在好像这些限制都取消了,注册的顶级域名可以做URL转发也可以直接解析到自定义的IP上,甚至可以自己完全定制域名NS域。注册时选择期限可以是1到12个月,到期前15天自己手动在控制面板刷新即可,非常方便超值。

新手站长在学习或者起步阶段使用免费空间可以省一笔可观的费用。不过由于免费空间普遍被滥用,所以一些空间要求注册者自己拥有顶级域名才能注册,这里面就有老牌的Freehostia和pipni这些口碑非常好的空间。这样,注册一个免费的顶级域名的优势就很明显了。

.tk域名注册过程很简单,填入email注册,或者直接用支持openid的账号登陆就行,完全不需要身份认证,非常方便。一般免费注册只要求名字要4个或者以上的字符数即可。注册地址在这: 免费注册TK顶级域名

测试网站请点这里:http://nevil.tk/ , 这是完全免费域名的效果。有兴趣可以注册一个试试,反正不要钱^_^

Free top level domain name

Domain names help people to remember web sites easily, without domain name, people would have to remember web sites in number form address such as 12.34.56.78. For example, we usually access Google at http://www.google.com, you can also access it at http://74.125.31.99/. Obviously, the English form is mush easier for visitors to remember.

So if one wants to build his/her own web site on the Internet, a beautiful domain name may be a good start. And of course, the shorter, the better. I bet the Google guys won't like the name googleblahlblahblahhahahah.com :-) The shortest domain name available now should be top level domain names, as in 2012. Top level domain name is just a little longer than root names (which is not available for register now), like google.com. It is the coolest domain name one can get nowadays, if you can think up a good word. Usually, one top level domain name costs you about $10 one year, however, with one exception, the .TK (abbrev. for talk) top level domain.

The .TK domain is the only free top level domain name in the world. It is free to register, free to use, and free to renew before expires. You can use .tk names for URL redirect. You can also point it directly to some IP address. And you can set up your own name server to serve your domain. It is every useful to one who's learning how the Internet works or web masters who are not so rich.

Well, here is my .tk name http://nevil.tk/ if you are interested. You can also get your own free top level domain here: Register free top level .TK Domain.

Thanks for reading.