廉价OTP解决方案:yubikey

本人组织团购的第一批yubikey正在发货路上,所以下文全文都是纸上谈兵的分析。期待入手后的详细评测XD

@ohsc那里了解到yubikey这个东西。作为信息安全的学生,我的第一反应是:两眼发亮。为什么两眼发亮呢?慢慢解释。

首先要从什么是OTP说起。
OTP是One-Time Password的简称,中文对应的准确翻译应该叫“一次一密”。根据香农(这个人…信息论、现代密码学,以及其他乱七八糟东西的发明者,牛逼至极的人物啊!)创立的现代密码学理论,一次一密是不可能被破解的,除此之外所有的其他加密方案都至少能被暴力破解,虽然破解的难度是指数级的。(当然,香农说的一次一密不可破解是有前提条件的,具体参考维基百科上的”一次性密码本“词条)。具体来说,一次一密就是在每次加密会话过程中,对传送的明文使用不同的密钥进行加密,每次使用的密钥是随机、不可预测、不重复使用的,从而保证了加密是绝对不可破解的。
当然,我说的是简单化的一次一密的实现,实际操作过程中,密钥的长度必须大于等于明文长度,而且密钥必须是可验证的(所以也可以看成是可预测的)。真正的一次一密,等于需要一个安全信道来传送不少于明文长度的密钥,几乎是没有意义的。

其实生活中已经有很多一次一密的例子,例如中国银行的E-TOKEN、魔兽世界安全令牌、中国建设银行的动态口令卡(纸制),这些都是一次一密的。

国内的一次一密电子令牌基本上使用的是SecurID,EMC公司下属的RSA公司出品的。这种一次一密解决方案使用一个预先定义的time-based的函数计算密码,称为Time-synchronized one-time password。每个token出厂前与服务器同步时间,在出厂后,token和服务器以相同的时钟计算,每分钟变化一次。在验证token上读取的数字时,服务端可以设置允许的误差值,例如允许前后5分钟内产生的密钥输入都认为是有效的,这样可以最大限度避免token的时钟漂移。这样的方案安全性很高,很多公司内部的vpn系统、线上服务器登陆系统等等都使用了SecurID进行认证。缺点很明显:价格高,据说每个的成本在¥200(网易出的那个山寨版我就不评论了…售价居然才60左右…只能说不太靠谱了…),而且需要配套RSA的服务端方案;需要电池保证时钟运作,因此存在更换token的情况。

另一种完全不同的一次一密方案是使用数学方法生成密钥序列,称为Mathematical-algorithm-based one-time password。这种算法使用数学函数生成密钥序列,然后依次使用密钥序列,从而不需要考虑时间因素。由于密钥序列生成过程中没有时间因素,实际生产的硬件token可以不包含电池供电,免去服务端与token的对时,成本可以下降,同时也没有电池耗尽更换token的担忧(更换token=安全隐患,因为需要人的参与,人永远是任何安全体系的最大漏洞…)。维基百科上举例了一个使用hash chain方法产生此类OTP的方案:找到一个单向函数f(例如任意一个hash函数),给定一个初始种子s。根据f和s产生序列:f(s), f(f(s)), f(f(f(s)))…。然后将该序列倒置,依次作为密钥使用。第三方如果偶然获取到序列中某个密钥,他就必须要通过f的反函数来计算下一个密钥,而f的单向性保证了这样的计算是不可行的。

yubikey使用的是第二种方案。它是一个廉价的OTP解决方案,10枚yubikey的平均价格是$28,由yubico提供验证服务器并提供API供开发者调用。它不需要电池供电,也没有液晶屏显示密钥。在插入电脑之后,它会被识别为一个USB键盘,在任意输入框聚焦并按一下yubikey上的硬件按钮,yubikey将自动模拟键盘输入一串一次性密钥。由于yubikey在电脑上被识别为USB键盘,它可以做到最好的免驱动支持(现在没有操作系统不支持USB键盘了吧?),可以在Windows/MacOSX/Linux上使用。关于yubikey使用的OTP生成方案,强烈建议阅读一下官方提供的文档来了解:http://yubico.com/files/Security_Evaluation_2009-09-09.pdf

要注意的是,yubikey每次插拔都会在内置的非易失性存储器上的Session Counter增加1,该Session Counter总长度为16bit,在每天插拔20次的频率下,该Counter在9年左右到达满值。这个寿命还是很让人满意的。

