文逸首页 小文论坛 文逸博客 精华文章
 首页 | 新闻 | 论坛 | 博客 | 专题 | FTP | 金融 | 微博 | 图库 | MyHome | 搜索 | 登陆 | 注册 | 帮助 | 设为首页  ·在线人数: 2942

发表新帖 我的主页  用户登陆 返回上页 收藏本帖 文友爬行榜

标题:www server与ftp server安装使用完全手册
[作者] dsj [发表时间] 2003/4/14 22:46:44  [回复] 8  [点击] 13368

 [作者] dsj   [头衔] 论坛坛主  [经验] 220862  [等级] 大主帅   [发帖] 15642   [回帖] 1366  [登陆] 7956
[发表时间] 2003/4/14 22:46:44  [楼主]
标题: www server与ftp server安装使用完全手册
 
1.开启某用户的ftp功能-而关闭www功能!

假如你的站是有个人主页功能--但Apache是用系统用户的主目录如常见的~用户名指到public_html下-但想关闭几个用户的www功能,同时为了给他ftp的机会不关闭他的ftp功能。可用userdir disable 用户名如
userdir disable root abc等--这是userdir 的另一个不公开用法--一般只是userdir public_html的用法-事实上userdir还有很多用法-我会慢慢把它写出来,以及个人主页系统的完整实现等,请大家提出意见! 

2.telnet和ftp登录特别慢的解决方法

 这肯定是DNS反向解析的问题-主要问题在/etc/hosts中。如果你的主机名不规则或是假的则可能发生这种情况-如果server没配错的话,在没有真正域名时把hostname改为localhost或127.0.0.1一般可解决。(如还不行就删了resolv.conf)
以下来自jerryzhou:Logins to the ftp server take a long time, after that things run smooth
Possible causes: IDENT (RFC931) lookup is enabled in WU-FTPD. This has a timeout of 10 seconds. If the protocol (port 113) gets blocked by a firewall or suchlike, it will wait for timeout. If it is 30 seconds and you are using redhat 7.x with xinetd, disable AUTH in inetd as well. Change the entries in /etc/xinetd.d/ftp that read:

log_on_success += DURATION USERID
log_on_failure += USERID

Remove the 'USERID' from both. Any other time period: DNS is broken for the IP address the connection is coming from.

上面是老外http://www.wu-ftpd.org/wu-ftpd-faq.html
faq上的解决方案,看来是dns的问题,我跟踪了一下,
我修改之后我的in.ftpd只用了40秒来查询dns,每次10秒,
10正好是超时时间,如果没有修改的话,在/etc/resolv.conf
里面有两个server name,那么一个用10秒,两个,
就用了80秒,怪不得,很慢啊,呵呵,不过,如果按照作者
所说,修改之后就可以了,可是还是要查,慢!费劲。
我觉得还是自己编译好些,可以设掉查询的retry
另外,你的dns很好,或者你的主机的网络很快的话,
dns查询也是很快的,这样登录时间也能缩短

目前还没有关于rpm安装wu-ftpd超时的解决方式

这个建议也不错,完全干掉dns反向解析
From: i-wear-spammers-skulls-jan-2000@paypc.com (Lord Apollyon)
Subject: Re: wu-ftpd vs. betaftpd performance comparison
Newsgroup: comp.benchmarks

In article <387FE688.6CB8049B@alumni.caltech.edu>, Dan Kegel
wrote:

> Picked out of a hat. Actually, I didn't want to worry about running
> out of ports, so I didn't want fetches to finish too fast.
> Yep, 30 seconds.

Hrm. If you had wu-ftpd configured to do reverse DNS lookups and identd,
and betafpd does not, for such small files, the identd timeout/DNS lookup
times would indeed be SERIOUS factors in your tests.

I'd suggest your turning off identd lookups and reverse DNS.

In /etc/ftpaccess:

timeout RFC931 0

and to disable DNS, in the root-level of the wu-ftpd-2.6.0 distro, in config.h,

#define NO_DNS 1

That should completely optimise wu-ftpd-2.6.0 for connection speed.
Note: obviously, name-based access rules won't work anymore. You should
try to use ip#-based ones anyhow, if you segregate classes by source-ip.

Under no circumstances should you grant access (rsh-style) based solely on
connecting ip#, though.

=R=

-------------------------------------------------------------
From: i-wear-spammers-skulls-jan-2000@paypc.com (Lord Apollyon)
Subject: Re: wu-ftpd vs. betaftpd performance comparison

In article <387EC939.F4782E87@alumni.caltech.edu>, Dan Kegel
wrote:

> betaftpd handled 249 users at about 28000 bits/sec each, for an
> average throughput of something like 6 megabits/sec.
> Not bad for a 10baseT connection.
>
> wu-ftpd pooped out at 39 users.

Huh? Define "pooped out". I use 64k buffers on my wu-ftpd-2.6.0, and I
see EXCELLENT performance. Wire-speeds on LAN xfers, and the fastest
possible xfers to most distant hosts.

wu-ftpd sets IP_TOS (to bandwidth), which some routers/systems respect, as
well as SO_NODELAY, and it uses large socket buffers by default usually.

Most of the users I've seen complain about wu-ftpd normally have
configuration issues. [They let it do identd lookups, they have it do
reverse DNS, etc, etc]. identd is pretty much useless these days for
anything but logfile candy, and you really only need to log ip#s. You
certainly should make access rule decisions based solely on what address
they're coming from either. So there's really no call for reverse DNS.

I find that turning off reverses and identd lookups makes wu-ftpd
super-fast in connecting.

=Rob=
-------------------------------------------------------------
From: Lord Apollyon
Subject: Re: wu-ftpd vs. betaftpd performance comparison

In article <388DEDF0.CDB478A9@alumni.caltech.edu>, Dan Kegel
wrote:

> Server nearly unusable interactively with wuftpd loading it down,
> other servers were much lighter on system.

It's possible wu-ftpd's buffer sizes are too generous. 120 users x 64
== about 8MB just for buffers. On a 32MB box, that's pretty wicked.

Try editing wu-ftpd's root-level config.h file, adding the lines (be
sure they override whatever settings for these exist within the file):

#define BUFFER_SIZE 12288
#undef USE_RFC931
#define NO_DNS
#define PARANOID 1
#define DAEMON 1

And try it out with that. On your 32MB box, basically, the smallest
ftpd will win, so wu-ftpd will never be the leader... but I think it
could be a bit better. Also, be sure you're building it with -s -O2
-fomit-frame-pointer -m486 to make the smallest binary. betaftpd is
like 30k, with a small footprint I'd wager.






分享到:

我的QQ群:500人财富群11470502;投资群5920530;资源群6648659;交友群5713862;娱乐群6925950。
我的博客:http://104508155.qzone.qq.com/
dsj重新编辑

 [作者]dsj [头衔]论坛坛主 [经验]220862 [等级]大主帅  [发帖]15642  [回帖]1366 [登陆]7956
[发表时间]2003/4/14 22:51:10 [1楼]
3.ftp server中限制用户活动目录的最简单方法

 proftpd中我就不多说啦proftpd.conf中Defaultroot ~ testgroup,!staff---即可-testgroup是要限的组,staff随意起。主要是wu-ftpd--我看到方法是用guest和匿名来做-能实现--不过这种方法在我看来早就过时啦-因为还要cp /bin /lib等文件-麻烦死--其实这个问题早就解决啦-用这个语法restricted-uid *
unrestricted-uid siteadm--说明第一句是限制所有的用户-第二句允许指定用户向上走。

4.Apache反应慢的最主要参数maxclients

 有时linux资源还很多-可是IE中连接极慢--这有可能是达到了maxclients数-Apache在等待空闲子进程的释放-可用ps -ef |grep http |wc -l来看进程数,除了主进程和grep把这个数减2应该是子进程数。httpd.conf中缺省是150这个很不够-如你内存大-cpu强-可改为256--要是想再多就要改源码啦apache_1.3.19/src/include/httpd.h--改#define HARD_SERVER_LIMIT 1024
#else
#define HARD_SERVER_LIMIT 256中的256再重编译即可。

5.在用户ftp登录时显示他的空间限制大小和已用空间及i节点数

 这个技巧非常有用-可是fei发现的呀:-)别的技术站上绝对找不到的!所以你要常来linuxforum呀(不许做广告!我打)--闲话少说-具体实现/etc/ftpaccess中message /welcome.msg login all %B %b %Q
message .message cwd=* all %B %b %Q
再在/welcome.msg中写上-hello-你的空间硬限制是%B,软限制是%b,用了%Q--即可--这里主要是用了wu-ftpd的magic cookie技术--大家可看一下ftpaccess的man还有很多magic cookie字符,比如%I,max i nodes,%i perfer i nodes, %q已用i nodes数等。

6.php4在Apache2下的编译方法

  一般来说php做为Apache1.3模块可用--with-apache或--with-apxs=/path/apxs来生成,但是如果是Apache2如2.0.16beta则会提示找不到httpd.h哪怕你的apache2做了预configure也不行--其实php的configure有个--with-apxs2选项是用于Apache2的--用它即可加入到Apache2中做为DSO模块。目前php的开发版是4.3-dev-下载请http://snaps.php.net/php4-latest.tar.gz
然后用--with-apxs2指令apache2的apxs,make,make install然后加入LoadModule php4_module modules/libphp4.so -这行会动加进去
AddOutputFilter PHP .php
AddInputFilter PHP .php
AddType text/html .php
写一个<? phpinfo() ;?>大家看看吧--我安装的例http://202.96.64.144:81/index.php大家可以看看

 7.ApacheDSO模式详解原理篇

这算是fei译的文章吧--对学习DSO应该会有帮助--毕竟DSO在Apache中可是越来越重要啦。
- 那么DSO究竟是什么?事实上DSO是Dynamic Shared Objects(动态共享目标)的缩写,它是现代Unix派生出来的操作系统都存在着的一种动态连接机制。它提供了一种在运行时将特殊格式的代码,在程序运行需要时,将需要的部分从外存调入内存执行的方法。Apache在1.3以后的版本后开始支持它。因为Apache早就使用一个模块概念来扩展它的功能并且在内部使用一个基于调度的列表来链接扩展模块到Apache核心模块.所以,Apache早就注定要使用DSO来在运行时加载它的模块。

在mod_ssl和mod_rewrite的作者Ralf S. Engelschall(在我看来他是真正的Apache大师和主要开发者之一,他的个人主页上 的名篇“Apache 1.3 Dynamic Shared Object (DSO) Support”
中对DSO模式的原理有着比较详尽的叙述(本文基本基于此)。


让我们先来看一下Apache本身的程序结构:这是一个很复杂的四层结构--每一层构建在下一层之上。

第四层是用Apache模块开发的第三方库--比如open ssl一般来说在Apache的官方发行版中这层是空的,但是在实际的Apache结构中这些库构成的层结构肯定是存在的。

第三层是一些可选的附加功能模块--如mod_ssl,mod_perl。这一层的每个模块通常实现的是Apache的一个独立的分离的功能而事实上这些模块没有一个是必须的,运行一个最小的Apache不需要任何一个此层的模块。

第二层是Apache的基本功能库-这也是Apache的核心本质层--这层包括Apache内核,http_core(Apache的核心模块),它们实现了基本HTTP功能(比如资源处理(通过文件描述符和内存段等等),保持预生成(pre-forked)子进程模型,监听已配置的虚拟服务器的TCP/IP套接字,传输HTTP请求流到处理进程,处理HTTP协议状态,读写缓冲,此外还有附加的许多功能比如URL和MIME头的解析及DSO的装载等),也提供了Apache的应用程序接口(API)(其实Apache的真正功能还是包含在内部模块中的,为了允许这些模块完全控制Apache进程,内核必须提供API接口),这层也包括了一般性的可用代码库(libap)和实现正则表达式匹配的库(libregex)还有就是一个小的操作系统的抽象库(libos)。

最低层是与OS相关的平台性应用函数,这些OS可以是不同现代UNIX的变种,win32,os/2,MacOS甚至只要是一个POSIX子系统。

在这个复杂的程序结构中有趣的部分是---事实上第三层和第四层与第二层之间是松散的连接,而另一方面第三层的模块间是互相依赖的--因这种结构造成的显著影响就是第三层和第四层的代码不能静态地连接到最低层平台级的代码上。因此DSO模式就成了解决它的一种手段。结合DSO功能,这个结构就变得很灵活了,可以让Apache内核(从技术上说应该是mod_so模块而不是内核)在启动时(而不是安装时)装载必要的部分以实现第三层和第四层的功能。

DSO在程序运行时将需要的部分从外存调入内存执行存取通常会有两种途径:一种是ld由系统在程序开始时自动载入,这种载入可以由两种途径实现:一种是自动由系统在可执行程序开始时调用ld.so来执行。另一种是手动,是通过在执行程序里程序系统界面到Unix装载程序通过系统调用tdlopen()/dlsym()来执行的.
那么具体来说Apache是怎么实现DSO功能的呢?DSO支持调用特别的Apache模块是基于一个名叫mod_so.c的模块,这个模块必须静态的编译Apache的核心。这是除了http_core.c以外仅有的模块不可以被放到DSO自己(bootstrapping!)。 实际上所有的别的发布的Apache模块都可以被放置到DSO,通过个别的通过设置被DSO建立允许--允许可能的-共享设置(看顶层的INSTALL文件)或者通过改变AddModule命令在你的src/Configuration到SharedModule命令(看src/INSTALL文件)。
在编译一个模块到一个名字叫mod_foo.so的DSO以后,你能够使用mod_so的LoadModule命令在你的httpd.conf文件里在服务程序开始时或重新启动以后调用这个模块。

为了简化这种为了Apache模块而创建DSO文件的方法(尤其是第三方模块),一个新的名叫apxs的支持程序(APache eXtenSion)被使用.它可以用来建立基于DSO的模块,模块位于Apache源码树以外。这个思路很简单:当安装Apache时,设置使安装程序安装Apache C 头文件并且放置平台支持的编译器和链接程序标志,用来建立DSO文件到apxs程序。通过这种方法,用户可以使用apxs来编译它的Apache模块源代码而不用Apache发布源代码树并且不用手动的添加平台支持的编译程序和谅解程序的标志来获得DSO支持。

为了放置编译好的apache核心程序到一个DSO库(仅仅在一些支持的平台上需要强迫链接程序输出Apache核心的地址码--一个DSO模块化的先决条件)规定的SHARED_CORE必须能够通过设置--允许-规定=SHARED_CORE设置(看顶层的INSTALL文件)或者通过改变Rule命令,在你的Configuration 文件里规定SHARED_CORE=yes (看src/INSTALL文件).Apache核心代码接着被放置到一个名叫libhttpd.so的DSO库。因为静态库不能够在所有的平台上被链接成为一个DSO,一个附加的名叫 libhttpd.ep的可执行程序被创建,这个程序不但包含这个静态代码而且有提供main()剩余部分 的功能.最后,httpd程序自己被用bootstrapping代码替换,后者自动确定Unix调度程序能够装载并且开始libhttpd.ep,它通过提供LD_LIBRARY_PATH到libhttpd.so的方法实现.
最后我们再来说说Apache DSO模式支持的平台和它的优缺点--应该说目前DSO模式基本可运行在任何unix平台上--除了ultrix(因为它没有动态(库)装载器即:No dlopen-style interface under this platform).它的优点是服务器包能够在运行时更加灵活并且服务器包能够简单的用第三方模块来扩展,那怕是在安装之后。但同时DSO模式也有一些缺点如:

1、不能工作在所有平台下比如刚才说的不支持动态连接的ultrix。

2、Apache会在启动时慢大约20%,因为要做一些前置作业,而地址码的解决现在需要UNIX调度程序来做。 服务器在某些平台在执行时会慢5%,因为相对地址代码(PIC)有时在不必要时也会需要重新编译相对寻址,所以没有绝对地址快.因此有时DSO不会提高速度。

3、因为DSO模块会在个别平台上与别的基于DSO的库(ld -lfoo)发生冲突(例如a.out-based 平台经常不支持这个功能,但是ELF-based平台支持)你不能为所有类型的模块使用DSO机制(即不是所有的DSO模块都能被加载)。 或者换一句话说,模块作为DSO文件编译是受限制,只能使用APACHE核心地址码,APACHE核心使用的C库(libc)和所有的别的动态和静态的库,或者静态库档案(libfoo.a)包含的独立的代码。唯一使用别的代码的办法是或者确定APACHE核心自己早就包含自己的参考,通过dlopen()调用代码自己,或者在建立APACHE时允许SHARED_CHAIN规则(当你的平台支持不用DSO库链接DSO文件)。

在一些平台下(许多SVR4系统)在链接Apache httpd可执行程序时没有办法强迫链接程序输出所有全部的DSO所用的地址.但是没有可见的Apache核心地址码就没有标准的Apache模块能够作为DSO使用.唯一的办法是使用SHARED_CORE特性,因为这种方法使全部的地址码都被强制输出。作为结果,Apache src/Configure script自动强制SHARED_CORE在这些平台上,当DSO特性被用在Configuration文件或者在configure命令行.

谈了这么多--都是原理性的东西--好象与我在序言中的实用性有些不符--其实DSO在Apache中是很重要的方面-也是比较高端的内容-要用好它需要对它的原理有所了解-另本文不足之处请大家指教批评-

-----注:参考文献

Ralf S. Engelschall--
Apache 1.3 Dynamic Shared Object (DSO) Support
软件屋linux之家的中文翻译。
 


我的QQ群:500人财富群11470502;投资群5920530;资源群6648659;交友群5713862;娱乐群6925950。
我的博客:http://104508155.qzone.qq.com/

 [作者]dsj [头衔]论坛坛主 [经验]220862 [等级]大主帅  [发帖]15642  [回帖]1366 [登陆]7956
[发表时间]2003/4/14 22:55:19 [2楼]
8.Apache中实现netants和flashget的单IP并发进程数限制!

 netants对多点下载的人说不错--不过对我们网管来说就---太占http进程啦--其实到Apache1.3.19还没本身实现单IP的http并发进程数限制-但其实是可以实现的-这个技巧也是fei从朋友那得到的--绝对是网上您能唯一看到的地方哈哈-转载属fei的名呀-要不您可真不够意思-好--说说怎么实现--要用mod_headers模块-在src/modules/standard中有-不过缺省不装-你一定要编译进去然后用 Header add Netants "Maxconnection=3"语句给netants客户端发个http头标告诉并发进程数--3可以改为1-就是一个进程-事实上这是netants的作者特意为我们网管留的接口--看看netants的help就有啦!哈哈-不过您的网速连接太快是有可能冲破的-就是头标还没收到就--那就没法啦--注意:这个只针对netants--别的如flashget嘛-对于网络管理员,FlashGet同样提供了可以限制FlashGet建立太多的连接,可以在FTP和HTTP服务器的欢迎信息中添加如下列就可以限制单一用户的同时连接数目FlashGet: MaxConnection=value 

 9.Apache重起的最好方法apachectl graceful!

 起动Apache有很多种方法-但实质都是调用httpd--fei一般只用Apachectl好用简单apachectl是控制Apache的脚本-start,stop,restart就不用说了---configtest是看配置文件的语法有没有错误-有就会指出哪行-什么错--主要是调试用.status是如果你加载了mod_status模块后调用lynx显示apache的工作状态.主要是graceful---完美的重起--我推荐每次重起都用它不用restart--那么它与restart的不同---可以写一篇文章啦--概括的说restart向apache主进程发送一个SIGHUP信号--而graceful发的是SIGUSER1信号--发送HUP信号给主进程将导致结束它的子进程, 就想TERM(stop)信号一样,但是主进程将不会终止. 它将重新读取配置文件, 并且重新打开所有的日志文件. 然后重新产生所有子进程并继续为点击操作提供服务.而USR1 信号引起主进程处理并警告收到当前请求之后的子进程结束(或在它们不做任何服务时立刻结束). 主进程将重新读取它的配置文件并打开它的日志文件. 当每一个子进程结束后,主进程将使用配置信息产生一个新的子进程来立刻响应请求并为之服务. --好象挺复杂的是吧--主要是知道graceful要比restart 好就行了-呵呵 

10.用Apache与Mysql整合实现基本的身份认证

 Apache来实现基本的用户身份认证有很多种方式,比如最常见的txt文本和DBM格式,但在负载很重的server上-这些都不是理想的方法,文本的形式是基于平面的,性能很差而且也不安全;DBM好些但在千或万级用户时还是力不从心,于是用database做后台存储则是很好的方法-比平面搜索更有效而且安全,用户口令以DES加密形式存储在数据库的表中。
这种实现要归功于Apache本身出色的模块化结构--以及开放的DSO方式,可以使开发人员完成大量的第三方模块,并扩充Apache的功能。我在本文中只写了用Mysql做后台存储--此外还可用Postgresql,Oracle等来完成,原理一样-都是用各自的模块。
让我们开始吧--先去modules.apache.org(这可是Apache第三方模块的大本营)找到mod_auth_mysql--会有两个我们要用DSO那个-事实上直接ftp://ftp.kcilink.com/pub/下一个mod_auth_mysql.c.gz就行-好-把它解开是一个mod_auth_mysql.c-好-我们用apxs来生成DSO模块(前题是你用DSO模式编译的Apache)--apxs -c -i -a -L/usr/local/lib/mysql -lmysqlclient >-lm mod_auth_mysql.c即可--这里注意一定要这么写---L/usr/local/lib/mysql是mysql的客户库位置,我假定mysql是用的缺省安装)---如果不加在起动Apache时会报错-无法装载此模块。
好-看看httpd.conf中应该有LoadModule mysql_auth_module libexec/mod_auth_mysql.so和AddModule mod_auth_mysql.c这两句了,重起Apache也不应该有问题。
然后我们进入mysql,mysql>create database auth;
mysql>use auth;
mysql> create table mysql_auth (
-> user_name char(20) not null,
-> user_passwd char(25),
-> groups char(25),
-> primary key (username) );
注意字段名一定是user_name和user_passwd这个。再插入几条记录:
mysql> insert into mysql_auth values('xingfei2',encrypt("abcde"),'xingfei');
Query OK, 1 row affected (0.00 sec)
mysql> insert into mysql_auth values('xingfei',encrypt("abcde"),'xingfei');
Query OK, 1 row affected (0.00 sec)
这里abcde是口令-用encrypt函数来进行加密,用的是DES算法-这是和unix的password等同的算法-而不是mysql本身加密的password()函数。
最后在要保护的目录里建一个.htaccess(别忘了把AllowOverride all打开)内容如下:
authname "xingfei"
authtype basic
AuthMySQLHost localhost ---mysql主机名
authmysqluser root ---mysql用户
authmysqlpassword abc ---mysql用户的口令
AuthMySQLDB auth ---用户所用的库-也就是我们建的库
AuthMySQLUserTable mysql_auth ---所用的表
AuthMySQLGroupField groups ---用户组的字段名
require group xingfei
require user xingfei
可以把用户都放在一个组里-只要是这个组里的用户即可通过认证。-也可require单个或多个用户。

11.由unknownuser提供用RH7.1上Apache自带的mod_bandwith用法!

怎么用RH7.1上Apache自带的mod_bandwith.o进行并发与带宽限制?? 作者 unknownuser
时间 06/29/01 09:54 PM



mod_bandwidth.c

在使用该模块之前(假定已经编译完成),必须要提供几个个目录给该模块写权限以产生
流量控制的临时文件。默认为:
/tmp/apachebw
/tmp/apachebw/link
/tmp/apachebw/master
这些目录的位置可以在源码中(#define )更改。

语法及作用:
* BandWidthModule
该模块的开关,可以对每个Server进行配置

* BandWidthPulse
设定计时单位,MS(微秒),建议为:1000000 (1秒)

* BandWidth
可以针对特定来源的对象控制流,rate以字节为单位,但当rate为0时,为不限制流速。
例子:

BandWidth ecp.fr 0
BandWidth 138.195 0
BandWidth all 1024


* LargeFileLimit
当传送一个大于等于filesize KB大小的文件时,设定一个最大流速(字节/秒),当rate
为0的时候,不限速。
例子:
LargeFileLimit 200 3072
LargeFileLimit 1024 2048
以上例子设定小于200KB的文件将不会被限制流速,大小在200K到1024K之间的文件将会被
限速3072 B/s,大于1024KB的文件将会被限速2048 B/s.

* MinBandWidth
设定每个连接传送数据的基本带宽占用,以Byte为单位。默认值:256 B/s。
当rate设定为0时,使用默认带宽限制。

更详细的文档参见源码。 源码来源:
http://www.cohprog.com/
http://www.animanga.com/

12.修改Apache对外显示版本号等信息的方法 [

 改path/to/apachesrc/src/include/httpd.h 中的#define SERVER_BASEREVISION "1.3.20"为你想要显示的版本--如10000然后在 configure时就会看到Configuring for Apache, Version 10000  


我的QQ群:500人财富群11470502;投资群5920530;资源群6648659;交友群5713862;娱乐群6925950。
我的博客:http://104508155.qzone.qq.com/
dsj 2003/4/15 22:19:30

 [作者]dsj [头衔]论坛坛主 [经验]220862 [等级]大主帅  [发帖]15642  [回帖]1366 [登陆]7956
[发表时间]2003/4/14 23:00:14 [3楼]
13.如何取消redhat7.1安装时的默认防火墙规则

redhat7.1缺省过滤了很多服务--看看如何关掉它吧。
如何取消redhat7.1安装时的默认防火墙规则
ideal
Redhat7.1系统在安装时会让用户选择防火墙安全级别,用户选定以后就会定义一些防火墙规则,而用户随后在使用时往往出现不能访问莫个服务的情况。取消redhat7.1的默认防火墙规则的方法如下:
/etc/rc.d/init.d/ipchains stop
/etc/rc.d/init.d/iptables stop
chkconfig --level 35 ipchains off
chkconfig --level 35 iptables off
这样就会取消防火墙规则,用户重新启动以后也不会有防火墙规则定义。

 14.用vhost_alias模块实现泛域名解析

一般我们常用的是Mod-rewrite模块-感谢他提供的这种方法!在DNS中设好*.abc.com到IP后把vhost_alias模块配置进apache里面然后
UseCanonicalName Off
VirtualDocumentRoot /somwhere/%1.1%1.2/%1

(这里使用了这种目录结构:
建立两级目录,用户abcdef的位置将会在
/somewhere/ab/abcdef
123456用户的位置将会在:
/somewhere/12/123456)


如果嫌麻烦的话可以直接只使用一级目录结构,指定:
VirtualDocumentRoot /somewhere/%1
(%1指的是客户机提交形如abcdef.yourhost.org的http请求时,abcdef 这一部分,如果采用更加复杂的方案,请参阅apache文档。)

15.SGI的Apache性能补丁(据说能快10倍!)!

 根据我的经验,使用Apache1.3.20比redhat7.1带的Apache速度要快很多。编译时把不用的模块去掉。SGI为Apache做了一个多线程的patchhttp://oss.sgi.com/projects/apache/),经过我的测试,能提高Apache的性能,虽然不象他们所说得那么神奇(SGI官方说可以快10倍!)。
用patch -p1 < 10xpatch-1.3.x-n打补丁。用httpd -v证实加没加进去--如看到类似[root@www bin]# ./httpd -v
Server version: Apache/1.3.20 (Unix) (10xpatchlevel 1.3.20-0)
Server built: Aug 6 2001 09:58:34
Performance Tuned by SGI 则说明正确。
以下是我的测试结果(pIII600+128MRAM+redhat7.1+100MNIC)共参考:
apache1.3.20+patch 2200Req/s
redhat7.1自带的apapche 900Req/s
tux 2900Req/s (受到了网络带宽限制,估计可以达到9000Req/s)
IIS 1000Req/s 大家可以试试

16。proftpd中实现上传下载的文件的最大大小限制!

 最近感觉proftpd--在各方面都已超过了wu-ftpd-- 无论是安全性上--功能上--可扩展性上-性能上--别忘了proftpd已是mandrake8.0以后的缺省ftp server了:)--我认为proftpd会成为以后ftpserver的老大-。在技术它是先进的-在配置上它和Apache的语法很象的,而且它的模块化同样和Apache很象。
最近有朋友问如何实现ftp server中上传文件的最大值--在proftpd中本身好象没有这个功能--需要一个第三方补http://rad.geology.washington.edu/~tj/proftpd/patches/proftpd-max-file-size-patch.tar.gz
至于怎么用看看readme就知道了Problem
------------------------------------------------------------------------

Many FTP administrators would like to be able to place size limits on
any single file that a client might upload. Others, though less common,
would like to place similar size restrictions on the size of files
downloaded from their servers.

----------------------------------------------------------------------------
Solution
----------------------------------------------------------------------------

Create two new configuration directives, MaxRetrieveFileSize (for
download restrictions) and MaxStoreFileSize (for upload restrictions).

Syntax: MaxRetrieveFileSize number[units]|*
Default: None
Context: server config, , , ,
, .ftpaccess
Module: mod_xfer
Compatibility: 1.2.2rc1 and later

When downloading files to clients (eg serving a RETR request), the
server will check for any configured limit against the size of the file
being requested, and abort any transfers if the requested file's size
exceeds the configured limit.

A single "*" argument configures unlimited file sizes, and is used
primarily to override any inherited restrictions from higher contexts.
The given number is the number of bytes for the limit, and may be followed
by an optional "units" specifier of (case-insensitive) G (Gigabytes),
M (Megabytes), K (Kilobytes), or B (bytes). If the units specifier is
used, the given number of bytes is multiplied by the appropriate factor.

Example:

# restrict downloads to only 1 gigabyte
MaxRetrieveFileSize 1g

See Also: MaxStoreFileSize

-----------------------------------------------

Syntax: MaxStoreFileSize number[units]|*
Default: None
Context: server config, , , ,
, .ftpaccess
Module: mod_xfer
Compatibility: 1.2.2rc1 and later

When uploading files from a client (eg serving a STOR request), the
server will check for any configured limit against the size of the file
being sent, and abort any transfers if/when the given file's size
exceeds the configured limit.

A single "*" argument configures unlimited file sizes, and is used
primarily to override any inherited restrictions from higher contexts.
The given number is the number of bytes for the limit, and may be followed
by an optional "units" specifier of (case-insensitive) G (Gigabytes),
M (Megabytes), K (Kilobytes), or B (bytes). If the units specifier is
used, the given number of bytes is multiplied by the appropriate factor.

Example:

# restrict upload to only 3 megabytes
MaxStoreFileSize 3m

See Also: MaxRetrieveFileSize

17。把Proftpd登录时显示的版本信息改成我们自己的!!

 Linux的软件就是好--可以DIY--:)-要是大家觉得ftp登录时220 ProFTPD 1.2.2 Server (ProFTPD Default Installation)--这个有透露秘密之嫌-简单的ServerIdent off即可关掉-不过让我们自己动手改成我们想要的--当然是改源码啦--来吧--解开tar.gz--进入proftpd的目录--进入include--改version.h--#define VERSION "1.2.2"
/* VERSION_STATUS is reported by --version-status
* don't ask why
*/
#define VERSION_STATUS "1.2.2 (release)"
#define INTERNAL_VERSION 0x01020001--改什么一目了然吧。--呵呵--这是版本号--那么220 ProFTPD
1.2.2 Server在哪改呢?进入src/--vi main.c--查找ProFTPD的字串吧--都改成你想要显示的就好啦:)-至于ProFTPD Default Installation就不用我说了吧--改proftpd.conf中的ServerName "ProFTPD Default Installation"为你想要的吧:) 

