如何搭建FTP服务器在linux 中《一》

如何搭建FTP服务器在linux 中《一》,第1张

代码:

# cd /home/xuchen

# tar xzvf vsftpd-2.0.3.tar.gz //解压缩程序

# cd vsftpd-2.0.3

三种方式的实现

1、匿名用户形式实现

# vi builddefs.h \\编辑builddefs.h 文件,文件内容如下:

#ifndef VSF_BUILDDEFS_H

#define VSF_BUILDDEFS_H

#undef VSF_BUILD_TCPWRAPPERS

#define VSF_BUILD_PAM

#undef VSF_BUILD_SSL

#endif /* VSF_BUILDDEFS_H */

将以上undef的都改为define,支持tcp_wrappers,支持PAM认证方式,支持SSL

# make //直接在vsftpd-2.0.3里用make编译

# ls -l vsftpd

-rwxr-xr-x 1 root root 86088 Jun 6 12:29 vsftpd //可执行程序已被编译成功

创建必要的帐号,目录

# useradd nobody //可能你的系统已经存在此帐号,那就不用建立

# mkdir /usr/share/empty //可能你的系统已经存在此目录,那就不用建立

# mkdir /var/ftp //可能你的系统已经存在此目录,那就不用建立

# useradd -d /var/ftp ftp //可能你的系统已经存在此帐号,那就不用建立

# chown root:root /var/ftp

# chmod og-w /var/ftp

请记住,如果你不想让用户在本地登陆,那么你需要把他的登陆SHELL设置成/sbin/nologin,比如以上的nobody和ftp我就设置成/sbin/nologin

安装vsftp配置文件,可执行程序,man等:

# install -m 755 vsftpd /usr/local/sbin/vsftpd-ano

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

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

# install -m 644 vsftpd.conf /etc/vsftpd-ano.conf

这样就安装完成了,那么我们开始进行简单的配置

# vi /etc/vsftpd-ano.conf ,将如下三行加入文件

listen=YES

listen_port=21

tcp_wrappers=YES

anon_root=/var/ftp //设置匿名用户本地目录,和ftp用户目录必须相同

listen=YES的意思是使用standalone启动vsftpd,而不是super daemon(xinetd)控制它 (vsftpd推荐使用standalone方式)

# /usr/local/sbin/vsftpd-ano /etc/vsftpd-ano.conf & //以后台方式启动vsftpd

注意:每行的值都不要有空格,否则启动时会出现错误,举个例子,假如我在listen=YES后多了个空格,那我启动时就出现如下错误:

500 OOPS: bad bool value in config file for: listen

测试搭建好的匿名用户方式

# ftp 127.0.0.1

Connected to 127.0.0.1.

220 (vsFTPd 2.0.3)

530 Please login with USER and PASS.

530 Please login with USER and PASS.

KERBEROS_V4 rejected as an authentication type

Name (127.0.0.1:root): ftp

331 Please specify the password.

Password:

230 Login successful.

Remote system type is UNIX.

Using binary mode to transfer files.

ftp>pwd

257 "/"

ftp>quit

221 Goodbye.

#

OK,已经完成了,very nice.

高级配置

细心的朋友可能已经看出来我们只在默认配置文件增加了四行,就实现了FTP连接(也证明了vsftpd的易用性),那么让我们传个文件吧,呀!!传输失败了(见图1)

为什么呢?因为 vsftpd 是为了安全需要,/var/ftp目录不能把所有的权限打开,所以我们这时要建一个目录pub,当然也还是需要继续修改配置文件的。

# mkdir /var/ftp/pub

# chmod -R 777 /var/ftp/pub

为了测试方便,我们先建立一个名为kill-ano的脚本,是为了杀掉FTP程序的

#!/bin/bash

