<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>gkp&#039;s post</title>
	<atom:link href="http://b.gkp.cc/feed/" rel="self" type="application/rss+xml" />
	<link>http://b.gkp.cc</link>
	<description>Just another gkp&#039;s family blogs site</description>
	<lastBuildDate>Wed, 01 Sep 2010 13:55:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>gkp 版 iDevice 标准安装流程</title>
		<link>http://b.gkp.cc/2010/08/22/a-workflow-of-idevice-installation/</link>
		<comments>http://b.gkp.cc/2010/08/22/a-workflow-of-idevice-installation/#comments</comments>
		<pubDate>Sat, 21 Aug 2010 18:10:07 +0000</pubDate>
		<dc:creator>gkp</dc:creator>
				<category><![CDATA[我的慵懒生活]]></category>
		<category><![CDATA[crack]]></category>
		<category><![CDATA[iDevice]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[ipod]]></category>
		<category><![CDATA[jailbreak]]></category>

		<guid isPermaLink="false">http://b.gkp.cc/2010/08/22/a-workflow-of-idevice-installation/</guid>
		<description><![CDATA[&#160; 这个周末安装 iDevice 有些吐：自己的新 iPhone4 和送给丈母娘的 iPod touch 要装东西，老婆的 iPod touch 也该升级一下系统，基本同样的工作重复进行了三遍，流程基本已经标准化了。。。记录如下 升级 / 恢复固件：iPod touch 2G 跑 iOS 4.0 速度还可以忍受，iPhone&#160;3G 则需要把 spotlight 禁用了，不然实在是不能忍啊。iPhone4 就不说了，飞一样。。。 越狱：4.02 以下推荐用 jailbreakme.com ，实在是太方便了，slide to jailbreak 配置 VPN：不然 Cydia 的部分源链接不能 进入 Cydia：选择 GUI+Command 方式，彻底系统升级，添加 hakulo.us &#8230; <a href="http://b.gkp.cc/2010/08/22/a-workflow-of-idevice-installation/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img title="gkp_idevices" style="border-right: 0px; border-top: 0px; display: block; float: none; margin-left: auto; border-left: 0px; margin-right: auto; border-bottom: 0px" height="391" alt="gkp_idevices" src="http://b.gkp.cc/files/2010/08/gkp_idevices.jpg" width="652" border="0" /> </p>
<p>&#160;</p>
<p>这个周末安装 iDevice 有些吐：自己的新 iPhone4 和送给丈母娘的 iPod touch 要装东西，老婆的 iPod touch 也该升级一下系统，基本同样的工作重复进行了三遍，流程基本已经标准化了。。。记录如下</p>
<ol>
<li>升级 / 恢复固件：iPod touch 2G 跑 iOS 4.0 速度还可以忍受，<a href="http://android.google.org.cn/tag/iphone" target="_blank">iPhone</a>&#160;<a href="http://android.google.org.cn/tag/3g" target="_blank">3G</a> 则需要把 spotlight 禁用了，不然实在是不能忍啊。iPhone4 就不说了，飞一样。。。</li>
<li>越狱：4.02 以下推荐用 jailbreakme.com ，实在是太方便了，slide to jailbreak</li>
<li>配置 VPN：不然 Cydia 的部分源链接不能</li>
<li>进入 Cydia：选择 GUI+Command 方式，彻底系统升级，添加 hakulo.us / ifuckgfw.com 源，安装 appsync，OpenSSH，SBSettings，Aptitude，APT，SBSetting VPN toggle，gfwinterceptor</li>
<li>改 SBSettings 设置，ssh 一下修改 root密码，关闭 openssh</li>
<li>同步照片，视频，软件</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://b.gkp.cc/2010/08/22/a-workflow-of-idevice-installation/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>简述 GFWInterceptor PHP 服务器端安装</title>
		<link>http://b.gkp.cc/2010/08/17/setup-php-proxy-server-for-gfwinterceptor/</link>
		<comments>http://b.gkp.cc/2010/08/17/setup-php-proxy-server-for-gfwinterceptor/#comments</comments>
		<pubDate>Tue, 17 Aug 2010 17:59:45 +0000</pubDate>
		<dc:creator>gkp</dc:creator>
				<category><![CDATA[我的慵懒生活]]></category>
		<category><![CDATA[电脑相关]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[GFW]]></category>
		<category><![CDATA[GFWInterceptor]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://b.gkp.cc/?p=1457</guid>
		<description><![CDATA[首先非常感谢 @overboming 同学连续两个晚上和我调试 GFWInterceptor 的 PHP 服务端，而且今天后来很长一段时间都是因为我的一个操作失误导致的错误，实在是很对不住 @overboming 同学，具体的这个操作失误在最后会提到，先来简单说一下安装的过程。 1，下载源代码 有两种方式，使用 svn： svn checkout https://gfwinterceptor.googlecode.com/svn/trunk/api-proxy-php 或者直接到下面这个地址下载 index.php 和 .htaccess 这两个文件的 raw file http://code.google.com/p/gfwinterceptor/source/browse/#svn/trunk/api-proxy-php 其中 svn 还是强烈推荐的，虽然文件可能要移动一下，不过这样可以确保在 copy / paste 时候不出错误。 2，代码安装 GFWInterceptor 的安装还是十分简单的，首先确认你的服务器使用的是 Apache httpd，并且开启了 mod_rewrite 支持，php 方面需要有 cURL 模块。没问题的话，把 &#8230; <a href="http://b.gkp.cc/2010/08/17/setup-php-proxy-server-for-gfwinterceptor/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="g_f_w" src="http://b.gkp.cc/files/2010/08/g_f_w.png" border="0" alt="g_f_w" width="345" height="151" /></p>
<p>首先非常感谢 <a href="http://twitter.com/overboming " target="_blank">@overboming</a> 同学连续两个晚上和我调试 <a href="http://iFuckGFW.com" target="_blank">GFWInterceptor</a> 的 PHP 服务端，而且今天后来很长一段时间都是因为我的一个操作失误导致的错误，实在是很对不住 <a href="http://twitter.com/overboming " target="_blank">@overboming</a> 同学，具体的这个操作失误在最后会提到，先来简单说一下安装的过程。</p>
<h2>1，下载源代码</h2>
<p>有两种方式，使用 svn：</p>
<pre>svn checkout https://gfwinterceptor.googlecode.com/svn/trunk/api-proxy-php</pre>
<p>或者直接到下面这个地址下载 index.php 和 .htaccess 这两个文件的 raw file</p>
<p><a title="http://code.google.com/p/gfwinterceptor/source/browse/#svn/trunk/api-proxy-php" href="http://code.google.com/p/gfwinterceptor/source/browse/#svn/trunk/api-proxy-php">http://code.google.com/p/gfwinterceptor/source/browse/#svn/trunk/api-proxy-php</a></p>
<p>其中 svn 还是强烈推荐的，虽然文件可能要移动一下，不过这样可以确保在 copy / paste 时候不出错误。</p>
<h2>2，代码安装</h2>
<p><a href="http://iFuckGFW.com" target="_blank">GFWInterceptor</a> 的安装还是十分简单的，首先确认你的服务器使用的是 Apache httpd，并且开启了 mod_rewrite 支持，php 方面需要有 cURL 模块。没问题的话，把 index.php 和 .htaccess 这两个文件放到服务器的某个目录就可以了，完全不需要进行代码修改以及权限设置。</p>
<h2>3，测试安装</h2>
<p><span id="more-1457"></span></p>
<p>首先在电脑上用浏览器打开一下 <a href="http://iFuckGFW.com" target="_blank">GFWInterceptor</a> PHP server 所在的目录，看看有没有报错信息，显示白板一块就对了。如果报 error 500 internal server error 服务器内部错误的话，很可能是你的服务器 Apache 没有启用 mod_headers。如果你有操作 apache 权限的话，直接</p>
<pre>sudo a2enmod headers</pre>
<p>加载 mod_headers 的配置文件，并重新启动 Ａpache 即可。如果服务器不是你的话，那你只能退而求其次，将 .htaccess 中下面这段删掉了，副作用是 4sq 无法 check-in，<a href="http://www.google.org.cn/tag/facebook" target="_blank">facebook</a> 无法登陆。不过你可以将备用服务器（图床服务器）保留默认的 appspot.com 地址，0.61 以后版本的 <a href="http://iFuckGFW.com" target="_blank">GFWInterceptor</a> 会将 4sq check-in 之类的请求直接走备用服务器。</p>
<pre>#&lt;Files ~ "*.php"&gt;
SetEnvIf content-type ([^m].*) NEW_CONTENT_TYPE=$1
SetEnvIf content-type (multipart/form-data)(.*) NEW_CONTENT_TYPE=multipart/form-data-alternate$2 OLD_CONTENT_TYPE=$1$2
RequestHeader unset content-type
RequestHeader append content-type %{NEW_CONTENT_TYPE}e env=NEW_CONTENT_TYPE
#&lt;/Files&gt;</pre>
<h2>4，开始使用吧</h2>
<p>在<a href="http://b.gkp.cc/2010/08/16/gfwinterceptor-is-another-gfw-fucker/" target="_blank">安装好 GFWInterceptor</a> 的 iDevice 上进入 Settings –&gt; GFWInterceptor，将主力服务器设置成你安装 PHP 服务器端文件的地址，注意开头的 http:// 不要省略。图床服务器则根据个人情况，有 mod_headers 的话完全也可以用自己的服务器。之后确认第一个选项在启动状态，保存退出，我这里需要 respring 一下，但是据 <a href="http://twitter.com/overboming " target="_blank">@overboming</a> 说他那里则不用。</p>
<p>依次打开 <a href="http://www.google.org.cn/tag/twitter" target="_blank">twitter</a> for iPhone，4sq，Facebook 试试看吧，目前这三个应用除了 4sq check-in 后的 mayor 皇冠等几个图片不能显示外，应该已经完美了。</p>
<h2>5，关于安全</h2>
<p>首先我认为所有 Fuck-GFW 的服务都应该保持 private，所有公开的服务都会在瞬间被干掉，经过我的实测，北京移动 edge 用户已经无法访问 <a href="http://iFuckGFW.com" target="_blank">GFWInterceptor</a> 的默认 appspot 服务器了。所以我强烈建议自己搭建 <a href="http://iFuckGFW.com" target="_blank">GFWInterceptor</a> 服务器的用户也将服务器保持私有状态，仅限自己和好友使用。更何况现在 <a href="http://iFuckGFW.com" target="_blank">GFWInterceptor</a> 的服务端还没有验证机制，也就是说任何人只要知道你的服务器地址就可以用。大家可以将服务器路径设置的诡异一些，有条件的甚至可以在非标准端口上开一个虚拟主机，这样被猜到的可能性就大大降低了。</p>
<p>不过 <a href="http://twitter.com/overboming " target="_blank">@overboming</a> 已经<a href="http://code.google.com/p/gfwinterceptor/issues/detail?id=14" target="_blank">确认</a>在下个大升级中将加入 token 验证机制，手机端转发请求时将在 HTTP_HEADER 中包含一个 token，服务器端收到后会先验证 token，没有问题才放行，届时安全性将大大改善。</p>
<p>最后一个建议，就是尽量使用 https 加密连接，twitter for <a href="http://android.google.org.cn/tag/iphone" target="_blank">iPhone</a> 已经是全 OAuth，但是最新的 Facebook 登录时密码还是明文发送的，存在被居心不良的人截获的可能性。</p>
<p>最后说下我今天晚上犯的错误吧，我是直接在 <a href="http://www.google.org.cn/tag/chrome" target="_blank">Chrome</a> 中复制代码，然后到 iterm 中 vi 粘贴，结果不小心在代码开头的 &lt;? 前面多复制了一个空行，导致 twitter / Facebook 报告 xml 数据前有垃圾数据，折腾了好久，所以大家最好还是 svn 吧，最起码避免了复制代码出错的可能性。</p>
<p>基本安装就是这样，如果遇到问题可以留言或者在 twitter <a href="http://twitter.com/gokeeper" target="_blank">@gokeeper</a>，我会尽我所能帮大家解决。</p>
]]></content:encoded>
			<wfw:commentRss>http://b.gkp.cc/2010/08/17/setup-php-proxy-server-for-gfwinterceptor/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>试用 GFWInterceptor</title>
		<link>http://b.gkp.cc/2010/08/16/gfwinterceptor-is-another-gfw-fucker/</link>
		<comments>http://b.gkp.cc/2010/08/16/gfwinterceptor-is-another-gfw-fucker/#comments</comments>
		<pubDate>Mon, 16 Aug 2010 11:39:40 +0000</pubDate>
		<dc:creator>gkp</dc:creator>
				<category><![CDATA[我的慵懒生活]]></category>
		<category><![CDATA[电脑相关]]></category>
		<category><![CDATA[4sq]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[GFW]]></category>
		<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://b.gkp.cc/2010/08/16/gfwinterceptor-is-another-gfw-fucker/</guid>
		<description><![CDATA[GFWInterceptor 是 @overboming 同学写的一个 iOS App，其原理为按照关键字拦截应用程序外发网络请求到 proxy，并接受 proxy 传回的返回值，twitter / 4sq / Facebook 等一般都可以搞定。 GFWInterceptor 的手机端可以用 Cydia 安装，Source 地址是 http://gfwinterceptor.googlecode.com/svn/trunk/cydia，proxy 服务器端有 GAE 和 PHP 两个版本，不过 PHP 版本在我这里稍有问题，4sq 没问题，对返回值要求严格的 twitter 则提示 Extra Content，可能需要写 PHP proxy 的 @luosheng 同学 debug 一下 @overboming &#8230; <a href="http://b.gkp.cc/2010/08/16/gfwinterceptor-is-another-gfw-fucker/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="gfwinterceptor_digiram" src="http://b.gkp.cc/files/2010/08/gfwinterceptor_digiram.png" border="0" alt="gfwinterceptor_digiram" width="534" height="474" /></p>
<p><a href="http://code.google.com/p/gfwinterceptor/" target="_blank">GFWInterceptor</a> 是 <a href="http://twitter.com/overboming" target="_blank">@overboming</a> 同学写的一个 iOS App，其原理为按照关键字拦截应用程序外发网络请求到 proxy，并接受 proxy 传回的返回值，<a href="http://www.google.org.cn/tag/twitter" target="_blank">twitter</a> / 4sq / <a href="http://www.google.org.cn/tag/facebook" target="_blank">Facebook</a> 等一般都可以搞定。</p>
<p><a href="http://code.google.com/p/gfwinterceptor/" target="_blank">GFWInterceptor</a> 的手机端可以用 Cydia 安装，Source 地址是 <a title="http://gfwinterceptor.googlecode.com/svn/trunk/cydia" href="http://gfwinterceptor.googlecode.com/svn/trunk/cydia">http://gfwinterceptor.googlecode.com/svn/trunk/cydia</a>，proxy 服务器端有 GAE 和 PHP 两个版本，不过 PHP 版本在我这里稍有问题，4sq 没问题，<span style="text-decoration: line-through;">对返回值要求严格的 twitter 则提示 Extra Content，可能需要写 PHP proxy 的 </span><a href="http://twitter.com/luosheng" target="_blank"><span style="text-decoration: line-through;">@luosheng</span></a><span style="text-decoration: line-through;"> 同学 debug 一下</span> <a href="http://twitter.com/overboming" target="_blank">@overboming</a> 已经更新了 PHP 服务器文件，现在 twitter 也没问题了。<a href="http://code.google.com/p/gfwinterceptor/" target="_blank">GFWInterceptor</a> 自带了一个 appspot.com 的 GAE proxy，据 @overboming 说日请求大概有2-3w，刚刚到 Google 限制的 20% 左右，所以默认服务器也是个不错的选择。</p>
<p>想自己搭建 PHP 版 GFWInterceptor 的可以参考<a href="http://b.gkp.cc/2010/08/17/setup-php-proxy-server-for-gfwinterceptor/" target="_blank">这篇教程</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://b.gkp.cc/2010/08/16/gfwinterceptor-is-another-gfw-fucker/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>搭建支持 OAuth Echo 的第三方 twitter 应用</title>
		<link>http://b.gkp.cc/2010/08/16/twitter-for-iphone-custom-image-endpoint-and-twitter-oauth-echo/</link>
		<comments>http://b.gkp.cc/2010/08/16/twitter-for-iphone-custom-image-endpoint-and-twitter-oauth-echo/#comments</comments>
		<pubDate>Mon, 16 Aug 2010 03:46:17 +0000</pubDate>
		<dc:creator>gkp</dc:creator>
				<category><![CDATA[我的工作学习]]></category>
		<category><![CDATA[电脑相关]]></category>
		<category><![CDATA[curl]]></category>
		<category><![CDATA[imggd]]></category>
		<category><![CDATA[oauth]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://b.gkp.cc/2010/08/16/twitter-for-iphone-custom-image-endpoint-and-twitter-oauth-echo/</guid>
		<description><![CDATA[背景：进入8月中，twitter 已经在每天减少 Basic Auth 的 API limit了，到月底 Basic Auth 将彻底关闭，也就是说到月底，所有的客户端，twitter与第三方服务之间都必须使用 OAuth 来传递帐号密码等信息。 我喜欢 twitter for iPhone 的很大一个原因就是其支持自定义图片服务，3.0 以及之前的版本使用 Basic Auth 自建图片服务很容易，只要处理一下提交过来的 multipart/form-data 就行了，但是相应的安全性比较低——密码用明文传送，所以 atebits 强烈推荐用 https，并且曾经计划在后续版本强制 https。当然现在都 OAuth 了，这个问题也就不存在了。 twitter for iPhone 升级到 3.01 以后，就一直有人说其有 bug，自定义 API 和 自定义图片服务都不能用，这个 &#34;bug&#34; &#8230; <a href="http://b.gkp.cc/2010/08/16/twitter-for-iphone-custom-image-endpoint-and-twitter-oauth-echo/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img title="imggd_oauth_echo" style="border-right: 0px; border-top: 0px; display: block; float: none; margin-left: auto; border-left: 0px; margin-right: auto; border-bottom: 0px" height="288" alt="imggd_oauth_echo" src="http://b.gkp.cc/files/2010/08/imggd_oauth_echo.png" width="552" border="0" /> </p>
<p>背景：进入8月中，<a href="http://www.google.org.cn/tag/twitter" target="_blank">twitter</a> 已经在每天减少 Basic Auth 的 API limit了，到月底 Basic Auth 将彻底关闭，也就是说到月底，所有的客户端，twitter与第三方服务之间都必须使用 OAuth 来传递帐号密码等信息。</p>
<p>我喜欢 twitter for <a href="http://android.google.org.cn/tag/iphone" target="_blank">iPhone</a> 的很大一个原因就是其支持自定义图片服务，3.0 以及之前的版本使用 Basic Auth 自建图片服务很容易，只要处理一下提交过来的 multipart/form-data 就行了，但是相应的安全性比较低——密码用明文传送，所以 atebits 强烈推荐用 https，并且曾经计划在后续版本强制 https。当然现在都 OAuth 了，这个问题也就不存在了。</p>
<p>twitter for iPhone 升级到 3.01 以后，就一直有人说其有 bug，自定义 API 和 自定义图片服务都不能用，这个 &quot;bug&quot; 一直持续到了 3.03a。。。昨天偶然和 <a href="http://twitter.com/2046" target="_blank">@2046</a> 聊起这个事情，才突然明白这根本不是什么 bug，而是新版的 twitter for iPhone 已经开始用 oAuth 将用户信息打包提交了，所以导致之前在 expect basic auth 的 API Proxy 以及 自定义图片服务都歇菜了，包括 <a href="http://img.gd" target="_blank">img.gd</a> 与 <a href="http://code.google.com/p/twip/" target="_blank">twip</a> 。。。</p>
<p>这里要强烈谴责一下 twitter 的官方网站，直到现在 twitter for iPhone 的<a href="http://support.twitter.com/groups/34-mobile/topics/126-carriers-apps/articles/170511-twitter-for-iphone-advanced-features" target="_blank">支持页面</a>里面还是让大家去 atebits 的 developer 页面看<a href="http://developer.atebits.com/tweetie-iphone/custom-image/" target="_blank">老掉牙的信息</a>，严重误导。实际上现在 twitter 使用 OAuth Echo 为类似的第三方服务进行验证，基本原理可以参考这（<a href="http://dev.twitter.com/pages/oauth_echo" target="_blank">1</a>，<a href="http://www.scribd.com/doc/26707268/OAuth-Echo-Identity-Veri%EF%AC%81cation-Delegation-Draft" target="_blank">2</a>）篇文档，基本流程如下图：</p>
<p> <span id="more-1452"></span>
<p><a href="http://b.gkp.cc/files/2010/08/oauth_echo.png" target="_blank"><img title="oauth_echo" style="border-right: 0px; border-top: 0px; display: block; float: none; margin-left: auto; border-left: 0px; margin-right: auto; border-bottom: 0px" height="482" alt="oauth_echo" src="http://b.gkp.cc/files/2010/08/oauth_echo_thumb.png" width="519" border="0" /></a> </p>
<p>以 twitter for iPhone 发图到 img.gd 为例：</p>
<ol>
<li>twitter for iPhone 将 multipart/form-data POST 到 img.gd 的 ending point，包括图片以及 $_POST['message']，即 tweet 主体。</li>
<li>POST multipart/form-data 的同时，HTTP HEADER 中会包含关键的 OAuth 信息：X-Auth-Service-Provider （验证 url） 以及 X-Verify-Credentials-Authorization （OAuth 信息主体，包括 token 等）。</li>
<li>img.gd 收到 POST 后，将 HTTP HEADER 中的 X-Verify-Credentials-Authorization 改名为 Authorization 提交到 X-Auth-Service-Provider （这里就是 twitter）验证。</li>
<li>如果 twitter 返回 HTTP CODE 200 的话，表示验证成功，同时会返回一个 json 格式的用户 object。</li>
<li>img.gd 读取 twitter 返回的 json 数据，存储图片，返回图片 url 给 twitter for iPhone。</li>
</ol>
<p>最终效果如本文题图，这样终于可以放心升级到 twitter for iPhone 3.03a了，twitter 本身走 <a href="http://code.google.com/p/gfwinterceptor/" target="_blank">#GFWInterceptor</a> 图片则直接 OAuth Echo 到 img.gd，赞！</p>
]]></content:encoded>
			<wfw:commentRss>http://b.gkp.cc/2010/08/16/twitter-for-iphone-custom-image-endpoint-and-twitter-oauth-echo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Debian 5 安装 Pure-ftpd 笔记</title>
		<link>http://b.gkp.cc/2010/08/14/setup-pure-ftpd-on-debian/</link>
		<comments>http://b.gkp.cc/2010/08/14/setup-pure-ftpd-on-debian/#comments</comments>
		<pubDate>Sat, 14 Aug 2010 07:21:14 +0000</pubDate>
		<dc:creator>gkp</dc:creator>
				<category><![CDATA[我的慵懒生活]]></category>
		<category><![CDATA[电脑相关]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[ftp]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[pure-ftpd]]></category>

		<guid isPermaLink="false">http://b.gkp.cc/?p=1443</guid>
		<description><![CDATA[今天实在要用到 ftp 传文件了，不得已开始装 ftpd。因为之前一直在用 pure-ftpd，所以这次在 Debian 上也打算用这个，发现还稍微需要配置一下，简单记下来： 安装： aptitude install pure-ftpd 当然也可以直接装 pure-ftpd-mysql ，不过我嫌弄 mysql 表和用户麻烦。。 添加组和用户 groupadd ftpgroup useradd -g ftpgroup -d /dev/null -s /etc ftpuser 修改启动方式，从默认的 inetd 改成 独立启动，这步很关键 vi /etc/default/pure-ftpd-common 找到 STANDALONE_OR_INETD=inetd 改成 STANDALONE_OR_INETD=standalone 为 PureDB 文件创建连接 &#8230; <a href="http://b.gkp.cc/2010/08/14/setup-pure-ftpd-on-debian/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>今天实在要用到 ftp 传文件了，不得已开始装 ftpd。因为之前一直在用 pure-ftpd，所以这次在 Debian 上也打算用这个，发现还稍微需要配置一下，简单记下来：</p>
<p>安装：</p>
<pre>aptitude install pure-ftpd</pre>
<p>当然也可以直接装 pure-ftpd-mysql ，不过我嫌弄 mysql 表和用户麻烦。。</p>
<p>添加组和用户</p>
<pre>groupadd ftpgroup
useradd -g ftpgroup -d /dev/null -s /etc ftpuser</pre>
<p>修改启动方式，从默认的 inetd 改成 独立启动，这步很关键</p>
<pre>vi /etc/default/pure-ftpd-common</pre>
<p>找到</p>
<pre>STANDALONE_OR_INETD=inetd</pre>
<p>改成</p>
<pre>STANDALONE_OR_INETD=standalone</pre>
<p>为 PureDB 文件创建连接</p>
<pre>cd /etc/pure-ftpd/auth
ln -s /etc/pure-ftpd/conf/PureDB 50pure</pre>
<p>启动</p>
<pre>/etc/init.d/pure-ftpd restart</pre>
<p>ps 一下看看，如果 pure-ftpd 在就没问题了。增减用户等操作运行一下 pure-pw 看帮助吧，很简单的，记得所有涉及修改用户操作后面都加个 -m 即时更新数据库。</p>
<p>参考：<a href="http://linux.justinhartman.com/PureFTPd_Installation_and_Setup" target="_blank">justinhartman.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://b.gkp.cc/2010/08/14/setup-pure-ftpd-on-debian/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>使用 MySQL 进行 PPP 验证</title>
		<link>http://b.gkp.cc/2010/08/12/setup-pppd-with-mysql-auth/</link>
		<comments>http://b.gkp.cc/2010/08/12/setup-pppd-with-mysql-auth/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 13:08:23 +0000</pubDate>
		<dc:creator>gkp</dc:creator>
				<category><![CDATA[我的慵懒生活]]></category>
		<category><![CDATA[电脑相关]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[ipsec]]></category>
		<category><![CDATA[l2tp]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[ppp]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[vpn]]></category>

		<guid isPermaLink="false">http://b.gkp.cc/2010/08/12/setup-pppd-with-mysql-auth/</guid>
		<description><![CDATA[继续折腾服务器的 VPN。之前已经配置好了 ipsec+L2TP 以及 OpenVPN，还做了 OpenVPN 的 MySQL 验证以实现用户跨服务器，但是 L2TP 的用户验证还是需要用 PPP 调用 /etc/ppp/chap-secrets 文件，跨服务器验证貌似也只能 crontab rsync，于是没用过 Radius 的我还是往 MySQL 方面想办法。搜索后发现了两个相关的开源项目：pppd-mysql 和 pppd-sql，前者简陋到只有一个 .c 文件，让人无从下手，而后者是基于前者的思路重新开发的，编译文件与文档齐全，而且支持 PostgreSQL，于是决定用之。 首先需要安装 ppp 和 openssl 的 header / lib aptitude install ppp-dev libssl-dev 下载安装 pppd-sql &#8230; <a href="http://b.gkp.cc/2010/08/12/setup-pppd-with-mysql-auth/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img style="display: block; float: none; margin-left: auto; margin-right: auto; border-width: 0px;" title="mysql" src="http://b.gkp.cc/files/2010/08/mysql.gif" border="0" alt="mysql" width="425" height="283" /></p>
<p>继续折腾服务器的 VPN。之前已经配置好了 <a href="http://b.gkp.cc/2010/06/19/setup-ipsec-l2tp-on-centos-55/" target="_blank">ipsec+L2TP</a> 以及 <a href="http://b.gkp.cc/2010/08/01/setup-openvpn-server-on-linode-debian/" target="_blank">OpenVPN</a>，还做了 OpenVPN 的 <a href="http://b.gkp.cc/2010/08/08/setup-openvpn-with-mysql-auth/" target="_blank">MySQL 验证</a>以实现用户跨服务器，但是 L2TP 的用户验证还是需要用 PPP 调用 /etc/ppp/chap-secrets 文件，跨服务器验证貌似也只能 crontab rsync，于是没用过 <a href="http://www.gnu.org/software/radius/" target="_blank">Radius</a> 的我还是往 MySQL 方面想办法。搜索后发现了两个相关的开源项目：<a href="http://sourceforge.net/projects/pppd-mysql/" target="_blank">pppd-mysql</a> 和 <a href="http://freshmeat.net/projects/pppd-sql" target="_blank">pppd-sql</a>，前者简陋到只有一个 .c 文件，让人无从下手，而后者是基于前者的思路重新开发的，编译文件与文档齐全，而且支持 PostgreSQL，于是决定用之。</p>
<p>首先需要安装 ppp 和 openssl 的 header / lib</p>
<pre>aptitude install ppp-dev libssl-dev</pre>
<p>下载安装 pppd-sql</p>
<pre>cd /usr/src
wget <a title="http://freshmeat.net/urls/5649d7ea329d121d094f12544e2b70a1" href="http://freshmeat.net/urls/5649d7ea329d121d094f12544e2b70a1">http://freshmeat.net/urls/5649d7ea329d121d094f12544e2b70a1</a>
tar zxvf pppd-sql-0.8.0.tar.gz
cd pppd-sql-0.8.0
./configure  &lt;- 注意结果提示，看看你的数据库服务是否被找到了
./make
./make install</pre>
<p>另外关键的 mysql.so ppp 插件文件不知道为什么没有在 make install 时候安装到应有位置，手工 cp 吧，目标路径按照你系统里面的 pppd 版本号修改。</p>
<p><span id="more-1431"></span></p>
<pre>cp /usr/src/pppd-sql-0.8.0/src/.libs/mysql.so /usr/lib/pppd/2.4.5/</pre>
<p>下面修改 ppp 的配置文件，如果你是按照我<a href="http://b.gkp.cc/2010/06/19/setup-ipsec-l2tp-on-centos-55/" target="_blank">之前的 ipsec + L2TP 文档</a>安装的话，那么就是修改 /etc/ppp/options.xl2tpd 这个文件，加入以下内容：</p>
<pre>plugin mysql.so
mysql-host      MYSQL-HOST
mysql-port      MYSQL-PORT
mysql-user      MYSQL-USER
mysql-pass      MYSQL-PASS
mysql-pass-encryption   AES
mysql-pass-key  SALT
mysql-database  MYSQL-DB
mysql-table     MYSQL-TABLE
mysql-column-user       username
mysql-column-pass       ppppass
mysql-column-client-ip  client_ip
mysql-column-server-ip  server_ip
mysql-column-update     status
mysql-exclusive
mysql-authoritative</pre>
<p>具体的配置请看 man pppd-mysql，数据库和表结构也很简单，我是直接在之前 OpenVPN 的表格基础上修改的。</p>
<p>连接试试看吧，应该没问题了，最终效果是用户名密码在所有服务器的 ipsec+L2TP 以及 OpenVPN 连接方式全部通用。如果你的 ppp 使用 CHAP2 验证密码的话，这个插件只支持 AES 加密，而 OpenVPN 用的是 mysql.PASSWORD()，所以这两个服务不能共享一个密码字段（当然明文除外）。我觉得问题不大，用 PHP 简单写个脚本即可，还可以顺便加上用户修改密码功能，如果再加上支付宝 API 调用的话。。。都可以做全自动化的 VPN 网络销售系统了。。。</p>
]]></content:encoded>
			<wfw:commentRss>http://b.gkp.cc/2010/08/12/setup-pppd-with-mysql-auth/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Linux 系统连接 OpenVPN 无法获取推送 DNS 服务器的解决</title>
		<link>http://b.gkp.cc/2010/08/11/resolv-openvpn-linux-client-dns-issue/</link>
		<comments>http://b.gkp.cc/2010/08/11/resolv-openvpn-linux-client-dns-issue/#comments</comments>
		<pubDate>Wed, 11 Aug 2010 11:17:53 +0000</pubDate>
		<dc:creator>gkp</dc:creator>
				<category><![CDATA[我的慵懒生活]]></category>
		<category><![CDATA[电脑相关]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[openvpn]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[vpn]]></category>

		<guid isPermaLink="false">http://b.gkp.cc/2010/08/11/resolv-openvpn-linux-client-dns-issue/</guid>
		<description><![CDATA[&#160; 话说上周我们安装好了 OpenVPN，并且也启用了 MySQL 验证用户名和密码，结果没用几天又遇到问题了。。。还是 @cnkang 同学，反映在 Android 手机上连接成功后，没有收到服务器端推送过来的 Google DNS。 因为我实在懒得和 Android 较劲，于是在一台 Ubuntu 10.04 Desktop 机器上安装了 OpenVPN 试验，结果果然如此，完全没有理会服务器 push &#34;dhcp-option DNS 8.8.8.8&#34; 这条配置。还是 Google 后找到了答案。 原来 Linux 系统确实有这个问题，OpenVPN 也提供了现成的解决方案，那就是 /etc/openvpn/update-resolv-conf 这个脚本。在客户端配置文件 client.conf 后面加上如下三行： script-security 2 up ./update-resolv-conf down &#8230; <a href="http://b.gkp.cc/2010/08/11/resolv-openvpn-linux-client-dns-issue/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img title="resolvconf" style="border-top-width: 0px; display: block; border-left-width: 0px; float: none; border-bottom-width: 0px; margin-left: auto; margin-right: auto; border-right-width: 0px" height="137" alt="resolvconf" src="http://b.gkp.cc/files/2010/08/resolvconf.png" width="487" border="0" />&#160; </p>
<p>话说上周我们<a href="http://b.gkp.cc/2010/08/01/setup-openvpn-server-on-linode-debian/" target="_blank">安装好了 OpenVPN</a>，并且也启用了 <a href="http://b.gkp.cc/2010/08/08/setup-openvpn-with-mysql-auth/" target="_blank">MySQL 验证用户名和密码</a>，结果没用几天又遇到问题了。。。还是 <a href="http://twitter.com/cnkang" target="_blank">@cnkang</a> 同学，反映在 <a href="http://android.google.org.cn" target="_blank">Android</a> 手机上连接成功后，没有收到服务器端推送过来的 Google DNS。</p>
<p>因为我实在懒得和 Android 较劲，于是在一台 Ubuntu 10.04 Desktop 机器上安装了 OpenVPN 试验，结果果然如此，完全没有理会服务器</p>
<pre>push &quot;dhcp-option DNS 8.8.8.8&quot;</pre>
<p>这条配置。还是 Google 后找到了答案。</p>
<p>原来 Linux 系统确实有这个问题，OpenVPN 也提供了现成的解决方案，那就是 /etc/openvpn/update-resolv-conf 这个脚本。在客户端配置文件 client.conf 后面加上如下三行：</p>
<pre>script-security 2
up ./update-resolv-conf
down ./update-resolv-conf</pre>
<p>这样在连接成功后，脚本会自动修改 /etc/resolv.conf ，将 OpenVPN 服务器推送过来的 DNS 服务器地址填入。断开连接后，又会自动清空 /etc/resolv.conf。如果你没有别的程序要修改 /etc/resolv.conf 的话，用这个脚本还是很方便的。</p>
<p>注意使用前需要检查下系统里面有没有 resolvconf 这个软件包，没有的话编译或者 APT 装一个就行了。还要注意 update-resolv-conf 有没有执行权限，没有的话 chmod +x update-resolv-conf 搞一下。另外我这里默认 update-resolv-conf 脚本和配置文件处于同一目录，不是这样的话请自己添加完整路径。</p>
<p>请 <a href="http://twitter.com/cnkang" target="_blank">@cnkang</a> 等同学重新下载我的 OpenVPN 配置文件包，里面已经包含了 update-resolv-conf 脚本，在 Linux 下用的话只需要将 conf 文件调用脚本的三行取消注释就可以了。</p>
]]></content:encoded>
			<wfw:commentRss>http://b.gkp.cc/2010/08/11/resolv-openvpn-linux-client-dns-issue/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>pam-mysql 验证 bug 的最佳解决方案</title>
		<link>http://b.gkp.cc/2010/08/09/a-patch-for-pam-mysql-07rc1-bug/</link>
		<comments>http://b.gkp.cc/2010/08/09/a-patch-for-pam-mysql-07rc1-bug/#comments</comments>
		<pubDate>Mon, 09 Aug 2010 05:51:19 +0000</pubDate>
		<dc:creator>gkp</dc:creator>
				<category><![CDATA[我的慵懒生活]]></category>
		<category><![CDATA[电脑相关]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[openvpn]]></category>
		<category><![CDATA[pam-mysql]]></category>
		<category><![CDATA[vpn]]></category>

		<guid isPermaLink="false">http://b.gkp.cc/2010/08/09/a-patch-for-pam-mysql-07rc1-bug/</guid>
		<description><![CDATA[昨天我在配置 mysql 验证的 OpenVPN 时遇到了 pam-mysql 的验证 bug，当时使用的是 export LD_PRELOAD=/lib/libpam.so.0 这个 walk around。今天继续 Google 后，发现网上已经有可用的 patch，步骤如下： cd /usr/src wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz tar zxvf pam_mysql-0.7RC1.tar.gz cd pam_mysql-0.7RC1 vi patch.in 内容如下 --- Makefile.in.chold 2008-07-14 10:25:53.000000000 +0200 +++ Makefile.in 2008-07-14 10:26:06.000000000 +0200 @@ -110,7 &#8230; <a href="http://b.gkp.cc/2010/08/09/a-patch-for-pam-mysql-07rc1-bug/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>昨天我在配置 <a href="http://b.gkp.cc/2010/08/08/setup-openvpn-with-mysql-auth/" target="_blank">mysql 验证的 OpenVPN</a> 时遇到了 pam-mysql 的验证 bug，当时使用的是</p>
<pre>export LD_PRELOAD=/lib/libpam.so.0</pre>
<p>这个 walk around。今天继续 Google 后，发现网上已经有可用的 patch，步骤如下：</p>
<pre>cd /usr/src
wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz
tar zxvf pam_mysql-0.7RC1.tar.gz
cd pam_mysql-0.7RC1
vi patch.in</pre>
<p>内容如下</p>
<pre><code>--- Makefile.in.chold   2008-07-14 10:25:53.000000000 +0200
+++ Makefile.in 2008-07-14 10:26:06.000000000 +0200
@@ -110,7 +110,7 @@
 CPPFLAGS = @CPPFLAGS@
 LDFLAGS = @LDFLAGS@
 LIBS = @LIBS@
-pam_mysql_la_LIBADD =
+pam_mysql_la_LIBADD = -lpam
 pam_mysql_la_OBJECTS =  pam_mysql.lo
 CFLAGS = @CFLAGS@
 COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
</code></pre>
<p>有读者反应直接复制上面代码 patch 时候报错，我试了试还真是，有问题的下载下面这个附件然后改名成 patch.in 吧：</p>
<p><a href="http://b.gkp.cc/files/2010/08/patch.txt">pam_mysql-0.7RC1-patch</a></p>
<p>打 patch，编译安装</p>
<pre>patch -p0 &lt; patch.in
./configure
make
make install
/etc/init.d/openvpn restart</pre>
<p>重新测试连接 OpenVPN，工作正常！</p>
<p>PS：如果你的系统是 Debian 的话，squeeze 的 testing 源里面已经有了加入这个 patch 的新版 libpam-mysql，版本号为 <a href="http://packages.debian.org/squeeze/libpam-mysql" target="_blank">0.7~RC1-4</a></p>
<p>参考：</p>
<ul>
<li><a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=418500#50" target="_blank">bugs.debian.org</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://b.gkp.cc/2010/08/09/a-patch-for-pam-mysql-07rc1-bug/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>使用 MyQL 验证 OpenVPN 用户笔记</title>
		<link>http://b.gkp.cc/2010/08/08/setup-openvpn-with-mysql-auth/</link>
		<comments>http://b.gkp.cc/2010/08/08/setup-openvpn-with-mysql-auth/#comments</comments>
		<pubDate>Sun, 08 Aug 2010 18:05:12 +0000</pubDate>
		<dc:creator>gkp</dc:creator>
				<category><![CDATA[我的慵懒生活]]></category>
		<category><![CDATA[电脑相关]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[openvpn]]></category>
		<category><![CDATA[vpn]]></category>
		<category><![CDATA[vps]]></category>

		<guid isPermaLink="false">http://b.gkp.cc/2010/08/08/setup-openvpn-with-mysql-auth/</guid>
		<description><![CDATA[上次我们成功的在 Debian 上安装了 OpenVPN，但是用证书方式验证用户还是有些麻烦：昨天和 @cnkang 吃晚饭说给他开一个 OpenVPN 帐号，回家后还得去服务器那边生成证书，再让他下载。。。遂 Google 一把，发现可以使用 pam + MySQL 验证，这样不但以后给朋友开账户方便了，而且还可以多台主机使用一个 MySQL 表，实现多台服务器账户信息共享，配置过程简单整理记录如下 前提条件：安装好 OpenVPN，并且客户端可以使用证书方式正常连接。 安装 pam-mysql aptitude install libpam-dev libpam-mysql libmysql++-dev sasl2-bin Ubuntu 的话，包的名字稍有区别，比如：libmysqlclient-dev 和 libpam0g-dev 如果喜欢自己使用源代码编译 pam-mysql 的话，可能在 ./configure 时会遇到 configure: error: C compiler cannot &#8230; <a href="http://b.gkp.cc/2010/08/08/setup-openvpn-with-mysql-auth/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img style="display: block; float: none; margin-left: auto; margin-right: auto; border-width: 0px;" title="openvpn_mysql" src="http://b.gkp.cc/files/2010/08/openvpn_mysql.png" border="0" alt="openvpn_mysql" width="500" height="364" /></p>
<p>上次我们成功的<a href="http://b.gkp.cc/2010/08/01/setup-openvpn-server-on-linode-debian/" target="_blank">在 Debian 上安装了 OpenVPN</a>，但是用证书方式验证用户还是有些麻烦：昨天和 <a href="http://twitter.com/cnkang" target="_blank">@cnkang</a> 吃晚饭说给他开一个 OpenVPN 帐号，回家后还得去服务器那边生成证书，再让他下载。。。遂 Google 一把，发现可以使用 pam + MySQL 验证，这样不但以后给朋友开账户方便了，而且还可以多台主机使用一个 MySQL 表，实现多台服务器账户信息共享，配置过程简单整理记录如下</p>
<p>前提条件：安装好 OpenVPN，并且客户端可以使用<a href="http://b.gkp.cc/2010/08/01/setup-openvpn-server-on-linode-debian/" target="_blank">证书方式</a>正常连接。</p>
<h2>安装 pam-mysql</h2>
<pre>aptitude install libpam-dev libpam-mysql libmysql++-dev sasl2-bin
Ubuntu 的话，包的名字稍有区别，比如：libmysqlclient-dev 和 libpam0g-dev</pre>
<p>如果喜欢自己使用<a href="http://pam-mysql.sourceforge.net/" target="_blank">源代码</a>编译 pam-mysql 的话，可能在 ./configure 时会遇到</p>
<pre>configure: error: C compiler cannot create executables
See `config.log' for more details.</pre>
<p>这时候先</p>
<pre>aptitude install build-essential</pre>
<p>就可以了</p>
<h2>建 MySQL 库，表，用户</h2>
<p><span id="more-1402"></span></p>
<pre>mysql&gt; create database openvpn;
mysql&gt; GRANT ALL ON openvpn.* TO <a href="mailto:openvpn@localhost">openvpn@localhost</a> IDENTIFIED BY 'PASSWORD';
mysql&gt; FLUSH PRIVILEGES;
mysql&gt; use openvpn;
mysql&gt; CREATE TABLE vpnuser (
-&gt; username char(20) NOT NULL,
-&gt; password char(128) default NULL,
-&gt; active int(10) NOT NULL DEFAULT 1,
-&gt; PRIMARY KEY (username)
-&gt; );
mysql&gt; INSERT INTO vpnuser (username,password) values('somebody',password('secret'));</pre>
<h2>配置 pam-mysql</h2>
<pre>vi /etc/pam.d/openvpn</pre>
<p>内容：</p>
<pre>auth optional pam_mysql.so user=openvpn passwd=PASSWORD host=localhost db=openvpn table=vpnuser usercolumn=username passwdcolumn=password where=active=1 crypt=2

account required pam_mysql.so user=openvpn passwd=PASSWORD host=localhost db=openvpn table=vpnuser usercolumn=username passwdcolumn=password where=active=1 crypt=2</pre>
<p>注意这里 crypt=2，是指密码需要用 mysql 的 password()，如果 crypt=3 的话密码则需要 MD5()</p>
<p>如果 pam 验证有问题的话，可以用 verbose=1 启用 debug，然后在 /var/log/auth.log 察看具体信息。此外，还可以将验证过程日至也保存到表格中，用 sqllog=1 启用，具体语法参考 pam-mysql 的 README 即可。</p>
<p>用 sasl2 验证一下</p>
<pre>saslauthd -a pam
testsaslauthd -u somebody -p secret -s openvpn</pre>
<p>如果出现</p>
<pre>0: OK "Success."</pre>
<p>就表示 pam-mysql 验证没有问题了</p>
<h2>修改 OpenVPN 配置</h2>
<pre>cp /usr/lib/openvpn/openvpn-auth-pam.so /etc/openvpn/
vi /etc/openvpn/server.conf</pre>
<p>在最后加入：</p>
<pre>#begin mysql
plugin ./openvpn-auth-pam.so openvpn
client-cert-not-required
username-as-common-name</pre>
<p>客户端 conf 文件修改，将原来的</p>
<pre>cert client.crt
key client.key</pre>
<p>这两行注释掉，并加入一行</p>
<pre>auth-user-pass</pre>
<p>保存即可。</p>
<p>到此为止所有准备工作就完成了，用 Tunnelblick 启动这个新的客户端配置文件的话，会有对话框提示用户名和密码，输入并保存到 keychain 以后就一劳永逸了。</p>
<p>另外，网上很多用户遇到了使用 sasl 验证没问题，但是 OpenVPN 验证不过去的现象，我也在这个问题上卡了好久，/var/log/auth.log 是这么说的：</p>
<pre>Aug  9 01:13:34 fremont openvpn[16395]: PAM unable to dlopen(/lib/security/pam_mysql.so): /lib/security/pam_mysql.so: undefined symbol: pam_get_item
Aug  9 01:13:34 fremont openvpn[16395]: PAM adding faulty module: /lib/security/pam_mysql.so</pre>
<p><span style="text-decoration: line-through;">还是 Google 到答案，貌似是个 BUG ，有个 walk around 就是</span></p>
<pre><span style="text-decoration: line-through;">export LD_PRELOAD=/lib/libpam.so.0</span></pre>
<p><span style="text-decoration: line-through;">可以写到 /etc/rc.local 里面`</span></p>
<pre><span style="text-decoration: line-through;">#openvpn pam fix
export LD_PRELOAD=/lib/libpam.so.0
/etc/init.d/openvpn restart</span></pre>
<p>有了更好的解决办法了，直接用<a href="http://b.gkp.cc/2010/08/09/a-patch-for-pam-mysql-07rc1-bug/" target="_blank">这篇文章</a>里面的 patch 文件或者 testing 的包就搞定了。</p>
<p>这下不应该有任何问题了，把 ca.crt 放到你的网站让用户下载吧，以后只需要在 MySQL 表格中添加记录就可以开帐号了。</p>
<p>参考：</p>
<ul>
<li><a href="http://www.openvpn.net/index.php/open-source/documentation/howto.html" target="_blank">OpenVPN how to</a></li>
<li><a href="http://www.chinaunix.net/jh/50/513004.html" target="_blank">OpenVPN使用User/Pass验证登录</a></li>
<li><a href="http://www.linuxquestions.org/questions/linux-newbie-8/configure-error-c-compiler-cannot-create-executables-354485/" target="_blank">configure: error: C++ compiler cannot create executables</a></li>
<li><a href="https://bugs.launchpad.net/debian/+source/pam-mysql/+bug/96091" target="_blank">Broken libpam-mysql</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://b.gkp.cc/2010/08/08/setup-openvpn-with-mysql-auth/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>WordPress 3.0 MU 设置与独立域名映射</title>
		<link>http://b.gkp.cc/2010/08/04/enable-wordpress-30-mu-function-and-map-domain-for-network-blogs/</link>
		<comments>http://b.gkp.cc/2010/08/04/enable-wordpress-30-mu-function-and-map-domain-for-network-blogs/#comments</comments>
		<pubDate>Wed, 04 Aug 2010 13:50:57 +0000</pubDate>
		<dc:creator>gkp</dc:creator>
				<category><![CDATA[我的慵懒生活]]></category>
		<category><![CDATA[电脑相关]]></category>
		<category><![CDATA[domain]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[wordpress MU]]></category>

		<guid isPermaLink="false">http://b.gkp.cc/2010/08/04/enable-wordpress-30-mu-function-and-map-domain-for-network-blogs/</guid>
		<description><![CDATA[WordPress MU Domain Mapping plugi <a href="http://b.gkp.cc/2010/08/04/enable-wordpress-30-mu-function-and-map-domain-for-network-blogs/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>6月推出的 WordPress 3.0 包含了我期待已久的一个功能：和 MU 的整合。因为之前我家里的三个 blog 分别用了三套程序，每次升级程序和插件（尤其是自己 hack 过的）都是一个痛苦的过程。昨天动手将这三套程序整合到了一个全新安装的 WordPress 3.0 中，简单记录如下：</p>
<p>基本思路：全新安装 WordPress 3.0 –&gt; 启用 Network –&gt; 导入数据 –&gt; 调整数据 –&gt; 独立域名映射</p>
<h2>安装 WordPress 3.0</h2>
<p>和之前版本没有任何区别，改好 wp-config.php 设置好目录属性，直接按照向导安装即可。</p>
<h2>启用 Network</h2>
<p>MU 里面 Network 有两种形式：1是子域名，比如 a.gkp.com，b.gkp.com。2是目录，比如 gkp.com/a 和  gkp.com/b ，可以根据个人喜好选择。如果是用第一种形式的话，那么需要设置一条 DNS 的 A 记录，将 *.gkp.com （或者至少是你想要的用的子域名）指向你的服务器，同样 Apache 也需要做对应的 Server Alias 。如果你打算和我一样给子网站分别映射独我立域名的话，其实选择哪种都无所谓。</p>
<p>打开 wp-config.php，将下面这行添加在 /* That's all, stop editing! Happy blogging. */  之前</p>
<pre>define('WP_ALLOW_MULTISITE', true);</pre>
<p>之后就可以在后台的 Tools –&gt; Network 看到网络设置了，在这里输入网络的名字和管理员 Email 等信息，点 Install 安装。</p>
<p>接下来需要一些操作，在 wp-content 目录下面建立一个 blogs.dir 目录，用来存放子 blog 上传文件等内容，权限要设置为可写。然后按照向导程序的提示分别将给出的文件内容添加到 wp-config.php 和 .htaccess 两个文件中。至此 WordPress MU 网络的设置就完成了，重新登录后台就可以看到最上方多出了 Super Admin 菜单。</p>
<p>参考<a href="http://codex.wordpress.org/Create_A_Network" target="_blank">官方文档</a></p>
<h2>导入数据</h2>
<p>建议直接在原 blog 使用 export 导出 xml，新 blog 这边用 wordpress importer 导入，支持作者映射和附件下载。</p>
<h2>调整数据</h2>
<p>主要是上传文件位置，比如 b.gkp.cc/wp-content/uploads/ 之前文章中引用的都是这样的地址，可以直接在导出后修改数据库，也可以直接用 .htaccess 将这些文件 rewrite 到 blogs.dir 下面对应的目录。</p>
<h2>独立域名映射</h2>
<p>这步我开始想的比较简单，以为直接修改数据库中的域名记录就可以了，但是事实证明不是那么容易的。Google 后找到了 <a href="http://ottopress.com/2010/wordpress-3-0-multisite-domain-mapping-tutorial/" target="_blank">ottopress</a> 这篇文档，很有效，简单步骤如下：</p>
<p>主要是使用 WordPress MU Domain Mapping plugin 这个插件，但是注意这个插件必须手工安装才可以生效。 svn checkout <a href="http://plugins.svn.wordpress.org/wordpress-mu-domain-mapping/trunk/" target="_blank">trunk</a> 下载 domain_mapping.php 和 sunrise.php 这两个文件，在 wp-content 下面建立一个 mu-plugins 的目录，将 domain_mapping.php 放进去。需要说明的是，mu-plugins 里面的 MU 不是 MultiUser，而是 MustUse 的意思，也就是说是强制启用的插件。sunrise.php 直接放到 wp-content 下面。</p>
<p>接下来修改 wp-config.php，在最后一行 require_once 前面加入一行</p>
<pre>define( 'SUNRISE', 'on' );</pre>
<p>貌似 sunrise.php 主要是替换了一些 wordpress 内置的函数。准备工作完毕，进入 Super Admin-&gt;Domain Mapping 里面输入服务器的 IP 地址（或者是一个 CNAME），设置下是否允许用户自行设置域名映射等选项，save 保存。</p>
<p>之后就可以在 Super Admin –&gt; Domains 里面，或者各个子网站管理员后台的 Tools –&gt;Domain Mapping 里面设置域名了，每个网站支持多个域名映射，需要设置一个 primary 域名，最终所有的域名都重定向到这里。试试看吧，效果很不错的。</p>
<p>最终结果，三个 blog 只需维护一套程序，主题和插件，并且分别使用独立的域名，完全看不出是一个 MU 网络。</p>
]]></content:encoded>
			<wfw:commentRss>http://b.gkp.cc/2010/08/04/enable-wordpress-30-mu-function-and-map-domain-for-network-blogs/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