18。改变wu-ftpd的登录提示

用greeting就行--语法如下--很明了吧。 greeting full|brief|terse

greeting text

Allows you to control how much information is given out before the remote user logs in.
'greeting full' is the default and shows the hostname and daemon version. 'greeting
brief' whose shows the hostname. 'greeting terse' simply says "FTP server ready."
Although full is the default, brief is recommended.

The 'text' form allows you to specify any greeting message you desire. can
be any string; whitespace (spaces and tabs) is converted to a single space

 19.proftpd+mod_sql+mod_mysql安装文档

proftpd+mod_sql+mod_sql_mysql安装
1.前言:
千辛万苦总算搞好了(没办法,谁叫我是初手),不敢独享,也希望能给那些在这个问题上如我当初般

彷徨的朋友一点帮助(当然,我现在也只是略知一二)我的邮箱keggs@sina.com,欢迎各位一齐讨论.

想搞这个的初衷是想搞个立即可以开通的个人竹叶服务,用户通过提交申请后,竹叶可以立即开通,

而且ftp可以立即上载,不需收工添加用户.且要通过www可以管理用户ftp帐户(php),开始是想通过

proftpd+mod_ldap实现,不过可能是我对ldap的无知,编译带mod_ldap模块的proftpd总是不成功.

(我在论坛提出过编译的问题),所以就另想办法了,于是有了这篇东西.

2.软件:

proftpd-1.2.1.tar.gz

mod_sql-3.2.4.tar.gz(不要这个也行,因为proftpd包里已经有了,这个包是单独的mod_sql.c和

mod_sql_mysql.c以及一些帮助文档).

mysql-3.23.41.tar.gz

3.安装mysql.

这里就不说了.记住安装目录(例如/usr/local/mysql).

安装好后,建立ftpusers数据库,然后建一个users表.命令如下.

CREATE TABLE users (

userid text NOT NULL, #用户名

password text NOT NULL, #用户密码

homedir text NOT NULL, #用户目录

count int(11) NOT NULL, #用户登录次数(初始填0)

shell text NOT NULL #用户shell

);

然后插入一条数据,例如:

INSERT INTO users VALUES( 'keggs', 'mypassword', '/home/keggs', '0', '/bin/bash');

4.安装proftpd

tar -xvzf proftpd-1.2.1.tar.gz

cd proftpd-1.2.1

./configure --prefix=/usr/local/proftpd \

--with-includes=/usr/local/mysql/include \

--with-libraries=/usr/local/mysql/lib/mysql \ (注意与上一行的区别,看出来了么?)

--with-modules=mod_sql:mod_sql_mysql

make

make install

(注意:includes和libraries的指向的区别,原来我的includes也是指向了/usr/local/mysql/include/mysql,

编译时出现找不到mysql.h的提示,这主要是mod_sql_mysql.c里面定义mysql.h它自己加了mysql目录.

你也可以更改mod_sql_mysql.c里面关于mysql.h的include命令)

5.修改proftpd.conf.

添加如下:

SQLConnectInfo ftpusers@studio.keggs.net root password #连接mysql的ftpusers数据库,根据你的情况修改.

SQLDoGroupAuth off #因为我们只建了users表,proftpd默认是要用groups表的,这里是关掉组认证

SQLAuthTypes Plaintext #密码以明文形式认证.

SQLDoAuth on #打开sql认证

SQLHomedirOnDemand on #如果用户目录不存在,则自动建了.

SQLUserTable users #定义存放用户信息的表

SQLUsernameField userid #定义用户名字段

SQLPasswordField password #定义密码

SQLHomedirField homedir #定义用户目录

SQLLoginCountField count #定义登录次数

SQLShellField shell #定义登录shell

SQLAuthoritative off #除了可以进行sql认证,系统用户等别的认证方式也可以.

6.编辑/etc/group,添加gid=65533的组ftpusers(SQLHomedirOnDemand on就是用这个组来建立用户目录)

7.ftp localhost试一试,可以查看/var/log/messages看错误信息.

8.这里再罗嗦两句,可能你在messages里会看到,连接数据库失败的信息,如果数据库名,用户名,密码都

没错,那么也许是你的mysql不允许除了localhost以外的连接,那么你需要在数据库host表里增加相应

的主机信息,这个问题我遇到过,如果你也遇到,不妨看看是不是这方面的原因.



9.现在你可以写个php来管理ftp帐户了,爽吧?!
fei,写完安装文档后由于一直比较忙,对于文中需要补充的地方一直没有说明,
今天看到你把我的文章贴到精华区,为了不误了广大同好,连夜赶了一篇补充,
希望不要见怪,最好把这个补充进去.



补充:关于proftpd非系统用户的uid和gid.

大家也许注意到了,在上篇安装文档里mysql里的用户表我没有建立指定用户uid和gid的值的字段,
那么proftpd自动建立的用户目录将属于哪个用户和组??正如你看到的,执行ls -l /用户目录,用户目录
属于uid=65533,gid=65533, 疑问:难道不能让用户目录属于用户自己么?答案当然是肯定的.
其实在proftpd里面有许多参数是没有设定,而使用系统默认值的,以下4个就是控制建立的用户目录
是不是属于用户自己
SQLMinUserGID #默认值999
SQLMinUserUID #默认值999
SQLDefaultGID #默认值65533
SQLDefaultUID #默认值65533
(如要自己设定以上几个值,注意SQLDefaultGID必需大于SQLMinUserGID
SQLDefaultUID必需大于SQLMinUserUID)
如果:用户gid>SQLMinUserGID 用户目录将属于用户gid
用户gid
如果: 用户uid>SQLMinUserUID 用户目录将属于用户uid
用户uid
(例如:在不设定以上4值的情况下,如果用户gid=1000,uid=1000,那么用户目录将属于1000,1000)
现在你可以给用户表增加名为uid和gid的两个字段,指定用户uid和gid了.
在proftpd.conf中增加如下:
SQLUidField uid
SQLGidField gid 
 


我的QQ群:500人财富群11470502;投资群5920530;资源群6648659;交友群5713862;娱乐群6925950。
我的博客:http://104508155.qzone.qq.com/
dsj 2003/4/15 22:20:40

 [作者]dsj [头衔]论坛坛主 [经验]220862 [等级]大主帅  [发帖]15642  [回帖]1366 [登陆]7956
[发表时间]2003/4/14 23:02:33 [4楼]
20。改xinetd中实例限制(如ftp最大人数)及xinetd完全指南!

 redhat7.0以后inetd都已换成xinetd了--好用了很多。先看一下/etc/xinetd.conf--instances最大实例数--如果你用的是wu-ftpd-最大人数60那就改这个了。注意最后一句includedir其实是把telnet,wu-ftpd等脚本包含到此文件中的--直接写在这也行。
defaults
{
instances = 60
log_type = SYSLOG authpriv
log_on_success = HOST PID
log_on_failure = HOST
cps = 25 30
}

includedir /etc/xinetd.d
这篇xinetd完全指南已非常全了--看了它你对xinetd就会很熟了:)
许多人在装了redhat 7.x后开始找不到北!!!(我就是其中一个)
因为redhat 7.x开始注重系统安全,最大的特征就是用xinetd.conf代替原来的inetd.conf
并且7.1中默认安装没有开ftp,telnet等熟悉的服务,而是更安全的ssh!
7.1还加入firewall等服务
(感谢paradise提供下载地点给我安装redhat7.1)

大家对被称作超级服务器的Inetd一定很熟悉,其实现控制对主机网络连接。当一个请求到达由Inetd管理的服务端口,Inetd将该请求转发给名为tcpd的程序。Tcpd根据配置文件hosts.{allow, deny}来判断是否允许服务该请求。如果请求被允许则相应的服务器程序(如:ftpd、telnetd)将被启动。这个机制也被称作tcp_wrapper.

xinetd(eXtended InterNET services daemon)提供类似于inetd+tcp_wrapper的功能,但是更加强大和安全。它能提供以下特色:

* 支持对tcp、ucp、RPC服务(但是当前对RPC的支持不够稳定)

* 基于时间段的访问控制

* 功能完备的log功能,即可以记录连接成功也可以记录连接失败的行为

* 能有效的防止DoS攻击(Denial of Services)

* 能限制同时运行的同意类型的服务器数目

* 能限制启动的所有服务器数目

* 能限制log文件大小

* 将某个服务绑定在特定的系统接口上,从而能实现只允许私有网络访问某项服务

* 能实现作为其他系统的代理。如果和ip伪装结合可以实现对内部私有网络的访问

 它最大的缺点是对RPC支持的不稳定性,但是可以启动protmap,与xinetd共存来解决这个问题

编译安装

可以从www.xinetd.org下载xinetd,当前最新的版本是xinetd 2.1.8.8p3。默认编译和安装xinetd是非常简单的,按照如下的步骤进行:

#./configure; make; make install

即可完成。

在进行configure时,可以支持如下几个有用处的选项:

--with-libwrap : 如果使用该选项xinetd将会察看tcpd配置文件(/etc/hosts.{allow, deny})来进行访问控制,但是如果要利用该功能,系统上必须安装有tcp_wrapper和相关库。

--with-loadavg : 使用该选项,xinetd将而已处理max-load配置选项。从而在系统负载过重时关闭某些服务进程,来实现某些DoS攻击。

--with-inet6 : 使用该选项xinetd将支持IPv6。

如果是是用redhat7.0,则其默认将安装xinetd,而不需要自行安装。

配置

xinetd的默认配置文件是/etc/xinetd.conf。其语法和/etc/inetd.conf完全不同且不兼容。它本质上是/etc/inetd.conf和/etc/hosts.allow,/etc/hosts.deny功能的组合。/etc/xinetd.conf中的每一项具有下列形式

service service-name
{
     ……。
}

其中service是必需的关键字,且属性表必须用大括号括起来。每一项都定义了由service-name定义的服务。

Service-name是任意的,但通常是标准网络服务名,也可增加其他非标准的服务,只要它们能通过网络请求激活,包括localhost自身发出的网络请求。有很多可以使用的attribute,在下表中进行了详细的说明。稍后将描述必需的属性和属性的使用规则。

操作符可以是=,+=,或-=。所有属性可以使用=,其作用是分配一个或多个值,某些属性可以使用+=或-=的形式,其作用分别是将其值增加到某个现存的值表中,或将其值从现存值表中删除。表10.10中说明了可以用后一种形式的属性。

Value是为给定属性设置的参数。

表1 扩展的lnernet服务进程属性

属 性
描述和允许值

Socket_type
使用的TCP/IP socket类型,值可能为stream(TCP), dgram(UDP), raw和seqpacket(可靠的有序数据报)

protocol
指定该服务使用的协议,其值必须是在/etc/protocols中定义的。如果不指定,使用该项服务的缺省协议。

Server
要激活的进程,必须指定完整路径

Server_args
指定传送给该进程的参数,但是不包括服务程序名

Port
定义该项服务相关的端口号。如果该服务在/etc/services中列出,它们必须匹配

Wait
这个属性有两个可能的值。如果是yes,那么xinetd会启动请的进程并停止处理该项服务的请求直到该进程终止。这是个单线程服务。如果是no,那xinetd会为每个请求启动的一个进程,而不管先前启动的进程的状态。这是个多线程服务

User
设置服务进程的UID,但是若xinetd的有效UID不是0,该属性无效

Group
设置进程的GID。若xinetd的有效UID不是0,这个属性无效

Nice
指定进程的nice值

Id
该属性被用来唯一地指定一项服务。因为有些服务的区别仅仅在于使用不同的协议,因此需要使用该属性加以区别。默认情况下服务id和服务名相同。如echo同时支持dgram和streama服务。设置id=echo_dgram和id=echo_streams来分别唯一标识两个服务

Type
可以是下列一个或多个值:RPC(对RPC服务),INTERNAL(由由xinetd自身提供的服务,如echo),UNLISTED(没有列在标准系统文件如/etc/rpc或/etc/service中的服务)

Access_time
设置服务可用时的时间间隔。格式是hh:mm_hh:mm; 如08:00-18:00意味着从8A.M到6P.M.可使用这项服务

Banner
无论该连接是否被允许,当建立连接时就将该文件显示给客户机

Flags
可以是以下一个或多个选项的任意组合:

REUSE:设置TCP/IP socket可重用。也就是在该服务socket中设置SO_REUSEADDR标志。当中断并重新启动xinetd

