Chinaunix首页 | 论坛 | 博客
  • 博客访问: 370713
  • 博文数量: 83
  • 博客积分: 2213
  • 博客等级: 大尉
  • 技术积分: 835
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-16 20:26
文章分类

全部博文(83)

文章存档

2015年(1)

2012年(1)

2011年(14)

2007年(20)

2006年(47)

我的朋友

分类: LINUX

2006-03-16 21:40:35

昨天在公司内部机器上测试做了一个FTP服务器,用的是最流行的VSFTP软件,以前也在学校 的时候弄过一个FTP.只是

 用的软件是proftpd。之所以要做这个是因为公司在二台服务器在上海托管着,一个是DNS服务器,负责企业网站的域名解析

一个是qmail邮件服务器,给各个客户企业弄内部邮箱专用。在此主DNS服务上有很多的二级域名,各自有各自的账户和密码,和根目录

所以在上传和下载文件的时候就成为了一种必要了。于是FTP服务器就可以完成 这样的工作,同时就能达到完美的效果。

下面是我配置公司内部FTP服务器的一点小小的心得,我把它们都记录下来,已省自己。因为以前做过相同的工作,而由于时间的流逝,也忘记差不多了

从那以后我就相信,不管在生活学到了什么样的新知识都应该把他们记录下来,整理成一个笔记,这样就可以取得很好的效果了。就是以后忘记了,也可以随时

拿来翻阅,这同时也是我取得的一个教训。相信在以后的生活中不会再次发生如此愚蠢的问题。

我内部调试服务器装的红旗公司的RED FLAG。可能由于和其它版本的系统有一些出入,所以出现了一些在网上我没有看到过的问题,这些都在我的耐心修改下取得了

良好的效果。。。。

首先下载源代码,我下的是网上最新的vsftpd-2.0.4.tar.gz

把它放到一个目录下面解压。

[root@china-yr soft]# tar  vsftpd-2.0.4.tar.gz

[root@china-yr soft]# cd  vsftpd-2.0.4

和在网上发表的一些文章一样我也想让它支持SSL认证

 

[root@china-yr vsftpd-2.0.4]# vi builddefs.h

#ifndef VSF_BUILDDEFS_H

#define VSF_BUILDDEFS_H

 

#define VSF_BUILD_TCPWRAPPERS

#define VSF_BUILD_PAM

#undef VSF_BUILD_SSL

 

#endif /* VSF_BUILDDEFS_H */

我把上面的#undef VSF_BUILD_SSL

改成了#define VSF_BUILD_SSL,然后在编辑的时候就出现了下面这样的问题

 

[root@china-yr vsftpd-2.0.4]# make

gcc -c main.c -O2 -Wall -W -Wshadow  -idirafter dummyinc

gcc -c utility.c -O2 -Wall -W -Wshadow  -idirafter dummyinc

gcc -c prelogin.c -O2 -Wall -W -Wshadow  -idirafter dummyinc

gcc -c ftpcmdio.c -O2 -Wall -W -Wshadow  -idirafter dummyinc

gcc -c postlogin.c -O2 -Wall -W -Wshadow  -idirafter dummyinc

gcc -c privsock.c -O2 -Wall -W -Wshadow  -idirafter dummyinc

gcc -c tunables.c -O2 -Wall -W -Wshadow  -idirafter dummyinc

gcc -c ftpdataio.c -O2 -Wall -W -Wshadow  -idirafter dummyinc

gcc -c secbuf.c -O2 -Wall -W -Wshadow  -idirafter dummyinc

gcc -c ls.c -O2 -Wall -W -Wshadow  -idirafter dummyinc

gcc -c postprivparent.c -O2 -Wall -W -Wshadow  -idirafter dummyinc

gcc -c logging.c -O2 -Wall -W -Wshadow  -idirafter dummyinc

gcc -c str.c -O2 -Wall -W -Wshadow  -idirafter dummyinc

gcc -c netstr.c -O2 -Wall -W -Wshadow  -idirafter dummyinc

gcc -c sysstr.c -O2 -Wall -W -Wshadow  -idirafter dummyinc

gcc -c strlist.c -O2 -Wall -W -Wshadow  -idirafter dummyinc

gcc -c banner.c -O2 -Wall -W -Wshadow  -idirafter dummyinc

gcc -c filestr.c -O2 -Wall -W -Wshadow  -idirafter dummyinc

gcc -c parseconf.c -O2 -Wall -W -Wshadow  -idirafter dummyinc

gcc -c secutil.c -O2 -Wall -W -Wshadow  -idirafter dummyinc