$1}'`   a=`/bin/ps -A | grep vsftpd-ano | awk '{print

$a   kill -9

那么现在大家看看我的匿名服务器配置文件吧

anonymous_enable=YES //允许匿名访问,这是匿名服务器必须的

write_enable=YES //全局配置可写

no_anon_password=YES //匿名用户login时不询问口令

anon_umask=077 //匿名用户上传的文件权限是-rw----

anon_upload_enable=YES //允许匿名用户上传文件

anon_mkdir_write_enable=YES //允许匿名用户建立目录

anon_other_write_enable=YES //允许匿名用户具有建立目录,上传之外的权限,如重命名,删除

dirmessage_enable=YES //当使用者转换目录,则会显示该目录下的.message信息

xferlog_enable=YES //记录使用者所有上传下载信息

xferlog_file=/var/log/vsftpd.log //将上传下载信息记录到/var/log/vsftpd.log中

xferlog_std_format=YES //日志使用标准xferlog格式

idle_session_timeout=600 //客户端超过600S没有动作就自动被服务器踢出

data_connection_timeout=120 //数据传输时超过120S没有动作被服务器踢出

chown_uploads=YES

chown_username=daemon //上传文件的属主

ftpd_banner=Welcome to d-1701.com FTP service. //FTP欢迎信息

anon_max_rate=80000 //这是匿名用户的下载速度为80KBytes/s

check_shell=NO //不检测SHELL

现在再测试,先kill掉再启动FTP程序

# ./kill-ano

# /usr/local/sbin/vsftpd-ano /etc/vsftpd-ano.conf &

上传一个文件测试一下,怎么样?OK了吧,下载刚上传的那个文件,恩?不行,提示

550 Failed to open file.

传输已失败!

传输队列已完成

1 个文件传输失败

没有关系,你记得咱们设置了anon_umask=077了吗?所以你下载不了,如果你到服务器上touch 一个文件(644),测试一下,是可以被下载下来的,好了,匿名服务器就说到这里了。

2、本地用户形式实现

# cd /home/xuchen/vsftpd-2.0.3 //进入vsftpd-2.0.3的源代码目录

# make clean //清除编译环境

# vi builddefs.h \\继续编辑builddefs.h 文件,文件内容如下:

#ifndef VSF_BUILDDEFS_H

#define VSF_BUILDDEFS_H

#define VSF_BUILD_TCPWRAPPERS

#define VSF_BUILD_PAM

#define VSF_BUILD_SSL

#endif /* VSF_BUILDDEFS_H */

将以上define VSF_BUILD_PAM行的define改为undef,支持tcp_wrappers,不支持PAM认证方式,支持SSL,记住啊,如果支持了PAM认证方式,你本地用户是不能登陆的。

# make //直接在vsftpd-2.0.3里用make编译

# ls -l vsftpd

-rwxr-xr-x 1 root root 84712 Jun 6 18:56 vsftpd //可执行程序已被编译成功

创建必要的帐号,目录:

# useradd nobody //可能你的系统已经存在此帐号,那就不用建立

# mkdir /usr/share/empty //可能你的系统已经存在此目录,那就不用建立

# mkdir /var/ftp //可能你的系统已经存在此目录,那就不用建立

# useradd -d /var/ftp ftp //可能你的系统已经存在此帐号,那就不用建立

# chown root:root /var/ftp

# chmod og-w /var/ftp

请记住,如果你不想让用户在本地登陆,那么你需要把他的登陆SHELL设置成/sbin/nologin,比如以上的nobody和ftp我就设置成/sbin/nologin

安装vsftp配置文件,可执行程序,man等:

# install -m 755 vsftpd /usr/local/sbin/vsftpd-loc

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

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

# install -m 644 vsftpd.conf /etc/vsftpd-loc.conf

这样就安装完成了,那么我们开始进行简单的配置

# vi /etc/vsftpd-loc.conf ,将如下三行加入文件

listen=YES

listen_port=21

tcp_wrappers=YES //支持tcp_wrappers,限制访问(/etc/hosts.allow,/etc/hosts.deny)

listen=YES的意思是使用standalone启动vsftpd,而不是super daemon(xinetd)控制它 (vsftpd推荐使用standalone方式),注意事项请参看匿名用户的配置。

anonymous_enable=NO

local_enable=YES //这两项配置说不允许匿名用户登陆,允许本地用户登陆

# /usr/local/sbin/vsftpd-loc /etc/vsftpd-loc.conf & //以后台方式启动vsftpd

测试搭建好的匿名用户方式,先测试root用户吧 :)