INTERCEPT:截获数据报进行访问检查,以确定它是来自于允许进行连接的位置。不能和INTERNAL服务和多线程服务不可使用该属性值

   NORETRY:如果fork失败,不重试

IDONLY: 只有在远程端识别远程用户时才接受该连接(也就是远程系统必须运行ident服务器),该标记只适用于面向连接的服务。若没有使用USERID记录选项则该标记无效log_on_success和/或log_on_failure属性设置USERID值以使该值生效。仅用于多线程的流服务

NAMEINARGS:允许server_args属性中的第一个参数是进程的完全合格路径,以允许使用TCP_Wrappers

NODELAY:若服务为tcp服务,并且NODELAY标记被设置,则TCP_NODELAY标记将被设置。若服务不是tcp服务则该标记无效

Rpc_version
指定RPC版本号或服务号。版本号可以是一个单值或者一个范围中如2-3

rpc_number
如果RPC程序号不在/etc/rpc中,就指定它

Env
用空格分开的VAR=VALUE表,其中VAR是一个shell环境变量且VALUE是其设置值。这些值以及xinetd的环境都在激活时传送给服务程序。这个属性支持=和+=操作符

Passenv
用空格分开的xinetd环境中的环境变量表,该表在激活时传递给服务程序。设置no就不传送任何变量。该属性支持所有操作符

Only_from
用空格分开的允许访问服务的客户机表。表2种给出客户机语法。如果不为该属性指定一个值,就拒绝访问这项服务。该属性支持所有操作符。

No_access
用空格分开的拒绝访问服务的客户机表。表2给出客户机语法。该属性支持所有操作符

Instances
接受一个大于或等于1的整数或UNLIMITED。设置可同时运行的最大进程数。UNLIMITED意味着xinetd对该数没有限制。

Log_type
指定服务log记录方式,可以为:

SYSLOG facility[level]:设置该工具为daemon,auth,user或loca10-7。设置level是可选的,可以的level值为emerg,alert,crit,err,warning,notice, info, debug,默认值为info

file[soft[hard]]:指定file用于记录log,而不是syslog。限度soft和hard用KB指定(可选)。一旦达到soft限,xinetd就登记一条消息。一旦达到hard限,xinetd停止登记使用该文件的所有服务。如果不指定hard限,它成为soft加1%,但缺省时不超过20MB.缺省soft限是5MB

Redirect
该属性语法为redirect=Ipaddress port。它把TCP服务重定向到另一个系统。如果使用该属性,就忽略server属性

Bind
把一项服务绑定到一个特定端口。语法是bind=Ipaddress。这样有多个接口(物理的或逻辑的)的主机允许某个接口但不是其他接口上的特定服务(或端口)

Log_on_success
指定成功时登记的信息。可能值是

PID:进程的PID。如果一个新进程没被分叉,PID设置为0。

HOST:客户机主机IP地址

USERID:通过RFC1413高用捕获客户机用户的UID。只可用于多线程流服务。

EXIT:登记进程终止和状态

DURATION:登记会话持续期

缺省时不登记任何信息。该属性支持所有操作符

Log_on_failure
指定失败时登记的信息。总是登记表明错误性质的消息。可能值是ATTEMPT:记录一次失败的尝试。所有其他值隐含为这个值。

HOST:客户机主机IP地址

USERID:通过RFC1413调用捕获客户机用户的UID。只

可用于多线程流服务。

RECORD:记录附加的客户机信息如本地用户,远程用户

和终端的类型。缺省时不登记任何信息。该属性支持所有操作符。

Disabled
只可用于defaults项(参看本小节后面的defaults项),指定被关闭的服务列表,是用空格分开的不可用服务列表来表示的。它和在/etc/xinetd.conf文件中注释掉该服务项有相同的效果。


我们首先看一个简单的例子。例1是配置文件/etc/xinetd.conf的一个范例。这两种服务的定义看上去像/etc/inetd.conf的原因是因为它们是用itox工具从/etc/inetd.conf转换得来的,只把/etc/inetd.conf项对应转换成适当的xinetd语法。这样,这些属性(在大括号中的=号的左边)意义是非常直接的,其相关值(在大括号中的=号的右边)也是如此。

例1 文件/etc/xinetd.conf中的一部分

Serice ftp

{

Socket_type=stream

  protocol=tcp

  wait=no

  user=root

  server=root

  Server_args= - 1 - a

}

Service telnet

{

  Socket_type=stream

  protocol=tcp

  wait=tcp

  user=root

  server=/usr/sbin/in.telnetd
}


创建/etc/xinetd.conf文件最容易的方法是用itox工具(该例假定当前工作目录是xinetd的编译目录):

# xinetd/itox -daemon_dir /usr/sbin /etc/xinetd.conf。itox的参数-daemon_dir /usr/sbin指定服务程序的目录位置,如果实现了TCP_Wrappers,从/etc/inetd.conf中是不能确定它的,转换完成以后,就开始增加属性和值,以限制访问并增加登记,最后要手工修改/etc/xinetd.conf以充分利用xinetd的特性;否则,如果只把/etc/inetd.conf转换为/etc/xinetd.conf, xinetd的行为就和inetd一样了。

表1详述了在/etc/xinetd.conf中最常使用的一些属性和值。当然还有许多其他属性,详细配置选项可以在安装xinetd以后通过man xinetd.conf来得到。在本小节后面的“配置实例”中,将用一些例子阐明其中的许多属性。

表2中给出only_from和no_access表的语法,定义了指定主机名,IP地址和网络的语法。注意表2中最后一项netmask的语法和之前看到的有所不同。它没有采用传统的十进制或十六进制netmask的表示方法,而是采用一个整数表示从netmask(用二进制表示)的最高位(最左端)开始起每位都为1的位数。因此,给定例子的netmask值设置为20,意味着其最左端的20位都设置为1,而余下12位设置为0,或

11111111    11111111   11110000   00000000

它是十进制netmask255.255.240.0的二进制表示。

表2 /etc/xinetd.conf的访问控制表的语法

语  法
描  述

hostname
可解析的主机名。使用和这个主机名相关的所有IP地址

IPaddress
点和十进制形式的标准IP地址,如192.168.0.1

Net_name
/etc/networks中的网络名

x.x.x.0 x.x.0.0

x.0.0.0 0.0.0.0
0作为通配符看待。如项88.3.92.0匹配从88.3.92.0到88.3.92.255的所有IP地址。项0.0.0.0匹配所有地址

x.x.x.{a,b,…}

x.x{a,b,…}

x.{a,b,…}
指定主机表。如172.19.32.{1,56,59}意味着含IP地址172,19.32.1,172.19.32.56和172.19.32.59的表

Ipaddress/netmask 
定义要匹配的网络或子网。如172.19.16.0/20匹配从172.19.16.0到172.19.31.255的所有地址




在看了这些基本属性之后,下面我们仔细讨论那些必需的属性,特定服务和一些配置实例。


必需的属性

对每种服务都必须指定某些属性。一些服务比其他服务需要更多属性,因为它们不被缺省定义(即不在/etc/services或/etc/rpc中)。表3列出了必需的属性。

表3 必需的属性

语 法
描 述

Socket_type
所有服务

Wait
所有服务

User
在/etc/services或/etc/rpc中列出的服务

Server
非内部服务

Port
不在/etc/services中的非RPC服务

Protocol
不在/etc/services中的所有RPC服务和所有其他服务

Rpc_version
所有RPC服务

Rpc_number
不列在/etc/rpc中的任何RPC服务




特定的xinetd服务 /etc/xinetd.conf文件中有4个特殊项。它们分别是defaults, servers,services和xadmin。Defaults项不是一项服务,且不需要前置service关键字(否则它会被当成称为defaults的服务对待)。这些特殊项在以下4小段中描述。


Defaults项

/etc/xinetd.conf文件中的defaults项是实现为该文件中的所有服务指定某些属性的默认值。这些默认值可被每个服务项取消或修改。表4中列出可在defaults项中指定的属性。这个表也指明了具体服务项中可以修改哪些属性。



表4 defaults可用的属性

属性
服务修改

Log_on_success

Log-on_failure

 Only_from

 No_access

 Passenv
可以用=操作符改写或用+ =或 - =操作符修改

Instances

Log_type
可以用=操作符改写

disabled
可注释掉的服务,但disabled属性可用于某个服务项内




例2是defaults项的一个实例。从中看到对所有服务而言,登记消息将通过loca14.info有选择地送到syslogd进程。对成功的服务连接,将登记PID,客户机IP地址,中止状态和连接时间。对不成功的连接企图,将登记客户机IP地址。每项服务的最大实例数设置为8。禁止两项服务:in.tftpd和in.rexecd。

defaults项从本质上提供了在整个文件中建立某些属性的默认值,它应用于没有设置这些属性的所有服务。

例2 /etc/xinetd.conf中defaults项的示例

Defaults
{
Log_type = SYSLOG loca14 info
Log_on_success = PID HOST EXIT DURATION
Log_on_failure = HOST
Instances =8
Disabled = in.tftpd in.rexecd
}


注:如果在/etcxinetd.conf文件中没有defaults项,且之后决定增加这一项,你必须中止和重新启动xinetd以使defaults生效。这对任何要增加到/etc/xinetd.conf中的新服务也是正确的。它可以如下完成。

# kill-TERM xinetd

#/ usr/sbin/xinetd

或者如果使用了启动脚本,则只需要简单执行。

#/etc/rc.d/init.d/xinetd restart



Servers项 servers特殊服务是实现提供当前运行在服务器上的进程表,以及有关这些进程的确切信息。换句话说,它提供了活动连接的列表。这对排除故障和检查xinetd状态是个有用机制。例3显示了/etc/xinetd.conf文件中的一个实例servers项。注意这项服务的类型是INTERNAL,UNLISTED,这意味着它是xinetd的内部功能,且不列在/etc/services中。使用的端口是完全任意的。

例3 servers项的示例

Service servers
{
     type = INTERNAL UNLISTED
     Socket_type = stream
     Protocol = tcp
     Port = 9997
     Wait = no
     Only_from = 172.17.33.111
     Wait = no
}

注意这项服务仅用于特定IP地址172.17.33.111,它是服务器自身的IP地址。这表示不允许任何其他主机从这个服务器获得当前运行在服务器上的进程列表。这样做的原因是显而易见的:如果这条信息可被其他系统上的主机获取,基于对当前正在运行的进程的了解就加以利用。除用于调试之外,一般不要运行该服务,因为172.17.33.111上的任何用户通过执行例4中的telnet 172.17.33.111 9997都能获取这条信息。注意xinetd仅提供这条信息就退出,不提供交互连接。例4中的输出告诉我们有两个正在运行的telnet进程(第5行和第31行),一个进程PID为5931,另一个为5961(分别为第6行和第32行),有一个ftp进程(第18行),其运行PID为5960(第19行)。

例4 servers服务的输出示例

1 $ telnet topcat 9997
2 Trying 172.17.33.111……
3 Connected to topcat
4 Escape character is ‘^]’
5 telnet server
6 Pid=5931
7 Start_time=Sat Apr 17 10:32:15 1999
8 Connection info:
9 State=CLOSED
10 Service=telnet
11 Descriptor=20
12 Flags=9
13 Remote_address=10.48.3.2,39958
14 Alternative services=
15 Log_remote_user=YES
16 Writes_to_log=YES
17 
18 ftp server
19 Pid=5960
20 Start_time=Sat Apr 17 10:49:06 1999
21 Connection info:
22 State=CLOSED
23 Service=ftp
24 Descriptor=20
25 Flags=9
26 Remote_address=172.17.55.124,2320
27 Alternative services=
28 Log_remote_user=YES
29 Writes_to_log=YES
30
31 telnet server
32 Pid=5961
33 Start_time=Sat Apr 17 10:49:20 1999
34 Connection info:
35 State=CLOSED
36 Service=telnet
37 Descriptor=20
38 Flags=9
39 Remote_address=172.17.1.3,35461
40 Alternative services=
41 Log_remote_user=YES
42 Writes_to_log=YES
43
44 Connection closed by foreign host
45 $

Services项
 services特定项的目的是提供可用服务的列表。对services特定项来说,这是个有用的排除故障工具,但为了上述同样的安全因素,可能不会去用它。尽管如此,还是要看一看它如何工作。

例5是 services项的一个示例。端口号的选择也是任意的。也应注意访问限制于topcat,这是服务器自身的主机名。

例5 /etc/xinetd.conf中services项示例

Service services
{
    type = INTERNAL UNLISTED
    Socket_type = stream
    protocol = tcp
    port = 8099
    wait = no
    Only_ from = topcat
}

对于servers服务来说,任何用户可执行telnet topcat 8099,并获得来自services服务的输出。例6给出了连接8099端口的实例信息信息。注意xinetd仅提供这条信息就退出,而不提供任何交互连接。

例6 查询services内部服务的输出

$ telnet topcat 8099
Trying 172.17.33.111……
Connected to topcat.
Escape character is ‘^]’
Servers tcp 9997
Services tcp 8099
ftp tcp 21
telnet tcp 23
Shell tcp 514
Login tcp 513
Talk udp 517
Ntalk udp 518
Pop-2 tcp 109
Pop-3 tcp 110
Imap tcp 143
Linuxconf tcp 98
Connection closed by foreign host.
$

Xadmin项

这个特定服务项提供以交互方式获得services特定服务所提供信息的方法。例7是/etc/xinetd.conf项的一个示例(端口号的选择也是任意的),类似于services和servers服务,这项服务也没有口令或其他保护,所以要谨慎设置服务的only_from项,以增强安全性。

例7 xadmin项

Service xadmin
{
    type = INTERNAL UNLISTED
    socket_type = stream
    protocol = tcp
    port = 9967
    wait = no
    Only_from = topcat
}

对前两个特定服务类型来说,你只需telnet到所列端口上,即telnet topcat 9967。和前两项服务不同,xadmin提供了一个交互环境。一旦连接到xadmin服务器上,就可执行5个命令。它们是help,show, run,bye和exit。Help命令显示其他命令以及一个简短的用法消息。Bye和exit命令都关闭这个连接。Show run和show avail命令分别提供servers和services提供的信息。

警告:像前3段中指出的一样,这些特定服务servers, services和xadmin产生的信息可用于攻击系统。可能不需要一直运行这些服务,或许只当你调试时才需要。在任何时候,如果的确运行了这些服务,要确信用access_from和/或no_access配置了访问控制。也可以为这些服务使用bind属性以进一步限制访问。

配置实例
 这节中将看到一些不同的例子,与之相关的行为以及它们产生的登记消息。

访问控制

从一个简单的访问控制例子开始。在例10中,服务器topcat的login服务项允许IP地址以172开始但不以172.19开始的任何系统访问。这个例子包括了defaults部分。假定这一项用于login服务,且从客户机上用rlogin命令激活,让我们检查成功和不成功企图,以及它们产生的登记。

假定主机underdog和IP地址是172.18.5.9。那么当Mary执行rlogin登记topcat时,会给予她访问权。这相成功的登录如例11所示。尽管例11说明了Mary的动作产生的log内容。如例12所示,该例中的最后一项反映了当Mary拆除登录时的退出情况。可用PID跟踪某次会话的退出,只要你指明这个PID将在/etc/xinetd.conf中登记。登记项如下:每个xinetd登记项记录日期和时间戳,之后服务器主机名,然后是xinetd,之后在括号中是xinetd的PID。例12中的第一条记录以start关键字开始,表明这个会话的开始,之后识别的激活进程(login),然后激活进程的PID,最后是客户机地址。

例10 在/etc/xinetd.conf中rlogin service项的示例

Defaults
{
    Log_type=SYSLOG loca14 info
    Log_on_success=PID HOST EXIT DURATION
    Log_on_failure=HOST
    instances=8
}

Service login
{
    Socket_type=stream
    protocol=tcp
    wait=no
    user=root
    flags=REUSE
    Only_from=172.0.0.0
    No_access=172.19.0.0
    Olg_on_success+=USERID
    Olg_on_failure+=USERID
    server=/usr/sbin/in.ftpd
    Server_args=-1 –a
}


例11 成功的rlogin企图

[mary@underdog]$ rlogin topcat
password:
last login:Wed Apr 14 17:45:02 from roadrunner
[mary@topcat]$


例12 和例11相关的登记项
Apr 15 11:01:46 topcat xinetd[1402]:START:login pid=1439
From=172.18.5.9
Apr 15 11:01:46 topcat xinetd[1439]:USERID:login OTHER:mary



apr 15 11:39:31 topcat xinetd[1402]:EXIT:login status:1 pid=1439 dura-tion=2265(sec)

第2项以USERID关键字开始,表明成功地发出了RFC1413调用。之后是服务名(login),远程系统对RFC1413调用(此时为OTHER)的响应,最后远程用户名(mary)。

这些log项的含义是很清楚的,但表4提供了这些关键字(如START,USERID和EXIT)和其含义的解释。

现在假定Joe想在主机sly.no.good.org(IP地址为19.152.1.5)上使用rlogin。例13显示了这一结果。看上去Joe连接被拒绝,或者可能他想强入。让我们看一看例14中的这三次企图所产生的登记项。注意登记项不包括远程用户名,尽管我们在例10中用log_on_failure属性特别请求那个信息。这是因为远程主机sly.no.good.org没有运行identd或类似进程。因为主机sly.no.good.org不在例10中的only_from表中,尽管在login服务项中增加了flags=IDONLY一项,它不会记录sly.no.good.org没有运行identd的事实。仅当主机得到许可时,这样一项登记记录才会出现。

表4 xinetd登记项的描述

登记关键词
格式和描述

START
START:service_id[pid=PID][from=Ipaddress]

当启动一项服务时记录该项。Service_id是服务名,像id属性指定的一样(如果不明确设置这个属性,它采用该服务参数的值:参看表10.10);PID是被激活进程的标识符,或者如果没有进程被激活,就为0(仅不灵log_on_


Success指定了PID时才记录):Ipaddress是客户机的IP地址(仅当HOST是log_on_success时才记录)

EXIT
EXIT:service_id[type=s][pid=PID][duration=#(sec)]

仅当为log_on_success指定了EXIT时,若进程终止就记录这项。Service_id和PID项和以前一样。Type项记录退出状态或产生终止的信号。Duration捕获会话时间(秒数)且需要在log_on_success中说明DURATION选项

FAIL
FAIL:service_id reason[from=Ipaddress]

当失败的请求发生且至少为log_on_success属性指定了一个值时生成该项。Service_id如前。Reason是一个解释失败原因的简单词或短语。Ipaddress是客户机地址且需要为log_on_success属性设置HOST值才出现。

DATA
DATA:service_id data

仅当为log_on_failure指定了RECORD时才记录。Service_id如前。记录的data取决于服务,但通常包括远程用户名(如果可得到)和状态信息

USERID
USERID:service_id text

仅当为log_on_success或log_on_failure或者指定了USERID时,才记录这个住处。Service_id如前。Text包括客户机对RFC1413调用的响应且特别是远程用户名

NOID
NOID:service_id Ipaddress reason

仅当为flags属性设置了IDONLY值且至少为log_on_success或log_on_failure设置了USERID值时该项出现。Service_id如前。给出的Ipaddress是主机地址。Reason是失败状态


例13 来自未授权主机的失败rlogin企图

Sly.no.good.org $ rlogin topcat
Topcat:Connection reset by peer
Sly.no.good.org $ rlogin –1 paul topcat
Topcat:Connection reset by peer
Sly.no.good.org $ rlogin –1 mary topcat
Topcat:Connection reset by peer
Sly.no.good.org $


例 14 和例10-50相关的登记项

Apr 15 12:08:40 topcat xinetd[1402]:FAIL:login address from-19.152.1.5
Apr 15 12:08:52 topcat xinetd[1402]:FAIL:login address from-19.152.1.5
Apr 15 12:08:49 topcat xinetd[1402]:FAIL:login address from-19.152.1.5


有一个最后登记项要检查。注意例10中的instances属性设置为8。对第9个登录会话会发生什么?当第9个用户试图rlogin到topcat时,那个用户会看到下列错误消息

rcmd:topcat:address already in use

并且topcat中为这一事件记录的登记项是

Apr 15 13:37:33 topcat xinetd(1402):FAIL:login service_limit from-172.17.55.124

把这个记录和表4中的描述相对照,FAIL关键字之后是服务名,然后是对失败的解释(此时为service_limit),最后是客户机地址。



使用bind属性
 bind属性允许把一个特定接口的IP地址和一个特定的服务关联。假定有一个内部ftp服务器,它通过匿名ftp为公司职员提供只读资源。再假定这个ftp服务器有两个接口,一个连接在公司环境中,另一个连接到专用内部网,通常只有在那个特定组中工作的职员可访问它。尽这个例子中只考虑基于接口提供两个不同ftp服务的需求。例15在/etc/xinetd.conf中说明了两个ftp服务项。它可以实现所期望的功能。出于完整性再次提供了defaults部分。

注意每个ftp服务项有一个唯一的id属性。对有相同名字的服务数目没有任何限制,只要每个有唯一的标识符。在这个例子中,为内部ftp服务器设置id属性为ftp,为外部匿名服务器设置id属性为ftp_chroot。注意在后一种情况下,激活的进程是/usr/sbin/anon/in.aftpd(对TCP_Wrappers来说是twist),这和以前的服务是不同的。

例15 把服务绑定到特定地址上

Defaults
{
    Log_type=SYSLOG loca14 info
    Log_on_success=PID HOST EXIT DURATION
    Instances=8
}

Service ftp
{
    id=ftp
    Socket_type=stream
    protocol=tcp
    wait=no
    user=root
    Only_from=172.17.0.0 172.19.0.0/20
    bind=172.17.1.1
    Log_on_success+=USERID
    Log_on_failure+=USERID
    server=/usr/sbin/in.ftpd
    Server_args=-1 –a
}

Service ftp
{
    id=ftp_chroot
    Socket_type=stream
}


Service telnet
{
    Socket_type=stream
    Wait=no
    flags=REUSE
    user=root
    bind=172.17.33.111
    server=usr/sbin/in.telnetd
    Log_on_success=PID HOST EXIT DURATION USERID
    Log_on_failure=RECORD HOST
}

Service telnet
{
    Socket_type=stream
    protocol=tcp
    wait=no
    flags=REUSE
    user=root
    bind=201.171.99.99
    redirect=172.17.1.1 23
    Log_on_success=PID HOST EXIT DURATION USERID
    LOG_ON_FAILURE=record host
}

例 16 redirect的结果

$ telnet 201.171.99.99
Trying 201.171.99.99
Connected to 201.171.99.99
Escape character is‘^]’
UNIX(r) System V Release 4.0 (foghorn)
Login:


因为Linux对每个物理端口最多支持256个逻辑接口,因此理论上可以为系统上的每个物理地址代理256个不同的地址。

尽管redirect机制可能是非常有用的,但实现它时要小心。要确保在代理服务器和终端系统上进行登记。可是在高度受控的内部网络中,这个实现可能是方便的。

包含TCP_Wrappers 

/etc/xinetd.conf中包含TCP_Wrappers功能是如此简单,TCP_Wrappers的所有功能可通过xinetd包括进去,就像通过inetd一样。例17是/etc/xinetd.conf文件的一个实例,它为许多服务使用了TCP_Wrappers。当属性服务器设置为/usr/sbin/tcpd后,那个服务将被包裹。注意这样的项总是把server_args属性设置为要激活的进程(全路径)。载讨论xinetd的编译时,用到了libwrap配置选项,但是无论是否用libwrap编译,例17中的配置文件都能发挥作用。用libwrap编译的作用是包含/etc/hosts.allow和/etc/hosts.deny中的访问限制。例7所示提供了TCP_Wrappers的一组完整特征,banners,spawn,twist等。

例 17 在/etc/xinetd.conf中使用TCP_Wrappers

Defaults
{
    Log_type=SYSLOG loca14 info
    Log_on_success=PID HOST EXIT DURATION
    Log_on_failure=HOST
    instances=8
}
Service ftp
{
    id=ftp
    Socket_type=stream
    protocol=tcp
    wait=no
    user=root
    Only_from=172.17.0.0
    Log_on_success+=USERID
    Log_on_failure+=USERID
    Access_times=8:00-16:30
    server= /usr/sbin/tcpd
    Server_args= /usr/sbin/in.ftpd –1 –a
}

Service telnet
{
    Socket_type=stream
    wait=no
    flags=NAMEINARGS REUSE
    User=root
    Bind=172.17.33.111
    server= /usr/sbin/tcpd
    Server_args= /usr/sbin/in.telnetd
    Log_on_success=PID HOST EXIT DURATION USERID
    Log_on_failure=RECORD HOST
}

Service telnet
{
    Socket_type=stream
    protocol=tcp
    wait=no
    flags=REUSE
    user=root
    bind=201.171.99.99
    redirect=172.17.1.1 23
    Log_on_success=PID HOST EXIT DURATION USERID
    Log_on_failure=RECORD HOST
}





xinetd进程

xinetd进程接受若干参数。这些参数可被特定服务default中的属性改写,或在一个或多个服务的单个属性项改写。然而,这里给出的所有参数或它们的缺省值控制xinetd自身的行为。例如,如果filelog标记指定为xinetd,那么将在那里登记所有状态转换消息,尽管 /etc/xinetd.conf文件中为和服务相关消息指定了其他登记位置。可用参数列在表5中。

应注意xinetd报告的所有状态信息,总是出现在-syslog或-filelog标记指定的登记文件中,不管设置如何,即通过defaults还是在/etc/xinetd.conf中。如果要在一个文件中捕获xinetd的PID,可以用

xinetd –pid 2> /var/run.xinetd.pid

和xinetd一起使用的可用信号 xinetd进程也基于收到的信号采取特定的行动。表16描述了它接受的每个信号的功能。注意每当增加了新服务或defaults项,或每当改变了任何服务的如下属性:protocol,socket_type,type或wait时,必须用SIGTERM(或更简单的TERM)信号中止xientd。每当给xinetd发布一个软性或硬性重配置信号时,将写入例19中所示类型的登记项。这个特定例子是硬性重配置的结果。注意这次硬性重配置的结果是中止了一项服务(用dropped=1标识)。



表 5 xinetd的标记

标 记
描 述

-d
调试模式。输出可和调试器如gdb一起使用

-sysllog facility
指定syslogd工具。是daemon, auth, user和loca10-7其中之一

-filelog file
指定登记写到file而不是syslog中。必须是完整路径名

-fconfig_file
指定配置文件。必须是完整路径名。缺省是/etc/xinetd.conf

-pid
把PID写入标准错误中

-loop rate
指定每秒钟分叉的进程数。缺省是10.对较快机器来说可能希望改变它

-reuse
设置可重用的TCP socket,这意味着以前的实例运行时也可启动其他进程。当和flags属性一起使用时,有更特殊的服务控制(参看表10.10)

-limit numproc
限制由xinetd启动的同时运行的进程总数为numproc

-
限制同时发生的RFC1413请求数为limit

-shutdownprocs limit
当log_on_failure属性中使用了RECORD值时,xinetd分叉称为shutdown的服务以收集服务终止时的信息。该选项限制同时运行的shutdown进程总数为limit

-cc interval
使xinetd每隔interval秒运行对其内部状态的一致性检查。用killall –IOT xinetd可手工实现


表18 xinetd信号

信 号
作 用

SIGUSR1
软性重配置。重读/etc/xinetd.conf并作相应调整

SIGUSR2
硬性重配置。重读/etc/xinetd.conf并杀死和配置文件中的建立准则不再匹配的所有进程。例如,如果一个客户机连接到这个服务器且又增加到no_access表中,那么这个信号会终止该客户机的会话

SIGQUIT
终止xinetd但不终止它分叉的任何进程

SIGTERM
终止xinetd分叉的所有进程;然后终止xinetd

SIGHUP
把xinetd状态信息写到/tmp/xinetd.dump中

SIGIOT
检查内部数据库毁坏情况并报告结果


例19 xinetd硬性重配置的登记记录

Apr 15 14:42:31 topcat xinetd[1402]:Starting hard reconfiguration
Apr 15 14:42:31 topcat xinetd[1402]:readjusting service servers
Apr 15 14:42:31 topcat xinetd[1402]:readjusting service servces
Apr 15 14:42:31 topcat xinetd[1402]:readjusting service telnet
Apr 15 14:42:31 topcat xinetd[1402]:readjusting service shell
Apr 15 14:42:31 topcat xinetd[1402]:readjusting service login
Apr 15 14:42:31 topcat xinetd[1402]:readjusting service talk
Apr 15 14:42:31 topcat xinetd[1402]:readjusting service ntalk
Apr 15 14:42:31 topcat xinetd[1402]:readjusting service pop-2
Apr 15 14:42:31 topcat xinetd[1402]:readjusting service pop-3
Apr 15 14:42:31 topcat xinetd[1402]:readjusting service imap
Apr 15 14:42:31 topcat xinetd[1402]:readjusting service linuxconf
Apr 15 14:42:31 topcat xinetd[1402]:readjusting service ftp
Apr 15 14:42:31 topcat xinetd[1402]:Reconfigured:new=1 old=12 dropped=1 (services)


注:确定某个修改的/etc/xinetd.conf文件被读的最可靠方式是停止并重启动xinetd进程。最好用SIGTERM信号中止xinetd。如这节中描述的,发给xzinetd一个SIGTERM使它中止(用SIGKILL或信号号9)其控制之下的每个进程。有时在xinetd的子进程中止之前有一个延时,这意味着如果杀死并立即重启动xinetd,它不可能绑定所有端口(对此xinetd的登记文件----而不是这项服务指定的登记文件----中含一个错误消息)。这就是为什么sleep3命令出现在例中的stop和start命令间的脚本中。对TCP服务如telnet和ftp用flags=REUSE属性及其值或指定xinetd自身的-reuse选项可完全消除这个问题。

我目前每天在学Oracle8i和Java2-Oracle DBA和Sun CSA,SCEA是我的奋斗目标-为了DBA和SCEA坚定不疑努力着

文章选项: 打印   将这篇文章放置于备忘录中,待有空时回覆   好友分享   通知版主  redhat7.0以后inetd都已换成xinetd了--好用了很多。先看一下/etc/xinetd.conf--instances最大实例数--如果你用的是wu-ftpd-最大人数60那就改这个了。注意最后一句includedir其实是把telnet,wu-ftpd等脚本包含到此文件中的--直接写在这也行。
defaults
{
instances = 60
log_type = SYSLOG authpriv
log_on_success = HOST PID
log_on_failure = HOST
cps = 25 30
}

includedir /etc/xinetd.d
这篇xinetd完全指南已非常全了--看了它你对xinetd就会很熟了:)
许多人在装了redhat 7.x后开始找不到北!!!(我就是其中一个)
因为redhat 7.x开始注重系统安全,最大的特征就是用xinetd.conf代替原来的inetd.conf
并且7.1中默认安装没有开ftp,telnet等熟悉的服务,而是更安全的ssh!
7.1还加入firewall等服务
(感谢paradise提供下载地点给我安装redhat7.1)

大家对被称作超级服务器的Inetd一定很熟悉,其实现控制对主机网络连接。当一个请求到达由Inetd管理的服务端口,Inetd将该请求转发给名为tcpd的程序。Tcpd根据配置文件hosts.{allow, deny}来判断是否允许服务该请求。如果请求被允许则相应的服务器程序(如:ftpd、telnetd)将被启动。这个机制也被称作tcp_wrapper.

xinetd(eXtended InterNET services daemon)提供类似于inetd+tcp_wrapper的功能,但是更加强大和安全。它能提供以下特色:

* 支持对tcp、ucp、RPC服务(但是当前对RPC的支持不够稳定)

* 基于时间段的访问控制

* 功能完备的log功能,即可以记录连接成功也可以记录连接失败的行为

* 能有效的防止DoS攻击(Denial of Services)

* 能限制同时运行的同意类型的服务器数目

* 能限制启动的所有服务器数目

* 能限制log文件大小

* 将某个服务绑定在特定的系统接口上,从而能实现只允许私有网络访问某项服务

* 能实现作为其他系统的代理。如果和ip伪装结合可以实现对内部私有网络的访问

 它最大的缺点是对RPC支持的不稳定性,但是可以启动protmap,与xinetd共存来解决这个问题

编译安装

可以从www.xinetd.org下载xinetd,当前最新的版本是xinetd 2.1.8.8p3。默认编译和安装xinetd是非常简单的,按照如下的步骤进行:

#./configure; make; make install

即可完成。

在进行configure时,可以支持如下几个有用处的选项:

--with-libwrap : 如果使用该选项xinetd将会察看tcpd配置文件(/etc/hosts.{allow, deny})来进行访问控制,但是如果要利用该功能,系统上必须安装有tcp_wrapper和相关库。

--with-loadavg : 使用该选项,xinetd将而已处理max-load配置选项。从而在系统负载过重时关闭某些服务进程,来实现某些DoS攻击。

--with-inet6 : 使用该选项xinetd将支持IPv6。

如果是是用redhat7.0,则其默认将安装xinetd,而不需要自行安装。

配置

xinetd的默认配置文件是/etc/xinetd.conf。其语法和/etc/inetd.conf完全不同且不兼容。它本质上是/etc/inetd.conf和/etc/hosts.allow,/etc/hosts.deny功能的组合。/etc/xinetd.conf中的每一项具有下列形式

service service-name
{
     ……。
}

其中service是必需的关键字,且属性表必须用大括号括起来。每一项都定义了由service-name定义的服务。

Service-name是任意的,但通常是标准网络服务名,也可增加其他非标准的服务,只要它们能通过网络请求激活,包括localhost自身发出的网络请求。有很多可以使用的attribute,在下表中进行了详细的说明。稍后将描述必需的属性和属性的使用规则。

操作符可以是=,+=,或-=。所有属性可以使用=,其作用是分配一个或多个值,某些属性可以使用+=或-=的形式,其作用分别是将其值增加到某个现存的值表中,或将其值从现存值表中删除。表10.10中说明了可以用后一种形式的属性。

Value是为给定属性设置的参数。

表1 扩展的lnernet服务进程属性

属 性
描述和允许值

Socket_type
使用的TCP/IP socket类型,值可能为stream(TCP), dgram(UDP), raw和seqpacket(可靠的有序数据报)

protocol
指定该服务使用的协议,其值必须是在/etc/protocols中定义的。如果不指定,使用该项服务的缺省协议。

Server
要激活的进程,必须指定完整路径

Server_args
指定传送给该进程的参数,但是不包括服务程序名

Port
定义该项服务相关的端口号。如果该服务在/etc/services中列出,它们必须匹配

Wait
这个属性有两个可能的值。如果是yes,那么xinetd会启动请的进程并停止处理该项服务的请求直到该进程终止。这是个单线程服务。如果是no,那xinetd会为每个请求启动的一个进程,而不管先前启动的进程的状态。这是个多线程服务

User
设置服务进程的UID,但是若xinetd的有效UID不是0,该属性无效

Group
设置进程的GID。若xinetd的有效UID不是0,这个属性无效

Nice
指定进程的nice值

Id
该属性被用来唯一地指定一项服务。因为有些服务的区别仅仅在于使用不同的协议,因此需要使用该属性加以区别。默认情况下服务id和服务名相同。如echo同时支持dgram和streama服务。设置id=echo_dgram和id=echo_streams来分别唯一标识两个服务

Type
可以是下列一个或多个值:RPC(对RPC服务),INTERNAL(由由xinetd自身提供的服务,如echo),UNLISTED(没有列在标准系统文件如/etc/rpc或/etc/service中的服务)

Access_time
设置服务可用时的时间间隔。格式是hh:mm_hh:mm; 如08:00-18:00意味着从8A.M到6P.M.可使用这项服务

Banner
无论该连接是否被允许,当建立连接时就将该文件显示给客户机

Flags
可以是以下一个或多个选项的任意组合:

REUSE:设置TCP/IP socket可重用。也就是在该服务socket中设置SO_REUSEADDR标志。当中断并重新启动xinetd

INTERCEPT:截获数据报进行访问检查,以确定它是来自于允许进行连接的位置。不能和INTERNAL服务和多线程服务不可使用该属性值

   NORETRY:如果fork失败,不重试

IDONLY: 只有在远程端识别远程用户时才接受该连接(也就是远程系统必须运行ident服务器),该标记只适用于面向连接的服务。若没有使用USERID记录选项则该标记无效log_on_success和/或log_on_failure属性设置USERID值以使该值生效。仅用于多线程的流服务

NAMEINARGS:允许server_args属性中的第一个参数是进程的完全合格路径,以允许使用TCP_Wrappers

NODELAY:若服务为tcp服务,并且NODELAY标记被设置,则TCP_NODELAY标记将被设置。若服务不是tcp服务则该标记无效

Rpc_version
指定RPC版本号或服务号。版本号可以是一个单值或者一个范围中如2-3

rpc_number
如果RPC程序号不在/etc/rpc中,就指定它

Env
用空格分开的VAR=VALUE表,其中VAR是一个shell环境变量且VALUE是其设置值。这些值以及xinetd的环境都在激活时传送给服务程序。这个属性支持=和+=操作符

Passenv
用空格分开的xinetd环境中的环境变量表,该表在激活时传递给服务程序。设置no就不传送任何变量。该属性支持所有操作符

Only_from
用空格分开的允许访问服务的客户机表。表2种给出客户机语法。如果不为该属性指定一个值,就拒绝访问这项服务。该属性支持所有操作符。

No_access
用空格分开的拒绝访问服务的客户机表。表2给出客户机语法。该属性支持所有操作符

Instances
接受一个大于或等于1的整数或UNLIMITED。设置可同时运行的最大进程数。UNLIMITED意味着xinetd对该数没有限制。

Log_type
指定服务log记录方式,可以为:

SYSLOG facility[level]:设置该工具为daemon,auth,user或loca10-7。设置level是可选的,可以的level值为emerg,alert,crit,err,warning,notice, info, debug,默认值为info

file[soft[hard]]:指定file用于记录log,而不是syslog。限度soft和hard用KB指定(可选)。一旦达到soft限,xinetd就登记一条消息。一旦达到hard限,xinetd停止登记使用该文件的所有服务。如果不指定hard限,它成为soft加1%,但缺省时不超过20MB.缺省soft限是5MB

Redirect
该属性语法为redirect=Ipaddress port。它把TCP服务重定向到另一个系统。如果使用该属性,就忽略server属性

Bind
把一项服务绑定到一个特定端口。语法是bind=Ipaddress。这样有多个接口(物理的或逻辑的)的主机允许某个接口但不是其他接口上的特定服务(或端口)

Log_on_success
指定成功时登记的信息。可能值是

PID:进程的PID。如果一个新进程没被分叉,PID设置为0。

HOST:客户机主机IP地址

USERID:通过RFC1413高用捕获客户机用户的UID。只可用于多线程流服务。

EXIT:登记进程终止和状态

DURATION:登记会话持续期

缺省时不登记任何信息。该属性支持所有操作符

Log_on_failure
指定失败时登记的信息。总是登记表明错误性质的消息。可能值是ATTEMPT:记录一次失败的尝试。所有其他值隐含为这个值。

HOST:客户机主机IP地址

USERID:通过RFC1413调用捕获客户机用户的UID。只

可用于多线程流服务。

RECORD:记录附加的客户机信息如本地用户,远程用户

和终端的类型。缺省时不登记任何信息。该属性支持所有操作符。

Disabled
只可用于defaults项(参看本小节后面的defaults项),指定被关闭的服务列表,是用空格分开的不可用服务列表来表示的。它和在/etc/xinetd.conf文件中注释掉该服务项有相同的效果。


我们首先看一个简单的例子。例1是配置文件/etc/xinetd.conf的一个范例。这两种服务的定义看上去像/etc/inetd.conf的原因是因为它们是用itox工具从/etc/inetd.conf转换得来的,只把/etc/inetd.conf项对应转换成适当的xinetd语法。这样,这些属性(在大括号中的=号的左边)意义是非常直接的,其相关值(在大括号中的=号的右边)也是如此。

例1 文件/etc/xinetd.conf中的一部分

Serice ftp

{

Socket_type=stream

  protocol=tcp

  wait=no

  user=root

  server=root

  Server_args= - 1 - a

}

Service telnet

{

  Socket_type=stream

  protocol=tcp

  wait=tcp

  user=root

  server=/usr/sbin/in.telnetd
}


创建/etc/xinetd.conf文件最容易的方法是用itox工具(该例假定当前工作目录是xinetd的编译目录):

# xinetd/itox -daemon_dir /usr/sbin /etc/xinetd.conf。itox的参数-daemon_dir /usr/sbin指定服务程序的目录位置,如果实现了TCP_Wrappers,从/etc/inetd.conf中是不能确定它的,转换完成以后,就开始增加属性和值,以限制访问并增加登记,最后要手工修改/etc/xinetd.conf以充分利用xinetd的特性;否则,如果只把/etc/inetd.conf转换为/etc/xinetd.conf, xinetd的行为就和inetd一样了。

表1详述了在/etc/xinetd.conf中最常使用的一些属性和值。当然还有许多其他属性,详细配置选项可以在安装xinetd以后通过man xinetd.conf来得到。在本小节后面的“配置实例”中,将用一些例子阐明其中的许多属性。

表2中给出only_from和no_access表的语法,定义了指定主机名,IP地址和网络的语法。注意表2中最后一项netmask的语法和之前看到的有所不同。它没有采用传统的十进制或十六进制netmask的表示方法,而是采用一个整数表示从netmask(用二进制表示)的最高位(最左端)开始起每位都为1的位数。因此,给定例子的netmask值设置为20,意味着其最左端的20位都设置为1,而余下12位设置为0,或

11111111    11111111   11110000   00000000

它是十进制netmask255.255.240.0的二进制表示。

表2 /etc/xinetd.conf的访问控制表的语法

语  法
描  述

hostname
可解析的主机名。使用和这个主机名相关的所有IP地址

IPaddress
点和十进制形式的标准IP地址,如192.168.0.1

Net_name
/etc/networks中的网络名

x.x.x.0 x.x.0.0

x.0.0.0 0.0.0.0
0作为通配符看待。如项88.3.92.0匹配从88.3.92.0到88.3.92.255的所有IP地址。项0.0.0.0匹配所有地址

x.x.x.{a,b,…}

x.x{a,b,…}

x.{a,b,…}
指定主机表。如172.19.32.{1,56,59}意味着含IP地址172,19.32.1,172.19.32.56和172.19.32.59的表

Ipaddress/netmask 
定义要匹配的网络或子网。如172.19.16.0/20匹配从172.19.16.0到172.19.31.255的所有地址




在看了这些基本属性之后,下面我们仔细讨论那些必需的属性,特定服务和一些配置实例。


必需的属性

对每种服务都必须指定某些属性。一些服务比其他服务需要更多属性,因为它们不被缺省定义(即不在/etc/services或/etc/rpc中)。表3列出了必需的属性。

表3 必需的属性

语 法
描 述

Socket_type
所有服务

Wait
所有服务

User
在/etc/services或/etc/rpc中列出的服务

Server
非内部服务

Port
不在/etc/services中的非RPC服务

Protocol
不在/etc/services中的所有RPC服务和所有其他服务

Rpc_version
所有RPC服务

Rpc_number
不列在/etc/rpc中的任何RPC服务




特定的xinetd服务 /etc/xinetd.conf文件中有4个特殊项。它们分别是defaults, servers,services和xadmin。Defaults项不是一项服务,且不需要前置service关键字(否则它会被当成称为defaults的服务对待)。这些特殊项在以下4小段中描述。


Defaults项

/etc/xinetd.conf文件中的defaults项是实现为该文件中的所有服务指定某些属性的默认值。这些默认值可被每个服务项取消或修改。表4中列出可在defaults项中指定的属性。这个表也指明了具体服务项中可以修改哪些属性。