yubikey是一个非常开放的硬件设备,它本身的硬件实现原理、服务端架设代码、服务端API代码,都是完全开放的。从而在它之上衍生了很多开源项目与之搭配使用。从yubico的wiki页面可以看到一个简单的列表。稍微列举一下:

  • YubiRADIUS:使用yubikey产生的OTP验证用户的RADIUS服务器。该服务器由yubico提供,任何拥有yubikey的用户都可以在上面开通管理员帐号进行使用。详细使用指南:http://wiki.yubico.com/wiki/index.php/Applications:YubiRADIUS_RADIUS_Service
  • RADIUS on Premise:使用LDAP维护yubikey ID与用户的联系,自行搭建使用yubikey做验证的RADIUS服务器。OTP+VPN+RADIUS,这几乎是最安全的上网方案了。
  • YubiKey WordPress Plugin:wordpress登录过程中可使用yubikey配合原密码进行加强安全的登录
  • LastPass Login:使用yubikey作为lastpass的master password,详见@ohsc的日志。该功能需lastpass的高级会员权限,每月$1。
  • Google Apps:使用yubikey登录Google Apps。要是Gmail也能用yubikey登录,那就nb了…


随机日志:
测试twitter tools

一个插件用于发表日志时候自动向twitter发布信息给出日志链接


随机日志:
对pidgin的一些小优化

我的pidgin版本:2.3.1

主要优化工作

1加上飞信协议图标准备3飞信图标文件分别为16X16、22X22、48X48大小然后分别到/usr/shar/pixmaps/pidgin/protocols对应文件夹文件名必须为pidgin.png可能允许其他文件名不是清楚

2汉化guifications提示窗口在ubuntu里面安装这个十全大补插件简单只需要sudo aptitude install pidgin-guifications即可但是默认安装插件弹出提示窗口英文插件编辑窗口不能编辑默认几个主题无法直接汉化汉化,sudo pidgin然后打开插件手选项主题编辑器编辑默认主题即可

