星期五, 十二月 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/ , 这是完全免费域名的效果。有兴趣可以注册一个试试,反正不要钱^_^