# ftp 127.0.0.1

Connected to 127.0.0.1.

220 (vsFTPd 2.0.3)

530 Please login with USER and PASS.

530 Please login with USER and PASS.

KERBEROS_V4 rejected as an authentication type

Name (127.0.0.1:root): root

331 Please specify the password.

Password:

230 Login successful.

Remote system type is UNIX.

Using binary mode to transfer files.

ftp>pwd

257 "/root"

ftp>quit

221 Goodbye.

我们看到root用户可以登陆到ftp,他的登陆目录就是自己的主目录。

再测试一个系统用户,那我们先建立一个用户名叫xuchen的

# useradd xuchen

# passwd xuchen

Changing password for user xuchen.

New UNIX password:

Retype new UNIX password:

passwd: all authentication tokens updated successfully.

建立好了,让我们开始测试吧!!

# ftp 127.0.0.1

Connected to 127.0.0.1.

220 (vsFTPd 2.0.3)

530 Please login with USER and PASS.

530 Please login with USER and PASS.

KERBEROS_V4 rejected as an authentication type

Name (127.0.0.1:root): xuchen

331 Please specify the password.

Password:

230 Login successful.

Remote system type is UNIX.

Using binary mode to transfer files.

ftp>pwd

257 "/home/xuchen"

ftp>quit

221 Goodbye.

我们看到xuchen用户可以登陆到ftp,他的登陆目录也是自己的主目录。哈哈,又完成了!

高级配置

细心的朋友可能已经看出来如果我们不支持PAM认证方式,那么本地用户就可以登陆,而默认编译的vsftpd支持PAM认证方式,所以是不支持本地用户登陆的。恩,从这点说,这也是vsftp安全的一个表现----禁止本地用户登陆。

我们登陆后进行测试,传一个文件上去,得,失败了,那下载个文件下来吧,恩,这是成功的(见图2),而且我们发现我们可以进入到系统根目录(见图3),这样很危险。

那么改配置文件吧,为了测试方便,我们先建立一个名为kill-loc的脚本,也是为了杀掉FTP程序的

#!/bin/bash