3替换2.3.1的QQ协议插件:2.3.1的QQ插件功能严重bug很多名称显示是(NULL)并且成员经常显示出来解决方法就是下载2.3.0的libpurple0这个软件包(www.getdeb.net搜索pidgin注意版本号然后其中的libqq.so替换目前使用的即可

Twitter2Renren PHP同步脚本(20100828更新)

又更新了一下,使用m.renren.com进行状态发布

脚本名称正式定为twitter2renren.php

使用方法详见这篇日志

代码:

< ?php
 
//
//twitter2renren.php
//By @yegle, yegle.net
//Licensed under CC by-nc-sa
//Version:20100828
//
 
$file = '/home/yegle/.twitter2renren';
$cookie_file = '/home/yegle/.twitter2renren.cookie';
$twitter_username = '';
$twitter_pwd = '';
$hashtag = '';
$renren_username = '';
$renren_password = '';
 
//配置完毕,请停止编辑文件!
if(file_exists($file)){
    $lastid = intval(file_get_contents($file));
}
else{
    touch($file);
    $lastid = 0;
}
 
 
$timeline_url = 'http://'.$twitter_username.':'.$twitter_pwd.'@twitter.com/statuses/user_timeline.rss?count=200';
if($lastid!==0) $timeline_url.='&since_id='.$lastid;
 
 
$timeline = file_get_contents($timeline_url);
 
$obj = simplexml_load_string($timeline);
 
$items = $obj->channel->item;
if(empty($items)){
    echo "no newer tweet\n";
    exit();
}
if(sizeof($items)==1){
    $new_id = preg_replace('/.*\/([0-9]*)$/','$1',strval($items->link));
}
else{
    $new_id = preg_replace('/.*\/([0-9]*)$/','$1',strval($items[0]->link));
}
if($new_id == ''){
    echo "error\n";
    exit();
}
file_put_contents($file,$new_id);
$post_arr = array();
foreach($items as $tweet){
    $text = substr($tweet->title,strlen($twitter_username)+2);
    if(strpos($text,'@')!==0 && ( empty($hashtag) || strpos($text,$hashtag)!==FALSE)){
        $text = str_replace("RT: @","转自",$text);
         $post_arr[] = $text.' [twitter]';
    }
}
 
if(empty($post_arr)){
    echo "no need.\n";
    exit();
}
 
$post_arr = array_reverse($post_arr);
 
foreach($post_arr as $item){
    $post = 'sour=home&status='.urlencode($item).'&update=发布';
 
    $renren_login = "http://3g.renren.com/login.do?fx=0&autoLogin=true";
    $ch = curl_init();
    curl_setopt($ch,CURLOPT_COOKIEJAR,$cookie_file);
    curl_setopt($ch,CURLOPT_URL,$renren_login);
    curl_setopt($ch,CURLOPT_POST,TRUE);
    curl_setopt($ch,CURLOPT_FOLLOWLOCATION,TRUE);
    curl_setopt($ch,CURLOPT_POSTFIELDS,'email='.$renren_username.'&password='.$renren_password.'&login=登录');
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
    #curl_setopt($ch,CURLOPT_VERBOSE,TRUE);
    $str = curl_exec($ch);
    curl_close($ch);
    $pattern = '/action="([^"]*)"/';
    preg_match($pattern,$str,$matches);
 
 
    $ch = curl_init($matches[1]);
    curl_setopt($ch,CURLOPT_POST,TRUE);
    curl_setopt($ch,CURLOPT_POSTFIELDS,$post);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
    curl_setopt($ch,CURLOPT_COOKIEFILE,$cookie_file);
    //curl_setopt($ch,CURLOPT_FOLLOWLOCATION,TRUE);
    //curl_setopt($ch,CURLOPT_REFERER,'http://status.renren.com/ajaxproxy.htm');
    $ret = curl_exec($ch);
    curl_close($ch);
}
?>

使用PHP进行HTTP重定向

在Google里搜“PHP 重定向”,这篇日志的排名在第四。但是这篇写得实在太烂了…重写一篇…

什么是HTTP重定向?

当你访问www.yegle.net时,地址栏的地址会自动变成yegle.net。当你访问ye.gl的时候,地址栏的地址会变成yegle.net。这就是HTTP重定向

一个HTTP请求,返回的HTTP Response Header里,第一行是HTTP的状态码。正常情况下,HTTP请求返回的状态码是200 OK。
正常的HTTP请求,返回200 OK:

< HTTP/1.1 200 OK
< Date: Fri, 16 Jul 2010 11:21:10 GMT
< Server: Apache
< X-Powered-By: PHP/5.2.4-2ubuntu5.10
< Set-Cookie: PHPSESSID=7f86ed2e5a4750275e98971773ac88ab; path=/
< Expires: Thu, 19 Nov 1981 08:52:00 GMT
< Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
< Pragma: no-cache
< Set-Cookie: wassup=ZjVjMWExMjZjNmIxNzU1NDBhZjU0MmM5MzhmYjllZDQ6OjEyNzkyODE5NzE6Ojo6MjAwMTozODg6ZjAwMDo6ZTZmOjoyMDAxOjM4ODpmMDAwOjplNmY%253D; expires=Fri, 16-Jul-2010 12:11:11 GMT; path=/
< X-Pingback: http://yegle.net/xmlrpc.php
< Vary: Accept-Encoding
< Transfer-Encoding: chunked
< Content-Type: text/html; charset=UTF-8
<

其他的比较知名的还有例如:

  • 404 Not Found
  • 301 Moved Permanently
  • 302 Found
  • 500 Internal Server Error

HTTP重定向就是通过301和302两种状态码来实现的。

302是临时重定向的意思。表示被访问页面因为各种需要被临时跳转到其他页面。具体的例子是访问 http://yegle.net/recursion.php

< HTTP/1.1 302 Found
< Date: Fri, 16 Jul 2010 11:26:48 GMT
< Server: Apache
< X-Powered-By: PHP/5.2.4-2ubuntu5.10
< Location: http://yegle.net/recursion.php
< Cache-Control: max-age=600
< Expires: Fri, 16 Jul 2010 11:36:48 GMT
< Vary: Accept-Encoding
< Content-Length: 0
< Content-Type: text/html
<

浏览器在收到302 Found的状态码之后会在返回的HTTP Response Header中查找Location字段,然后访问对应地址。在这个例子中,浏览器就会访问 http://yegle.net/recursion.php (嗯这是一个递归,你懂的…)

301是永久重定向。这样的例子很好找。例如 http://google.com

< HTTP/1.1 301 Moved Permanently
< Location: http://www.google.com/
< Content-Type: text/html; charset=UTF-8
< Date: Fri, 16 Jul 2010 11:29:07 GMT
< Expires: Sun, 15 Aug 2010 11:29:07 GMT
< Cache-Control: public, max-age=2592000
< Server: gws
< Content-Length: 219
< X-XSS-Protection: 1; mode=block
<

同样,浏览器在发现301的状态码之后会查找Location字段,然后访问那个地址。

Location字段的格式很随意,既可以是绝对地址,也可以是相对地址,还可以是相对根目录的地址。以下Location字段都是合法的:

Location: http://yegle.net/
Location: /test/index.php
Location: index.php
Location: ../index.php

301重定向和302重定向在SEO以及缓存上是有非常大区别的。

对于SEO也就是搜索引擎优化,一个页面302重定向到另一个页面,新页面的PageRank不会受原页面影响。而一个页面301重定向到另一个页面,原页面的PageRank会被传递到新页面。所以对于一个网站进行域名转换,最好的方法就是使用301重定向,在经过一段时间之后可以不损失PR地将全站转移到新域名下。

对于HTTP代理服务器例如squid来说,如果一个页面是302重定向到新页面并且没有指定Expire HTTP头,squid将不缓存这个信息,也就是说每次用户通过代理请求时都会重新获取一遍。而对于301重定向,squid可以将结果缓存以便快速响应下一个请求相同页面的用户。

PHP里的302重定向非常简单,只要在返回的HTTP Response Header里添加Location字段,PHP将自动返回302状态码。例如:

< ?php
header("Location: http://yegle.net/recursion.php");
?>

这段代码将自动重定向到http://yegle.net/recursion.php

而301重定向则稍微有点复杂,需要直接将301状态码用header函数返回给用户。例如:

< ?php
    header( "HTTP/1.1 301 Moved Permanently" );
    header( "Location: http://yegle.net/" );
?>

注意的是,跳转不是在收到response header的时候马上进行,也就是说页面的剩余内容会被下载来之后浏览器才会跳转。新手常犯的一个错误是,在逻辑判断时对符合条件的情况进行header跳转之后,忘了在之后加上exit(),导致错误。例如,用user_login()判断用户是否进行了登录,如果未登录则跳转到登录页面。代码如下:

if(!user_login()){
    header("Location:login.php");
}
//display contents for login users.

这里,容易以为header之后这段代码就结束了,没有在header之后使用exit()。后面的代码继续被执行,导致未登录用户看到了已登录用户才能看到的内容。

Windows下编译OpenVPN 2.1.1

为什么要编译OpenVPN

  1. OpenVPN官方提供的Windows二进制文件默认是不包含从文件读取用户名密码功能的。
  2. 作为OpenVPN卖家,可以在自己编译的OpenVPN安装包里提供自己的logo等信息

Continue reading ‘Windows下编译OpenVPN 2.1.1′

购买yegle的OpenVPN,你能获得什么?

像这样自夸的文章我是会脸红的,嘿嘿~单纯炫耀~

购买我的OpenVPN,你可以进行正常的网络访问.这是当然的~

除此之外:

如果你使用的是CMWAP的无限流量的卡,你可以通过TCP方式连接我的VPN,实现CMNET效果~
如果你的公司网络必须要代理才能访问外网,你可以通过TCP+HTTP PROXY方式连接到我的VPN,实现无障碍访问网络
如果你是教育网用户,你可以通过ipv6方式连接我的VPN,实现翻出教育网+翻出GFW双重效果
如果你能在你周围搜到CMCC,ChinaNet的wifi网络,你可以使用53端口连接我的VPN,免费蹭网~
如果你不喜欢VPN的全局性,你可以选择不修改默认路由的方式连接到我的VPN,用VPN网关+FoxyProxy自由翻墙

嗯,就是这样的,娃哈哈~~~~~

Twitter同步人人脚本(Updated at 2010-04-12)

使用方法详见这篇日志
人人很贱地加了个参数,以前的脚本就失效了.没啥,在强大的正则面前,任何企图让自动化脚本失效的图谋都会被粉碎!

其实这个升级版里的正则还可以更漂亮一点…懒得优化了…

另外这个版本会把你的官方RT也转发到renren上去

Update at 2010-04-14,修改几个小bug
Update at 2010-05-27,修改几个小bug

< ?php
 
//
//twitter2renren.php
//By @yegle, yegle.net
//Licensed under CC by-nc-sa
//
 
$file = '用于记录你最后一次同步tweet id的文件路径。注意不要删除并让脚本能读取!';
$cookie_file = '保留curl模拟登陆renren.com的cookie文件路径。';
$twitter_username = '你的twitter用户名,注意是用户名,不是邮箱名';
$twitter_pwd = '你的twitter密码';
$hashtag = '如果你希望在你的推里包含特殊字符串时才转过去,请设置该变量,否则只转发不是以@开头的推';
$renren_username = 'renren.com登录用户名';
$renren_password = 'renren.com登录密码';
 
//配置完毕,请停止编辑文件!
if(file_exists($file)){
    $lastid = intval(file_get_contents($file));
}
else{
    touch($file);
    $lastid = 0;
}
 
 
$timeline_url = 'http://'.$twitter_username.':'.$twitter_pwd.'@twitter.com/statuses/user_timeline.rss?count=200';
if($lastid!==0) $timeline_url.='&since_id='.$lastid;
 
 
$timeline = file_get_contents($timeline_url);
 
$obj = simplexml_load_string($timeline);
 
$items = $obj->channel->item;
if(empty($items)){
    echo "no newer tweet\n";
    exit();
}
if(sizeof($items)==1){
    $new_id = preg_replace('/.*\/([0-9]*)$/','$1',strval($items->link));
}
else{
    $new_id = preg_replace('/.*\/([0-9]*)$/','$1',strval($items[0]->link));
}
if($new_id == ''){
    echo "error\n";
    exit();
}
file_put_contents($file,$new_id);
$post_arr = array();
foreach($items as $tweet){
    $text = substr($tweet->title,strlen($twitter_username)+2);
    if(strpos($text,'@')!==0 && ( empty($hashtag) || strpos($text,$hashtag)!==FALSE)){
        $text = str_replace("RT: @","转自",$text);
         $post_arr[] = $text.' [twitter]';
    }
}
 
if(empty($post_arr)){
    echo "no need.\n";
    exit();
}
 
//$post_arr = array_reverse($post_arr);
 
$renren_login = "http://passport.renren.com/PLogin.do";
$ch = curl_init();
curl_setopt($ch,CURLOPT_COOKIEJAR,$cookie_file);
curl_setopt($ch,CURLOPT_URL,$renren_login);
curl_setopt($ch,CURLOPT_POST,TRUE);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,TRUE);
curl_setopt($ch,CURLOPT_POSTFIELDS,'email='.$renren_username.'&password='.$renren_password.'&autoLogin=true&origURL=http://www.renren.com/Home.do&domain=renren.com');
curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
#curl_setopt($ch,CURLOPT_VERBOSE,TRUE);
$str = curl_exec($ch);
$pattern = "/get_check:'([^']*)'/";
preg_match($pattern,$str,$matches);
$get_check = $matches[1];
curl_close($ch);
$renren_status = 'http://status.renren.com/doing/update.do';
foreach($post_arr as $item){
    $post = 'c='.urlencode($item).'&raw='.urlencode($item).'&isAtHome=0&publisher_form_ticket='.$get_check;
 
    $ch = curl_init($renren_status);
    curl_setopt($ch,CURLOPT_POST,TRUE);
    curl_setopt($ch,CURLOPT_POSTFIELDS,$post);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
    curl_setopt($ch,CURLOPT_COOKIEFILE,$cookie_file);
    curl_setopt($ch,CURLOPT_FOLLOWLOCATION,TRUE);
    curl_setopt($ch,CURLOPT_REFERER,'http://status.renren.com/ajaxproxy.htm');
    $ret = curl_exec($ch);
    curl_close($ch);
    $ret = json_decode($ret,TRUE);
    echo $ret['msg']."\n";
}
 