表4 defaults可用的属性

属性
服务修改

Log_on_success

Log-on_failure

 Only_from

 No_access

 Passenv
可以用=操作符改写或用+ =或 - =操作符修改

Instances

Log_type
可以用=操作符改写

disabled
可注释掉的服务,但disabled属性可用于某个服务项内




例2是defaults项的一个实例。从中看到对所有服务而言,登记消息将通过loca14.info有选择地送到syslogd进程。对成功的服务连接,将登记PID,客户机IP地址,中止状态和连接时间。对不成功的连接企图,将登记客户机IP地址。每项服务的最大实例数设置为8。禁止两项服务:in.tftpd和in.rexecd。

defaults项从本质上提供了在整个文件中建立某些属性的默认值,它应用于没有设置这些属性的所有服务。

例2 /etc/xinetd.conf中defaults项的示例

Defaults
{
Log_type = SYSLOG loca14 info
Log_on_success = PID HOST EXIT DURATION
Log_on_failure = HOST
Instances =8
Disabled = in.tftpd in.rexecd
}


注:如果在/etcxinetd.conf文件中没有defaults项,且之后决定增加这一项,你必须中止和重新启动xinetd以使defaults生效。这对任何要增加到/etc/xinetd.conf中的新服务也是正确的。它可以如下完成。

# kill-TERM xinetd

#/ usr/sbin/xinetd

或者如果使用了启动脚本,则只需要简单执行。

#/etc/rc.d/init.d/xinetd restart



Servers项 servers特殊服务是实现提供当前运行在服务器上的进程表,以及有关这些进程的确切信息。换句话说,它提供了活动连接的列表。这对排除故障和检查xinetd状态是个有用机制。例3显示了/etc/xinetd.conf文件中的一个实例servers项。注意这项服务的类型是INTERNAL,UNLISTED,这意味着它是xinetd的内部功能,且不列在/etc/services中。使用的端口是完全任意的。

例3 servers项的示例

Service servers
{
     type = INTERNAL UNLISTED
     Socket_type = stream
     Protocol = tcp
     Port = 9997
     Wait = no
     Only_from = 172.17.33.111
     Wait = no
}

注意这项服务仅用于特定IP地址172.17.33.111,它是服务器自身的IP地址。这表示不允许任何其他主机从这个服务器获得当前运行在服务器上的进程列表。这样做的原因是显而易见的:如果这条信息可被其他系统上的主机获取,基于对当前正在运行的进程的了解就加以利用。除用于调试之外,一般不要运行该服务,因为172.17.33.111上的任何用户通过执行例4中的telnet 172.17.33.111 9997都能获取这条信息。注意xinetd仅提供这条信息就退出,不提供交互连接。例4中的输出告诉我们有两个正在运行的telnet进程(第5行和第31行),一个进程PID为5931,另一个为5961(分别为第6行和第32行),有一个ftp进程(第18行),其运行PID为5960(第19行)。

例4 servers服务的输出示例

1 $ telnet topcat 9997
2 Trying 172.17.33.111……
3 Connected to topcat
4 Escape character is ‘^]’
5 telnet server
6 Pid=5931
7 Start_time=Sat Apr 17 10:32:15 1999
8 Connection info:
9 State=CLOSED
10 Service=telnet
11 Descriptor=20
12 Flags=9
13 Remote_address=10.48.3.2,39958
14 Alternative services=
15 Log_remote_user=YES
16 Writes_to_log=YES
17 
18 ftp server
19 Pid=5960
20 Start_time=Sat Apr 17 10:49:06 1999
21 Connection info:
22 State=CLOSED
23 Service=ftp
24 Descriptor=20
25 Flags=9
26 Remote_address=172.17.55.124,2320
27 Alternative services=
28 Log_remote_user=YES
29 Writes_to_log=YES
30
31 telnet server
32 Pid=5961
33 Start_time=Sat Apr 17 10:49:20 1999
34 Connection info:
35 State=CLOSED
36 Service=telnet
37 Descriptor=20
38 Flags=9
39 Remote_address=172.17.1.3,35461
40 Alternative services=
41 Log_remote_user=YES
42 Writes_to_log=YES
43
44 Connection closed by foreign host
45 $

Services项
 services特定项的目的是提供可用服务的列表。对services特定项来说,这是个有用的排除故障工具,但为了上述同样的安全因素,可能不会去用它。尽管如此,还是要看一看它如何工作。

例5是 services项的一个示例。端口号的选择也是任意的。也应注意访问限制于topcat,这是服务器自身的主机名。

例5 /etc/xinetd.conf中services项示例

Service services
{
    type = INTERNAL UNLISTED
    Socket_type = stream
    protocol = tcp
    port = 8099
    wait = no
    Only_ from = topcat
}

对于servers服务来说,任何用户可执行telnet topcat 8099,并获得来自services服务的输出。例6给出了连接8099端口的实例信息信息。注意xinetd仅提供这条信息就退出,而不提供任何交互连接。

例6 查询services内部服务的输出

$ telnet topcat 8099
Trying 172.17.33.111……
Connected to topcat.
Escape character is ‘^]’
Servers tcp 9997
Services tcp 8099
ftp tcp 21
telnet tcp 23
Shell tcp 514
Login tcp 513
Talk udp 517
Ntalk udp 518
Pop-2 tcp 109
Pop-3 tcp 110
Imap tcp 143
Linuxconf tcp 98
Connection closed by foreign host.
$

Xadmin项

这个特定服务项提供以交互方式获得services特定服务所提供信息的方法。例7是/etc/xinetd.conf项的一个示例(端口号的选择也是任意的),类似于services和servers服务,这项服务也没有口令或其他保护,所以要谨慎设置服务的only_from项,以增强安全性。

例7 xadmin项

Service xadmin
{
    type = INTERNAL UNLISTED
    socket_type = stream
    protocol = tcp
    port = 9967
    wait = no
    Only_from = topcat
}

对前两个特定服务类型来说,你只需telnet到所列端口上,即telnet topcat 9967。和前两项服务不同,xadmin提供了一个交互环境。一旦连接到xadmin服务器上,就可执行5个命令。它们是help,show, run,bye和exit。Help命令显示其他命令以及一个简短的用法消息。Bye和exit命令都关闭这个连接。Show run和show avail命令分别提供servers和services提供的信息。

警告:像前3段中指出的一样,这些特定服务servers, services和xadmin产生的信息可用于攻击系统。可能不需要一直运行这些服务,或许只当你调试时才需要。在任何时候,如果的确运行了这些服务,要确信用access_from和/或no_access配置了访问控制。也可以为这些服务使用bind属性以进一步限制访问。

配置实例
 这节中将看到一些不同的例子,与之相关的行为以及它们产生的登记消息。

访问控制

从一个简单的访问控制例子开始。在例10中,服务器topcat的login服务项允许IP地址以172开始但不以172.19开始的任何系统访问。这个例子包括了defaults部分。假定这一项用于login服务,且从客户机上用rlogin命令激活,让我们检查成功和不成功企图,以及它们产生的登记。

假定主机underdog和IP地址是172.18.5.9。那么当Mary执行rlogin登记topcat时,会给予她访问权。这相成功的登录如例11所示。尽管例11说明了Mary的动作产生的log内容。如例12所示,该例中的最后一项反映了当Mary拆除登录时的退出情况。可用PID跟踪某次会话的退出,只要你指明这个PID将在/etc/xinetd.conf中登记。登记项如下:每个xinetd登记项记录日期和时间戳,之后服务器主机名,然后是xinetd,之后在括号中是xinetd的PID。例12中的第一条记录以start关键字开始,表明这个会话的开始,之后识别的激活进程(login),然后激活进程的PID,最后是客户机地址。

例10 在/etc/xinetd.conf中rlogin service项的示例

Defaults
{
    Log_type=SYSLOG loca14 info
    Log_on_success=PID HOST EXIT DURATION
    Log_on_failure=HOST
    instances=8
}

Service login
{
    Socket_type=stream
    protocol=tcp
    wait=no
    user=root
    flags=REUSE
    Only_from=172.0.0.0
    No_access=172.19.0.0
    Olg_on_success+=USERID
    Olg_on_failure+=USERID
    server=/usr/sbin/in.ftpd
    Server_args=-1 –a
}


例11 成功的rlogin企图

[mary@underdog]$ rlogin topcat
password:
last login:Wed Apr 14 17:45:02 from roadrunner
[mary@topcat]$


例12 和例11相关的登记项
Apr 15 11:01:46 topcat xinetd[1402]:START:login pid=1439
From=172.18.5.9
Apr 15 11:01:46 topcat xinetd[1439]:USERID:login OTHER:mary



apr 15 11:39:31 topcat xinetd[1402]:EXIT:login status:1 pid=1439 dura-tion=2265(sec)

第2项以USERID关键字开始,表明成功地发出了RFC1413调用。之后是服务名(login),远程系统对RFC1413调用(此时为OTHER)的响应,最后远程用户名(mary)。

这些log项的含义是很清楚的,但表4提供了这些关键字(如START,USERID和EXIT)和其含义的解释。

现在假定Joe想在主机sly.no.good.org(IP地址为19.152.1.5)上使用rlogin。例13显示了这一结果。看上去Joe连接被拒绝,或者可能他想强入。让我们看一看例14中的这三次企图所产生的登记项。注意登记项不包括远程用户名,尽管我们在例10中用log_on_failure属性特别请求那个信息。这是因为远程主机sly.no.good.org没有运行identd或类似进程。因为主机sly.no.good.org不在例10中的only_from表中,尽管在login服务项中增加了flags=IDONLY一项,它不会记录sly.no.good.org没有运行identd的事实。仅当主机得到许可时,这样一项登记记录才会出现。

表4 xinetd登记项的描述

登记关键词
格式和描述

START
START:service_id[pid=PID][from=Ipaddress]

当启动一项服务时记录该项。Service_id是服务名,像id属性指定的一样(如果不明确设置这个属性,它采用该服务参数的值:参看表10.10);PID是被激活进程的标识符,或者如果没有进程被激活,就为0(仅不灵log_on_


Success指定了PID时才记录):Ipaddress是客户机的IP地址(仅当HOST是log_on_success时才记录)

EXIT
EXIT:service_id[type=s][pid=PID][duration=#(sec)]

仅当为log_on_success指定了EXIT时,若进程终止就记录这项。Service_id和PID项和以前一样。Type项记录退出状态或产生终止的信号。Duration捕获会话时间(秒数)且需要在log_on_success中说明DURATION选项

FAIL
FAIL:service_id reason[from=Ipaddress]

当失败的请求发生且至少为log_on_success属性指定了一个值时生成该项。Service_id如前。Reason是一个解释失败原因的简单词或短语。Ipaddress是客户机地址且需要为log_on_success属性设置HOST值才出现。

DATA
DATA:service_id data

仅当为log_on_failure指定了RECORD时才记录。Service_id如前。记录的data取决于服务,但通常包括远程用户名(如果可得到)和状态信息

USERID
USERID:service_id text

仅当为log_on_success或log_on_failure或者指定了USERID时,才记录这个住处。Service_id如前。Text包括客户机对RFC1413调用的响应且特别是远程用户名

NOID
NOID:service_id Ipaddress reason

仅当为flags属性设置了IDONLY值且至少为log_on_success或log_on_failure设置了USERID值时该项出现。Service_id如前。给出的Ipaddress是主机地址。Reason是失败状态


例13 来自未授权主机的失败rlogin企图

Sly.no.good.org $ rlogin topcat
Topcat:Connection reset by peer
Sly.no.good.org $ rlogin –1 paul topcat
Topcat:Connection reset by peer
Sly.no.good.org $ rlogin –1 mary topcat
Topcat:Connection reset by peer
Sly.no.good.org $


例 14 和例10-50相关的登记项

Apr 15 12:08:40 topcat xinetd[1402]:FAIL:login address from-19.152.1.5
Apr 15 12:08:52 topcat xinetd[1402]:FAIL:login address from-19.152.1.5
Apr 15 12:08:49 topcat xinetd[1402]:FAIL:login address from-19.152.1.5


有一个最后登记项要检查。注意例10中的instances属性设置为8。对第9个登录会话会发生什么?当第9个用户试图rlogin到topcat时,那个用户会看到下列错误消息

rcmd:topcat:address already in use

并且topcat中为这一事件记录的登记项是

Apr 15 13:37:33 topcat xinetd(1402):FAIL:login service_limit from-172.17.55.124

把这个记录和表4中的描述相对照,FAIL关键字之后是服务名,然后是对失败的解释(此时为service_limit),最后是客户机地址。



使用bind属性
 bind属性允许把一个特定接口的IP地址和一个特定的服务关联。假定有一个内部ftp服务器,它通过匿名ftp为公司职员提供只读资源。再假定这个ftp服务器有两个接口,一个连接在公司环境中,另一个连接到专用内部网,通常只有在那个特定组中工作的职员可访问它。尽这个例子中只考虑基于接口提供两个不同ftp服务的需求。例15在/etc/xinetd.conf中说明了两个ftp服务项。它可以实现所期望的功能。出于完整性再次提供了defaults部分。

注意每个ftp服务项有一个唯一的id属性。对有相同名字的服务数目没有任何限制,只要每个有唯一的标识符。在这个例子中,为内部ftp服务器设置id属性为ftp,为外部匿名服务器设置id属性为ftp_chroot。注意在后一种情况下,激活的进程是/usr/sbin/anon/in.aftpd(对TCP_Wrappers来说是twist),这和以前的服务是不同的。

例15 把服务绑定到特定地址上

Defaults
{
    Log_type=SYSLOG loca14 info
    Log_on_success=PID HOST EXIT DURATION
    Instances=8
}

Service ftp
{
    id=ftp
    Socket_type=stream
    protocol=tcp
    wait=no
    user=root
    Only_from=172.17.0.0 172.19.0.0/20
    bind=172.17.1.1
    Log_on_success+=USERID
    Log_on_failure+=USERID
    server=/usr/sbin/in.ftpd
    Server_args=-1 –a
}

Service ftp
{
    id=ftp_chroot
    Socket_type=stream
}


Service telnet
{
    Socket_type=stream
    Wait=no
    flags=REUSE
    user=root
    bind=172.17.33.111
    server=usr/sbin/in.telnetd
    Log_on_success=PID HOST EXIT DURATION USERID
    Log_on_failure=RECORD HOST
}

Service telnet
{
    Socket_type=stream
    protocol=tcp
    wait=no
    flags=REUSE
    user=root
    bind=201.171.99.99
    redirect=172.17.1.1 23
    Log_on_success=PID HOST EXIT DURATION USERID
    LOG_ON_FAILURE=record host
}

例 16 redirect的结果

$ telnet 201.171.99.99
Trying 201.171.99.99
Connected to 201.171.99.99
Escape character is‘^]’
UNIX(r) System V Release 4.0 (foghorn)
Login:


因为Linux对每个物理端口最多支持256个逻辑接口,因此理论上可以为系统上的每个物理地址代理256个不同的地址。

尽管redirect机制可能是非常有用的,但实现它时要小心。要确保在代理服务器和终端系统上进行登记。可是在高度受控的内部网络中,这个实现可能是方便的。

包含TCP_Wrappers 

/etc/xinetd.conf中包含TCP_Wrappers功能是如此简单,TCP_Wrappers的所有功能可通过xinetd包括进去,就像通过inetd一样。例17是/etc/xinetd.conf文件的一个实例,它为许多服务使用了TCP_Wrappers。当属性服务器设置为/usr/sbin/tcpd后,那个服务将被包裹。注意这样的项总是把server_args属性设置为要激活的进程(全路径)。载讨论xinetd的编译时,用到了libwrap配置选项,但是无论是否用libwrap编译,例17中的配置文件都能发挥作用。用libwrap编译的作用是包含/etc/hosts.allow和/etc/hosts.deny中的访问限制。例7所示提供了TCP_Wrappers的一组完整特征,banners,spawn,twist等。

例 17 在/etc/xinetd.conf中使用TCP_Wrappers

Defaults
{
    Log_type=SYSLOG loca14 info
    Log_on_success=PID HOST EXIT DURATION
    Log_on_failure=HOST
    instances=8
}
Service ftp
{
    id=ftp
    Socket_type=stream
    protocol=tcp
    wait=no
    user=root
    Only_from=172.17.0.0
    Log_on_success+=USERID
    Log_on_failure+=USERID
    Access_times=8:00-16:30
    server= /usr/sbin/tcpd
    Server_args= /usr/sbin/in.ftpd –1 –a
}

Service telnet
{
    Socket_type=stream
    wait=no
    flags=NAMEINARGS REUSE
    User=root
    Bind=172.17.33.111
    server= /usr/sbin/tcpd
    Server_args= /usr/sbin/in.telnetd
    Log_on_success=PID HOST EXIT DURATION USERID
    Log_on_failure=RECORD HOST
}

Service telnet
{
    Socket_type=stream
    protocol=tcp
    wait=no
    flags=REUSE
    user=root
    bind=201.171.99.99
    redirect=172.17.1.1 23
    Log_on_success=PID HOST EXIT DURATION USERID
    Log_on_failure=RECORD HOST
}





xinetd进程

xinetd进程接受若干参数。这些参数可被特定服务default中的属性改写,或在一个或多个服务的单个属性项改写。然而,这里给出的所有参数或它们的缺省值控制xinetd自身的行为。例如,如果filelog标记指定为xinetd,那么将在那里登记所有状态转换消息,尽管 /etc/xinetd.conf文件中为和服务相关消息指定了其他登记位置。可用参数列在表5中。

应注意xinetd报告的所有状态信息,总是出现在-syslog或-filelog标记指定的登记文件中,不管设置如何,即通过defaults还是在/etc/xinetd.conf中。如果要在一个文件中捕获xinetd的PID,可以用

xinetd –pid 2> /var/run.xinetd.pid

和xinetd一起使用的可用信号 xinetd进程也基于收到的信号采取特定的行动。表16描述了它接受的每个信号的功能。注意每当增加了新服务或defaults项,或每当改变了任何服务的如下属性:protocol,socket_type,type或wait时,必须用SIGTERM(或更简单的TERM)信号中止xientd。每当给xinetd发布一个软性或硬性重配置信号时,将写入例19中所示类型的登记项。这个特定例子是硬性重配置的结果。注意这次硬性重配置的结果是中止了一项服务(用dropped=1标识)。



表 5 xinetd的标记

标 记
描 述

-d
调试模式。输出可和调试器如gdb一起使用

-sysllog facility
指定syslogd工具。是daemon, auth, user和loca10-7其中之一

-filelog file
指定登记写到file而不是syslog中。必须是完整路径名

-fconfig_file
指定配置文件。必须是完整路径名。缺省是/etc/xinetd.conf

-pid
把PID写入标准错误中

-loop rate
指定每秒钟分叉的进程数。缺省是10.对较快机器来说可能希望改变它

-reuse
设置可重用的TCP socket,这意味着以前的实例运行时也可启动其他进程。当和flags属性一起使用时,有更特殊的服务控制(参看表10.10)

-limit numproc
限制由xinetd启动的同时运行的进程总数为numproc

-
限制同时发生的RFC1413请求数为limit

-shutdownprocs limit
当log_on_failure属性中使用了RECORD值时,xinetd分叉称为shutdown的服务以收集服务终止时的信息。该选项限制同时运行的shutdown进程总数为limit

-cc interval
使xinetd每隔interval秒运行对其内部状态的一致性检查。用killall –IOT xinetd可手工实现


表18 xinetd信号

信 号
作 用

SIGUSR1
软性重配置。重读/etc/xinetd.conf并作相应调整

SIGUSR2
硬性重配置。重读/etc/xinetd.conf并杀死和配置文件中的建立准则不再匹配的所有进程。例如,如果一个客户机连接到这个服务器且又增加到no_access表中,那么这个信号会终止该客户机的会话

SIGQUIT
终止xinetd但不终止它分叉的任何进程

SIGTERM
终止xinetd分叉的所有进程;然后终止xinetd

SIGHUP
把xinetd状态信息写到/tmp/xinetd.dump中

SIGIOT
检查内部数据库毁坏情况并报告结果


例19 xinetd硬性重配置的登记记录

Apr 15 14:42:31 topcat xinetd[1402]:Starting hard reconfiguration
Apr 15 14:42:31 topcat xinetd[1402]:readjusting service servers
Apr 15 14:42:31 topcat xinetd[1402]:readjusting service servces
Apr 15 14:42:31 topcat xinetd[1402]:readjusting service telnet
Apr 15 14:42:31 topcat xinetd[1402]:readjusting service shell
Apr 15 14:42:31 topcat xinetd[1402]:readjusting service login
Apr 15 14:42:31 topcat xinetd[1402]:readjusting service talk
Apr 15 14:42:31 topcat xinetd[1402]:readjusting service ntalk
Apr 15 14:42:31 topcat xinetd[1402]:readjusting service pop-2
Apr 15 14:42:31 topcat xinetd[1402]:readjusting service pop-3
Apr 15 14:42:31 topcat xinetd[1402]:readjusting service imap
Apr 15 14:42:31 topcat xinetd[1402]:readjusting service linuxconf
Apr 15 14:42:31 topcat xinetd[1402]:readjusting service ftp
Apr 15 14:42:31 topcat xinetd[1402]:Reconfigured:new=1 old=12 dropped=1 (services)


注:确定某个修改的/etc/xinetd.conf文件被读的最可靠方式是停止并重启动xinetd进程。最好用SIGTERM信号中止xinetd。如这节中描述的,发给xzinetd一个SIGTERM使它中止(用SIGKILL或信号号9)其控制之下的每个进程。有时在xinetd的子进程中止之前有一个延时,这意味着如果杀死并立即重启动xinetd,它不可能绑定所有端口(对此xinetd的登记文件----而不是这项服务指定的登记文件----中含一个错误消息)。这就是为什么sleep3命令出现在例中的stop和start命令间的脚本中。对TCP服务如telnet和ftp用flags=REUSE属性及其值或指定xinetd自身的-reuse选项可完全消除这个问题。

 