$1}'`   a=`/bin/ps -A | grep vsftpd-loc | awk '{print

$a   kill -9

现在提供我的本地用户验证服务器配置文件吧(在匿名里写过的注释我就不在这里写了)

listen=YES

listen_port=21

tcp_wrappers=YES

anonymous_enable=NO

local_enable=YES

write_enable=YES

local_umask=022 //本地用户文件上传后的权限是-rw-r-r

anon_upload_enable=NO

anon_mkdir_write_enable=NO

dirmessage_enable=YES

xferlog_enable=YES

xferlog_file=/var/log/vsftpd.log

xferlog_std_format=YES

connect_from_port_20=YES

chroot_local_user=YES //限制用户在自己的主目录

#local_root=/ftp //你可以指定所有本地用户登陆后的目录,如果不设置此项,用户都会登陆于自己的主目录,就跟咱们前面测试的结果是一样的

local_max_rate=500000 //本地用户的下载速度为500KBytes/s

idle_session_timeout=600

data_connection_timeout=120

nopriv_user= nobody //设定服务执行者为nobody,vsftpd推荐使用一个权限很低的用户,最好是没有家目录(/dev/null),没有登陆shell(/sbin/nologin),系统会更安全

ftpd_banner=Welcome to d-1701.com FTP service.

check_shell=NO

userlist_enable=YES

userlist_deny=YES

userlist_file=/etc/vsftpd.denyuser

以上三条设定不允许登陆的用户,用户列表存放在/etc/vsftpd.denyuser中,一行一个帐号如果我把xuchen这个用户加到vsftpd.denyuser里,那么登陆时会出现如下错误:

# ftp 127.0.0.1

Connected to 127.0.0.1.

220 Welcome to d-1701.com FTP service.

530 Please login with USER and PASS.

530 Please login with USER and PASS.

KERBEROS_V4 rejected as an authentication type

Name (127.0.0.1:root): xuchen

530 Permission denied.

Login failed.

呵呵,有意思吧,自己测试吧,本地用户登陆方式就介绍到这里吧!

3、虚拟用户形式实现(db及mysql形式)

# cd /home/xuchen/vsftpd-2.0.3 //进入vsftpd-2.0.3的源代码目录

# make clean //清除编译环境

# vi builddefs.h \\继续编辑builddefs.h 文件,文件内容如下:

#ifndef VSF_BUILDDEFS_H

#define VSF_BUILDDEFS_H

#define VSF_BUILD_TCPWRAPPERS

#undef VSF_BUILD_PAM

#define VSF_BUILD_SSL

#endif /* VSF_BUILDDEFS_H */

将以上define VSF_BUILD_PAM行的undef改为define,支持tcp_wrappers,支持PAM认证方式,支持SSL,和匿名用户形式是一样的。

# make //直接在vsftpd-2.0.3里用make编译

# ls -l vsftpd

-rwxr-xr-x 1 root root 86088 Jun 6 22:26 vsftpd //可执行程序已被编译成功

创建必要的帐号,目录:

# useradd nobody //可能你的系统已经存在此帐号,那就不用建立

# mkdir /usr/share/empty //可能你的系统已经存在此目录,那就不用建立

# mkdir /var/ftp //可能你的系统已经存在此目录,那就不用建立

# useradd -d /var/ftp ftp //可能你的系统已经存在此帐号,那就不用建立

# chown root:root /var/ftp

# chmod og-w /var/ftp

请记住,如果你不想让用户在本地登陆,那么你需要把他的登陆SHELL设置成/sbin/nologin,比如以上的nobody和ftp我就设置成/sbin/nologin

FTP服务器,不需要用C#写代码,它就像个安装软件一样,安装好了,设置下要作为Ftp服务的文件夹,然后给这个文件夹添加些用户能访问该文件夹,客户端只要知道服务器的IP和你设置的用户名密码就是访问ftp文件夹了。

ftp功能一般都不需要数据库,如果你存储的仅仅是文件的话。

FTP不安全,万不得已情况下,才可使用。

vsftp安全性相对较好

可采用sftp代替FTP

Linux另外常用的FTP:

proftp

vsftp

pureftp

下面以VSFTP为例:

安装方式一:源码包安装

useradd -s /bin/false -d /var/ftp ftpvirtual

cd ......

make

make install

cp vsftpd.conf /etc

/usr/local/sbin/vsftpd & #启动

安装方式二:rpm安装,推荐

rpm -ivh vsftpd-2.0.1-5.i386.rpm

或者 yum install vsftpd

/etc/init.d/vsftpd start

两种方式安装完成后,配置方法都一样,下面开始讲配置。

首先讲主配置文件常见配置

vi /etc/vsftpd/vsftpd.conf

anonymous_enable=NO #禁止匿名登录

local_enable=NO #禁止本地用户登录

write_enable=YES #对本地用户的写权限

local_umask=022 #本地用户文件生成掩码

dirmessage_enable=YES #显示隐藏文件

xferlog_enable=YES #启用上传和下载日志

connect_from_port_20=YES #服务器将启用FTP数据端口的连接请求

xferlog_std_format=YES #服务器将使用标准的ftpd xferlog日志格式

pam_service_name=vsftpd #设置PAM认证服务的配置文件名称

userlist_enable=YES #设置文件中指定的用户是否可以访问vsftpd服务器

listen=YES #FTP服务器将处于独立启动模式

tcp_wrappers=YES #使用tcp_wrappers作为主机访问控制方式

chroot_local_user=YES #将FTP本地用户禁锢在宿主目录中

chroot_list_enable=YES #将用户禁锢在宿主目录中

listen_address=192.168.0.2 #侦听地址

pasv_enable=YES #是否允使用被动模式,默认是允许的。

pasv_min_port=10000 #指定使用被动模式时打开端口的最小值

pasv_max_port=10004 #指定使用被动模式时打开端口的最大值。

max_clients=100 #设置FTP服务器所允许的最大客户端连接数,值为0时表示不限制

max_per_ip=5 #同一IP地址允许的最大客户端连接数,值为0时表示不限制,即线程

local_max_rate=500000 #设置本地用户的最大传输速率,单位为bytes/sec,值为0时表示不限制

anon_max_rate=200000 #设置匿名用户的最大传输速率,单位为bytes/sec,值为0表示不限制

use_localtime=YES #在vsftp之中的时间默认值是显式GMT时间,因此我们会发现上面的时间与我们时寄存取的时间差八小时。改了这一项就好了。

listen_port=10021 改端口

one_process_model=NO yes可增加性能,增加负载,便降低安全,建议NO

nopriv_user=nobody 默认以nobody运行vsftp

对外服务,建议使用stand alone方式启动,性能好。

仅内部人员,建议用super daemon启动,修改如下:

listen=NO

……略

vsftp默认使用GMT时间,建议修改如下:

use_localtime=YES

/etc/vsftpd.ftpusers #保存不允许进行FTP登录的本地用户帐号,提高系统的安全性

/etc/vsftpd.user_list

#禁止vsftpd.user_list中的用户

userlist_enable=YES

userlist_deny=YES

#仅允许vsftpd.user_list中的用户

userlist_enable=YES

userlist_deny=NO

日志:

vsftpd_log_file=/var/log/vsftpd.log

下面开始讲vsftp四种“用户认证”的方式

一、匿名用户 ftp anonymous

/var/ftp 默认主目录

在/etc/vsftpd/vsftpd.conf中:

anonymous_enable=YES

anon_upload_enable=YES

anon_other_write_enable=YES #可删除

chmod -R 777 /var/ftp/pub/

修改/var/ftp/pub的SELinux权限

执行以下命令,修改/var/ftp/pub这目录的类型:

chcon -R -t ftpd_anon_rw_t /var/ftp/pub/

anon_root=/var/www/html/ftp #改匿名用户的宿主目录

二、本地用户

默认支持,使用各自的宿主目录。不安全

local_root=/opt#新增这一项,改成其他路径

三、虚拟用户 PAM文件方式 推荐

建立虚拟用户口令库文件

# cat logins.txt

mike

pwabcd

john

pw1234

生成vsftpd的认证文件

db_load -T -t hash -f logins /etc/vsftpd/vsftpd_login.db

chmod 600 /etc/vsftpd/vsftpd_login.db

新创建虚拟用户所需的PAM配置文件

cat /etc/pam.d/vsftpd.vu

auth required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login

account required /lib/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login

新创建虚拟用户的系统用户所要访问的目录并设置相应权限

# useradd -s /bin/false -d /home/ftpsite ftpvirtual

# chmod 700 /home/ftpsite

#设置vsftpd.conf配置文件,支持虚拟用户

guest_enable=YES

guest_username=ftpvirtual

pam_service_name=vsftpd.vu

user_config_dir=/etc/vsftpd/vsftpd_user_conf #添加用户配置文件目录设置

/etc/vsftpd/vsftpd_user_conf/mike (同名),这里没有的设置默认按vsftpd.conf的设置执行

anon_world_readable_only=NO #可以浏览FTP目录和下载文件

anon_upload_enable=YES #用户可以上传文件,等同于 write_enable=yes 允许上传

anon_mkdir_write_enable=YES #具有建立和删除目录的权利

anon_other_write_enable=YES #具有文件改名和删除文件的权限

local_root=/data/userspace #设置虚拟用户登录后的主目录

anon_max_rate=1024000 #以Bytes/s为单位,这里限8Mbit,范围大概在80%到120%之间

四、虚拟用户 mysql认证方式 推荐

1. mysql安装见mysql笔记

2.1 openssl-0.9.8e 源程序预编译时在日志中可能出现md5.h "Present But Cannot Be Compiled的错误,卸载下面某些包可能解决问题。

cyrus-sals-sql cyrus-sasl-ntlm cyrus-sasl-gssapi cyrus-sasl-devel openldap-devel

然后移除系统可能自带的:

mv /usr/bin/openssl /usr/bin/openssl.OFF

mv /usr/include/openssl /usr/include/openssl.OFF

ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl

ln -s /usr/local/ssl/include/openssl /usr/include/openssl

配置库文件搜索路径

#echo "/usr/local/ssl/lib" >>/etc/ld.so.conf

#ldconfig -v

2.2 或者安装openssl-0.9.8e的rpm包

3. pam_mysql-0.7RC1.tar.gz

#./configure --with-mysql=/usr/local/mysql --with-openssl=/usr/local/ssl

如果mysql是rpm安装的,则不带--with-mysql参数,如果openssl是rpm安装的,参数为--with-openssl

makemake install

注意pam_mysql.so路径,可能在/usr/lib/security/pam_mysql.so或/lib/security/pam_mysql.so

vi /etc/pam.d/vsftp.mysql #新建,仅两行

auth required /lib/security/pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftp table=users usercolumn=name passwdcolumn=passwd crypt=2

account required /lib/security/pam_mysql.so user=vsftpd passwd=123456 host=localhost db=vsftp table=users usercolumn=name passwdcolumn=passwd crypt=2

4.0 准备数据库、表和数据

mysql>create database vsftp

mysql>grant select on vsftp.* to vsftpd@localhost identified by '123456'

mysql>grant select on vsftp.* to vsftpd@127.0.0.1 identified by '123456'

mysql>use vsftp

mysql>create table users (

->id int AUTO_INCREMENT NOT NULL,

->name char(20) binary NOT NULL,

->passwd char(48) binary NOT NULL,

->primary key(id)

->)

mysql>insert into users(name,passwd) values('hlc',password('hlc'))

mysql>insert into users(name,passwd) values('holly',password('holly'))

5.0 修改主配置文件

vi /etc/vsftpd/vsftpd.conf

guest_enable=YES

guest_username=vsftp

listen=YES

pam_service_name=vsftpd.mysql

以上完成了vsftp的配置,下面是补充:

dirmessage_enable=YES #设置欢迎语 在每个目录下建立.message,写入欢迎语即可。

db_load支持包(前面三个即可):

db4

db4-devel

db4-utils

db4-java

db4-tcl

Linux建议关闭selinux或征对FTP不做任何安全

setsebool -P -ftpd_disable_trans on

setsebool -P -allow_ftpd_full_access on

servie vsftpd restart

或者需要重启服务器

底下列出FTP访问中所出现数字代码的含意。

110 重新启动标记应答。

120 服务在多久时间内ready。

125 数据链路端口开启,准备传送。

150 文件状态正常,开启数据端口。

200 命令执行成功。

202 命令执行失败。

211 系统状态或是系统求助响应。

212 目录的状态。

213 文件的状态。

214 求助的讯息。

215 名称系统类型。

220 新的联机服务ready。

221 服务的控制端口关闭,可以注销。

225 数据链接开启,但无传输动作。

226 关闭数据端口,请求的文件操作成功。

227 进入passive mode。

230 用户登录。

250 请求的文件操作完成。

257 显示目前的路径名称。

331 用户名称正确,需要密码。

332 登入时需要帐户信息。

350 请求的操作需要进一部的命令。

421 无法提供服务,关闭控制连结。

425 无法开启数据链路。

426 关闭联机,终止传输。

450 请求的操作未执行。

451 命令终止:有本地的错误。

452 未执行命令:磁盘空间不足。

500 格式错误,无法识别命令。

501 参数语法错误。

502 命令执行失败。

503 命令顺序错误。

504 命令所接的参数不正确。

530 未登入。

532 储存文件需要账户登入。

550 未执行请求的操作。

551 请求的命令终止,类型未知。

552 请求的文件终止,储存位溢出。

553 未执行请求的的命令,名称不正确。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/550857.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-06-28
下一篇2023-06-28

发表评论

登录后才能评论

评论列表(0条)

    保存