?>

简单脚本检查portage安装的包是否有文件丢失

昨天开机fsck报错,正常fsck修复后丢了好多文件,导致现在系统各种不正常,ssh登录不上

写了个脚本检查丢失的文件:

#!/bin/bash
for package in `eix -cI --only-names`
do
    for file in `equery f $package`
    do
        FILE=`basename $file`
        if [ ! -e $file ] && [ "x${FILE:0:6}" != "x.keep_" ]
        then
            echo $package;
            break;
        fi
    done
done

嗯,希望能帮助到其他人.

2010年3月26日

Just to remember a special day for me.

OpenVPN连接问题排查

OpenVPN相对于PPTP的一大优势,就是有完整的log,可以根据客户端的log来发现无法连接的问题所在。以下为本人的VPN用户经常遇到的问题,希望对其他搭建OpenVPN服务的人有所帮助。

注意:本日志主要用于本人的OpenVPN服务(https://yegle.net/openvpn/)的用户用于自行排查问题用,转载请保留此信息,谢谢:-)

各个平台下OpenVPN连接log所在的位置:

Windows下:如果使用OpenVPN GUI进行连接,默认的log会存放在OpenVPN安装目录下log文件夹。
Linux下:在OpenVPN配置文件中添加一行:log-append /path/to/logfile,连接后/path/to/logfile即为连接log。
Mac OS下:tunnelblick里,Details菜单(感谢@tianyi提供信息:-))
Android下:tunneldroid里,按menu查看log。