我的QQ群:500人财富群11470502;投资群5920530;资源群6648659;交友群5713862;娱乐群6925950。
我的博客:http://104508155.qzone.qq.com/

 [作者]dsj [头衔]论坛坛主 [经验]220862 [等级]大主帅  [发帖]15642  [回帖]1366 [登陆]7956
[发表时间]2003/4/14 23:04:57 [5楼]
21。PHPJSP/servletsMysqlpostgresqlapache完全安装手册

本页动态更新--随以上软件的最新版本变动来随时改动--但会以稳定版为例--不会选beta版。--fei水平有限--不足及错误之处请指正。--一般来说按照我的步骤不会有问题--而且是通用的--如要自行删或加功能对别的都不会有影响。
目前:apache 1.3.22稳定版2.0.28beta版
php 4.06稳定版 4.1.0开发版
postgresql 7.1.3 稳定版7.2beta3开发版
jdk-1.3.1稳定版.1.4beta3开发版
resin2.04稳定版--resin-cmp1.04稳定版
----解释--平台选用的是Mandrake8.1--而不是Redhat7.2--是因为我个人觉得redhat可能更注意性能--而mandrake更注重使用顺手和兼容性。--比如JDK1.4beta3我在一台redhat7.0升级到7.2的server上会出现动态库版本不兼容的问题--而mandrake8.1无论装什么都很顺利-(那怕是Oracle8i)-只是configure php和apache2.0.28--(1.3.22没问题)-会死在那里--这是bash的问题-下个源码--比如最新的2.05a--自己编译一下就行。还有就是mandrake缺省会安装kaffe一个开源的Java解释器--把它删了rpm -e kaffe-好装JDK-jsp/servlets引擎我用的是resin-cmp(resin也行--不过cmp可支持EJB哦:))而不是Tomcat是因为我个人觉得resin更快更好用-而且十分顺手。而resin-cmp对J2EE支持更好-还内置Mysql的JDBC驱动--太方便了。这些软件都可以在我开ftp://202.96.64.158/pub/得到。
好下面开始了--
1--首先是JDK--
chmod 755 j2sdk-1_4_0-beta3-linux-i386-rpm.bin
./j2sdk-1_4_0-beta3-linux-i386-rpm.bin
回答yes--会生成一个rpm文件--rpm -ivh j2sdk-1_4_0-beta3-linux-i386-rpm--会装在/usr/java/j2sdk1.4.0下。改环境变量cd
vi .bash*e加/usr/java/j2sdk1.4.0/bin:/usr/java/j2sdk1.4.0/jre/bin到path,加JAVA_HOME=/usr/java/j2sdk1.4.0
CLASSPATH=/usr/java/j2sdk1.4.0/lib:/usr/java/j2sdk1.4.0/jre/lib
export JAVA_HOME CLASS_PATH然后source .ba*e--java -version看看是否生效了--这样JDK就装完了。
2。mysql--tar zxvf mysql*45*gz;cd mysql*45
./configure (这里有不少选项--可按需要加减--比如需要事务处理就加上--with-innodb可 --help看全部选项,常用的还有--prefix指定安装目录。如内存少加上--with-low-memory试试。然后make ,make install-再到prefix的目录下的bin下./my*db初始化系统表--然后./safe_mysqld -u root &即可起动mysql--注意-u root是最近版本加的--我是出于简便--也可以mysql用户身份运行--但要改脚本属性-然后mysqladmin u root password "password"设一下root口令。这样mysql就装好了。
3。然后是Postgresql--它与Mysql比要麻烦一些,要加useradd postgres这个用户--有些系统可能会自带此用户--最好删了重加,然后到Postgres主目录下编辑环境变量,(此步后做也行)--假设我要装到/home/postgres下chown postgres:postgres /home/postgres,vi .ba*e加入/home/postgres/bin到PATH后面,PGLIB=/home/postgres/lib;PGDATA=/home/postgres/data;MANPATH=/home/postgres/man;export PGLIB PGDATA MANPATH,然后source .ba*e,再回到安装目录。/configure --prefix=/home/postgres --enable-locale --with-multibyte同样要别的再加,make make install,再到doc下make install安装文档然后su - postgres,initdb,pg_ctl start就可以了。
4。php--注意要对Apache做预configure,先到apache目录src/include/--vi httpd.h找256--改成1024--不管你的负荷大不大--这一步是我推荐的。然后configure apache,再回到php目录configure --with-apache=../apache_1.3.22 (假设你所有软件解在同一目录下) --with-mysql=(你装mysql的目录,要是Mysql4你要打一个补丁。) --with-pgsql=/home/postgres --enable-track-vars --with-ftp --enable-trans-sid ,make ,make install。
5。apache--./configure --prefix=(你想装的地方) --activate-module=src/modules/php4/libphp4.a(不是libmodphp4.a) --enable-shared=max (支持DSO),make,make install,然后去Apache的安装后目录下conf下vi httpd.conf--去掉这两行前面的#
AddType application/x-httpd-php .php .php3 .phtml
AddType application/x-httpd-php-source .phps
../bin/apachectl start起动Apache在htdocs下建个phpinfo.php
--然后lynx http://localhost/phpinfo.php如能看到PHP相关信息--(包括mysql.postgresql,apache的——则说明安装成功了。
6。resin--解开tar zxvf resin*cmp*gz 进去后./configure --with-apache= --with-java=/usr/java/j2sdk1.4.0,make ,make install你会发现在Apache的httpd.conf最后面加上了一段mod_caucho的信息,重起Apache,再到resin目录下bin下./http*sh start--起动resin-cmp--lynx http://localhost:8080要是能看到页面说明resin-cmp也成功了。 

22. Apache1.3.22与Tomcat4.01的整合

标 题: HWOTO install and setup Apache+Jakarta-Tomcat4.01+webapp-modul for Linux
发布日期: 2001-10-16 12:00
发 布 者: 疯傻
作 者: 疯傻(madfool@163.net)
说 明: 此文档严格遵循GPL协议,转帖请保持此文档的完整性!

1.所需的软件包:
jdk1.3.1_01
Apache1.3.22
Jakarta-Tomcat4.01
Webapp-modul1.0
2.软件包下载地址:
(1) Java 2 SDK, Standard Edition Version 1.3.1_01 for Linux (Intel x86)
URLhttp://java.sun.com/j2se/1.3/download-linux.html
(2) Apache_1.3.22
URLhttp://httpd.apache.org/dist/httpd/apache_1.3.22.tar.gz
(3) Jakarta-Tomcat4.01
URLhttp://jakarta.apache.org/builds/jakarta-tomcat-4.0/release/v4.0.1/bin/jakarta-tomcat-4.0.1.tar.gz
(4) Webapp-modul1.0
URLhttp://jakarta.apache.org/builds/jakarta-tomcat-4.0/release/v4.0.1/bin/linux/i386/webapp-module-1.0-tc40-linux-glibc2.2.tar.gz
3.软件安装:
(1) 解开压缩包
   使用tar或rpm解开下载的软件包,按照默认方式安装既可
(2) 目录的处理
JDK安装目录: /usr/java/jdk1.3.1_01
Apache安装目录: /etc/httpd
/usr/lib/apache
/var/www
Jakarta-Tomcat安装目录: /usr/local/jakarta-tomcat-4.0.1
Webapp-modul安装目录:/usr/local/webapp-module-1.0-tc40
4.环境变量设置:
PATH=/usr/java/jdk1.3.1_01/bin:/usr/java/jdk1.3.1_01/jre/bin:/usr/local/sbin:/usr/sbin:/sbin:$PATH:$HOME/bin
JAVA_HOME=/usr/java/jdk1.3.1_01
CLASSPATH=/usr/java/jdk1.3.1_01/lib:/usr/java/jdk1.3.1_01/jre/lib
CATALINA_BASE=/usr/local/jakarta-tomcat-4.0.1
CATALINA_HOME=/usr/local/jakarta-tomcat-4.0.1
5.特殊安装:
把/usr/local/webapp-module-1.0-tc40目录下的mod_webapp.so文件复制到/usr/lib/apache
并执行如下命令来改变其属性
cd /usr/lib/apache
chmod +x mod_webapp.so
6.独立环境的测试
(1) 测试Java的运行状况,如下命令:
cd
java -version
javac -version
看到版本号则表示JDK安装成功
(2) 测试Apache的运行状况,如下命令:
/etc/init.d/httpd restart ## 重新启动Apache Server
使用任意一浏览器,输入服务器地址后回车,应该可以看到Apache的默认主页
(3) 测试Jakarta-Tomcat的运行状况,如下命令:
cd /usr/local/jakarta-tomcat-4.0.1
cd bin
./startup.sh ## 启动jakarta-tomcat-4.0.1服务
使用任意一浏览器,输入服务器地址和端口号8080后回车,应该可以看到jakarta-tomcat-4.0.1的默认主页
例如: http://192.192.192.1:8080
./shutdown.sh ## 关闭jakarta-tomcat-4.0.1服务
7.整合安装设置
(1) 修改/etc/httpd/conf/httpd.conf文件
在# Dynamic Shared Object (DSO) Support之后,添加如下内容
LoadModule webapp_module modules/mod_webapp.so
(2) 修改/etc/httpd/conf/httpd.conf文件
在ClearModuleList后,添加如下内容
AddModule mod_webapp.c
(3) 修改/etc/httpd/conf/httpd.conf文件
在文件尾部添加如下内容
WebAppConnection warpConnection warp localhost:8008
WebAppDeploy examples warpConnection /examples/
8.整合测试
重新启动所有服务
/usr/local/jakarta-tomcat-4.0.1/bin/shutdown.sh
/usr/local/jakarta-tomcat-4.0.1/bin/startup.sh
/etc/init.d/httpd restart
在浏览器中输入如下地址
http://服务器IP/examples/jsp/index.html,如果能够显示正常的网页,则安装成功
在浏览器中输入如下地址
http://服务器IP/examples/jsp/jsptoserv/jsptoservlet.jsp,如果能够显示正常的网页和时间,则jsp和Servlet安装成功
9.注意,
如在第8步中,重启Apache服务的时候报如下错误
Syntax error on line 1219 of /etc/httpd/conf/httpd.conf:
Invalid virtual host name
则证明在/etc/httpd/conf/httpd.conf中,未设定ServerName
打开/etc/httpd/conf/httpd.conf文件,找到ServerName一项,设定为你指定的名字,或简单的去掉#ServerName前的“#”号,再执行/etc/init.d/httpd restart就可以了!
10.祝你好运,如还有问题,请联系我
作 者: 疯傻
E-mail : madfool@163.net
HomePage: http://www.binary.com.cn ;

23.在FREEBSD系统上配置APACHE WEB服务器及其常用模块 

在FREEBSD系统上配置APACHE WEB服务器,及其常用模块。

apache+mod_gzip+mod_perl+mod_php+modssl+mod_fastcgi+mysql

在磁盘上建立一个工作目录/ 列如:mkdir /www

1:到APACHE的网络站下载APACHE WEB SERVER http://www.apache.org ;(目前版本是1.2.23)

2:到php的网络站下载php解析器 http://www.php.net ;(目前版本是 4.1.1)

3:到mod_gzip的网站下载mod_gzip.c http://www.remotecommunications.com/apache/mod_gzip/(目前版本

1.3.19.1a)

4:到mysql的网站下载 mysql http://sourceforge.net/projects/mysql/ ;(目前版本 3.23.49a)

5:到mod_perl的站点下载mod_perl http://perl.apache.org/dist/ ;(目前版本1.26)

更多APACHE模块 http://cpan.valueclick.com/modules/by-module/Apache/

6:到modssl网站下载 modssl http://www.modssl.org/contrib/ ;(目前版本2.87 for apache 1.3.23)这个模块

要符合你的apache版本,如:2.87只可以编译到apache 1.3.23的版本里。

7:到openssl的网站下载 openbssl http://www.openssl.org/(目前版本0.9.6c)

8:到mod_fastcgi网站下载mod_fastcgi http://www.fastcgi.com/dist/ ;(目前版本 2.2.12)

以上软件都下载到你的工作目录 /www 里。

cd /www

tar -zxvf apache_1.3.23.tar.gz

解开以后把目录更名为 mv apache_1.3.23 apache

tar -zxvf mod_perl-1.26.tar.gz

解开以后把目录更名为 mv mod_perl-2.26 mod_perl

tar -zxvf php-4.1.1.tar.gz

解开以后把目录更名为 mv php-4.1.1 php4

tar -zxvf mod_fastcgi-2.2.12.tar.gz

解开以后把目录更名为 mv mod_fastcgi-2.2.12 mod_fastcgi

tar -zxvf mod_ssl-2.8.7-1.3.23.tar.gz

解开以后把目录更名为 mv mod_ssl-2.8.7-1.3.23 mod_ssl

tar -zxvf openssl-0.9.6c.tar.gz

解开以后把目录更名为 mv openssl-0.9.6c openssl

tar -zxvf mysql-3.23.49.tar.gz

解开以后把目录更名为 mv mysql-3.23.49 mysql

先安装mysql

首先要为mysql 添加组和用户。

pw groupadd mysql (添加mysql用户组)

pw useradd mysql -g mysql -s /nonexistent (添加mysql用户)

用户和组添加完毕下一步我们开始编译安装mysql

cd mysql

./configure --prefix=/usr/local/mysql (这里指定把你的mysql安装到/usr/local/mysql 的目录里。)

make

make install

cd /usr/local/mysql/bin/

执行 ./mysql_install_db

cd /usr/local/mysql/share/mysql

执行 ./mysql.server

至此mysql安装完毕。让我们来看一下运行情况,

/usr/local/mysql/mysql

如果出先如下提示,说明mysql安装运行正常。

Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3 to server version: 3.23.49-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>
在 mysql>提示符下执行,
mysql>status
显示如下。
--------------
mysql Ver 11.16 Distrib 3.23.49, for unknown-freebsdelf4.5 (i386)

Connection id: 4
Current database:
Current user: root@localhost
Current pager: stdout
Using outfile: ''
Server version: 3.23.49-log
Protocol version: 10
Connection: Localhost via UNIX socket
Client characterset: latin1
Server characterset: latin1
UNIX socket: /tmp/mysql.sock
Uptime: 3 hours 22 min 32 sec

Threads: 1 Questions: 6 Slow queries: 0 Opens: 6 Flush tables: 1 Open tables: 0 Queries per

second avg: 0.000
--------------
执行
mysql>exit

退出mysql

/usr/local/mysql/bin/mysqladmin -u root password 123 (给mysql用户加上密码。密码为 123 或自己定义

)

/usr/local/mysql/bin/mysqladmin -u root -h lhs.westxj.net password 123 (给mysql用户加上密码。密码

为 123 或自己定义)

看看密码是否设置成功。

/usr/local/mysql/bin/mysql -u root -p (回车,然后输入你的mysql密码)

/usr/local/mysql/bin/mysql -u root -h you.com.cn -p (回车,然后输入你的mysql密码)

接下来我们准备安装apache和其他模块。

cd /www/apache

./configure --prefix=/usr/local/apache --enable-module=so(这个我们把apache 安装目录指定到

/usr/local/apache 里。)

为apache准备php模块。

cd /www/php4

./configure --with-mysql=/usr/local/mysql --with-apache=/www/apache --enable-track-vars

make

make install

为apache准备mod_perl 模块。

cd /mod_perl

perl Makefile.PL PL APACHE_SRC=/www/apache/src

perl Makefile.PL DO_HTTPD=1

perl Makefile.PL USE_APACI=1

perl Makefile.PL PERL_HTTPD=1

perl Makefile.PL EVERYTHING=1

(以上指令在Apache目录中创建perl的mod-perl模块)

make

make test

make install

为mod_ssl安装准备openssl

cd /www/openssl

./configure

make

make install

为apache 准备modssl模块。

cd /www/mod_ssl

./configure --with-apache=/www/apache --with-ssl=/www/openssl

make

make install

为apache 准备mod_fastcgi模块。

cd /www

将mod_fastcgi搬移并更名到apache的src/modules/目录里。

mv mod_fastcgi /www/apache/src/modules/fastcgi

为apache准备mod_gzip模块。

先在apache的src/modules/的目录里建立一个叫mod_gzip的目录。

mkdir /www/apache/src/modules/mod_gzip

cp mod_gzip.c /www/apache/src/modules/mod_gzip/

至此准备工作完毕,我们开始编译安装apache

cd /www/apache



/configure --prefix=/usr/local/apache --activate-module=src/modules/php4/libphp4.a

--activate-module=src/modules/perl/libperl.a --activate-module=src/modules/ssl/libssl.a

--activate-module=src/modules/fastcgi/libfastcgi.a --add-module=src/modules/mod_gzip/mod_gzip.c

--enable-module=so

make

make certificate TYPE=custom (设置mod_ssl)
这一步要生成你自己的 CA (认证中心),和用它来为你的服务器签署证书。 有很多东西要输入。

STEP 0: 选择算法,使用缺省的 RSA
STEP 1: 生成 ca.key,CA的私人密钥
STEP 2: 为CA生成X.509的认证请求 ca.csr 要输入一些信息:

Country Name: cn 国家代码,两个字母
State or Provice name: xin jiang 省份
Locality Name: urmqi 城市名
Organization Name: Home CA 组织名,随便写吧
Organization Unit Name: Mine CA
Common Name: Mine CA
Email Address: lhs@westxj.net 我的Email
Certificate Validity: 365 默然为一年。

STEP 3: 生成CA的签名,ca.crt
STEP 4: 生成服务器的私人密钥,server.key
STEP 5: 生成服务器的认证请求,server.csr 要输入一些信息,和STEP 2类似,
不过注意 Common Name是你的网站域名,如 www.you.com.cn Certificate Validity不要太大,365就可以了。
STEP 6: 为你的服务器签名,得到server.crt
STEP 7-8 :为你的 ca.key 和 server.key 加密,要记住pass phrase。

最后我们来完成apache的安装

make install

再做一些收尾工作。

cd /www/php4

把php.ini-dist配置文件拷贝并更名到/usr/local/lib/ 名为php.ini

cp /php.ini-dist /usr/local/lib/php.ini

再去配置一下apache下的/conf/httpd.conf文件。

cd /usr/local/apache/conf/

vi httpd.conf


ServerAdmin lhs@westxj.net (管理员邮箱,改成你自己的。)

#ServerName westxj.net (网站域名,该成你自己的域名,并把#号去掉!)

# And for PHP 4.x, use:(修改支持php脚本的配置,把#号去掉修改为如下列子。)
#
#AddType application/x-httpd-php .php
#AddType application/x-httpd-php-source .phps

AddType application/x-tar .tgz

列子:
# And for PHP 4.x, use:
#
AddType application/x-httpd-php .php .php3 (如果要支持老脚本php3,在这里加上.php3就可以了。)
AddType application/x-httpd-php-source .phps

AddType application/x-tar .tgz


修改完毕,下面我们来测试一下配置文件是否正确。

/usr/local/apache/bin/httpd -t

如果显示如下。
Syntax OK
说明配置无误。

让我们运行apache服务。

/usr/local/apache/bin/apachectl startssl (回车,输入你设置的mod_ssl 密码)

浏览一下看是否服务启动起来。

lynx localhost

或在其他浏览器里输入地址。

http://localhost
http://127.0.0.1
看到apache测试页说明服务启动起来了。

最后再来让我们测试一下php模块是否工作正常。

cd /usr/local/apache/htdocs/

建立一个TEST的php脚本。

vi test.php

<?
phpinfo ()
?>

http://localhost/test.php

如果看到内容说明工作正常。
如果你在安装中有什么问题,欢迎你给我发信提问。dzzs@westxj.net
 


我的QQ群:500人财富群11470502;投资群5920530;资源群6648659;交友群5713862;娱乐群6925950。
我的博客:http://104508155.qzone.qq.com/

 [作者]dsj [头衔]论坛坛主 [经验]220862 [等级]大主帅  [发帖]15642  [回帖]1366 [登陆]7956
[发表时间]2003/4/14 23:07:57 [6楼]
24.有关php的DSO编译方式产生undefined symbol:uncompress错误的解决

感谢viva,尽管我没遇到过--如果你遇过看看吧。
哈哈,碰见这样的问题首先你没有好好看安装文件,没有看看configure的参数,我是这样解决的。
php的dso安装说明:
1。编译mysql源码文件
如果你要用这个--with-mysql参数
需要mysqlclient.so,这个文件需要mysql的源码重新编译产生
去mysql的主页下载源码文件,看看安装说明如何编译
我的环境是redhat 7.2
根据安装说明文件提示:
CFLAGS="-O3 -mpentiumpro" CXX=gcc CXXFLAGS="-O3 -mpentiumpro
-felide-constructors -fno-exceptions -fno-rtti" ./configure
--prefix=/usr/local/mysql --enable-assembler
--with-mysqld-ldflags=-all-static --disable-shared
--with-extra-charset=complex
修改说明文件中的参数--disable-shared 为--enable-shared
否则共享库libmysqlclient.so不会产生,其他参数你慢慢调试
然后根据php的安装文件提示修改/etc/ld.so.conf
加入libmysqlclient.so 的文件路径
执行ldconfig

2。php安装
根据php的DSO安装文件提示安装就可以了,要用源码编译后的mysql路径编译php。
真是搞不懂php.net是怎样解决问题的,那么多同这类似的问题
却没有一个得到满意的答案,只有慢慢啃他的文档,结果搞定,想不到吧,文档很重要哦

25.在debian中安装apache+php+mysql 

在debian中安装apache+php+mysql中非常简单,
1.安装:
apt-get install apache php4 mysql
则自动下载所需要的软件包,确认安装.安装过程中都选ok,然后会提示你是否现在就启动,确认启动.
2.测试:
写一个测试文件:<? phpinfo(); ?>
感觉一都ok,但进行连接数据库测试,则有问题,死活都连接不上,发了封信到debian-chinese-gb@lists.debian.org,很快一位叫Alex的网友回复.
原来还需要下载一个php4-mysql,
apt-get install php4-mysql
安装中提示你需要在php.ini文件中增加一行:extension=mysql.so
确认后会自动在php.ini文件中增加
一切ok.测试也没什么问题,phpinfo测试文件中也出现了mysql相关内容.