gcc -c ascii.c -O2 -Wall -W -Wshadow  -idirafter dummyinc

gcc -c oneprocess.c -O2 -Wall -W -Wshadow  -idirafter dummyinc

gcc -c twoprocess.c -O2 -Wall -W -Wshadow  -idirafter dummyinc

gcc -c privops.c -O2 -Wall -W -Wshadow  -idirafter dummyinc

gcc -c standalone.c -O2 -Wall -W -Wshadow  -idirafter dummyinc

gcc -c hash.c -O2 -Wall -W -Wshadow  -idirafter dummyinc

gcc -c tcpwrap.c -O2 -Wall -W -Wshadow  -idirafter dummyinc

gcc -c ipaddrparse.c -O2 -Wall -W -Wshadow  -idirafter dummyinc

gcc -c access.c -O2 -Wall -W -Wshadow  -idirafter dummyinc

gcc -c features.c -O2 -Wall -W -Wshadow  -idirafter dummyinc

gcc -c readwrite.c -O2 -Wall -W -Wshadow  -idirafter dummyinc

gcc -c ssl.c -O2 -Wall -W -Wshadow  -idirafter dummyinc

In file included from /usr/include/openssl/ssl.h:179,

                 from ssl.c:26:

/usr/include/openssl/kssl.h:72:18: krb5.h: No such file or directory

In file included from /usr/include/openssl/ssl.h:179,

                 from ssl.c:26:

/usr/include/openssl/kssl.h:132: parse error before "krb5_enctype"

/usr/include/openssl/kssl.h:134: parse error before "FAR"

/usr/include/openssl/kssl.h:135: parse error before '}' token

/usr/include/openssl/kssl.h:147: parse error before "kssl_ctx_setstring"

/usr/include/openssl/kssl.h:147: parse error before '*' token

/usr/include/openssl/kssl.h:148: parse error before '*' token

/usr/include/openssl/kssl.h:149: parse error before '*' token

/usr/include/openssl/kssl.h:149: parse error before '*' token

/usr/include/openssl/kssl.h:150: parse error before '*' token

/usr/include/openssl/kssl.h:151: parse error before "kssl_ctx_setprinc"

/usr/include/openssl/kssl.h:151: parse error before '*' token

/usr/include/openssl/kssl.h:153: parse error before "kssl_cget_tkt"

/usr/include/openssl/kssl.h:153: parse error before '*' token

/usr/include/openssl/kssl.h:155: parse error before "kssl_sget_tkt"

/usr/include/openssl/kssl.h:155: parse error before '*' token

/usr/include/openssl/kssl.h:157: parse error before "kssl_ctx_setkey"

/usr/include/openssl/kssl.h:157: parse error before '*' token

/usr/include/openssl/kssl.h:159: parse error before "context"

/usr/include/openssl/kssl.h:160: parse error before "kssl_build_principal_2"

/usr/include/openssl/kssl.h:160: parse error before "context"

/usr/include/openssl/kssl.h:163: parse error before "kssl_validate_times"

/usr/include/openssl/kssl.h:163: parse error before "atime"

/usr/include/openssl/kssl.h:165: parse error before "kssl_check_authent"

/usr/include/openssl/kssl.h:165: parse error before '*' token

/usr/include/openssl/kssl.h:167: parse error before "enctype"

In file included from ssl.c:26:

/usr/include/openssl/ssl.h:909: parse error before "KSSL_CTX"

/usr/include/openssl/ssl.h:931: parse error before '}' token

ssl.c: In function `ssl_init':

ssl.c:46: warning: declaration of `options' shadows a global declaration

/usr/include/openssl/ssl.h:925: warning: shadowed declaration is here

make: *** [ssl.o] Error 1

 

可能是我的系统SSL认证什么的和它连接不上,或者是产生的冲突,于是我就索性把系统默认的

#define VSF_BUILD_SSL改成了#undef VSF_BUILD_SSL

在用make编译的时候就没有出现什么问题。用下面命令就可以查看已生成了一个vsftpd可执行文件

[chris@localhost vsftpd]$ ls -l vsftpd

-rwxrwxr-x    1 chris    chris       61748 Sep 27 00:26 vsftpd

 

接着往下走吧。。。。。。记得在往下进行的时候要做下面几项工作

 

 

 

[root@localhost root]# useradd nobody     #添加一个nobody用户,因为nobody用户在默认的配置中是必需的,如果系统中已经存在这个用户那么显示

useradd: user nobody exists

 

 

 

