<?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/"
	xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule">

<channel>
	<title>wolfg&#039;s Weblog &#187; CU</title>
	<atom:link href="http://guoyong.org/category/cu/feed" rel="self" type="application/rss+xml" />
	<link>http://guoyong.org</link>
	<description>wolfg&#039;s journey with open source, linux, programming, sysadm ...</description>
	<lastBuildDate>Thu, 04 Aug 2011 15:02:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.1</generator>
<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/2.5/cn/</creativeCommons:license>		<item>
		<title>发布ChinaUnix Forum Menu 0.7.3</title>
		<link>http://guoyong.org/2007/01/20/298</link>
		<comments>http://guoyong.org/2007/01/20/298#comments</comments>
		<pubDate>Sat, 20 Jan 2007 13:31:07 +0000</pubDate>
		<dc:creator>wolfg</dc:creator>
				<category><![CDATA[CU]]></category>
		<category><![CDATA[chinaunix]]></category>
		<category><![CDATA[firefox extention]]></category>

		<guid isPermaLink="false">http://guoyong.org/2007/01/20/298</guid>
		<description><![CDATA[最近CU论坛变化很大，所以修改了解析论坛用的正则表达式和解析策略（改成根据显示论坛的表格来解析了）。 为了美化调试信息，学会使用了javascript中的如何重写对象的toString方法 Klass.prototype.toString = function () {&#160;&#160; &#160;return &#34;something meaningful&#34;;} 还有，修改了build脚本里不更新属性文件中版本信息的bug（bug现象是安装新版本后第一次启动Firefox不显示ChinaUnix Forum Menu的主页） 下一个版本可能会提供一个选项对话框，可以设置解析用的正则表达式。 下载扩展请访问 guoyong.org/cu-forum-menu Addons更新需要审核，比较慢（而且似乎更新有些问题），建议不要从那里下载或更新了。]]></description>
			<content:encoded><![CDATA[<p>最近CU论坛变化很大，所以修改了解析论坛用的正则表达式和解析策略（改成根据显示论坛的表格来解析了）。</p>
<p>为了美化调试信息，学会使用了javascript中的如何重写对象的toString方法</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Blue;">Klass</span><span style="color: Gray;">.</span><span style="color: Blue;">prototype</span><span style="color: Gray;">.</span><span style="color: Blue;">toString</span><span style="color: Gray;"> = </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">something meaningful</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span></div></div>
<p>还有，修改了build脚本里不更新属性文件中版本信息的bug（bug现象是安装新版本后第一次启动Firefox不显示ChinaUnix Forum Menu的主页）</p>
<p>下一个版本可能会提供一个选项对话框，可以设置解析用的正则表达式。</p>
<p>下载扩展请访问 <a href="http://guoyong.org/cu-forum-menu" title="http://guoyong.org/cu-forum-menu" target="_blank">guoyong.org/cu-forum-menu</a><br />
Addons更新需要审核，比较慢（而且似乎更新有些问题），建议不要从那里下载或更新了。</p>
]]></content:encoded>
			<wfw:commentRss>http://guoyong.org/2007/01/20/298/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>我做的用来访问CU的Firefox扩展，可以支持Firefox 2.0了</title>
		<link>http://guoyong.org/2006/12/15/296</link>
		<comments>http://guoyong.org/2006/12/15/296#comments</comments>
		<pubDate>Fri, 15 Dec 2006 07:12:42 +0000</pubDate>
		<dc:creator>wolfg</dc:creator>
				<category><![CDATA[CU]]></category>
		<category><![CDATA[chinaunix]]></category>
		<category><![CDATA[firefox extention]]></category>

		<guid isPermaLink="false">http://guoyong.org/2006/12/15/296</guid>
		<description><![CDATA[忙了两天，终于升级到了0.6.0版本。上一个版本还是2月份写的，都快一年了，汗。。。 这次重构了代码，改成从CU论坛的首页动态读取论坛列表，也简化了菜单结构，够用就好，简单就是美。 安装地址： https://addons.mozilla.org/firefox/1664/ 可能有的问题：在某些主题下可能无法显示菜单项，比如Noia 2.0(eXtreme)这个主题。 欢迎广大CUer使用并提出修改建议。]]></description>
			<content:encoded><![CDATA[<p>忙了两天，终于升级到了0.6.0版本。上一个版本还是2月份写的，都快一年了，汗。。。</p>
<p>这次重构了代码，改成从CU论坛的首页动态读取论坛列表，也简化了菜单结构，够用就好，简单就是美。</p>
<p>安装地址：<br />
<a href="https://addons.mozilla.org/firefox/1664/">https://addons.mozilla.org/firefox/1664/</a></p>
<p>可能有的问题：在某些主题下可能无法显示菜单项，比如Noia 2.0(eXtreme)这个主题。</p>
<p>欢迎广大CUer使用并提出修改建议。</p>
]]></content:encoded>
			<wfw:commentRss>http://guoyong.org/2006/12/15/296/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一个把Rss Feed的编码方式由GB2312转成UTF-8的CGI脚本</title>
		<link>http://guoyong.org/2006/07/25/242</link>
		<comments>http://guoyong.org/2006/07/25/242#comments</comments>
		<pubDate>Mon, 24 Jul 2006 16:35:55 +0000</pubDate>
		<dc:creator>wolfg</dc:creator>
				<category><![CDATA[CU]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://guoyong.org/2006/07/25/242</guid>
		<description><![CDATA[今天设置自己的]]></description>
			<content:encoded><![CDATA[<p>今天设置自己的<a title="planet of <a href="http://guoyong.org" title="http://guoyong.org" target="_blank">guoyong.org</a>&#8221; href=&#8221;http://planet.guoyong.org&#8221;>Planet站点</a>，用CU的feed做试验，发现会乱码，原因是CU的feed是GB2312编码的。</p>
<p>google到一些资料，但好像并不能完全解决问题：</p>
<p><a href="http://blog.myrual.com/2006/07/how-to-process-gb2312-rss-with-planet.html">小林的blog</a>，按照这个方法做没成功。</p>
<p><a href="http://blog.jjgod.org/2005/07/28/planet-uaoo-patch/">Web4C</a>，我写完脚本才注意到这个搜索结果，但没找到planet源码里的planetlib.py文件。</p>
<p>我想到的土方法，写一个cgi脚本做proxy，取回feed后做转换编码方式再输出。</p>
<p>转码是这样完成的： str.decode(&#39;GBK&#39;).encode(&#39;UTF-8&#39;)</p>
<p><a href="/?dl=feed_gb2utf8.cgi">下载</a></p>
]]></content:encoded>
			<wfw:commentRss>http://guoyong.org/2006/07/25/242/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>vsftpd v2.0.4 FAQ的翻译</title>
		<link>http://guoyong.org/2006/02/07/174</link>
		<comments>http://guoyong.org/2006/02/07/174#comments</comments>
		<pubDate>Tue, 07 Feb 2006 14:07:11 +0000</pubDate>
		<dc:creator>wolfg</dc:creator>
				<category><![CDATA[CU]]></category>

		<guid isPermaLink="false">http://guoyong.org/blog/2006/02/07/174</guid>
		<description><![CDATA[增加了11条。 Q1) 求助！我在下载时遇到&#8221;426 Failure writing network stream.&#8221;错误。 A) 在v1.2.1以及更高版本的vsftpd中你应该不会遇到这个错误。如果用户试图从不常见的文件系统（比如FAT）中下载，旧版本的vsftpd就会出 现这个错误，因为（这种文件系统）不支持vsftpd需要的性能特性。 1.1.3及更高版本的vsftpd有一个相关的配置选项use_sendfile=NO. Q2) 求助！我在使用pam_userdb登录模块时登录过程僵死了。 A) 这是因为版本2.3的glibc和PAM交互的问题。有Debian用户已经报告了这个bug。看这里：http://lists.debian.org/debian-glibc/2003/debian-glibc-200309/msg00310.html Q3) 求助！vsftpd支持大文件(&#62;2Gb?)吗？ A) 支持。 Q4) 求助！但是大文件支持好像不工作啊！ A1) 从版本1.1.0开始就支持大文件了。 A2) Solarisp平台下的大文件支持需要版本v1.2.2。 A3) FreeBSD平台下的大文件支持需要版本v1.2.2。 A4) 早期的Linux 2.6 内核在大文件支持上有bug － 用v2.6.6或更新版本的内核。 A5) 你能保证你的FTP客户端可以正确的支持大文件吗？ Q5) 求助！Help! 内置的vsftpd监听器死掉（崩溃）了！ A) vsftpd v1.2.2修复了这个bug。问题还存在但似乎只在特定的平台上才频繁出现。例如，Fedora Core 1 － 怀疑是启用了NPTL的内核和glibc-2.3触发了这个问题。 Q6) 求助！我在使用Solaris / Veritas时vsftpd死掉了！ A) 怀疑是与Solaris / Veritas 结合使用时的bug。 vsftpd-1.2.3里有一个可能的解决方法：no_log_lock=YES [...]]]></description>
			<content:encoded><![CDATA[<p>增加了11条。</p>
<p>Q1) <strong>求助！我在下载时遇到&#8221;426 Failure writing network stream.&#8221;错误。</strong><br />
A) 在v1.2.1以及更高版本的vsftpd中你应该不会遇到这个错误。如果用户试图从不常见的文件系统（比如FAT）中下载，旧版本的vsftpd就会出 现这个错误，因为（这种文件系统）不支持vsftpd需要的性能特性。 1.1.3及更高版本的vsftpd有一个相关的配置选项use_sendfile=NO.</p>
<p>Q2) <strong>求助！我在使用pam_userdb登录模块时登录过程僵死了。</strong><br />
A) 这是因为版本2.3的glibc和PAM交互的问题。有Debian用户已经报告了这个bug。看这里：<a href="http://lists.debian.org/debian-glibc/2003/debian-glibc-200309/msg00310.html">http://lists.debian.org/debian-glibc/2003/debian-glibc-200309/msg00310.html</a></p>
<p>Q3) <strong>求助！vsftpd支持大文件(&gt;2Gb?)吗？</strong><br />
A) 支持。</p>
<p>Q4) <strong>求助！但是大文件支持好像不工作啊！</strong><br />
A1) 从版本1.1.0开始就支持大文件了。<br />
A2) Solarisp平台下的大文件支持需要版本v1.2.2。<br />
A3) FreeBSD平台下的大文件支持需要版本v1.2.2。<br />
A4) 早期的Linux 2.6 内核在大文件支持上有bug － 用v2.6.6或更新版本的内核。<br />
A5) 你能保证你的FTP客户端可以正确的支持大文件吗？</p>
<p>Q5) <strong>求助！Help! 内置的vsftpd监听器死掉（崩溃）了！<br />
</strong> A) vsftpd v1.2.2修复了这个bug。问题还存在但似乎只在特定的平台上才频繁出现。例如，Fedora Core 1 － 怀疑是启用了NPTL的内核和glibc-2.3触发了这个问题。</p>
<p>Q6) <strong>求助！我在使用Solaris / Veritas时vsftpd死掉了！</strong><br />
A) 怀疑是与Solaris / Veritas 结合使用时的bug。 vsftpd-1.2.3里有一个可能的解决方法：no_log_lock=YES 详见 vsftpd.conf.5。</p>
<p>Q7) <strong>vsftpd支持基于SSL / TLS的加密吗？</strong><br />
A) 支持。版本v2.0.0对控制和数据连接都支持加密（喝彩！）你首先需要一个启用这些支持的vsftpd，然后激活ssl_enable这个设置。注意这里有安全问题需要考虑，请一定在使用前详细阅读 vsftpd.conf.5的man帮助中ssl_enable一节。</p>
<p>Q8) <strong>求助！我使用FlashFXP下载文件时会发生截断。</strong><br />
A) FlashFXP的bug多多－尤其是启用SSL传输时。升级到v3.0RC4或更新的版本，据说已修复了这个bug。</p>
<p>Q9) <strong>求助！我想编译vsftpd，但我遇到了&#8221;krb5.h: no such file or directory&#8221;这个错误。</strong><br />
A) 好像是一些RedHat系统会有这个问题。详细解释和解决办法请看后面这个链接<br />
<a href="http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=111301">http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=111301</a>。</p>
<p>Q10) <strong>求助！当我连接vsftpd时遇到了&#8221;OOPS: capset&#8221;错误。</strong><br />
A) 用启用了SELinux的发行版时会有这个问题。解决办法是确保加载了capability这个内核模块。</p>
<p>Q11) <strong>求助！我遇到了&#8221;ftp: netin: Interrupted system call&#8221;错误。</strong><br />
A) 这似乎是ftp-tls的一个bug，特别是结合了SSL并且设置了带宽限制时会发生。</p>
]]></content:encoded>
			<wfw:commentRss>http://guoyong.org/2006/02/07/174/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>学习Mozilla扩展开发 第一个作品</title>
		<link>http://guoyong.org/2005/12/28/181</link>
		<comments>http://guoyong.org/2005/12/28/181#comments</comments>
		<pubDate>Wed, 28 Dec 2005 07:27:21 +0000</pubDate>
		<dc:creator>wolfg</dc:creator>
				<category><![CDATA[CU]]></category>

		<guid isPermaLink="false">http://guoyong.org/blog/2005/12/28/181</guid>
		<description><![CDATA[我的第一个Firefox Extension &#8211; ChinaUnix Forum Menu 可以通过Firefox的菜单访问CU. 最新版本 v0.50 下载地址： ChinaUnix Forum Menu]]></description>
			<content:encoded><![CDATA[<p>我的第一个Firefox Extension &#8211; ChinaUnix Forum Menu</p>
<p>可以通过Firefox的菜单访问CU.</p>
<p>最新版本 v0.50</p>
<p>下载地址：</p>
<p><a href="https://addons.mozilla.org/extensions/moreinfo.php?application=firefox&#038;category=Website%20Integration&#038;numpg=10&#038;id=1664">ChinaUnix Forum Menu</a></p>
]]></content:encoded>
			<wfw:commentRss>http://guoyong.org/2005/12/28/181/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>vsftpd结合pam_mysql 安装配置总结</title>
		<link>http://guoyong.org/2005/12/27/182</link>
		<comments>http://guoyong.org/2005/12/27/182#comments</comments>
		<pubDate>Tue, 27 Dec 2005 03:17:40 +0000</pubDate>
		<dc:creator>wolfg</dc:creator>
				<category><![CDATA[CU]]></category>
		<category><![CDATA[SysAdmin]]></category>

		<guid isPermaLink="false">http://guoyong.org/blog/2005/12/27/182</guid>
		<description><![CDATA[前一段时间，论坛里总有朋友问到pam-mysql的安装问题。比较典型的有： vsftp1.2+mysql4.1+pam_mysql0.5在RedHat AS4(32bit)下好像是有bug 还是mysql虚拟用户和vsftpd的登陆问题? 为了解答类似的问题，我动手试验了一下vsftpd+pam-mysql的配置过程，总结如下: 系统环境： RedHat AS 4 MySQL 4.1.15 pam_mysql-0.7pre3 说明一下，MySQL我是使用其官方网站的rpm包安装的，包括下面这4个： MySQL-server-standard-4.1.15-0.rhel4.i386.rpm MySQL-client-standard-4.1.15-0.rhel4.i386.rpm MySQL-devel-standard-4.1.15-0.rhel4.i386.rpm MySQL-shared-standard-4.1.15-0.rhel4.i386.rpm vsftpd是RedHat自带的。 建立用于存放vsftpd虚拟用户的Schema的过程： mysql&#62; create database vsftpd; mysql&#62; use vsftpd; mysql&#62; create table users ( -&#62; id int AUTO_INCREMENT NOT NULL, -&#62; name char(16) binary NOT NULL, -&#62; passwd char(48) binary NOT NULL, -&#62; primary key(id) -&#62; ); mysql&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>前一段时间，论坛里总有朋友问到pam-mysql的安装问题。比较典型的有：<br />
<a href="http://bbs.chinaunix.net/viewthread.php?tid=650555">vsftp1.2+mysql4.1+pam_mysql0.5在RedHat AS4(32bit)下好像是有bug</a><br />
<a href="http://bbs.chinaunix.net/viewthread.php?tid=612488">还是mysql虚拟用户和vsftpd的登陆问题?</a></p>
<p>为了解答类似的问题，我动手试验了一下vsftpd+pam-mysql的配置过程，总结如下:</p>
<p>系统环境：</p>
<ul>
<li>RedHat AS 4</li>
<li>MySQL 4.1.15</li>
<li>pam_mysql-0.7pre3</li>
</ul>
<p>说明一下，MySQL我是使用其官方网站的rpm包安装的，包括下面这4个：</p>
<ol>
<li>MySQL-server-standard-4.1.15-0.rhel4.i386.rpm</li>
<li>MySQL-client-standard-4.1.15-0.rhel4.i386.rpm</li>
<li>MySQL-devel-standard-4.1.15-0.rhel4.i386.rpm</li>
<li>MySQL-shared-standard-4.1.15-0.rhel4.i386.rpm</li>
</ol>
<p>vsftpd是RedHat自带的。</p>
<p>建立用于存放vsftpd虚拟用户的Schema的过程：<br />
mysql&gt; create database vsftpd;</p>
<p>mysql&gt; use vsftpd;</p>
<p>mysql&gt; create table users (<br />
-&gt; id int AUTO_INCREMENT NOT NULL,<br />
-&gt; name char(16) binary NOT NULL,<br />
-&gt; passwd char(48) binary NOT NULL,<br />
-&gt; primary key(id)<br />
-&gt; );</p>
<p>mysql&gt; describe users;<br />
+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;-+&#8212;&#8212;+&#8212;&#8211;+&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| Field | Type | Null | Key | Default | Extra |<br />
+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;-+&#8212;&#8212;+&#8212;&#8211;+&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| id | int(11) | | PRI | NULL | auto_increment |<br />
| name | char(16) | | | | |<br />
| passwd | char(48) | | | | |<br />
+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;-+&#8212;&#8212;+&#8212;&#8211;+&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;-+</p>
<p>mysql&gt; create table logs (msg varchar(255),<br />
-&gt; user char(16),<br />
-&gt; pid int,<br />
-&gt; host char(32),<br />
-&gt; rhost char(32),<br />
-&gt; logtime timestamp<br />
-&gt; );</p>
<p>mysql&gt; describe logs;<br />
+&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;+&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;-+<br />
| Field | Type | Null | Key | Default | Extra |<br />
+&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;+&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;-+<br />
| msg | varchar(255) | YES | | NULL | |<br />
| user | varchar(16) | YES | | NULL | |<br />
| pid | int(11) | YES | | NULL | |<br />
| host | varchar(32) | YES | | NULL | |<br />
| rhost | varchar(32) | YES | | NULL | |<br />
| logtime | timestamp | YES | | CURRENT_TIMESTAMP | |<br />
+&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;+&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;-+</p>
<p>这里，用户密码这个字段的长度是48。这是根据MySQL加密函数的返回值的长度确定的。关于PASSWORD函数返回值的长度，可以参考这个：</p>
<p><a href="http://dev.mysql.com/doc/refman/4.1/en/password-hashing.html">http://dev.mysql.com/doc/refman/4.1/en/password-hashing.html</a></p>
<p>mysql&gt; select encrypt(&#8216;foo&#8217;);<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| encrypt(&#8216;foo&#8217;) |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| 4Wwn2AXFYb.So |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;-+</p>
<p>mysql&gt; select password(&#8216;foo&#8217;);<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| password(&#8216;foo&#8217;) |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| *F3A2A51A9B0F2BE2468926B4132313728C250DBF |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+</p>
<p>mysql&gt; select md5(&#8216;foo&#8217;);<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| md5(&#8216;foo&#8217;) |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| acbd18db4cc2f85cedef654fccc4a4d8 |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+</p>
<p>编译安装pam_mysql<br />
# ./configure &#8211;with-openssl<br />
# make<br />
# make install<br />
加上&#8211;with-openssl可以避免make时报有关md5.h的编译错误</p>
<p>建立/etc/pam.d/vsftpd.mysql（因为只是想验证pam_mysql的安装过程，所以我不想覆盖原有的vsftpd这个文件)。注意只有两行，auth是一行，account是一行。</p>
<p>auth required /lib/security/pam_mysql.so user=root passwd=123456 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=passwd crypt=2 sqllog=1 logtable=logs logmsgcolumn=msg logusercolumn=user logpidcolumn=pid loghostcolumn=host logrhostcolumn=rhost logtimecolumn=logtime verbose=1<br />
account required /lib/security/pam_mysql.so user=root passwd=123456 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=passwd crypt=2 sqllog=1 logtable=logs logmsgcolumn=msg logusercolumn=user logpidcolumn=pid loghostcolumn=host logrhostcolumn=rhost logtimecolumn=logtime verbose=1</p>
<p>注意这里pam_mysql.so的路径是/lib/security；指定了sqllog；加密方式是2，也就是用MySQL PASSWORD()函数；verbose=1，设置这个可以帮助调试，日志信息输出在/var/log/messages里。</p>
<p>建立/etc/vsftpd/vsftpd.mysql.conf（同样，不影响已有的vsftpd服务，执行service vsftpd restart时会启动两个vsftpd服务，端口不一样）<br />
主要的设置如下：</p>
<blockquote><p>pam_service_name=vsftpd.mysql<br />
listen=YES<br />
tcp_wrappers=YES<br />
local_enable=YES<br />
guest_enable=YES<br />
guest_username=ftp<br />
listen_port=2121</p></blockquote>
<p>注意pam_service_name=vsftpd.mysql指定了使用刚才设置的pam_mysql。</p>
<p>插入用户信息：<br />
mysql&gt; insert into users (name,passwd) values(&#8216;tom&#8217;,password(&#8216;foo&#8217;));<br />
mysql&gt; insert into users (name,passwd) values(&#8216;jerry&#8217;,password(&#8216;bar&#8217;));<br />
mysql&gt; select * from users;<br />
+&#8212;-+&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| id | name | passwd |<br />
+&#8212;-+&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| 1 | tom | *F3A2A51A9B0F2BE2468926B4132313728C250DBF |<br />
| 2 | jerry | *E8D46CE25265E545D225A8A6F1BAF642FEBEE5CB |<br />
+&#8212;-+&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+</p>
<p>启动vsftpd服务，测试配置：<br />
# ftp localhost 2121</p>
<p>登录失败，检查/var/log/messages，发现：<br />
# tail -f /var/log/messages<br />
Nov 29 14:52:04 javadev vsftpd[17683]: PAM unable to dlopen(/lib/security/pam_mysql.so)<br />
Nov 29 14:52:04 javadev vsftpd[17683]: PAM [dlerror: /lib/security/pam_mysql.so: cannot open shared object file: No such file or directory]<br />
Nov 29 14:52:04 javadev vsftpd[17683]: PAM adding faulty module: /lib/security/pam_mysql.so</p>
<p>看来是没找到pam_mysql.so，怎么会呢？<br />
用find（也可以用locate，不过得先updatedb一下，慢）找了一下，原来make install的时候默认安装在/usr/local/lib下。修改/etc/pam.d/vsftpd.mysql<br />
auth required /usr/lib/security/pam_mysql.so user=root passwd=123456 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=passwd crypt=2 sqllog=1 logtable=logs logmsgcolumn=msg logusercolumn=user logpidcolumn=pid loghostcolumn=host logrhostcolumn=rhost logtimecolumn=logtime verbose=1<br />
account required /usr/lib/security/pam_mysql.so user=root passwd=123456 host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=passwd crypt=2 sqllog=1 logtable=logs logmsgcolumn=msg logusercolumn=user logpidcolumn=pid loghostcolumn=host logrhostcolumn=rhost logtimecolumn=logtime verbose=1</p>
<p>在登录，成功！换用其他加密方式，也都可以。</p>
<p>然后试验pam_mysql v0.7新加的config_file配置选项。这个选项用来指定一个配置文件，可以把所有pam_mysql的配置放在这个文件中。这样的话，/etc/pam.d/vsftpd.mysql的内容变成这样：</p>
<p>auth required /usr/lib/security/pam_mysql.so config_file=/etc/security/pam_mysql.conf<br />
account required /usr/lib/security/pam_mysql.so config_file=/etc/security/pam_mysql.conf</p>
<p>清爽了许多吧，<img alt="Laughing" src="http://cn.iblog.com/js/tinymce/jscripts/tiny_mce/plugins/emotions/images/smiley-laughing.gif" /></p>
<p>/etc/security/pam_mysql.conf的内容：</p>
<p>users.host=localhost<br />
users.database=vsftpd<br />
users.db_user=root<br />
users.db_passwd=123456<br />
users.table=users<br />
<a href="http://users.us" title="http://users.us" target="_blank">users.us</a>er_column=name<br />
users.password_column=passwd<br />
users.password_crypt=3<br />
verbose=1<br />
log.enabled=1<br />
log.table=logs<br />
log.message_column=msg<br />
log.pid_column=pid<br />
<a href="http://log.us" title="http://log.us" target="_blank">log.us</a>er_column=user<br />
log.host_column=host<br />
log.rhost_column=rhost<br />
log.time_column=logtime</p>
<p>改好这些以后，用之前建好的虚拟用户登录，居然不行！而且这次/var/log/messages里没有任何错误消息。ls -ltr /var/log 发现secure这个文件最新，试着打开，果然发现了pam_mysql的调试信息：</p>
<p>Dec 26 16:18:37 javadev vsftpd[6175]: pam_mysql &#8211; option verbose is set to &#8220;1&#8243;<br />
Dec 26 16:18:37 javadev vsftpd[6175]: pam_mysql &#8211; option log.enabled is set to &#8220;1 &#8221;<br />
Dec 26 16:18:37 javadev vsftpd[6175]: pam_mysql &#8211; option log.table is set to &#8220;logs&#8221;<br />
Dec 26 16:18:37 javadev vsftpd[6175]: pam_mysql &#8211; option log.message_column is set to &#8220;msg&#8221;<br />
Dec 26 16:18:37 javadev vsftpd[6175]: pam_mysql &#8211; option log.pid_column is set to &#8220;pid&#8221;<br />
Dec 26 16:18:37 javadev vsftpd[6175]: pam_mysql &#8211; option <a href="http://log.us" title="http://log.us" target="_blank">log.us</a>er_column is set to &#8220;user&#8221;<br />
Dec 26 16:18:37 javadev vsftpd[6175]: pam_mysql &#8211; option log.host_column is set to &#8220;host&#8221;<br />
Dec 26 16:18:37 javadev vsftpd[6175]: pam_mysql &#8211; option log.rhost_column is set to &#8220;rhost&#8221;<br />
Dec 26 16:18:37 javadev vsftpd[6175]: pam_mysql &#8211; option log.time_column is set to &#8220;logtime&#8221;<br />
Dec 26 16:18:37 javadev vsftpd[6175]: pam_mysql &#8211; pam_sm_authenticate() called.<br />
Dec 26 16:18:37 javadev vsftpd[6175]: pam_mysql &#8211; pam_mysql_open_db() called.<br />
Dec 26 16:18:42 javadev vsftpd[6175]: pam_mysql &#8211; MySQL error (Unknown MySQL server host &#8216;localhost &#8216; (3))<br />
Dec 26 16:18:42 javadev vsftpd[6175]: pam_mysql &#8211; pam_mysql_open_db() returning 5.<br />
Dec 26 16:18:42 javadev vsftpd[6175]: pam_mysql &#8211; pam_sm_authenticate() returning 9.<br />
Dec 26 16:18:42 javadev vsftpd[6175]: pam_mysql &#8211; pam_mysql_release_ctx() called.<br />
Dec 26 16:18:42 javadev vsftpd[6175]: pam_mysql &#8211; pam_mysql_destroy_ctx() called.<br />
Dec 26 16:18:42 javadev vsftpd[6175]: pam_mysql &#8211; pam_mysql_close_db() called.</p>
<p>仔细检查，发现原因在这里：</p>
<p>pam_mysql &#8211; MySQL error (Unknown MySQL server host &#8216;localhost &#8216; (3))</p>
<p>原来配置文件里users.host=localhost 这行行尾多了一个空格！郁闷！修改以后就可以登录了。</p>
<p>最后，我在论坛里回复时说过不能用password这种方式，原因是</p>
<p>2 (or &#8220;mysql&#8221;) = Use MySQL PASSWORD() function. It is possible<br />
that the encryption function used by PAM-MySQL<br />
is different from that of the MySQL server, as<br />
PAM-MySQL uses the function defined in MySQL&#8217;s<br />
C-client API instead of using PASSWORD() SQL function<br />
in the query.</p>
<p>事实证明我说错了。</p>
<p>还有，两个log可以帮助分析故障（当然可能仅在RedHat下），/var/log/messages和/var/log/secure</p>
]]></content:encoded>
			<wfw:commentRss>http://guoyong.org/2005/12/27/182/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>vsftpd同时使用系统用户和虚拟用户验证</title>
		<link>http://guoyong.org/2005/12/08/186</link>
		<comments>http://guoyong.org/2005/12/08/186#comments</comments>
		<pubDate>Thu, 08 Dec 2005 06:25:07 +0000</pubDate>
		<dc:creator>wolfg</dc:creator>
				<category><![CDATA[CU]]></category>

		<guid isPermaLink="false">http://guoyong.org/blog/2005/12/08/186</guid>
		<description><![CDATA[记得有朋友曾经问过vsftpd可不可以同时使用系统用户和虚拟用户，我当时回答不可以。 对PAM了解不够，所以这个答案是错误的。 今天想起这个问题，决定做个试验来看看，事实证明是可以的。 我先了解了一PAM，看了这个文档， www.linuxmine.com/5214.html 知道了PAM的验证模块是可以串在一起的，通过控制标志（control-flag）来控制。 文档里也给出了类似的一个例子。 为了打开匿名FTP，需要使用以下的配置命令代替默认的配置(OTHER)： # ftpd; add&#160; ftp-specifics. These lines enable anonymous ftp over# standard UNIX&#160; access (the listfile entry blocks access to# users listed in&#160; /etc/ftpusers)#ftpd auth sufficient /usr/lib/security/pam_ftp.softpd auth required /usr/lib/security/pam_unix_auth.so use_first_passftpd auth required /usr/lib/security/pam_listfile.soonerr=succeed&#160; item=user sense=deny file=/etc/ftpusers 由于需要忽略默认的配置入口，所以第二行是必须要有的。这还是一个层叠模块的例子。使用sufficient控制标志，表示如果这个模块验证通过，就 不必使用后面的层叠模块进行验证了；use_first_pass表示使用为前面的模块(pam_ftp)输入的密码。 我的试验环境： RedHat AS 4 vsftpd-2.0.1-5 pam-0.77-65.1 vsftpd使用的pam文件 auth sufficient [...]]]></description>
			<content:encoded><![CDATA[<p>记得有朋友曾经问过vsftpd可不可以同时使用系统用户和虚拟用户，我当时回答不可以。<br />
对PAM了解不够，所以这个答案是错误的。</p>
<p>今天想起这个问题，决定做个试验来看看，事实证明是可以的。</p>
<p>我先了解了一PAM，看了这个文档，</p>
<p><a href="http://www.linuxmine.com/5214.html" title="http://www.linuxmine.com/5214.html" target="_blank">www.linuxmine.com/5214.html</a></p>
<p>知道了PAM的验证模块是可以串在一起的，通过控制标志（control-flag）来控制。<br />
文档里也给出了类似的一个例子。<br />
为了打开匿名FTP，需要使用以下的配置命令代替默认的配置(OTHER)：</p>
<div class="hl-surround"><div class="hl-main"># ftpd; add&nbsp; ftp-specifics. These lines enable anonymous ftp over<br /># standard UNIX&nbsp; access (the listfile entry blocks access to<br /># users listed in&nbsp; /etc/ftpusers)<br />#<br />ftpd auth sufficient /usr/lib/security/pam_ftp.so<br />ftpd auth required /usr/lib/security/pam_unix_auth.so use_first_pass<br />ftpd auth required /usr/lib/security/pam_listfile.so<br />onerr=succeed&nbsp; item=user sense=deny file=/etc/ftpusers</div></div>
<p>由于需要忽略默认的配置入口，所以第二行是必须要有的。这还是一个层叠模块的例子。使用sufficient控制标志，表示如果这个模块验证通过，就  不必使用后面的层叠模块进行验证了；use_first_pass表示使用为前面的模块(pam_ftp)输入的密码。</p>
<p>我的试验环境：<br />
RedHat AS 4<br />
vsftpd-2.0.1-5<br />
pam-0.77-65.1</p>
<p>vsftpd使用的pam文件</p>
<div class="hl-surround"><div class="hl-main">auth sufficient pam_userdb.so db=/etc/vsftpd/vsftpd_login<br />account sufficient pam_userdb.so db=/etc/vsftpd/vsftpd_login<br /><br />auth&nbsp; required pam_listfile.so item=user sense=deny file=/etc/vsftpd.ftpusers&nbsp; onerr=succeed<br />auth required pam_stack.so service=system-auth<br />auth&nbsp; required pam_shells.so<br />account required pam_stack.so service=system-auth<br />session required pam_stack.so service=system-auth</div></div>
<p>可以看出前面两行是对虚拟用户的验证，后面是对系统用户的验证。<br />
对虚拟用户的验证使用了sufficient这个控制标志。<br />
这个标志的含义是如果这个模块验证通过，就不必使用后面的层叠模块进行验证了；但如果失败了，<br />
就继续后面的认证，也就是使用系统真实用户的验证。</p>
<p>vsftpd.conf的内容（部分）</p>
<div class="hl-surround"><div class="hl-main">pam_service_name=vsftpd.mixed<br />listen=YES<br />tcp_wrappers=YES<br />local_enable=YES<br />guest_enable=YES<br />guest_username=ftp<br />listen_port=2121</div></div>
<p>如果加上anonymous_enable=YES，匿名用户也是可以登录的。<br />
这样的话，就可以同时支持匿名用户，系统真实用户和虚拟用户了。</p>
]]></content:encoded>
			<wfw:commentRss>http://guoyong.org/2005/12/08/186/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>解决Dell笔记本更换内存后RedHat AS 4找不到网卡的问题</title>
		<link>http://guoyong.org/2005/11/12/192</link>
		<comments>http://guoyong.org/2005/11/12/192#comments</comments>
		<pubDate>Fri, 11 Nov 2005 18:11:37 +0000</pubDate>
		<dc:creator>wolfg</dc:creator>
				<category><![CDATA[CU]]></category>

		<guid isPermaLink="false">http://guoyong.org/blog/2005/11/12/192</guid>
		<description><![CDATA[一台Dell D600笔记本，安装有RedHat AS 4。 原来的内存是512兆（两条256的），更换成1G（1条）后，重启机器，启用网卡时出现错误：Device eth0 has different MAC address than expected, ignoring. 系统启动以后找不到网卡设备。 google以后，在redhat的邮件列表里找到解决办法与大家分享。 https://www.redhat.com/archives/ &#8230; -June/msg00407.html 先注释掉/etc/sysconfig/network-scripts/ifcfg-eth0中HWADDR=xx:xx:xx:xx:xx:xx这一行。在查看文件/etc/modprobe.conf，得知eth0的模块名tg3。用lsmod查看，没有发现tg3这个module。 执行如下命令： # depmod -a # modprobe -v tg3 然后，重启网络 # service network restart 问题解决。]]></description>
			<content:encoded><![CDATA[<p>一台Dell D600笔记本，安装有RedHat AS 4。</p>
<p>原来的内存是512兆（两条256的），更换成1G（1条）后，重启机器，启用网卡时出现错误：<strong>Device eth0 has different MAC address than expected, ignoring.</strong> 系统启动以后找不到网卡设备。</p>
<p>google以后，在redhat的邮件列表里找到解决办法与大家分享。</p>
<p><a href="https://www.redhat.com/archives/redhat-list/2005-June/msg00407.html">https://www.redhat.com/archives/ &#8230; -June/msg00407.html</a></p>
<p>先注释掉/etc/sysconfig/network-scripts/ifcfg-eth0中HWADDR=xx:xx:xx:xx:xx:xx这一行。在查看文件/etc/modprobe.conf，得知eth0的模块名tg3。用lsmod查看，没有发现tg3这个module。</p>
<p>执行如下命令：</p>
<blockquote><p># depmod -a<br />
# modprobe -v tg3</p></blockquote>
<p>然后，重启网络</p>
<blockquote><p># service network restart</p></blockquote>
<p>问题解决。</p>
]]></content:encoded>
			<wfw:commentRss>http://guoyong.org/2005/11/12/192/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Solaris9下安装vsftpd2.0.1</title>
		<link>http://guoyong.org/2005/11/12/193</link>
		<comments>http://guoyong.org/2005/11/12/193#comments</comments>
		<pubDate>Fri, 11 Nov 2005 17:47:32 +0000</pubDate>
		<dc:creator>wolfg</dc:creator>
				<category><![CDATA[CU]]></category>

		<guid isPermaLink="false">http://guoyong.org/blog/2005/11/12/193</guid>
		<description><![CDATA[这个是发在CU的旧帖，也是我最后一次接触Solaris（到目前为止）。 下载软件包 编译安装vsftpd 配置vsftpd 用户管理 用户管理脚本 参考 1. 下载软件包 先取得wget,方便其他软件包的下载 # ftp www.sunfreeware.com ftp &#62; cd pub/freeware/sparc/9 ftp &#62; get wget-1.9.1-sol9-sparc-local.gz ftp &#62; bye 安装wget # gunzip wget-1.9.1-sol9-sparc-local.gz # pkgadd -d wget-1.9.1-sol9-sparc-local 下载vsftpd # wget vsftpd.beasts.org/users/cevans/vsftpd-2.0.1.tar.gz # gunzip vsftpd-2.0.1.tar.gz # tar xvf vsftpd-2.0.1.tar 下载编译vsftpd必需的软件包 # wget ftp.sunfreeware.com/pub/freeware/sparc/9/make-3.80&#8230; # gunzip make-3.80-sol9-sparc-local.gz # pkgadd -d make-3.80-sol9-sparc-local # [...]]]></description>
			<content:encoded><![CDATA[<p>这个是发在CU的旧帖，也是我最后一次接触Solaris（到目前为止）。</p>
<ol>
<li><strong>下载软件包</strong></li>
<li><strong>编译安装vsftpd</strong></li>
<li><strong>配置vsftpd</strong></li>
<li><strong>用户管理</strong></li>
<li><strong>用户管理脚本</strong></li>
<li><strong>参考</strong></li>
</ol>
<p>1. <strong>下载软件包</strong></p>
<p>先取得wget,方便其他软件包的下载</p>
<p># ftp <a href="http://www.sunfreeware.com" title="http://www.sunfreeware.com" target="_blank">www.sunfreeware.com</a></p>
<p>ftp &gt; cd pub/freeware/sparc/9</p>
<p>ftp &gt; get wget-1.9.1-sol9-sparc-local.gz</p>
<p>ftp &gt; bye</p>
<p>安装wget</p>
<blockquote><p># gunzip wget-1.9.1-sol9-sparc-local.gz</p>
<p># pkgadd -d wget-1.9.1-sol9-sparc-local</p></blockquote>
<p>下载vsftpd</p>
<blockquote><p># wget <a href="ftp://vsftpd.beasts.org/users/cevans/vsftpd-2.0.1.tar.gz" title="ftp://vsftpd.beasts.org/users/cevans/vsftpd-2.0.1.tar.gz" target="_blank">vsftpd.beasts.org/users/cevans/vsftpd-2.0.1.tar.gz</a></p>
<p># gunzip vsftpd-2.0.1.tar.gz</p>
<p># tar xvf vsftpd-2.0.1.tar</p></blockquote>
<p>下载编译vsftpd必需的软件包</p>
<blockquote><p># wget <a href="ftp://ftp.sunfreeware.com/pub/freeware/sparc/9/make-3.80-sol9-sparc-local.gz" title="ftp://ftp.sunfreeware.com/pub/freeware/sparc/9/make-3.80-sol9-sparc-local.gz" target="_blank">ftp.sunfreeware.com/pub/freeware/sparc/9/make-3.80&#8230;</a></p>
<p># gunzip make-3.80-sol9-sparc-local.gz</p>
<p># pkgadd -d make-3.80-sol9-sparc-local</p></blockquote>
<blockquote><p># wget <a href="ftp://mirror.sprintlink.net/sunfreeware.com/pub/freeware/sparc/9/libiconv-1.8-sol9-sparc-local.gz" title="ftp://mirror.sprintlink.net/sunfreeware.com/pub/freeware/sparc/9/libiconv-1.8-sol9-sparc-local.gz" target="_blank">mirror.sprintlink.net/sunfreeware.com/pub/freeware&#8230;</a></p>
<p># gunzip libiconv-1.8-sol9-sparc-local.gz</p>
<p># pkgadd -d libiconv-1.8-sol9-sparc-local</p>
<p># wget <a href="ftp://mirror.sprintlink.net/sunfreeware.com/pub/freeware/sparc/9/gcc_small-3.3.2-sol9-sparc-local.gz" title="ftp://mirror.sprintlink.net/sunfreeware.com/pub/freeware/sparc/9/gcc_small-3.3.2-sol9-sparc-local.gz" target="_blank">mirror.sprintlink.net/sunfreeware.com/pub/freeware&#8230;</a></p>
<p># gunzip gcc_small-3.3.2-sol9-sparc-local.gz</p>
<p># pkgadd -d gcc_small-3.3.2-sol9-sparc-local</p></blockquote>
<p>2. <strong>编译安装vsftpd</strong></p>
<blockquote><p># cd vsftpd-2.0.1</p>
<p># make</p>
<p># mkdir /usr/share/empty</p>
<p># cp vsftpd /usr/local/bin/vsftpd</p>
<p># cp vsftpd.conf.5 /usr/local/man/man5</p>
<p># cp vsftpd.8 /usr/local/man/man8</p>
<p># cp vsftpd.conf /etc</p></blockquote>
<p><strong><br />
3. 配置vsftpd</strong></p>
<p>建ftp目录和ftp帐号,所有ftp登录用户都映射到此帐号</p>
<blockquote><p># mkdir /data/ftp</p>
<p># groupadd ftp</p>
<p># useradd -d /data/ftp -g ftp -s /bin/false ftp</p>
<p># chown ftp:ftp /data/ftp</p>
<p># echo &#8220;ftp&#8221; &gt;&gt;　/etc/vsftpd.chroot_list</p></blockquote>
<p>建立放置每个ftp用户的独自的配置文件的目录</p>
<blockquote><p># mkdir /etc/vsftpd</p></blockquote>
<p>修改/etc/vsftpd.conf</p>
<blockquote><p># vi /etc/vsftpd.conf</p></blockquote>
<blockquote><p>anonymous_enable=NO</p>
<p>local_enable=YES</p>
<p>write_enable=NO</p>
<p>local_umask=022</p>
<p>anon_umask=022</p>
<p>anon_upload_enable=NO</p>
<p>anon_mkdir_write_enable=NO</p>
<p>dirmessage_enable=YES</p>
<p>xferlog_enable=YES</p>
<p>connect_from_port_20=YES</p>
<p>xferlog_file=/var/log/vsftpd.log</p>
<p>idle_session_timeout=600</p>
<p>data_connection_timeout=120</p>
<p>ftpd_banner=Welcome!</p>
<p>chroot_list_enable=YES</p>
<p>chroot_list_file=/etc/vsftpd.chroot_list</p>
<p>user_config_dir=/etc/vsftpd</p>
<p>ls_recurse_enable=NO</p>
<p>hide_ids=YES</p>
<p>userlist_enable=YES</p>
<p>userlist_deny=NO</p>
<p>userlist_file=/etc/vsftpd.user_list</p>
<p>guest_enable=YES</p>
<p>guest_username=ftp</p>
<p>max_clients=50</p>
<p>max_per_ip=2</p>
<p>pasv_min_port=55000</p>
<p>pasv_max_port=55100</p>
<p>listen=YES</p>
<p>local_root=/data/ftp/$USER # 每个用户都有自己的ftp主目录</p>
<p>user_sub_token=$USER</p></blockquote>
<p>建启动脚本</p>
<blockquote><p># vi /etc/rc3.d/S83vsftpd<br />
#!/sbin/sh</p>
<p>case &#8220;$1&#8243; in</p>
<p>start)</p>
<p>/usr/local/bin/vsftpd &#038;</p>
<p>;;</p>
<p>stop)</p>
<p>pkill vsftpd</p>
<p>;;</p>
<p>*)</p>
<p>echo &#8220;Usage: $0 { start | stop }&#8221;</p>
<p>exit 1</p>
<p>;;</p>
<p>esac</p>
<p>exit 0<strong><br />
</strong></p></blockquote>
<p><strong>4. 用户管理</strong></p>
<p>手工添加用户</p>
<blockquote><p># useradd -d /dev/null -g ftp -s /bin/false test</p></blockquote>
<p>设置密码</p>
<blockquote><p># passwd test</p></blockquote>
<p>在/etc/vsftpd/下添加一个与用户名相同名字的文件</p>
<blockquote><p># vi /etc/vsftpd/test</p></blockquote>
<p>若只允许下载，则添加如下内容</p>
<blockquote><p>anon_world_readable_only=no</p>
<p>anon_max_rate=512000</p></blockquote>
<p>若允许上传，则添加如下内容</p>
<blockquote><p>anon_world_readable_only=NO</p>
<p>write_enable=YES</p>
<p>anon_upload_enable=YES</p>
<p>anon_mkdir_write_enable=YES</p>
<p>anon_other_write_enable=YES</p>
<p>anon_max_rate=1024000</p></blockquote>
<p>追加新增的用户test到/etc/vsftpd.user_list文件</p>
<blockquote><p># echo &#8220;test&#8221;&gt;&gt; /etc/vsftpd.user_list</p></blockquote>
<p>建立test用户的ftp主目录</p>
<blockquote><p># mkdir /data/ftp/test</p>
<p># chown ftp:ftp /data/ftp/test</p></blockquote>
<p><strong>5. 用户管理脚本</strong></p>
<p>方便添加、删除用户、修改用户密码</p>
<p>安装脚本运行需要的软件包：</p>
<blockquote><p># wget <a href="ftp://mirror.sprintlink.net/sunfreeware.com/pub/freeware/sparc/9/tcl-8.4.6-sol9-sparc-local.gz" title="ftp://mirror.sprintlink.net/sunfreeware.com/pub/freeware/sparc/9/tcl-8.4.6-sol9-sparc-local.gz" target="_blank">mirror.sprintlink.net/sunfreeware.com/pub/freeware&#8230;</a></p>
<p># gunzip tcl-8.4.6-sol9-sparc-local.gz</p>
<p># pkgadd -d tcl-8.4.6-sol9-sparc-local</p>
<p># wget <a href="ftp://mirror.sprintlink.net/sunfreeware.com/pub/freeware/sparc/9/tk-8.4.6-sol9-sparc-local.gz" title="ftp://mirror.sprintlink.net/sunfreeware.com/pub/freeware/sparc/9/tk-8.4.6-sol9-sparc-local.gz" target="_blank">mirror.sprintlink.net/sunfreeware.com/pub/freeware&#8230;</a></p>
<p># gunzip tk-8.4.6-sol9-sparc-local.gz</p>
<p># pkgadd -d tk-8.4.6-sol9-sparc-local</p>
<p># wget <a href="ftp://mirror.sprintlink.net/sunfreeware.com/pub/freeware/sparc/9/expect-5.40-sol9-sparc-local.gz" title="ftp://mirror.sprintlink.net/sunfreeware.com/pub/freeware/sparc/9/expect-5.40-sol9-sparc-local.gz" target="_blank">mirror.sprintlink.net/sunfreeware.com/pub/freeware&#8230;</a></p>
<p># gunzip expect-5.40-sol9-sparc-local.gz</p>
<p># pkgadd -d expect-5.40-sol9-sparc-local</p></blockquote>
<p>setpasswd.exp</p>
<blockquote><p>#! /usr/local/bin/expect -f</p>
<p>#username is passed as 1st arg,password as 2nd</p>
<p>set password [lindex $argv 1]</p>
<p>spawn passwd [lindex $argv 0]</p>
<p>expect &#8220;*Password:&#8221;</p>
<p>send &#8220;$passwordr&#8221;</p>
<p>expect &#8220;*Password:&#8221;</p>
<p>send &#8220;$passwordr&#8221;</p>
<p>expect eof</p></blockquote>
<p>ftpuseradd</p>
<blockquote><p>#!/sbin/sh</p>
<p># ftpuseradd</p>
<p>usage()</p>
<p>{</p>
<p>echo &#8220;Usage: `basename $0` [-w] [-m maxrate] username password&#8221;</p>
<p>exit 1</p>
<p>}</p>
<p>WRITABLE=&#8221;no&#8221; # can&#8217;t upload</p>
<p>MAXRATE=&#8221;64000&#8243; # default max rate is 64Kb</p>
<p>OPT=&#8221;no&#8221;</p>
<p>while getopts :wm: OPTION</p>
<p>do</p>
<p>case $OPTION in</p>
<p>w) WRITABLE=&#8221;yes&#8221;</p>
<p>OPT=&#8221;yes&#8221;</p>
<p>;;</p>
<p>m) MAXRATE=$OPTARG</p>
<p>OPT=&#8221;yes&#8221;</p>
<p>;;</p>
<p>?) usage</p>
<p>;;</p>
<p>esac</p>
<p>done</p>
<p>shift `expr $OPTIND &#8211; 1`</p>
<p>if [ $# -ne 2 ]</p>
<p>then</p>
<p>usage</p>
<p>fi</p>
<p>USERNAME=$1</p>
<p>PASSWORD=$2</p>
<p>useradd -d /dev/null -g ftp -s /bin/false $USERNAME</p>
<p>if [ $? -eq 0 ]</p>
<p>then</p>
<p>setpasswd.exp $USERNAME $PASSWORD &gt; /dev/null</p>
<p>echo &#8220;anon_world_readable_only=NO&#8221; &gt; /etc/vsftpd/$USERNAME</p>
<p>echo &#8220;anon_max_rate=$MAXRATE&#8221; &gt;&gt; /etc/vsftpd/$USERNAME</p>
<p>if [ "$WRITABLE" = "yes" ]</p>
<p>then</p>
<p>echo &#8220;write_enable=YES&#8221; &gt;&gt; /etc/vsftpd/$USERNAME</p>
<p>echo &#8220;anon_upload_enable=YES&#8221; &gt;&gt; /etc/vsftpd/$USERNAME</p>
<p>echo &#8220;anon_mkdir_write_enable=YES&#8221; &gt;&gt; /etc/vsftpd/$USERNAME</p>
<p>echo &#8220;anon_other_write_enable=YES&#8221; &gt;&gt; /etc/vsftpd/$USERNAME</p>
<p>fi</p>
<p>echo &#8220;$USERNAME&#8221; &gt;&gt; /etc/vsftpd.user_list</p>
<p>mkdir /data/ftp/$USERNAME</p>
<p>chown ftp:ftp /data/ftp/$USERNAME</p>
<p>fi<br />
ftpuserdel<br />
#!/sbin/sh</p>
<p># ftpuserdel</p>
<p>usage()</p>
<p>{</p>
<p>echo &#8220;Usage: `basename $0` [-r] username&#8221;</p>
<p>exit 1</p>
<p>}</p>
<p>REMOVEDIR=&#8221;no&#8221;</p>
<p>while getopts :r OPTION</p>
<p>do</p>
<p>case $OPTION in</p>
<p>r) REMOVEDIR=&#8221;yes&#8221;</p>
<p>;;</p>
<p>?) usage</p>
<p>;;</p>
<p>esac</p>
<p>done</p>
<p>shift `expr $OPTIND &#8211; 1`</p>
<p>if [ $# -ne 1 ]</p>
<p>then</p>
<p>usage</p>
<p>fi</p>
<p>USERNAME=$1</p>
<p>userdel $USERNAME</p>
<p>if [ $? -eq 0 ]</p>
<p>then</p>
<p>if [ -f /etc/vsftpd.user_list ]</p>
<p>then</p>
<p>cat /etc/vsftpd.user_list | sed &#8220;/^$USERNAME$/d&#8221; | sed &#8217;1,$ w /etc/vsftpd.user_list&#8217; &gt; /dev/null</p>
<p>fi</p>
<p>if [ -f /etc/vsftpd/$USERNAME ]</p>
<p>then</p>
<p>rm -f /etc/vsftpd/$USERNAME &gt; /dev/null</p>
<p>fi</p>
<p>if [ -d /data/ftp/$USERNAME -a "$REMOVEDIR" = "yes" ]</p>
<p>then</p>
<p>rm -rf /data/ftp/$USERNAME &gt; /dev/null</p>
<p>fi</p>
<p>fi</p></blockquote>
<p>ftppasswd</p>
<blockquote><p>#!/sbin/sh</p>
<p># ftppasswd</p>
<p>usage()</p>
<p>{</p>
<p>echo &#8220;Usage: `basename $0` username password&#8221;</p>
<p>exit 1</p>
<p>}</p>
<p>if [ $# -ne 2 ]</p>
<p>then</p>
<p>usage</p>
<p>fi</p>
<p>USERNAME=$1</p>
<p>PASSWORD=$2<br />
setpasswd.exp $USERNAME $PASSWORD</p></blockquote>
<p>1. <strong>6. 参考</strong><br />
<em /></p>
<p><em>Manpage of VSFTPD.CONF</em>, <a href="http://vsftpd.beasts.org/vsftpd_conf.html">http://vsftpd.beasts.org/vsftpd_conf.html</a></p>
<p><em /></p>
<p><em>Freeware for Solaris</em>, <a href="http://www.sunfreeware.com/">http://www.sunfreeware.com/</a></p>
<p><em /></p>
<p><em>在SOLARIS上编译安装VSFTPD</em>, <a href="http://bbs.chinaunix.net/forum/viewtopic.php?t=344943">http://bbs.chinaunix.net/forum/viewtopic.php?t=344943</a></p>
]]></content:encoded>
			<wfw:commentRss>http://guoyong.org/2005/11/12/193/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>总结一下自己是如何在CU里回答FTP相关问题的</title>
		<link>http://guoyong.org/2005/10/26/197</link>
		<comments>http://guoyong.org/2005/10/26/197#comments</comments>
		<pubDate>Wed, 26 Oct 2005 14:31:47 +0000</pubDate>
		<dc:creator>wolfg</dc:creator>
				<category><![CDATA[CU]]></category>

		<guid isPermaLink="false">http://guoyong.org/blog/2005/10/26/197</guid>
		<description><![CDATA[我配置FTP服务器的次数屈指可数。常见的几种当中只配置过pureftpd和vsftpd，proftpd从来没弄过。 所以，论坛里碰到的各种各样问题对我来说也都是没遇到过的。我的招数是： Google 官方网站的文档、FAQ、论坛或讨论组 自己的常识 积累下来，攒了一些很有用的资源，下面分别列出来。 vsftpd http://vsftpd.beasts.org 官方主页 http://vsftpd.beasts.org/vsftpd_conf.html Man Page of VSFTPD.CONF 很有用，解决vsftpd配置的问题基本都靠这个 http://www.vsftpdrocks.org/ 有安装和配置vsftpd的文章，还有vsftpd官方FAQ的在线版本 http://www.vsftpdrocks.org/faq/ 官方FAQ，我已经翻译了 http://www.siliconvalleyccie.com/linux-hn/ftp-server.htm 这个Quick HOWTO系列的文章都很好 ProFTPD http://www.castaglia.org/proftpd/ 这个最权威了，尤其是那些Mini-HOWTO http://www.proftpd.org/docs/directives/linked/by-name.html 配置指示字列表，查起来很方便 PureFTPd http://www.pureftpd.org/README 需要仔细阅读 http://www.pureftpd.org/README.MySQL 配置用MySQL做认证 http://www.pureftpd.org/README.Virtual-Users 配置虚拟用户 http://www.pureftpd.org/FAQ 值得一看 WuFTP http://www.wu-ftpd.org/man/ftpaccess.html 主配置文件的man page http://linux.vbird.org/linux_server/0400wuftp.php 鳥哥的 Linux 與 ADSL 私房菜 不用多说了吧，经典 还有这个不能不看：Active FTP vs. Passive FTP, a Definitive Explanation [...]]]></description>
			<content:encoded><![CDATA[<p>我配置FTP服务器的次数屈指可数。常见的几种当中只配置过pureftpd和vsftpd，proftpd从来没弄过。<br />
所以，论坛里碰到的各种各样问题对我来说也都是没遇到过的。我的招数是：</p>
<ol>
<li>Google</li>
<li>官方网站的文档、FAQ、论坛或讨论组</li>
<li>自己的常识</li>
</ol>
<p>积累下来，攒了一些很有用的资源，下面分别列出来。</p>
<p><strong>vsftpd</strong></p>
<ul>
<li><a href="http://vsftpd.beasts.org/">http://vsftpd.beasts.org</a> 官方主页</li>
<li><a href="http://vsftpd.beasts.org/vsftpd_conf.html">http://vsftpd.beasts.org/vsftpd_conf.html</a> Man Page of VSFTPD.CONF 很有用，解决vsftpd配置的问题基本都靠这个</li>
<li><a href="http://www.vsftpdrocks.org">http://www.vsftpdrocks.org/</a> 有安装和配置vsftpd的文章，还有vsftpd官方FAQ的在线版本</li>
<li><a href="http://www.vsftpdrocks.org/faq/">http://www.vsftpdrocks.org/faq/</a> 官方FAQ，我已经<a href="http://wolfg.iblog.cn/index.php?op=ViewArticle&amp;amp;amp;amp;amp;articleId=2979&amp;amp;amp;amp;amp;blogId=765">翻译</a>了</li>
<li><a href="http://www.siliconvalleyccie.com/linux-hn/ftp-server.htm">http://www.siliconvalleyccie.com/linux-hn/ftp-server.htm</a> 这个Quick HOWTO系列的文章都很好</li>
</ul>
<p><strong>ProFTPD</strong></p>
<ul>
<li><strong><a href="http://www.castaglia.org/proftpd/">http://www.castaglia.org/proftpd/</a> 这个最权威了，尤其是那些Mini-HOWTO<br />
</strong></li>
<li><strong><a href="http://www.proftpd.org/docs/directives/linked/by-name.html">http://www.proftpd.org/docs/directives/linked/by-name.html</a> 配置指示字列表，查起来很方便 </strong></li>
</ul>
<p><strong>PureFTPd</strong></p>
<ul>
<li><a href="http://www.pureftpd.org/README">http://www.pureftpd.org/README</a> 需要仔细阅读</li>
<li><a href="http://www.pureftpd.org/README.MySQL">http://www.pureftpd.org/README.MySQL</a> 配置用MySQL做认证</li>
<li><a href="http://www.pureftpd.org/README.Virtual-Users">http://www.pureftpd.org/README.Virtual-Users</a> 配置虚拟用户</li>
<li><a href="http://www.pureftpd.org/FAQ">http://www.pureftpd.org/FAQ</a> 值得一看</li>
</ul>
<p><strong>WuFTP</strong></p>
<ul>
<li></li>
<li><a href="http://www.wu-ftpd.org/man/ftpaccess.html">http://www.wu-ftpd.org/man/ftpaccess.html</a> 主配置文件的man page</li>
<li><a href="http://linux.vbird.org/linux_server/0400wuftp.php">http://linux.vbird.org/linux_server/0400wuftp.php</a> 鳥哥的 Linux 與 ADSL 私房菜 不用多说了吧，经典</li>
</ul>
<p>还有这个不能不看：<a href="http://slacksite.com/other/ftp.html">Active FTP vs. Passive FTP, a Definitive Explanation</a> （中译版在<a href="http://wolfg.iblog.cn/index.php?op=ViewArticle&amp;amp;articleId=2971&amp;amp;blogId=765">这里</a>）</p>
<p>还有其他的中文资源，就不列出来了。</p>
]]></content:encoded>
			<wfw:commentRss>http://guoyong.org/2005/10/26/197/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>我翻译的vsftpd官方faq</title>
		<link>http://guoyong.org/2005/10/11/198</link>
		<comments>http://guoyong.org/2005/10/11/198#comments</comments>
		<pubDate>Tue, 11 Oct 2005 12:57:49 +0000</pubDate>
		<dc:creator>wolfg</dc:creator>
				<category><![CDATA[CU]]></category>

		<guid isPermaLink="false">http://guoyong.org/blog/2005/10/11/198</guid>
		<description><![CDATA[官方faq地址： ftp://vsftpd.beasts.org/users/cevans/untar/vsftpd-2.0.3/FAQ 这里也有，vsftpdrocks.org是一个很棒的关于vsftpd安装和配置的网站 Q1) 我能把用户限制在他的家(home)目录里吗？ A) 能，设置chroot_local_user=YES就行了。 Q2) 为什么设置了chroot_local_user=YES后，符号链接(symlink)就不起作用了呢？ A) 这是chroot()这种安全机制如何工作的结果。可选地，看一下硬连接(hard links)，或者，你用的是&#8221;现代的&#8221;Linux，看一下强大的&#8221;mount &#8211;bind&#8221;命令。 Q3) vsftpd支持限制用户连接数吗？ A1) 是的，间接地。vsftpd是一个基于inetd的服务。如果你使用流行的xinetd，它会支持per-service per-IP的连接限制。&#8221;EXAMPLE&#8221;目录里有这样的一个例子。 A2) 如果你以&#8221;standalone&#8221;方式运行vsftpd(方法是设置listen=YES)，你可以研究一下max_clients=10这样的设置。 Q4) 求助！我得到了&#8221;refusing to run with writable anonymous root&#8221;错误信息。 A) vsftpd是不允许&#8221;危险(不安全)&#8221;的配置的。出现这个错误信息的原因通常是ftp的家(home)目录的属主权限不正确。 家(home)目录的属主不应该是ftp用户自己，而且ftp用户也不能有写的权限。解决的方法是: chown root ~ftp; chmod -w ~ftp Q5) 求助！我得到了&#8221;str_getpwnam&#8221;错误信息。 A) 最有可能的原因是在你的系统中不存在那个被配置成&#8217;nopriv_user&#8217;的用户(一般是 &#8216;nobody&#8217;) 。vsftpd需要通过它以最低的权限运行。 Q6) 求助！本地用户无法登录。 A) 有几种可能的问题导致无法登录。 A1) 默认情况下，vsftpd只允许匿名用户(anonymous)登录。在你的/etc/vsftpd.conf配置文件中加入local_enable=YES就可以让本地用户登录了。 A2) vsftpd需要与PAM联系 (运行&#8221;ldd vsftpd&#8221;检查结果中有没有libpam可以确定这个). 如果vsftpd需要PAM支持, 你必须为vsftpd服务准备一个PAM文件. [...]]]></description>
			<content:encoded><![CDATA[<p>官方faq地址： <a href="ftp://vsftpd.beasts.org/users/cevans/untar/vsftpd-2.0.3/FAQ">ftp://vsftpd.beasts.org/users/cevans/untar/vsftpd-2.0.3/FAQ</a></p>
<p><a href="http://www.vsftpdrocks.org/faq/">这里</a>也有，vsftpdrocks.org是一个很棒的关于vsftpd安装和配置的网站</p>
<p>Q1) <strong>我能把用户限制在他的家(home)目录里吗？</strong><br />
A) 能，设置<strong>chroot_local_user=YES</strong>就行了。</p>
<p>Q2) <strong>为什么设置了chroot_local_user=YES后，符号链接(symlink)就不起作用了呢？</strong><br />
A) 这是chroot()这种安全机制如何工作的结果。可选地，看一下硬连接(hard links)，或者，你用的是&#8221;现代的&#8221;Linux，看一下强大的&#8221;mount &#8211;bind&#8221;命令。</p>
<p>Q3) <strong>vsftpd支持限制用户连接数吗？</strong><br />
A1) 是的，间接地。vsftpd是一个基于inetd的服务。如果你使用流行的xinetd，它会支持per-service per-IP的连接限制。&#8221;EXAMPLE&#8221;目录里有这样的一个例子。<br />
A2) 如果你以&#8221;standalone&#8221;方式运行vsftpd(方法是设置listen=YES)，你可以研究一下<strong>max_clients=10</strong>这样的设置。</p>
<p>Q4) <strong>求助！我得到了&#8221;refusing to run with writable anonymous<br />
root&#8221;错误信息。</strong><br />
A) vsftpd是不允许&#8221;危险(不安全)&#8221;的配置的。出现这个错误信息的原因通常是ftp的家(home)目录的属主权限不正确。 家(home)目录的属主不应该是ftp用户自己，而且ftp用户也不能有写的权限。解决的方法是:<br />
chown root ~ftp; chmod -w ~ftp</p>
<p>Q5) <strong>求助！我得到了&#8221;str_getpwnam&#8221;错误信息。</strong><br />
A) 最有可能的原因是在你的系统中不存在那个被配置成&#8217;nopriv_user&#8217;的用户(一般是 &#8216;nobody&#8217;) 。vsftpd需要通过它以最低的权限运行。</p>
<p>Q6) <strong>求助！本地用户无法登录。</strong><br />
A) 有几种可能的问题导致无法登录。<br />
A1) 默认情况下，vsftpd只允许匿名用户(anonymous)登录。在你的/etc/vsftpd.conf配置文件中加入<strong>local_enable=YES</strong>就可以让本地用户登录了。<br />
A2) vsftpd需要与PAM联系 (运行&#8221;ldd vsftpd&#8221;检查结果中有没有libpam可以确定这个). 如果vsftpd需要PAM支持, 你必须为vsftpd服务准备一个PAM文件. 在&#8221;RedHat&#8221;目录下有一个为RedHat系统准备的PAM文件的例子，把它放在/etc/pam.d目录下。<br />
A3) 如果vsftpd不需要PAM, 那么会有多种原因导致这种情况. 用户的shell在 /etc/shells文件中吗? 如果你使用shadow passwd，那么include路径中有没有shadow.h文件?<br />
A4) 如果你没有用PAM, vsftpd会用自己的方法检查用户的shell是否合法. 如果想用一个非法的shell（这样用户就只能用FTP登录），你可以在配置文件中加入<strong>check_shell=NO</strong>.</p>
<p>Q7) <strong>求助！上传或其他&#8221;写&#8221;命令都报&#8221;500 Unknown command.&#8221;.</strong><br />
A) 默认情况下&#8221;写&#8221;命令（上传和建新目录等）都是被禁止的. 这是一种安全的方法. 要允许写命令需要在配置文件/etc/vsftpd.conf中加入<strong>write_enable=YES</strong>.</p>
<p>Q8) <strong>求助！chroot_local_user这个选项里有什么安全隐患？</strong><br />
A) 首先注意其他ftp服务器也有同样的隐患。这是个一般性的问题。这个问题不是很严重，但它是这样的：有些人使不被信任的ftp帐户具有了全部的shell访问权限。如果这些帐户可以上传文件，那就会有一点风险。一个坏用户就可以控制作为其家目录的文件系统的根目录。FTP进程也许会使一些配置文件被访问到，例如/etc/some_file。使用chroot()，这个文件就处于此用户的控制之下。vsftpd非常在意这些安全问题。但是，系统的libc也许想打开语言配置文件或其他的什么配置&#8230;&#8230;</p>
<p>Q9) <strong>求助！上传后的文件权限是-rw&#8212;&#8212;-。</strong><br />
A1) 根据上传用户是本地用户还是匿名用户，修改<strong>local_umask</strong>或<strong>anon_umask</strong>选项。例如，设置<strong>anon_umask=022</strong>指定匿名上传的文件权限为-rw-r&#8211;r&#8211;。注意，22前面的0不能少。<br />
A2) 也可以看看vsftpd.conf的<a href="http://vsftpd.beasts.org/vsftpd_conf.html">man帮助</a>中的新选项<strong>file_open_mode</strong>。</p>
<p>Q10) <strong>求助！我如何集成LDAP用户登录？</strong><br />
A) 使vsftpd结合PAM，配置PAM使用LDAP认证。</p>
<p>Q11) <strong>求助！vsftpd可以配置成虚拟主机（virtual hosting）吗？</strong><br />
A1) 可以。如果你使用xinetd方式运行vsftpd，可以将xinetd绑定到几个不同的IP地址。针对每一个IP地址，xinetd使用不同的配置文件启动vsftpd。这样，你就能在每个IP上配置不同的vsftpd服务。<br />
A2) 也可以用standalone方式运行多个vsftpd实例。使用选项<strong>listen_address=x.x.x.x</strong>设置虚拟IP。</p>
<p>Q12) <strong>求助！vsftpd支持虚拟用户（virtual users）吗？</strong><br />
A) 支持，通过PAM集成。在/etc/vsftpd.conf中设置<strong>guest_enable=YES</strong>，这样的效果是所有非匿名用户的成功登录都映射成<strong>guest_username</strong>指定的本地用户。然后，使用PAM和（例如：）它的pam_userdb模块，就可以提高基于外部用户库（即不使用/etc/passwd）的认证。注意：当<strong>guest_enable</strong>生效后会有一个限制，就是本地用户也被映射到<strong>guest_username</strong>（译者：也就是说虚拟用户与本地用户不能同时使用）。EXAMPLE目录里有配置虚拟用户的例子。</p>
<p>Q13) <strong>求助！vsftpd支持不同的用户使用不同的配置吗？</strong><br />
A) 支持，而且功能强大。看<a href="http://vsftpd.beasts.org/vsftpd_conf.html">man帮助</a>里的<strong>user_config_dir</strong>选项。</p>
<p>Q14) <strong>求助！我可以把vsftpd的数据连接（data connections）限制到指定范围的端口吗？</strong><br />
A) 可以。看配置选项<strong>pasv_min_port</strong>和<strong>pasv_max_port</strong>。</p>
<p>Q15) <strong>求助！我看到了&#8221;OOPS: chdir&#8221;这样的信息。</strong><br />
A) 如果这是匿名用户在登录，就检查系统用户ftp的家目录是否正确。如果你使用了<strong>anon_root</strong>这个选项，也要检查该选项是否正确。</p>
<p>Q16) <strong>求助！vsftpd显示的是GMT时间，而不是本地时间!</strong><br />
A) 这个可以通过设置<strong>use_localtime=YES</strong>来解决。</p>
<p>Q17) <strong>求助！我能禁用某些FTP命令吗？</strong><br />
A) 可以。有一些单独的选项（比如<strong>dirlist_enable</strong>），或者可以通过<strong>cmds_allowed</strong>选项指定允许的命令集。</p>
<p>Q18) <strong>求助！我可以改变vsftpd的工作端口吗？</strong><br />
A1) 可以。如果以standalone方式运行vsftpd，可以用vsftpd.conf中的<strong>listen_port</strong>选项（指定端口）。<br />
A2) 可以。如果以inetd或xinetd方式运行vsftpd，那么这个问题由inetd或xinetd负责。你就必须修改inetd或xinetd的配置文件（可能是/etc/inetd.conf或/etc/xinetd.d/vsftpd）。</p>
<p>Q19) <strong>求助！vsftpd可以使用LDAP服务器进行验证吗？或者使用Mysql数据库？</strong><br />
A) 是的。vsftpd可以使用PAM进行验证，所以你需要配置PAM使用pam_ldap或pam_mysql模块。这包括安装PAM模块，然后编辑vsftpd的PAM配置文件（可能是/etc/pam.d/vsftpd）。</p>
<p>Q20) <strong>求助！vsftpd支持每IP限制（per-IP limits）吗？</strong><br />
A1) 是的。如果以standalone方式运行vsftpd，可以使用<strong>max_per_ip</strong>选项。<br />
A2) 是的。如果以xinetd方式运行vsftpd，可以用xinetd的配置参数<strong>per_source</strong>。</p>
<p>Q21) <strong>求助！vsftpd支持带宽限制吗？</strong><br />
A) 支持。看<a href="http://vsftpd.beasts.org/vsftpd_conf.html">man帮助</a>（vsftpd.conf.5）中的&#8221;<strong>anon_max_rate</strong>&#8220;和 &#8220;<strong>local_max_rate</strong>&#8220;选项。</p>
<p>Q22) <strong>求助！vsftpd支持基于IP（IP-based）的访问控制吗？</strong><br />
A1) 可以结合tcp_wrappers实现（前提是编译是加了tcp_wrappers支持）。通过设置<strong>tcp_wrappers=YES</strong>启用它。<br />
A2) 以xinetd方式运行vsftpd，xinetd可以结合tcp_wrappers。</p>
<p>Q23) <strong>求助！vsftpd支持IPv6吗</strong>？<br />
A) 从版本1.2.0开始就支持了。看vsftpd.conf的<a href="http://vsftpd.beasts.org/vsftpd_conf.html">man帮助</a>。</p>
<p>Q24) <strong>求助！vsftpd编译失败，错误是不能找到-lcap（unable to find -lcap）。</strong><br />
A) 安装libcap package再试。好像Debian用户遇到这个问题多一些。</p>
<p>Q25) <strong>求助！我的配置文件是/etc/vsftpd.conf，可是好像不起作用！</strong><br />
A) RedHat用户会遇到这个问题 &#8211; 一些RedHat版本中vsftpd的配置文件是/etc/vsftpd/vsftpd.conf.</p>
<p>Q26) <strong>求助！vsftpd编译失败，报sysutil.c中有不完整的类型（types）。</strong><br />
A) 你的系统可能不支持IPv6。要么在一个现代一些（支持IPv6）的系统中使用老版本的vsftpd（例如 v1.1.3），要么等没有这个问题的版本出来。</p>
<p>Q27) <strong>求助！下载（尤其是大量小文件）时看到很多这样的信息：&#8221;500 OOPS: vsf_sysutil_bind&#8221;。</strong><br />
A) vsftpd-1.2.1已经解决了这个问题。</p>
<p>Q28) <strong>求助！vsftpd可以隐藏或拒绝访问某些文件吗？</strong><br />
A) 可以。看看vsftpd.conf的<a href="http://vsftpd.beasts.org/vsftpd_conf.html">man帮助</a>中的<strong>hide_file</strong>和<strong>deny_file</strong>选项。</p>
<p>Q29) <strong>求助！vsftpd支持FXP吗？</strong><br />
A) 支持。FTP服务器不需要特别配置就可以支持FXP。但由于vsftpd在IP地址上的安全限制，你可能不会成功。想放宽这种限制，可以看看vsftpd.conf的<a href="http://vsftpd.beasts.org/vsftpd_conf.html">man帮助</a>(vsftpd.conf.5)中关于<strong>pasv_promiscuous</strong>（和不太推荐使用的<strong>port_promiscuous</strong>）选项。</p>
<p>Q30) <strong>&#8230;&#8230;</strong><br />
A) 想进一步了解vsftpd，请阅读vsftpd.conf的<a href="http://vsftpd.beasts.org/vsftpd_conf.html">man帮助</a>和配置示例。</p>
]]></content:encoded>
			<wfw:commentRss>http://guoyong.org/2005/10/11/198/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Active FTP vs. Passive FTP, a Definitive Explanation 中文版</title>
		<link>http://guoyong.org/2005/10/11/199</link>
		<comments>http://guoyong.org/2005/10/11/199#comments</comments>
		<pubDate>Tue, 11 Oct 2005 07:44:39 +0000</pubDate>
		<dc:creator>wolfg</dc:creator>
				<category><![CDATA[CU]]></category>

		<guid isPermaLink="false">http://guoyong.org/blog/2005/10/11/199</guid>
		<description><![CDATA[原文：http://slacksite.com/other/ftp.html CU链接：http://bbs.chinaunix.net/forum/viewtopic.php?t=574966 感谢CU网友pidan和missing-cn翻译，整理由wolfg完成。 主动FTP与被动FTP－权威解释 目录 开场白 基础 主动FTP 主动FTP的例子 被动FTP 被动FTP的例子 总结 参考资料 附录 1: 配置常见FTP服务器 开场白 处理防火墙和其他网络连接问题时最常见的一个难题是主动FTP与被动FTP的区别以及如何完美地支持它们。幸运地是，本文能够帮助你清除在防火墙环境中如何支持FTP这个问题上的一些混乱。 本文也许不像题目声称的那样是一个权威解释，但我已经听到了很多好的反馈意见，也看到了本文在许多地方被引用，知道了很多人都认为它很有用。虽然我一直在 找寻改进的方法，但如果你发现某个地方讲的不够清楚，需要更多的解释，请告诉我！最近的修改是增加了主动FTP和被动FTP会话中命令的例子。这些会话的 例子应该对更好地理解问题有所帮助。例子中还提供了非常棒的图例来解释FTP会话过程的步骤。现在，正题开始了&#8230; 基础 FTP是仅基于TCP的服务，不支持UDP。 与众不同的是FTP使用2个端口，一个数据端口和一个命令端口（也可叫做控制端口）。通常来说这两个端口是21－命令端口和20－数据端口。但当我们发现根据（FTP工作）方式的不同数据端口并不总是20时，混乱产生了。 主动FTP 主动方式的FTP是这样的：客户端从一个任意的非特权端口N（N&#62;1023）连接到FTP服务器的命令端口，也就是21端口。然后客户端开始监听端 口N+1，并发送FTP命令&#8221;port N+1&#8243;到FTP服务器。接着服务器会从它自己的数据端口（20）连接到客户端指定的数据端口（N+1）。 针对FTP服务器前面的防火墙来说，必须允许以下通讯才能支持主动方式FTP： 任何端口到FTP服务器的21端口 （客户端初始化的连接 S&#60;-C） FTP服务器的21端口到大于1023的端口（服务器响应客户端的控制端口 S-&#62;C） FTP服务器的20端口到大于1023的端口（服务器端初始化数据连接到客户端的数据端口 S-&#62;C） 大于1023端口到FTP服务器的20端口（客户端发送ACK响应到服务器的数据端口 S&#60;-C） 画出来的话，连接过程大概是下图的样子： 在第1步中，客户端的命令端口与FTP服务器的命令端口建立连接，并发送命令&#8221;PORT 1027&#8243;。然后在第2步中，FTP服务器给客户端的命令端口返回一个&#8221;ACK&#8221;。在第3步中，FTP服务器发起一个从它自己的数据端口（20）到客户端 先前指定的数据端口（1027）的连接，最后客户端在第4步中给服务器端返回一个&#8221;ACK&#8221;。 主动方式FTP的主要问题实际上在于客户端。FTP的客户端并没有实际建立一个到服务器数据端口的连接，它只是简单的告诉服务器自己监听的端口号，服务器 再回来连接客户端这个指定的端口。对于客户端的防火墙来说，这是从外部系统建立到内部客户端的连接，这是通常会被阻塞的。 主动FTP的例子 下面是一个主动FTP会话的实际例子。当然服务器名、IP地址和用户名都做了改动。在这个例子中，FTP会话从 testbox1.slacksite.com (192.168.150.80)，一个运行标准的FTP命令行客户端的Linux工作站，发起到testbox2.slacksite.com (192.168.150.90)，一个运行ProFTPd 1.2.2RC2的Linux工作站。debugging（-d）选项用来在FTP客户端显示连接的详细过程。红色的文字是 debugging信息，显示的是发送到服务器的实际FTP命令和所产生的回应信息。服务器的输出信息用黑色字表示，用户的输入信息用粗体字表示。 仔细考虑这个对话过程我们会发现一些有趣的事情。我们可以看到当 PORT 命令被提交时，它指定了客户端(192.168.150.80)上的一个端口而不是服务器的。当我们用被动FTP时我们会看到相反的现象。我们再来关注 PORT命令的格式。就象你在下面的例子看到的一样，它是一个由六个被逗号隔开的数字组成的序列。前四个表示IP地址，后两个组成了用于数据连接的端口 [...]]]></description>
			<content:encoded><![CDATA[<p>原文：<a href="http://slacksite.com/other/ftp.html">http://slacksite.com/other/ftp.html</a></p>
<p>CU链接：<a href="http://bbs.chinaunix.net/forum/viewtopic.php?t=574966&amp;amp;amp;amp;amp;amp;show_type=new">http://bbs.chinaunix.net/forum/viewtopic.php?t=574966</a></p>
<p>感谢CU网友pidan和missing-cn翻译，整理由wolfg完成。</p>
<p><strong>主动FTP与被动FTP－权威解释</strong></p>
<p><strong>目录</strong></p>
<ul>
<li>开场白</li>
<li>基础</li>
<li>主动FTP</li>
<li>主动FTP的例子</li>
<li>被动FTP</li>
<li>被动FTP的例子</li>
<li>总结</li>
<li>参考资料</li>
<li>附录 1: 配置常见FTP服务器</li>
</ul>
<p><strong>开场白</strong></p>
<p>处理防火墙和其他网络连接问题时最常见的一个难题是主动FTP与被动FTP的区别以及如何完美地支持它们。幸运地是，本文能够帮助你清除在防火墙环境中如何支持FTP这个问题上的一些混乱。</p>
<p>本文也许不像题目声称的那样是一个权威解释，但我已经听到了很多好的反馈意见，也看到了本文在许多地方被引用，知道了很多人都认为它很有用。虽然我一直在<br />
找寻改进的方法，但如果你发现某个地方讲的不够清楚，需要更多的解释，请告诉我！最近的修改是增加了主动FTP和被动FTP会话中命令的例子。这些会话的<br />
例子应该对更好地理解问题有所帮助。例子中还提供了非常棒的图例来解释FTP会话过程的步骤。现在，正题开始了&#8230;</p>
<p><strong><br />
基础</strong></p>
<p>FTP是仅基于TCP的服务，不支持UDP。 与众不同的是FTP使用2个端口，一个数据端口和一个命令端口（也可叫做控制端口）。通常来说这两个端口是21－命令端口和20－数据端口。但当我们发现根据（FTP工作）方式的不同数据端口并不总是20时，混乱产生了。</p>
<p><strong><br />
主动FTP</strong></p>
<p>主动方式的FTP是这样的：客户端从一个任意的非特权端口N（N&gt;1023）连接到FTP服务器的命令端口，也就是21端口。然后客户端开始监听端<br />
口N+1，并发送FTP命令&#8221;port N+1&#8243;到FTP服务器。接着服务器会从它自己的数据端口（20）连接到客户端指定的数据端口（N+1）。</p>
<p>针对FTP服务器前面的防火墙来说，必须允许以下通讯才能支持主动方式FTP：</p>
<ul>
<li>任何端口到FTP服务器的21端口 （客户端初始化的连接 S&lt;-C）</li>
<li>FTP服务器的21端口到大于1023的端口（服务器响应客户端的控制端口 S-&gt;C）</li>
<li>FTP服务器的20端口到大于1023的端口（服务器端初始化数据连接到客户端的数据端口 S-&gt;C）</li>
<li>大于1023端口到FTP服务器的20端口（客户端发送ACK响应到服务器的数据端口 S&lt;-C）</li>
</ul>
<p>画出来的话，连接过程大概是下图的样子：</p>
<p><img border="0" src="http://slacksite.com/images/ftp/activeftp.gif" /></p>
<p>在第1步中，客户端的命令端口与FTP服务器的命令端口建立连接，并发送命令&#8221;PORT<br />
1027&#8243;。然后在第2步中，FTP服务器给客户端的命令端口返回一个&#8221;ACK&#8221;。在第3步中，FTP服务器发起一个从它自己的数据端口（20）到客户端<br />
先前指定的数据端口（1027）的连接，最后客户端在第4步中给服务器端返回一个&#8221;ACK&#8221;。</p>
<p>主动方式FTP的主要问题实际上在于客户端。FTP的客户端并没有实际建立一个到服务器数据端口的连接，它只是简单的告诉服务器自己监听的端口号，服务器<br />
再回来连接客户端这个指定的端口。对于客户端的防火墙来说，这是从外部系统建立到内部客户端的连接，这是通常会被阻塞的。</p>
<p><strong><br />
主动FTP的例子</strong></p>
<p>下面是一个主动FTP会话的实际例子。当然服务器名、IP地址和用户名都做了改动。在这个例子中，FTP会话从<br />
<a href="http://testbox1.slacksite.com" title="http://testbox1.slacksite.com" target="_blank">testbox1.slacksite.com</a><br />
(192.168.150.80)，一个运行标准的FTP命令行客户端的Linux工作站，发起到testbox2.slacksite.com<br />
(192.168.150.90)，一个运行ProFTPd<br />
1.2.2RC2的Linux工作站。debugging（-d）选项用来在FTP客户端显示连接的详细过程。红色的文字是<br />
debugging信息，显示的是发送到服务器的实际FTP命令和所产生的回应信息。服务器的输出信息用黑色字表示，用户的输入信息用粗体字表示。</p>
<p>仔细考虑这个对话过程我们会发现一些有趣的事情。我们可以看到当 PORT<br />
命令被提交时，它指定了客户端(192.168.150.80)上的一个端口而不是服务器的。当我们用被动FTP时我们会看到相反的现象。我们再来关注<br />
PORT命令的格式。就象你在下面的例子看到的一样，它是一个由六个被逗号隔开的数字组成的序列。前四个表示IP地址，后两个组成了用于数据连接的端口<br />
号。用第五个数乘以256再加上第六个数就得到了实际的端口号。下面例子中端口号就是( (14*256) + 178) =<br />
3762。我们可以用netstat来验证这个端口信息。</p>
<p>testbox1: {/home/p-t/slacker/public_html} % ftp -d testbox2</p>
<p>Connected to <a href="http://testbox2.slacksite.com" title="http://testbox2.slacksite.com" target="_blank">testbox2.slacksite.com</a>.</p>
<p>220 <a href="http://testbox2.slacksite.com" title="http://testbox2.slacksite.com" target="_blank">testbox2.slacksite.com</a> FTP server ready.</p>
<p>Name (testbox2:slacker): slacker</p>
<p>&#8212;&gt; USER slacker</p>
<p>331 Password required for slacker.</p>
<p>Password: TmpPass</p>
<p>&#8212;&gt; PASS XXXX</p>
<p>230 User slacker logged in.</p>
<p>&#8212;&gt; SYST</p>
<p>215 UNIX Type: L8</p>
<p>Remote system type is UNIX.</p>
<p>Using binary mode to transfer files.</p>
<p>ftp&gt; ls</p>
<p>ftp: setsockopt (ignored): Permission denied</p>
<p>&#8212;&gt; PORT 192,168,150,80,14,178</p>
<p>200 PORT command successful.</p>
<p>&#8212;&gt; LIST</p>
<p>150 Opening ASCII mode data connection for file list.</p>
<p>drwx&#8212;&#8212; 3 slacker<br />
users 104 Jul 27 01:45<br />
public_html</p>
<p>226 Transfer complete.</p>
<p>ftp&gt; quit</p>
<p>&#8212;&gt; QUIT</p>
<p>221 Goodbye.</p>
<p><strong><br />
被动FTP</strong></p>
<p>为了解决服务器发起到客户的连接的问题，人们开发了一种不同的FTP连接方式。这就是所谓的被动方式，或者叫做PASV，当客户端通知服务器它处于被动模式时才启用。</p>
<p>在被动方式FTP中，命令连接和数据连接都由客户端，这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。当开启一个<br />
FTP连接时，客户端打开两个任意的非特权本地端口（N &gt;<br />
1023和N+1）。第一个端口连接服务器的21端口，但与主动方式的FTP不同，客户端不会提交PORT命令并允许服务器来回连它的数据端口，而是提交<br />
PASV命令。这样做的结果是服务器会开启一个任意的非特权端口（P &gt; 1023），并发送PORT<br />
P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。</p>
<p>对于服务器端的防火墙来说，必须允许下面的通讯才能支持被动方式的FTP:</p>
<ul>
<li>从任何端口到服务器的21端口 （客户端初始化的连接 S&lt;-C）</li>
<li>服务器的21端口到任何大于1023的端口 （服务器响应到客户端的控制端口的连接 S-&gt;C）</li>
<li>从任何端口到服务器的大于1023端口 （入；客户端初始化数据连接到服务器指定的任意端口 S&lt;-C）</li>
<li>服务器的大于1024端口到远程的大于1023的端口（出；服务器发送ACK响应和数据到客户端的数据端口 S-&gt;C）</li>
</ul>
<p>画出来的话，被动方式的FTP连接过程大概是下图的样子：</p>
<p><img border="0" src="http://slacksite.com/images/ftp/passiveftp.gif" /></p>
<p>在第1步中，客户端的命令端口与服务器的命令端口建立连接，并发送命令&#8221;PASV&#8221;。然后在第2步中，服务器返回命令&#8221;PORT<br />
2024&#8243;，告诉客户端（服务器）用哪个端口侦听数据连接。在第3步中，客户端初始化一个从自己的数据端口到服务器端指定的数据端口的数据连接。最后服务<br />
器在第4 步中给客户端的数据端口返回一个&#8221;ACK&#8221;响应。</p>
<p>被动方式的FTP解决了客户端的许多问题，但同时给服务器端带来了更多的问题。最大的问题是需要允许从任意远程终端到服务器高位端口的连接。幸运的是，许多FTP守护程序，包括流行的WU-FTPD允许管理员指定FTP服务器使用的端口范围。详细内容参看附录1。</p>
<p>第二个问题是客户端有的支持被动模式，有的不支持被动模式，必须考虑如何能支持这些客户端，以及为他们提供解决办法。例如，Solaris提供的FTP命令行工具就不支持被动模式，需要第三方的FTP客户端，比如ncftp。</p>
<p>随着WWW的广泛流行，许多人习惯用web浏览器作为FTP客户端。大多数浏览器只在访问ftp://这样的URL时才支持被动模式。这到底是好还是坏取决于服务器和防火墙的配置。</p>
<p><strong><br />
被动FTP的例子</strong></p>
<p>下面是一个被动FTP会话的实际例子，只是服务器名、IP地址和用户名都做了改动。在这个例子中，FTP会话从<br />
<a href="http://testbox1.slacksite.com" title="http://testbox1.slacksite.com" target="_blank">testbox1.slacksite.com</a><br />
(192.168.150.80)，一个运行标准的FTP命令行客户端的Linux工作站，发起到testbox2.slacksite.com<br />
(192.168.150.90)，一个运行ProFTPd<br />
1.2.2RC2的Linux工作站。debugging（-d）选项用来在FTP客户端显示连接的详细过程。红色的文字是<br />
debugging信息，显示的是发送到服务器的实际FTP命令和所产生的回应信息。服务器的输出信息用黑色字表示，用户的输入信息用粗体字表示。</p>
<p>注意此例中的PORT命令与主动FTP例子的不同。这里，我们看到是服务器(192.168.150.90)而不是客户端的一个端口被打开了。可以跟上面的主动FTP例子中的PORT命令格式对比一下。</p>
<p>testbox1: {/home/p-t/slacker/public_html} % ftp -d testbox2</p>
<p>Connected to <a href="http://testbox2.slacksite.com" title="http://testbox2.slacksite.com" target="_blank">testbox2.slacksite.com</a>.</p>
<p>220 <a href="http://testbox2.slacksite.com" title="http://testbox2.slacksite.com" target="_blank">testbox2.slacksite.com</a> FTP server ready.</p>
<p>Name (testbox2:slacker): slacker</p>
<p>&#8212;&gt; USER slacker</p>
<p>331 Password required for slacker.</p>
<p>Password: TmpPass</p>
<p>&#8212;&gt; PASS XXXX</p>
<p>230 User slacker logged in.</p>
<p>&#8212;&gt; SYST</p>
<p>215 UNIX Type: L8</p>
<p>Remote system type is UNIX.</p>
<p>Using binary mode to transfer files.</p>
<p>ftp&gt; passive</p>
<p>Passive mode on.</p>
<p>ftp&gt; ls</p>
<p>ftp: setsockopt (ignored): Permission denied</p>
<p>&#8212;&gt; PASV</p>
<p>227 Entering Passive Mode (192,168,150,90,195,149).</p>
<p>&#8212;&gt; LIST</p>
<p>150 Opening ASCII mode data connection for file list</p>
<p>drwx&#8212;&#8212; 3 slacker<br />
users 104 Jul 27 01:45<br />
public_html</p>
<p>226 Transfer complete.</p>
<p>ftp&gt; quit</p>
<p>&#8212;&gt; QUIT</p>
<p>221 Goodbye.</p>
<p><strong><br />
总结</strong></p>
<p>下面的图表会帮助管理员们记住每种FTP方式是怎样工作的：</p>
<p>主动FTP：</p>
<blockquote><p>命令连接：客户端 &gt;1023端口 -&gt; 服务器 21端口<br />
数据连接：客户端 &gt;1023端口 &lt;- 服务器 20端口</p></blockquote>
<p>被动FTP：</p>
<blockquote><p>命令连接：客户端 &gt;1023端口 -&gt; 服务器 21端口<br />
数据连接：客户端 &gt;1023端口 -&gt; 服务器 &gt;1023端口</p></blockquote>
<p>下面是主动与被动FTP优缺点的简要总结：</p>
<p>主动FTP对FTP服务器的管理有利，但对客户端的管理不利。因为FTP服务器企图与客户端的高位随机端口建立连接，而这个端口很有可能被客户端的防火墙<br />
阻塞掉。被动FTP对FTP客户端的管理有利，但对服务器端的管理不利。因为客户端要与服务器端建立两个连接，其中一个连到一个高位随机端口，而这个端口<br />
很有可能被服务器端的防火墙阻塞掉。</p>
<p>幸运的是，有折衷的办法。既然FTP服务器的管理员需要他们的服务器有最多的客户连接，那么必须得支持被动FTP。我们可以通过为FTP服务器指定一个有<br />
限的端口范围来减小服务器高位端口的暴露。这样，不在这个范围的任何端口会被服务器的防火墙阻塞。虽然这没有消除所有针对服务器的危险，但它大大减少了危<br />
险。详细信息参看附录1。</p>
<p><strong><br />
参考资料</strong></p>
<p>O&#8217;Reilly出版的《组建Internet防火墙》（第二版，Brent Chapman，Elizabeth Zwicky著）是一本很不错的参考资料。里面讲述了各种Internet协议如何工作，以及有关防火墙的例子。</p>
<p>最权威的FTP参考资料是RFC 959，它是FTP协议的官方规范。RFC的资料可以从许多网站上下载，例如：<a href="ftp://nic.merit.edu/documents/rfc/rfc0959.txt">ftp://nic.merit.edu/documents/rfc/rfc0959.txt</a> 。</p>
<p><a href="http://slacksite.com/other/ftp-appendix1.html"><br />
Active FTP vs. Passive FTP, Appendix 1</a></p>
]]></content:encoded>
			<wfw:commentRss>http://guoyong.org/2005/10/11/199/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用vnc2swf把vnc桌面操作录制成flash动画</title>
		<link>http://guoyong.org/2005/10/10/202</link>
		<comments>http://guoyong.org/2005/10/10/202#comments</comments>
		<pubDate>Mon, 10 Oct 2005 15:35:20 +0000</pubDate>
		<dc:creator>wolfg</dc:creator>
				<category><![CDATA[CU]]></category>

		<guid isPermaLink="false">http://guoyong.org/blog/2005/10/10/202</guid>
		<description><![CDATA[在Python版讨论一个问题时,发现用flash做的演示，抓取的是Fedora的桌面。 http://freedesktop.org/~clee/media/google-search.html google &#8220;flash screen capture&#8221;，在搜索结果中发现了这个叫vnc2swf的工具，可以把vnc桌面的操作保存成flash动画。 http://desktops.linux.com/desktops/04/07/26/1815242.shtml?tid=6 用法很简单，大家看上面的链接就知道了，我简单写一下： 1. 安装Ming-0.2a # make # make install 2. 安装vnc2swf # ./configure # make # make install 3. 抓屏 在xterm下运行vnc2swf # vnc2swf -startrecording -geometry 800&#215;600 -depth 16 -framerate 5 demo.swf vnc_server_ip:x.0 上面，demo.swf是要保存的flash文件，vnc_server_ip是要抓屏的运行着vncserver的机器的地址，x是vncserver的display number，比如vncserver的启动命令是vncserver :2，那么这个x就是2 输入访问vnc的密码后，就会出现一个vnc桌面的窗口，左上角有数字表示当前帧。 关掉这个窗口，录制结束。打开这个flash文件看看吧。 :) 原贴在这里。]]></description>
			<content:encoded><![CDATA[<p>在Python版讨论<a href="http://bbs.chinaunix.net/forum/viewtopic.php?t=623174">一个问题</a>时,发现用flash做的演示，抓取的是Fedora的桌面。<br />
<a href="http://freedesktop.org/~clee/media/google-search.html">http://freedesktop.org/~clee/media/google-search.html</a></p>
<p>google &#8220;flash screen capture&#8221;，在搜索结果中发现了这个叫vnc2swf的工具，可以把vnc桌面的操作保存成flash动画。<br />
<a href="http://desktops.linux.com/desktops/04/07/26/1815242.shtml?tid=6">http://desktops.linux.com/desktops/04/07/26/1815242.shtml?tid=6</a></p>
<p>用法很简单，大家看上面的链接就知道了，我简单写一下：</p>
<p>1. 安装Ming-0.2a</p>
<p># make</p>
<p># make install</p>
<p>2. 安装vnc2swf</p>
<p># ./configure</p>
<p># make</p>
<p># make install</p>
<p>3. 抓屏</p>
<p>在xterm下运行vnc2swf</p>
<p># vnc2swf -startrecording -geometry 800&#215;600 -depth 16 -framerate 5 demo.swf vnc_server_ip:x.0</p>
<p>上面，demo.swf是要保存的flash文件，vnc_server_ip是要抓屏的运行着vncserver的机器的地址，x是vncserver的display number，比如vncserver的启动命令是vncserver :2，那么这个x就是2</p>
<p>输入访问vnc的密码后，就会出现一个vnc桌面的窗口，左上角有数字表示当前帧。</p>
<p>关掉这个窗口，录制结束。打开这个flash文件看看吧。 :)</p>
<p>原贴在<a href="http://bbs.chinaunix.net/forum/viewtopic.php?t=624526&amp;highlight=wolfg">这里</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://guoyong.org/2005/10/10/202/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>我在CU</title>
		<link>http://guoyong.org/2005/10/10/203</link>
		<comments>http://guoyong.org/2005/10/10/203#comments</comments>
		<pubDate>Mon, 10 Oct 2005 15:33:23 +0000</pubDate>
		<dc:creator>wolfg</dc:creator>
				<category><![CDATA[CU]]></category>

		<guid isPermaLink="false">http://guoyong.org/blog/2005/10/10/203</guid>
		<description><![CDATA[在CU注册是03年。开始时只潜水，慢慢地也开始发贴。现在，每天都去，已是一种习惯，还有职责。]]></description>
			<content:encoded><![CDATA[<p>在CU注册是03年。开始时只潜水，慢慢地也开始发贴。现在，每天都去，已是一种习惯，还有职责。</p>
]]></content:encoded>
			<wfw:commentRss>http://guoyong.org/2005/10/10/203/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