OpenVPN的log文件为普通文本文件,可以用各种文本编辑器,例如记事本、写字板、VIM等工具打开。一般情况下为了方便查看问题所在,建议在OpenVPN的配置文件中添加verb 5,可以在log里输出更多有效信息。

正常连接时,log的最后一行是:

Fri Mar 5 09:58:04 2010 Initialization Sequence Completed

这表明OpenVPN成功建立了连接并成功修改了路由表,已经可以正常使用VPN。

问题1:

Mon Mar 01 21:42:13 2010 us=78000 CreateFile failed on TAP device: \\.\Global\{3D3B7076-EC34-48DE-82A4-B34956532951}.tap
Mon Mar 01 21:42:13 2010 us=78000 All TAP-Win32 adapters on this system are currently in use.
Mon Mar 01 21:42:13 2010 us=78000 Exiting

解答:这个问题仅在Windows上出现。原因未知,怀疑与防火墙软件有关。通常情况下可以通过重启系统解决。如果没有解决的话,可以到OpenVPN安装目录下bin文件夹,依次执行delalltap.bat和addtap.bat,即可解决。注意,如果使用的是Vista/Win7/Win2003Win2008这样的带UAC的Windows系统,需要用管理员权限执行这两个脚本。

问题2:

Thu Dec 03 22:46:07 2009 us=651000 C:\WINDOWS\system32\route.exe ADD 128.0.0.0 MASK 128.0.0.0 10.7.0.1
Thu Dec 03 22:46:07 2009 us=667000 ROUTE: route addition failed using CreateIpForwardEntry: 拒绝访问。 [status=5 if_index=14]
Thu Dec 03 22:46:07 2009 us=667000 Route addition via IPAPI failed [adaptive]
Thu Dec 03 22:46:07 2009 us=667000 Route addition fallback to route.exe
Thu Dec 03 22:46:07 2009 us=667000 ERROR: Windows route add command failed [adaptive]: returned error code 1