在开始安装时增加一个php4-mysql应该也可以. 

 26。Apache与mod_python的整合

 fei最近一直在看Python的书,深深被这种语言的优秀简练和有趣而打动,很是着迷。当然想把它用于Web开发,前面limodou兄写了把Python做为外部CGI的方法----不过有Apache的内部模块mod_python当然是用它了--优点多多(如果你知道Mod_perl和FastCGI你就会明白。看看mod_python的官方数据:Performance
Some very quick tests showed a very apparent performance increase:
Platform: 300Mhz Pentium MMX (Sony Vaio PCG-505TR), FreeBSD
Program: A script that first imported the standard library
cgi module, then output a single word "Hello!".
Measuring tool: ab (included with apache), 1000 requests.
Standard CGI: 5 requests/s
Cgihandler: 40 requests/s
As a handler: 140 requests/s还有个mod-snake据说可以把Python嵌在HTML中,fei下载了不过还没试,因为从sourceforge上看好象停止开发了:(--网上并没有Apache与Mod_python整合的资料--所以fei自己动手并参考Mod_python的文档-总结出这篇文章--希望对大家有所帮助。
我使用的版本是Apache1.3.26,Python2.2.1,Mod_python2.7.8,(下载都可ftp://202.96.64.158/pub),平台redhat7.2在安装过程中还真遇到了不少麻烦-并不象以往Apache模块那么好装,虽然最后解决了--但还真是值得一写的。
1。先装好Apache1.3.26----正常装--可支持DSO,加上--enable-shared=max就行。--这步没什么好说的--不过Apache2.0还不支持,1.3也最好是1.3.20以上。如果你想把mod_python做为静态模块也是可以的--见后面。
2。装Python,这里要注意--最好不要使用线程,因为Apache1.3还不怎么支持线程。如果用了的话后来起动Apache时会说Cannot load /root/apache1326/libexec/mod_python.so into server: /root/apache1326/libexec/mod_python.so: undefined symbol: pthread_sigmask--我是用Python源码装的--configure时加上了--without-threads选项,然后make,make install,最后最好设一下PATH和PYTHONPATH环境变量-使得python能被找到-否则如果Mod_python找不到库的话会有很多错误。这里要切记。
3。装Mod_python,这里先configure--注意有三个重要选项。--with-apxs找到apxs以生成DSO模块,--with-apache=这步就是用于生成静态模块了,在make后用make install_static生成,然后./configure --activate-module=src/modules/python/libpython.a-和PHP的安装方式差不多。不过我们一般还是用DSO方式,--with-python这步如果你按我说的设了环境变量的话就不用加了。configure后就make,注意make后要make install_py_lib,否则起Apache时会说undefined symbol:openpty,这步我想了很久。然后make install.
4.配Apache,加上LoadModule python_module libexec/mod_python.so
AddModule mod_python.c,再在你要用CGI的目录上设
<Directory /some/directory/htdocs/test>
AddHandler python-program .py
PythonHandler mptest
PythonDebug On
</Directory>
重起Apache。
5。测试。最后在test目录中编写一个mptest.py,内容如下:
from mod_python import apache
def handler(req):
req.send_http_header()
req.write("Hello World!")
return apache.OK
注意一定要小心缩进--否则会产生异常!然后访问test/mptest.py如果看到Hello World!
那就恭喜你大功告成了!
如果在安装过程有未知问题,请与fei联系xf5@163.net,对于mod_python更详细的用法和说明可http://www.modpython.org/live/mod_python-2.7.8/doc-html/

27。kuu的程序解决apache中文文件名问题--大家试试

前段时间好象有人问过这个问题:就是在apache目录中不放index文件而由apache自动生成索引,中文文件名保存时不正常的问题。
学校开始放暑假有空,想出个解决办法,希望能有点用。
关于设置IE中的UTF-8,我想可以编一段脚本更改注册表实现(不过那样会不会被当作病毒),也可以在页面上提醒用户更改。

程序附后:
<?
/************************************************************************/
/* 显示文件索引 */
/* v0.1 2002年7月19日 */
/* */
/* 浙江建设职业技术学院 王进勇 kuu@163.net */
/************************************************************************/
//未解决的问题:无效链接问题,文件大小显示和排序


//要求不显示的文件名
$file_hide=array(".",basename($PHP_SELF), //程序名称
".htaccess",
);
//文件扩展名对应的图标
$file_map=array(
"d ir"=>"folder.gif",
"htm"=>"text.gif",
"html"=>"text.gif",
"txt"=>"text.gif",
"png"=>"image2.gif",
"gif"=>"image2.gif",
"jpg"=>"image2.gif",
"exe"=>"binary.gif",
"com"=>"binary.gif",
"bin"=>"binary.gif",
"zip"=>"compressed.gif",
"gz"=>"compressed.gif",
"mp3"=>"sound2.gif",
"ra"=>"sound2.gif",
"pdf"=>"layout.gif",

);

//读入文件名、大小、时间
$handle=opendir('.');
while ($file = readdir($handle)) {
//处理“上一级目录”
if(".."==$file){
$file_name_back="上一级目录";
$file_icon_back="back.gif";
$file_link_back="../";
$file_size_back="-";
$file_time_back=date("F j Y h:i:s A",filemtime($file));
continue;
}
//处理不显示的文件名
for($j=0;$j<count($file_hide);$j++)
if($file_hide[$j]==$file) $file=".";
if("."==$file) continue;
//处理其它文件: 取文件名、类型、大小、时间、扩展名、链接文件实际指向
$file_name=$file; //名称
$file_size=("dir"==filetype($file)) ? "-" : filesize($file); //大小
$file_time=filemtime($file); //时间
$file_type=filetype($file); //类型(目录,文件,链接等)
//链接的目标为目录则设定其类型为目录
if("link"==filetype($file) && "dir"==filetype(readlink($file)) )
$file_type="dir";
//目录的链接名后加/,非目录不加;目录的扩展名为d ir,非目录取文件扩展名
if("dir"==filetype($file)){
$file_link="$file/";
$file_ext="d ir";
}else{
$file_link="$file";
$file_ext=(strrpos($file,".")) ? substr($file,strrpos($file,".")+1) : "";//扩展名
$file_ext=strtolower($file_ext); //转换成小写
}
//根据扩展名取图标文件名
$file_icon=$file_map[ $file_ext ];
if(""==$file_icon) $file_icon="unknown.gif";
//转存到数组中
$file_list[0][]=$file_name; //名称
$file_list[1][]=$file_size; //大小
$file_list[2][]=$file_time; //时间
$file_list[3][]=$file_type; //类型(目录,文件,链接等)
$file_list[4][]=$file_link; //链接名
$file_list[5][]=$file_ext; //扩展名
$file_list[6][]=$file_icon; //图标名
}
closedir($handle);

//列头(可排序)
$title_name="<A HREF='$PHP_SELF?sort=NameA'>名称</A>";
$title_size="<A HREF='$PHP_SELF?sort=SizeA'>大小</A>";
$title_time="<A HREF='$PHP_SELF?sort=TimeA'>修改时间</A>";
$title_memo="<A HREF='$PHP_SELF?sort=MemoA'>备注</A>";
//默认根据排序依据列
$file_list_disp=$file_list[0];

//控制根据参数排序
switch ($sort) {
case "NameA":
asort($file_list[0],SORT_STRING); //根据名称顺序
$title_name="<A HREF='$PHP_SELF?sort=NameB'>名称</A>";
$file_list_disp=$file_list[0];
break;
case "NameB":
arsort($file_list[0],SORT_STRING); //根据名称降序
$title_name="<A HREF='$PHP_SELF?sort=NameA'>名称</A>";
$file_list_disp=$file_list[0];
break;
case "SizeA":
asort($file_list[1],SORT_NUMERIC); //根据大小顺序
$title_size="<A HREF='$PHP_SELF?sort=SizeB'>大小</A>";
$file_list_disp=$file_list[1];
break;
case "SizeB":
arsort($file_list[1],SORT_NUMERIC); //根据大小降序
$title_size="<A HREF='$PHP_SELF?sort=SizeA'>大小</A>";
$file_list_disp=$file_list[1];
break;
case "TimeA":
asort($file_list[2],SORT_NUMERIC); //根据时间顺序
$title_time="<A HREF='$PHP_SELF?sort=TimeB'>修改时间</A>";
$file_list_disp=$file_list[2];
break;
case "TimeB":
arsort($file_list[2],SORT_NUMERIC); //根据时间降序
$title_time="<A HREF='$PHP_SELF?sort=TimeA'>修改时间</A>";
$file_list_disp=$file_list[2];
break;
default:
//默认不排序
}
?>

<!-- 以下为HTML文件头 -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<HEAD>
<TITLE>Index of <?= dirname($PHP_SELF) ?></TITLE>
</HEAD>
<style type="text/css">
<!--
table {font-family: "宋体"; font-size: 13px}
-->
</style>
<BODY>
<H1>Index of <?= dirname($PHP_SELF) ?></H1>
<!-- 表头开始 -->
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="5%" align="center"> </td>
<td width="30%" align="left"> <?=$title_name?></td>
<td width="8%" align="right"><?=$title_size?></td>
<td width="32%" align="center"><?=$title_time?></td>
<td width="30%" align="center"><?=$title_memo?></td>
</tr>
<tr>
<td colspan="5">
<hr size="2">
</td>
</tr>
<!-- 表头结束 -->

<?
//"上一级目录"固定显示在第一行
echo "<tr height=25>\n";
echo "<td><IMG SRC=\"/icons/".$file_icon_back."\" ALT=\"[".$file_link_back."]\"></td>";
echo "<td><A HREF=\"".$file_link_back."\">".$file_name_back."</A>"."</td>";
echo "<td align=right>".$file_size_back."</td>";
echo "<td align=left>   ".$file_time_back."</td>";
echo "<td> </td>";
echo "\n</tr>\n";

//显示其它文件行
//$file_list_disp=$file_list[0];
//arsort($file_list[0]);
while (list($i) = each($file_list_disp)) {
echo "<tr height=25>\n";
echo "<td><IMG SRC=\"/icons/".$file_list[6][$i]."\" ALT=\"[".$file_list[5][$i]."]\"></td>";
echo "<td><A HREF=\"".$file_list[4][$i]."\">".$file_list[0][$i]."</A>"."</td>";
echo "<td align=right>".$file_list[1][$i]."</td>";
echo "<td align=left>   ".date("F j Y h:i:s A",$file_list[2][$i])."</td>";
echo "<td> </td>";
echo "\n</tr>\n";
}

?>
<!-- 显示页脚信息 -->
</table>
<HR>
<?=$SERVER_SIGNATURE?>
</BODY></HTML>




 


我的QQ群:500人财富群11470502;投资群5920530;资源群6648659;交友群5713862;娱乐群6925950。
我的博客:http://104508155.qzone.qq.com/

 [作者]dsj [头衔]论坛坛主 [经验]220862 [等级]大主帅  [发帖]15642  [回帖]1366 [登陆]7956
[发表时间]2003/4/14 23:09:46 [7楼]
 28.另一种很好用的Ftpserver-Pureftpd--推荐

 因为Proftpd的目前的版本还不能在freeBSD5.0上用(直到proftpd1.2.8RC2)--而且pure-ftpd在功能比proftpd有过之而无不及--而且还支持简体中文的选项-而且性能我举个例子-普通PC P3 550(不是PC Server,就是PC机)+384M内存--FreeBSD4.7pl3+Pure-ftpd优化后目前同时承受350个ftp并发进程(350是根据响应速度调整的)Proftpd达不到这个值-大家可以试试。另外www.pureftpd.org上不去--不过其ftp站ftp://ftp.pureftpd.org/可以上去。
推荐好文一篇:
[转贴]Pure-ftpd on FreeBSD之攻略(中文简体版)
此贴(繁体原版)MaxBSD以前已经贴出来过,个人感觉看起来不方便,就把它弄成了简体的,希望对大家有点帮助。有错漏的地方请指正,谢过!
********************************************************************************
Pure-ftpd on FreeBSD之攻略
----[作者]far
<一>PureFTPD介紹
顾名思义.他是纯粹的一套FTPD.(-.-"废话).她好用在哪里?唔...就是
好用.用了就对了.问那么多干嘛.^_^!!
--------------------------------------------------------------
<二>安裝PureFTPD
FreeBSD的ports里面也有.如果你偷懒的話.可以直接到ports下安裝即
可(/usr/ports/ftp/pure-ftpd).不过我建议你去他的官方网站抓
新版的http://www.pureftpd.org/).我用的是1.0.12版.用起来还不错.
以往我都是懒人安裝法:到ports目录下打make install clean.完成!!
后来.发现用ports装並不能將pure-ftpd的強大体现出来.(其实是旧版
fxp支持上有问題.)所以...难得...这么懒的我.也就用source装了.
废话了好多.:D

A。把抓下来的source解开.(建议解在/tmp下)
#tar zxvf pure-ftpd-1.0.12.tar.gz
如果沒事做.可以看看里面的README.* 很值得看.如果你有什
么特殊需求的话.也可以直接在里面去找.应该是可以找到你要的东
东.(Ex: LDAP.MySQL.Virtual.......)

B。开始准备依你的意愿做出你想要的ftp-server.
#./configure --with-paranoidmsg --with-sysquotas --with-puredb \
--with-altlog --with-throttling --with-ratios --with-ftpwho \
--with-welcomemsg --with-uploadscript --with-largefile \
--with-virtualhosts --with-virtualchroot --with-diraliases \
--with-quotas --with-peruserlimits --with-language=traditional-chinese

在README中[ADVANCED COMPILATION]的段落中,有对上面的使用的
详细说明.在这里我只对常用的做简略的解释.
--without-standalone
不能以standalone的方式执行ftpd.
--without-inetd
不能以inetd的方式执行ftpd.
--without-iplogging
做log時不将IP 地址给log下來.
--without-shadow
不做shadow.除非是用PAM, LDAP or SQL.不然极不建议拿掉.
--without-usernames
文件列表只会列出UID & GID,不列出实际user or group name.
--without-humor
嘿嘿嘿....
--without-ascii
不支持7-bits transfers(ASCII).
--with-paranoidmsg
唔....不知该怎么说.算是可以给特定人的信息吧.
--with-sysquotas
吃系统的quota设定.
--with-minimal
最小化安裝.
--with-pam
--with-puredb
--with-ldap
--with-mysql
--with-pgsql
以上五种都是存储资料的格式?!(算吧?!).看你比较习惯什么.
我是比较喜欢用puredb.
--with-altlog
留log拉....
--with-cookie
使用者进站看到的东东.类似进站画面.
--with-ratios
上下传比.
--with-throttling
频宽可设限.
--with-ftpwho
可用pure-ftpwho來看线上使用者.像是Serv-u的线上状态.
--with-uploadscript
当一个文件被完整上传完后自动呼叫某一script去对这个文件
处理.当然.这个script得你自己写.
--with-largefile
支持下载超过2G的文件.
--with-virtualhosts
跟http的virtualhost有异曲同工之妙.
--with-virtualchroot
配合上面的chroot.
--with-diraliases
跟Serv-U上面的link功能一样.
--with-nonroot
不需root权限.一般user即可启动ftpd.
--with-quotas
使用quota.(非系统下的quota)
--with-peruserlimits
enable per-user concurrency limits.Avoid this on
very loaded servers.(太难翻译了)
--with-everything
所有功能全上.
--with-language=traditional-chinese
显示出来的信息的语言.缺省为英语.
(意外的发现.在config.h中作者以为大陆用traditional-chinese
台湾用simplified-chinese.但不管如何,这不影响我们的使用)

C.好了就准备安装上去吧!!
#make ; make check ; make install

D.把一些东东搬到该放的位置.
#chmod 755 configuration-file/pure-config.pl
#cp configuration-file/pure-config.pl /usr/local/sbin/
#cp configuration-file/pure-ftpd.conf /usr/local/etc/

-------OK.PureFTPD就这样装完了.其他Config等下回分解.:p-----------

在上一章节.我们已经成功把PureFTPD架起来了.现在我们要开始设定他的设定文件.:)
--------------------------------------------------------------------------
<三>pure-ftpd.conf的设定
*在上一次,我们把PureFTPD的default设定文件(pure-ftpd.conf)拷贝一
份在/usr/local/etc/下.(其实哪都可以,只是我习惯).建议再拷贝
一份叫pure-ftpd.xxx.conf(如果你要跑多支ftpd的话.xxx部分可以自
由替代成你要的名字.方便就好).开始编辑pure-ftpd.xxx.conf.
#vim pure-ftpd.xxx.conf (看你喜欢用什么编辑器.自己选用)

####pure-ftpd.xxx.conf#######
ChrootEveryone yes
TrustedGID 50
#以上两者要一起用
BrokenClientsCompatibility no
MaxClientsNumber 999
#最大链接数
Daemonize yes
#Fork in background
MaxClientsPerIP 5
#每个ip最多链接数
VerboseLog no
#是否要把所有client端的指令都log下来
DisplayDotFiles no
#显示开头的文件
AnonymousOnly no
#是否只让匿名登录
NoAnonymous yes
#不开放匿名登入
SyslogFacility ftp
DontResolve yes
#不反向解释客户端的ip
MaxIdleTime 5
#最大闲置時間
PureDB /ftp/etc/pureftpd.pdb
#使用者资料的DB存放地点 [由于我是用PureFTPD的內建DB.固有此选项]
UnixAuthentication yes
#如果你想要有简单的Unix(/etc/passwd)的认证的話
LimitRecursion 1000 3
#ls最多列出1000个文件.最深3层
MaxLoad 4
#当system load超过4時.使用者将不能再下载
AntiWarez no
#上传的文件不能被下载(owner is ftp).等到local admin确认
Bind 21
#要绑定哪个ip/port
#格式-> 127.0.0.1,21 如果只写port表All ip,port
Umask 133:022
#上传文件的Umask.(<umask for files>:<umask for dirs>)
MinUID 1000
# UID至少多少才能登录
AllowUserFXP yes
#支不支持FXP
ProhibitDotFilesWrite no
ProhibitDotFilesRead no
#.开头的文件能不能被读写
AutoRename no
#上传文件若有相同文件名自动改名(file.1,file.2...)
TrustedIP 10.1.1.1
#锁IP.
AltLog stats:/ftp/etc/log/pureftpd.log
#log存放地点
NoChmod yes
#不给Chmod指令的权限
KeepAllFiles yes
#使用者可续传.但不可刪除文件
CreateHomeDir no
#如果user的home不存在自动建立
PIDFile /ftp/etc/log/pure-ftpd.pid
#记录pure-ftpd的PID文件
Quota 1000:10
#<文件数:Megabytes>
CallUploadScript yes
#呼叫UploadScript
MaxDiskUsage 99
#当硬盘使用率到多少時将停止上传
NoRename yes
#不给改文件名
PerUserLimits 3:20
#<每个账号最多可登入几次:Anonymous最多可同時登入几次>
#############################
-----------------------------------------------------------
<四>建立账号
有了ftp.理所当然得也要有账号才行.
#vipw
ftpuser:$1$rEO39XEq$kRMKuch12ugYu3hCh/sPA.:9999:9999::0:0:ftp:/ftp:
/sbin/nologin
#vim /etc/group
ftpgroup:*:9999:
上面是ftp 客户以什么身分登入.
接下来我想要把pure-ftpd要吃的密码文件选个地方放.我是选择放在/ftp/etc/下
#pure-pw far -f pureftpd.ps -u 9999 -g 9999 -d /ftp/far -y 2
#pure-pw mkdb pureftpd.pdb -f pureftpd.ps

<Ex:>
useradd <login> [-f <密码文件>] -u <uid> [-g <gid>]
-D/-d <主目录> [-c <gecos>]
[-t <下载频宽>] [-T <上传频宽>]
[-n <最多下载文件数>] [-N <最多下载Mb>]
[-q <upload ratio>] [-Q <download ratio>](上下传比)
[-r <allow client ip>/<mask>] [-R <deny client ip>/<mask>]
[-i <allow local ip>/<mask>] [-I <deny local ip>/<mask>]
[-y <同時最多链接数>]
[-z <hhmm>-<hhmm>](可登入時间24小时制) [-m]
pure-pw usermod <login> -f <passwd file> -u <uid> [-g <gid>]
-D/-d <home directory> -[c <gecos>]
[-t <download bandwidth>] [-T <upload bandwidth>]
[-n <max number of files>] [-N <max Mbytes>]
[-q <upload ratio>] [-Q <download ratio>]
[-r <allow client ip>/<mask>] [-R <deny client ip>/<mask>]
[-i <allow local ip>/<mask>] [-I <deny local ip>/<mask>]
[-y <max number of concurrent sessions>]
[-z <hhmm>-<hhmm>] [-m]

pure-pw userdel <login> [-f <passwd file>] [-m]

pure-pw passwd <login> [-f <passwd file>] [-m]

pure-pw show <login> [-f <passwd file>]

pure-pw mkdb [<puredb database file> [-f <passwd file>]]

-d <home directory> : chroot user (建议值)
-D <home directory> : don't chroot user
-y 0 : 同時最多链接数不限
-m : 同時更新/etc/pureftpd.pdb文件.(如果PureDB不放置在此的请不要加)
For a 1:10 ratio, use -q 1 -Q 10
To allow access only between 9 am and 6 pm, use -z 0900-1800
****************************************************************
关于文件权限部份.(需要將可Upload的使用者改成ftpuser:ftpgroup.可
下载的文件权限也要是644)
#chown -R ftpuser:ftpgroup Upload/

------------------------------------------------------------------
<五>启动
到/usr/local/bin/rc.d/下编辑一个pure-ftpd.sh
#############################
#!/bin/sh

case "$1" in
start)
if [ -f /usr/local/etc/pure-ftpd.xxx.conf ]; then
/usr/local/sbin/pure-config.pl /usr/local/etc/pure-
ftpd.xxx.conf > /dev/null 2>&1 && echo -n 'pure-ftpd Begin!'
fi
;;
stop)
/usr/bin/killall pure-ftpd > /dev/null 2>&1 && echo -n 'pure-
ftpd Stop!'
;;
*)
echo ""
echo "Usage: `basename $0` { start | stop }"
echo ""
exit 64
;;
esac
#############################
#chmod +x pure-ftpd.sh
#./pure-ftpd.sh start