[root@localhost root]# mkdir /usr/share/empty/     #添加一个/usr/share/empty/目录,因为此目录在默认的配置中是必需的,如果系统中已经存在这个目录那么显示

mkdir: cannot create directory `/usr/share/empty': File exists

 

2c) For anonymous FTP, you will need the user "ftp" to exist, and have a

valid home directory (which is NOT owned or writable by the user "ftp").

The following commands could be used to set up the user "ftp" if you do not

have one:

 

[root@localhost root]# mkdir /var/ftp/      #添加一个/var/ftp/目录,如果系统不存在的话

[root@localhost root]# useradd -d /var/ftp ftp   #添加一个ftp用户,如果系统不存在的话

 

(the next two are useful to run even if the user "ftp" already exists).

[root@localhost root]# chown root.root /var/ftp

[root@localhost root]# chmod og-w /var/ftp      #修改/var/ftp目录的属主和属性

 

然后继续下面的操作。。

 

[root@china-yr vsftpd-2.0.4]# make install

if [ -x /usr/local/sbin ]; then \

        install -m 755 vsftpd /usr/local/sbin/vsftpd; \

else \

        install -m 755 vsftpd /usr/sbin/vsftpd; fi

if [ -x /usr/local/man ]; then \

        install -m 644 vsftpd.8 /usr/local/man/man8/vsftpd.8; \

        install -m 644 vsftpd.conf.5 /usr/local/man/man5/vsftpd.conf.5; \

elif [ -x /usr/share/man ]; then \

        install -m 644 vsftpd.8 /usr/share/man/man8/vsftpd.8; \

        install -m 644 vsftpd.conf.5 /usr/share/man/man5/vsftpd.conf.5; \

else \

        install -m 644 vsftpd.8 /usr/man/man8/vsftpd.8; \

        install -m 644 vsftpd.conf.5 /usr/man/man5/vsftpd.conf.5; fi

install: cannot stat `/usr/local/man/man8/vsftpd.8': Not a directory

install: cannot stat `/usr/local/man/man5/vsftpd.conf.5': Not a directory

make: *** [install] Error 1

 

可以看到上面又出现一个问题,是因为在我的系统中没有/var/local/man/man5和/var/local/man/man8二个目录

 自己建立在运行命令make install就会好了。

接下来就拷贝一份配置文档到/etc/下

[root@china-yr vsftpd-2.0.4]# cp vsftpd.conf /etc/

现在只是匿名登陆。要实现本地用户可以登陆就编辑此文档实现某种特定的目的

[root@china-yr vsftpd-2.0.4]# vi /etc/vsftpd.conf

把anonmous_enable=YES改成NO(禁掉匿名链接,不安全。)

把local_enable=YES前的注释去掉(打开本地用户连接的权限。)

把write_enable=YES前的注释去掉(打开本地用户的写权限。)

把local_umask=022前的注释去掉

在结尾加上listen=YES

重新启动vsftpd进程。

[root@china-yr RedHat]# ftp 127.0.0.1

Connected to 127.0.0.1 (127.0.0.1).

220 (vsFTPd 2.0.4)

Name (127.0.0.1:root): dutao

331 Please specify the password.

Password:

500 OOPS: could not open chroot() list file:/etc/vsftpd.chroot_list

Login failed.

ftp> quit

出现上述问题上你还没有在/etc/目录下面建立一个vsftpd.chroot_list文件

建好之后把你要登陆的用户名写进去就可了,我的方法是这样的

[root@china-yr RedHat]# touch /etc/vsftpd.chroot_list

把用户名写进去保存就可以了

现在在登陆,就可以成功了。

[root@china-yr RedHat]# ftp 127.0.0.1

Connected to 127.0.0.1 (127.0.0.1).

220 (vsFTPd 2.0.4)

Name (127.0.0.1:root): dutao

331 Please specify the password.

Password:

230 Login successful.

Remote system type is UNIX.

Using binary mode to transfer files.

ftp> ls

227 Entering Passive Mode (127,0,0,1,63,206)

150 Here comes the directory listing.

drwxr-xr-x    3 503      503          4096 Feb 23 09:37 Desktop

226 Directory send OK.

ftp> quit

221 Goodbye.

使用本地用户登录,OK!已经成功了!上传文件,也OK!

然后下面的工作是限制用户用SSH工具进行登陆,只能使用FTP客户端软件进行下载或者上传文件

把所要修改的用户改成如下的形式就可以了。

[root@china-yr RedHat]# vi /etc/passwd

dutao:x:503:503::/home/dutao:/sbin/nologin   ###把/bin/bash修改成/sbin/nologin就可了

 

 

 

阅读(2068) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~