解答:这是在Vista/Win7/Win2003Win2008等系统中没有用管理员权限安装及启动OpenVPN GUI造成的,OpenVPN进程没有相应权限修改系统路由表。解决方法是重新用管理员权限安装OpenVPN,并在启动OpenVPN GUI时右键选择使用管理员权限打开。

问题3:

Mon Feb 1 18:44:52 2010 us=241882 /system/xbin/bb/route add -net 128.0.0.0 netmask 128.0.0.0 gw 10.7.0.1
Mon Feb 1 18:44:52 2010 us=244293 ERROR: Linux route add command failed: could not execute external program
Mon Feb 1 18:44:52 2010 us=244628 Initialization Sequence Completed

解答:这是Android下,Cyanogen Mod和OpenEclair两个ROM,曾经有段时间使用了错误的OpenVPN二进制文件,导致的无法调用busybox添加ip和路由。具体请参考Android上OpenVPN的设置与使用这篇日志,重新安装OpenVPN二进制文件,相应地修复busybox

问题4:

Sat Mar 06 16:31:42 2010 us=107000 There are no TAP-Win32 adapters on this system. You should be able to create a TAP-Win32 adapter by going to Start -> All Programs -> OpenVPN -> Add a new TAP-Win32 virtual ethernet adapter.

解答:这个问题在Windows上发生,原因未知。解决方案如log所述:开始->所有程序->OpenVPN->Add a new TAP-Win32 virtual ethernet adapter。如果是Vista/Win7,用管理员权限执行
(待续)

Android上OpenVPN的设置与使用

这个问题被问过很多次,加上我自己的VPN用户也有询问这个问题,很多人参考的又是网上古老的文档,所以我这里写一篇讲解一下。

想要阅读下文,请确保你知道什么是adb及如何使用adb :-)
Continue reading ‘Android上OpenVPN的设置与使用’