ok...开始测试看看吧
ftp xxx.far2.net 21
Connected to ftp.far2.net.
220-=(<*>)=-.:. (( 欢迎来到 PureFTPd 1.0.12 )) .:.-=(<*>)=-
220-您是第 48 个使用者,最多可达 999 个连线
220-现在本地時间是 19:52 负载是 1.37。服务器端口: 21。
220-这是私用系统 - 不开放匿名登入
220 在 5 分钟內沒有活动,您会被断线。
Name (xxx.far2.net:far):far
331 使用者 far OK. 需要密码.
Password:
230-使用者 far 有群组存取于: ftpgroup
230-这个服务器支持FXP传输
230 OK. 目前限制的目录是 /
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

当你看到以上信息時.恭喜你.你已经成功的架起一个ftp了.:)

--------------------------------------------------------------------

是不是很简单呢.现在你可以好好享用你的FTP Server了.:)

--------------------------------------------------------------------

ps.如果你是超超超超超超大的b3k站.PureFTPD下面有几点建议.

* Compile with :
#env CFLAGS="-O2 -fomit-frame-pointer -fgcse -Os"
#./configure --with-minimal --without-inetd --without-pam
#make install-strip

-=特殊功能都不要加.以减轻Server负担=-

*用standalone的模式去启动.不要打开pure-ftpwho & pure-uploadscript
& per-userlimits 的选项

-=因为那几个都是很吃系统资源的工具=-

<FreeBSD下可以.....>
*编辑/etc/fstab, 对所有filesystems的options增加",noatime"

*在/boot/loader.conf里增加以下两行
hw.ata.wc="1"
kern.ipc.nmbclusters="60000"

*在/etc/sysctl.conf里增加
vfs.vmiodirenable=1
kern.ipc.maxsockbuf=2097152
kern.ipc.somaxconn=8192
kern.ipc.maxsockets=16424
kern.maxfiles=65536
kern.maxfilesperproc=32768
net.inet.tcp.rfc1323=1
net.inet.tcp.delayed_ack=0
net.inet.tcp.sendspace=65535
net.inet.tcp.recvspace=65535
net.inet.udp.recvspace=65535
net.inet.udp.maxdgram=57344
net.local.stream.recvspace=65535
net.local.stream.sendspace=65535

求一下土地公.让你等一下不用跑机房.然后reboot.重开机后就大功告成.
PS.你问我上面的参数有沒有用?唔...我加了.至于效果么.....站不够大.
所以...不知道.你可以试试跟我说...:DD

29.pure-ftpd1.0.14的简体中文语言包

ei翻译了其中的绝大部分台湾术语。用它替换src/messages_zh_cn.h就行。
#define MSG_TIMEOUT "超时"
#define MSG_CAPABILITIES "无法切换性能"
#define MSG_CLIENT_CLOSED_CNX "用户端已关闭连接"
#define MSG_CLIENT_READ_ERR "从用户端读取发生错误"
#define MSG_CANT_OPEN_CNX "无法开启新连接"
#define MSG_CANT_CREATE_DATA_SOCKET "无法建立数据套接字"
#define MSG_DEBUG_CLIENT_IS "用户端地址是"
#define MSG_SYNTAX_ERROR_IP "语法错误于IP地址"
#define MSG_PORT_SUCCESSFUL "PORT命令OK"
#define MSG_ONLY_IPV4V6 "仅支持IPv4与IPv6 (1,2)"
#define MSG_ONLY_IPV4 "仅支持IPv4 (1)"
#define MSG_TIMEOUT_PARSER "超时 - 下回试试敲键时速度快一点"
#define MSG_LINE_TOO_LONG "命令行过长"
#define MSG_LOG_OVERFLOW "用户尝试要溢满命令行缓冲区"
#define MSG_GOODBYE "再见。您上传%llu并下载%llu kbytes."
#define MSG_DEBUG_COMMAND "命令"
#define MSG_IS_YOUR_CURRENT_LOCATION "是您目前的位置"
#define MSG_NOT_LOGGED_IN "您并未登入"
#define MSG_AUTH_UNIMPLEMENTED "安全扩充项未实施"
#define MSG_NO_FILE_NAME "无文件名称"
#define MSG_NO_DIRECTORY_NAME "无目录名称"
#define MSG_NO_RESTART_POINT "无重新开始点"
#define MSG_ABOR_SUCCESS "ABOR OK"
#define MSG_MISSING_ARG "遗失参数"
#define MSG_GARBAGE_FOUND "参数值后有无用的字串"
#define MSG_VALUE_TOO_LARGE "参数值过大"
#define MSG_IDLE_TIME "闲置时间设为 %lu 秒"
#define MSG_SITE_HELP "下列的SITE命令被认可"
#define MSG_BAD_CHMOD "无效的权限"
#define MSG_UNKNOWN_EXTENSION "是不明的扩充项"
#define MSG_XDBG_OK "XDBG命令OK,除错程度现在是 %d"
#define MSG_UNKNOWN_COMMAND "未知的命令"
#define MSG_TIMEOUT_NOOP "超时 (已 %lu 秒无操作)"
#define MSG_TIMEOUT_DATA "超时 (已 %lu 秒无新数据)"
#define MSG_SLEEPING "Zzz..."
#define MSG_ALREADY_LOGGED "您已经登入"
#define MSG_ANY_PASSWORD "任何密码都可用"
#define MSG_ANONYMOUS_LOGGED "匿名使用者登入"
#define MSG_ANONYMOUS_LOGGED_VIRTUAL "匿名使用者登入到虚拟FTP"
#define MSG_USER_OK "使用者 %s OK. 需要密码."
#define MSG_CANT_DO_TWICE "在目前连接期间不能这样做"
#define MSG_UNABLE_SECURE_ANON "无法建立安全匿名FTP"
#define MSG_BANDWIDTH_RESTRICTED "您的带宽使用将受限制"
#define MSG_NO_PASSWORD_NEEDED "任何密码都可用"
#define MSG_NOTRUST "抱歉,我无法信任您"
#define MSG_WHOAREYOU "请告诉我你是谁"
#define MSG_AUTH_FAILED "验证失败,抱歉"
#define MSG_AUTH_TOOMANY "验证失败太多次"
#define MSG_NO_HOMEDIR "没有用户主目录 - 取消"
#define MSG_NO_HOMEDIR2 "%s 不存在或无法到达"
#define MSG_START_SLASH "开始于 /"
#define MSG_USER_GROUP_ACCESS "使用者 %s 有群组存取于"
#define MSG_FXP_SUPPORT "本FTP服务器支持FXP传输"
#define MSG_RATIO "您必须遵守 %u:%u (UL/DL) 比率"
#define MSG_CHROOT_FAILED "无法设定安全的chroot() jail"
#define MSG_CURRENT_DIR_IS "OK. 目前的目录是 %s"
#define MSG_CURRENT_RESTRICTED_DIR_IS "OK. 目前限制的目录是 %s"
#define MSG_IS_NOW_LOGGED_IN "%s 现在登入"
#define MSG_CANT_CHANGE_DIR "无法变更目录到 %s"
#define MSG_PATH_TOO_LONG "路径太长"
#define MSG_CANT_PASV "您不能在IPv6连接使用PASV。请改用EPSV。"
#define MSG_CANT_PASSIVE "无法开启被动式连接"
#define MSG_PORTS_BUSY "所有保留的TCP ports都正忙碌中"
#define MSG_GETSOCKNAME_DATA "无法辨识本机数据套接字"
#define MSG_GETPEERNAME "无法辨识本机接口"
#define MSG_INVALID_IP "抱歉,给的是无效的IP地址"
#define MSG_NO_EPSV "请使用符合IPv6并支持EPSV的用户端"
#define MSG_BAD_PORT "抱歉,无法连接到 ports < 1024"
#define MSG_NO_FXP "我不能开启连接到 %s (仅 %s)"
#define MSG_FXP "FXP传输: 从 %s 到 %s"
#define MSG_NO_DATA_CONN "无数据连接"
#define MSG_ACCEPT_FAILED "连接无法被接受"
#define MSG_ACCEPT_SUCCESS "接受数据连接"
#define MSG_CNX_PORT_FAILED "无法开启数据连接到port %d"
#define MSG_CNX_PORT "连线到port %d"
#define MSG_ANON_CANT_MKD "抱歉,不准匿名使用者建立目录"
#define MSG_ANON_CANT_RMD "抱歉,不准匿名使用者移除目录"
#define MSG_ANON_CANT_RENAME "不准匿名使用者移动/更名文件"
#define MSG_ANON_CANT_CHANGE_PERMS "匿名使用者不能变更权限"
#define MSG_GLOB_NO_MEMORY "形成 %s 时,内存不足"
#define MSG_PROBABLY_DENIED "(这可能意味 \"权限被拒\")"
#define MSG_GLOB_READ_ERROR "形成 %s 时发生读取错误"
#define MSG_GLOB_NO_MATCH "没有符合的 %s ,于 %s 中"
#define MSG_CHMOD_FAILED "不能变更 %s 权限"
#define MSG_CHMOD_SUCCESS " %s 权限已变更"
#define MSG_CHMOD_TOTAL_FAILURE "抱歉,我无法变更任何权限"
#define MSG_ANON_CANT_DELETE "匿名使用者不能删除文件"
#define MSG_ANON_CANT_OVERWRITE "匿名使用者不能覆盖现存的文件"
#define MSG_DELE_FAILED "无法删除 %s"
#define MSG_DELE_SUCCESS "删除 %s"
#define MSG_DELE_TOTAL_FAILURE "没有删除文件"
#define MSG_LOAD_TOO_HIGH "当您连线时负载是 %3.2f 。负载如此高时,我们不准匿名使用者下载。\n上传则都是可以的"



#define MSG_OPEN_FAILURE "无法开启 %s"
#define MSG_OPEN_FAILURE2 "无法打开那个文件"
#define MSG_STAT_FAILURE "无法找到文件大小"
#define MSG_STAT_FAILURE2 "无法检查文件的存在性"
#define MSG_REST_TOO_LARGE_FOR_FILE "针对文件大小 %lld时,重新开始offset %lld 会过大。"
#define MSG_REST_RESET "offset重设为 0 重新开始"
#define MSG_NOT_REGULAR_FILE "我只能抓取一般文件"
#define MSG_NOT_MODERATED "此档由匿名使用者上传。\n还没有被站点管理员核准供下载。"


#define MSG_RATIO_DENIAL "抱歉,上传/下载率是 %u:%u 。\n您目前上传 %llu Kb 下载 %llu Kb。\n请上传一些好东西然后晚点再尝试抓取。"



#define MSG_NO_MORE_TO_DOWNLOAD "已没东西可下载"
#define MSG_WINNER "电脑是您的朋友。信任电脑"
#define MSG_KBYTES_LEFT "剩 %.1f kbytes要下载"
#define MSG_ABORTED "传输中止"
#define MSG_DATA_WRITE_FAILED "数据连接写入时发生错误"
#define MSG_DATA_READ_FAILED "数据连接读取时发生错误"
#define MSG_MMAP_FAILED "无法将文件map进内存"
#define MSG_WRITE_FAILED "写入文件时发生错误"
#define MSG_TRANSFER_RATE_M "%.3f 秒 (到目前),每秒 %.2f Mbytes"
#define MSG_TRANSFER_RATE_K "%.3f 秒 (到目前),每秒 %.2f Kbytes"
#define MSG_TRANSFER_RATE_B "%.3f 秒 (到目前),每秒 %.2f bytes"
#define MSG_SPACE_FREE_M "%.1f Mbytes 剩馀硬盘空间"
#define MSG_SPACE_FREE_K "%f Kbytes 剩馀硬盘空间"
#define MSG_DOWNLOADED "已下载"
#define MSG_REST_NOT_NUMERIC "REST需要数字参数"
#define MSG_REST_ASCII_STRICT "在ASCII模式回应标记必须是 0"
#define MSG_REST_ASCII_WORKAROUND "重新开始于 %lld。但是我们在ASCII模式"
#define MSG_REST_SUCCESS "重新开始于 %lld"
#define MSG_SANITY_DIRECTORY_FAILURE "禁用的目录名称"
#define MSG_SANITY_FILE_FAILURE "禁用的文件名: %s"
#define MSG_MKD_FAILURE "无法建立目录"
#define MSG_MKD_SUCCESS "建立目录OK"
#define MSG_RMD_FAILURE "无法删除目录"
#define MSG_RMD_SUCCESS "删除目录OK"
#define MSG_TIMESTAMP_FAILURE "无法取得时间戳记"
#define MSG_MODE_ERROR "只支援ASCII及binary模式"
#define MSG_CREATE_FAILURE "无法建立文件"
#define MSG_ABRT_ONLY "当上传时ABRT是唯一能用的命令"
#define MSG_UPLOAD_PARTIAL "部份上传"
#define MSG_REMOVED "删除了"
#define MSG_UPLOADED "上传了"
#define MSG_GMTIME_FAILURE "无法取得当地时间"
#define MSG_TYPE_8BIT_FAILURE "只支援8-bit bytes,我们不是在十年前的年代"
#define MSG_TYPE_UNKNOWN "不明的TYPE"
#define MSG_TYPE_SUCCESS "TYPE目前是"
#define MSG_STRU_FAILURE "只支援F(ile)"
#define MSG_MODE_FAILURE "请使用S(tream)模式"
#define MSG_RENAME_ABORT "中止之前的更名操作"
#define MSG_RENAME_RNFR_SUCCESS "RNFR接受 - 文件存在,准备到目的地"
#define MSG_FILE_DOESNT_EXIST "抱歉,文件不存在"
#define MSG_RENAME_ALREADY_THERE "RENAME失败 - 目的文件已经存在"
#define MSG_RENAME_NORNFR "RNTO前需要RNFR"
#define MSG_RENAME_FAILURE "更名/移动失败"
#define MSG_RENAME_SUCCESS "文件更名/移动OK"
#define MSG_NO_SUPERSERVER "请在super-server (like tcpserver)中执行pure-ftpd"
#define MSG_NO_FTP_ACCOUNT "无法找到'ftp'帐号"
#define MSG_CONF_ERR "组态设定错误"
#define MSG_NO_VIRTUAL_FILE "遗失虚拟使用者文件名"
#define MSG_ILLEGAL_THROTTLING "不合法的节流值"
#define MSG_ILLEGAL_TRUSTED_GID "不合法的chroot信任gid"
#define MSG_ILLEGAL_USER_LIMIT "不合法的使用者限制"
#define MSG_ILLEGAL_FACILITY "不明的记录设施名称"
#define MSG_ILLEGAL_CONFIG_FILE_LDAP "无效的LDAP组态文件"
#define MSG_ILLEGAL_LOAD_LIMIT "不合法的负载限制"
#define MSG_ILLEGAL_PORTS_RANGE "不合法的端口范围"
#define MSG_ILLEGAL_LS_LIMITS "不合法的'ls'限制"
#define MSG_ILLEGAL_FORCE_PASSIVE "被动式连接时,不合法的强制IP"
#define MSG_ILLEGAL_RATIO "不合法的上传/下载率"
#define MSG_ILLEGAL_UID_LIMIT "不合法的uid限制"
#define MSG_ILLEGAL_OPTION "不明的run-time选项"
#define MSG_LDAP_MISSING_BASE "LDAP组态档中遗失LDAPBaseDN"
#define MSG_LDAP_WRONG_PARMS "错误的LDAP参数"
#define MSG_NEW_CONNECTION "自 %s 的新连接"
#define MSG_WELCOME_TO "欢迎来到"
#define MSG_MAX_USERS "%lu 使用者(最大值)已经登入,抱歉"
#define MSG_NB_USERS "您是第 %d 个使用者,最多可达 %d 个连接"
#define MSG_WELCOME_TIME "现在本地时间是 %02d:%02d 负载是 %3.2f。服务器端口: %u。"
#define MSG_ANONYMOUS_FTP_ONLY "这里只用匿名FTP"
#define MSG_RATIOS_EVERYONE "针对EVERYONE启用比率:"
#define MSG_RATIOS_ANONYMOUS "匿名使用者规定用UL/DL率:"
#define MSG_RATIOS_RULE "要下载 %u Mb, 先义务上传 %u Mb 的好东西。"
#define MSG_INFO_IDLE_M "在 %lu 分钟内没有活动,您被会断线。"
#define MSG_INFO_IDLE_S "在 %lu 秒内没有活动,您被会断线。"
#define MSG_INFO_CPU_TIME "登出 - CPU 时间花费: %ld.%03ld 秒。"
#define MSG_CANT_READ_FILE "抱歉,我们无法读取[%s]"
#define MSG_LS_TRUNCATED "输出截短到 %u 符合"
#define MSG_LS_SUCCESS "总共 %u 符合"
#define MSG_LOGOUT "登出"
#define MSG_AUTH_FAILED_LOG "使用者[%s]验证失败"
#define MSG_ILLEGAL_UMASK "无效的umask"
#define MSG_STANDALONE_FAILED "无法启动standalone server"
#define MSG_NO_ANONYMOUS_LOGIN "这是私用系统 - 不开放匿名登入"
#define MSG_ANONYMOUS_ANY_PASSWORD "任何密码都可用"
#define MSG_MAX_USERS_IP "太多连接 (%lu) 来自这个 IP"
#define MSG_ACTIVE_DISABLED "主动模式关闭"
#define MSG_TRANSFER_SUCCESSFUL "文件传送OK"
#define MSG_NO_DISK_SPACE "硬盘爆满 - 请晚点上传"
#define MSG_OUT_OF_MEMORY "内存不足"
#define MSG_ILLEGAL_TRUSTED_IP "不合法的信任IP地址"
#define MSG_NO_ASCII_RESUME "ASCII重传并不安全,请先删除文件"
#define MSG_UNKNOWN_ALTLOG "不明的记录档格式"
#define MSG_ACCOUNT_DISABLED "无法登入为[%s]: 帐号关闭"
#define MSG_SQL_WRONG_PARMS "错误的SQL参数"
#define MSG_ILLEGAL_CONFIG_FILE_SQL "无效的SQL设定档"
#define MSG_SQL_MISSING_SERVER "SQL组态档中遗失服务器设定"
#define MSG_SQL_DOWN "SQL server好像关机了"
#define MSG_ILLEGAL_QUOTA "无效的额度"
#define MSG_QUOTA_FILES "%llu 文件数使用 (%d%%) - 授权可用: %llu 个文件"
#define MSG_QUOTA_SIZE "%llu Kbytes使用 (%d%%) - 授权可用: %llu Kb"
#define MSG_QUOTA_EXCEEDED "超过额度: %s 不会被储存"
#define MSG_AUTH_UNKNOWN "不明的验证方法"
#define MSG_PDB_BROKEN "无法读取indexed puredb档(或侦测到旧格式) - 试试 pure-pw mkdb"
#define MSG_ALIASES_ALIAS "%s 是别名,给 %s 的"
#define MSG_ALIASES_UNKNOWN "不明的别名 %s。"
#define MSG_ALIASES_BROKEN_FILE "损坏的别名文件"
#define MSG_ALIASES_LIST "以下的别名可用:"
#define MSG_PERUSER_MAX "无法接受来自同一使用者超过 %lu 的连接数"
#define MSG_IPV6_OK "这部主机也欢迎IPv6的连接"
 


我的QQ群:500人财富群11470502;投资群5920530;资源群6648659;交友群5713862;娱乐群6925950。
我的博客:http://104508155.qzone.qq.com/

 [作者]bonjovi [头衔] [经验]1596 [等级]少校  [发帖]232  [回帖]0 [登陆]537
[发表时间]2004/6/1 23:07:39 [8楼]
好是好,不过我还是有点看不大懂呐!!!


 


                                                                                                   
                                                            
      E-mail:wangshuanglu1980@163.com

http://www.bonjovi.com

QQ:30617607



按此在新窗口浏览图片

8 条回复; 10 条/页;  1 / 1     第    ↑到页首
您未登陆,发帖前请填写:用户名  密码   注册新用户  
 回复: www server与ftp server安装使用完全手册
排版
粗体斜体下划线居中飞翔文字移动文字发光文字阴影文字插入超级链接插入网页插入下载地址插入Email地址插入图片插入Flash插入RealPlay文件插入Media文件插入QuickTime影片插入背景音乐插入代码插入引用
插入表情:表情符号   使用帮助
内容 (8000字以内)
 
  关闭窗口  
[论坛列表]

小文诊所 创业经验
金融创新 家庭理财
居家旅行 国内资源
职业生活 配置应用
饮食文化 实盘记录
温情一刻 国外资源
法律频道 红旗社区
妇幼天地 商标标准
站务处理 蓝总看盘
奖励认证 开源软件
故障咨询 求助中心
公益活动 手机软件
网络经济 文史研究
期货专版 代理试用
网页制作 人才交流
分类广告 房产观澜
体育资讯 雅瑟风流
初学园地 美术贴图
股海风云 听风茶轩
管理学院

[今日热帖]

关于文逸 | 小文论坛 | 文逸博客 | 文逸金融 | 精华文章网站地图 | 联系我们 | 隐私保护
 Copyright© WWW.WONYEN.NET 2003 - 2021  闽ICP备09016518号-16   本站最高 10508 人同时在线,发生时间 2005-5-17 5:09:15 
 文逸科技 制作维护