FTP是一个客户/服务器系统。用户通过一个客户机程序连接至在远程计算机上运行的服务器程序。由于FTP传输效率非常高,在网络上传输大的文件时,一般也采用该协议
安装
服务端安装:
[root@master ~]#yi vsftpd pam-devel db4-devel db4 [root@master ~]#rpm -ql vsftpd /etc/logrotate.d/vsftpd 日志清理配置 /etc/pam.d/vsftpd 认证方式设置 /etc/rc.d/init.d/vsftpd 服务文件 /etc/vsftpd 配置目录 /etc/vsftpd/ftpusers /etc/vsftpd/user_list /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd_conf_migrate.sh /usr/sbin/vsftpd
客户端:
centos上面:
lftp命令,见另外博文 lftp user:passwd@ip[:port] 登录 ls 列出文件 put file 将本地文件推送上去 mget file 将文件拉取下来 lcd /dir 不退出情况下更改linux当前目录
windows上面:
在浏览器里面输入:ftp://user:passwd@ip[:port] 可以访问到私有内容 在资源管理器里面输入:ftp://user:passwd@ip[:port] 可以访问到私有内容,或者输入:ftp://ip[:port] 可以访问到共有内容,鼠标右键可以登录
vsftpd配置文件说明
# Allow anonymous FTP? (Beware - allowed by default if you comment this out). #anonymous_enable=YES anonymous_enable=NO 设定不允许匿名访问 # # Uncomment this to allow local users to log in. local_enable=YES 设定本地用户可以访问。注意:主要是为虚拟宿主用户,如果该项目设定为NO那么所有虚拟用户将无法访问。 # # Uncomment this to enable any form of FTP write command. write_enable=YES 设定可以进行写操作。 # # Default umask for local users is 077. You may wish to change this to 022, # if your users expect that (022 is used by most other ftpd's) local_umask=022 设定上传后文件的权限掩码。 # # Uncomment this to allow the anonymous FTP user to upload files. This only # has an effect if the above global write enable is activated. Also, you will # obviously need to create a directory writable by the FTP user. #anon_upload_enable=YES anon_upload_enable=NO 禁止匿名用户上传。 # # Uncomment this if you want the anonymous FTP user to be able to create # new directories. #anon_mkdir_write_enable=YES anon_mkdir_write_enable=NO 禁止匿名用户建立目录。 # # Activate directory messages - messages given to remote users when they # go into a certain directory. dirmessage_enable=YES 设定开启目录标语功能。 # # Activate logging of uploads/downloads. xferlog_enable=YES 设定开启日志记录功能。 # # Make sure PORT transfer connections originate from port 20 (ftp-data). connect_from_port_20=YES 设定端口20进行数据连接。 # # If you want, you can arrange for uploaded anonymous files to be owned by # a different user. Note! Using "root" for uploaded files is not # recommended! #chown_uploads=YES chown_uploads=NO 设定禁止上传文件更改宿主。 #chown_username=whoever # # You may override where the log file goes if you like. The default is shown # below. xferlog_file=/var/log/vsftpd.log 设定Vsftpd的服务日志保存路径。注意,该文件默认不存在。必须要手动touch出来,并且由于这里更改 了Vsftpd的服务宿主用户为手动建立的Vsftpd。必须注意给与该用户对日志的写入权限,否则服务将启动失败。 # # If you want, you can have your log file in standard ftpd xferlog format xferlog_std_format=YES 设定日志使用标准的记录格式。 # # You may change the default value for timing out an idle session. #idle_session_timeout=600 设定空闲连接超时时间,这里使用默认。将具体数值留给每个具体用户具体指定,当然如果不指定的话,还是使用这里的默认值600,单位秒。 # # You may change the default value for timing out a data connection. #data_connection_timeout=120 设定单次最大连续传输时间,这里使用默认。将具体数值留给每个具体用户具体指定,当然如果不指定的话,还是使用这里的默认值120,单位秒。 # # It is recommended that you define on your system a unique user which the # ftp server can use as a totally isolated and unprivileged user. #nopriv_user=ftpsecure nopriv_user=vsftpd 设定支撑Vsftpd服务的宿主用户为手动建立的Vsftpd用户。注意,一旦做出更改宿主用户后,必须注意一起与该服务相关的读写文件的读写 赋权问题。比如日志文件就必须给与该用户写入权限等。 # # Enable this and the server will recognise asynchronous ABOR requests. Not # recommended for security (the code is non-trivial). Not enabling it, # however, may confuse older FTP clients. async_abor_enable=YES 设定支持异步传输功能。 # # By default the server will pretend to allow ASCII mode but in fact ignore # the request. Turn on the below options to have the server actually do ASCII # mangling on files when in ASCII mode. # Beware that on some FTP servers, ASCII support allows a denial of service # attack (DoS) via the command "SIZE /big/file" in ASCII mode. vsftpd # predicted this attack and has always been safe, reporting the size of the # raw file. # ASCII mangling is a horrible feature of the protocol. ascii_upload_enable=YES ascii_download_enable=YES 设定支持ASCII模式的上传和下载功能。 # # You may fully customise the login banner string: ftpd_banner=This Vsftp server supports virtual users ^_^ 设定Vsftpd的登陆标语。 # # You may specify a file of disallowed anonymous e-mail addresses. Apparently # useful for combatting certain DoS attacks. #deny_email_enable=YES # (default follows) #banned_email_file=/etc/vsftpd/banned_emails # # You may specify an explicit list of local users to chroot() to their home # directory. If chroot_local_user is YES, then this list becomes a list of # users to NOT chroot(). #chroot_list_enable=YES chroot_list_enable=NO 禁止用户登出自己的FTP主目录。 # (default follows) #chroot_list_file=/etc/vsftpd/chroot_list # # You may activate the "-R" option to the builtin ls. This is disabled by # default to avoid remote users being able to cause excessive I/O on large # sites. However, some broken FTP clients such as "ncftp" and "mirror" assume # the presence of the "-R" option, so there is a strong case for enabling it. #ls_recurse_enable=YES ls_recurse_enable=NO 禁止用户登陆FTP后使用"ls -R"的命令。该命令会对服务器性能造成巨大开销。如果该项被允许, 那么挡多用户同时使用该命令时将会对该服务器造成威胁。 # When "listen" directive is enabled, vsftpd runs in standalone mode and # listens on IPv4 sockets. This directive cannot be used in conjunction # with the listen_ipv6 directive. listen=YES 设定该Vsftpd服务工作在StandAlone模式下。顺便展开说明一下,所谓StandAlone模式就是该服务 拥有自己的守护进程支持,在ps -A命令下我们将可用看到vsftpd的守护进程名。如果不想工作在StandAlone模式下, 则可以选择SuperDaemon模式,在该模式下 vsftpd将没有自己的守护进程,而是由超级守护进程Xinetd全权代理, 与此同时,Vsftp服务的许多功能将得不到实现。 # # This directive enables listening on IPv6 sockets. To listen on IPv4 and IPv6 # sockets, you must run two copies of vsftpd whith two configuration files. # Make sure, that one of the listen options is commented !! #listen_ipv6=YESpam_service_name=vsftpd 设定PAM服务下Vsftpd的验证配置文件名。因此,PAM验证将参考/etc/pam.d/下的vsftpd文件配置。 userlist_enable=YES 设定userlist_file中的用户将不得使用FTP。 tcp_wrappers=YES 设定支持TCP Wrappers。#KC: The following entries are added for supporting virtual ftp users. 以下这些是关于Vsftpd虚拟用户支持的重要配置项目。默认Vsftpd.conf中不包含这些设定项目,需要自己手动添加配置。 guest_enable=YES 设定启用虚拟用户功能。 guest_username=overlord 指定虚拟用户的宿主用户。 virtual_use_local_privs=YES 设定虚拟用户的权限符合他们的宿主用户。 user_config_dir=/etc/vsftpd/vconf 设定虚拟用户个人Vsftp的配置文件存放路径。也就是说,这个被指定的目录里,将存放每个Vsftp虚拟用户个性的配置文件, 一个需要注意的地方就是这些配置文件名必须和虚拟用户名相同。 dual_log_enable=YES vsftpd_log_file=/var/log/vsftpd.log 记录服务器的传输情况
根据上面的配置进行操作
1.建立Vsftpd服务的宿主用户:
# useradd vsftpd -s /sbin/nologin
默认的Vsftpd的服务宿主用户是root,但是这不符合安全性的需要。这里建立名字为vsftpd的用户,用他来作为支持Vsftpd的服务宿主用户。由于该用户仅用来支持Vsftpd服务用,因此没有许可他登陆系统的必要,并设定他为不能登陆系统的用户。
2.建立Vsftpd虚拟宿主用户:
# useradd overlord -s /sbin/nologin
本篇主要是介绍Vsftp的虚拟用户,虚拟用户并不是系统用户,也就是说这些FTP的用户在系统中是不存在的。他们的总体权限其实是集中寄托在一个在系统中的某一个用户身上的,所谓Vsftpd的虚拟宿主用户,就是这样一个支持着所有虚拟用户的宿主用户。由于他支撑了FTP的所有虚拟的用户,那么他本身的权限将会影响着这些虚拟的用户,因此,处于安全性的考虑,也要非分注意对该用户的权限的控制,该用户也绝对没有登陆系统的必要,这里也设定他为不能登陆系统的用户。
3.安照上面的说明来配置
# cp /etc/vsftpd/vsftpd.conf{,.bak} 修改
4.建立Vsftpd的日志文件,并更该属主为Vsftpd的服务宿主用户:
# touch /var/log/vsftpd.log # chown vsftpd.vsftpd /var/log/vsftpd.log
5.建立虚拟用户配置文件存放路径:
# mkdir /etc/vsftpd/vconf
6.先建立虚拟用户名单文件:
建立了一个虚拟用户名单文件,这个文件就是来记录vsftpd虚拟用户的用户名和口令的数据文件,我这里给它命名为virtusers。为了避免文件的混乱,我把这个名单文件就放置在/etc/vsftpd/下。编辑这个虚拟用户名单文件,在其中加入用户的用户名和口令信息。格式很简单:“一行用户名,一行口令”。
# vim /etc/vsftpd/virtusers andy 123456 bob 234567
3.生成虚拟用户数据文件:需要特别注意的是,以后再要添加虚拟用户的时候,只需要按照“一行用户名,一行口令”的格式将新用户名和口令添加进虚拟用户名单文件。但是光这样做还不够,不会生效的哦!还要再执行一遍“ db_load -T -t hash -f 虚拟用户名单文件 虚拟用户数据库文件.db ”的命令使其生效才可以!
上面的一行一个是给人看的,下面的数据库是给服务看的
# db_load -T -t hash -f /etc/vsftpd/virtusers /etc/vsftpd/virtusers.db
4.设定PAM验证文件,并指定虚拟用户数据库文件进行读取
# cp /etc/pam.d/vsftpd{,.bak} # vim /etc/pam.d/vsftpd ---------------------------------------------------------------- #%PAM-1.0 auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/virtusers account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/virtusers 以上两条是手动添加的,内容是对虚拟用户的安全和帐户权限进行验证。 这里的auth是指对用户的用户名口令进行验证。 这里的accout是指对用户的帐户有哪些权限哪些限制进行验证。 其后的sufficient表示充分条件,也就是说,一旦在这里通过了验证,那么也就不用经过下面剩下的验证步骤了。 相反,如果没有通过的话,也不会被系统立即挡之门外,因为sufficient的失败不决定整个验证的失败,意味着用户还必须将经历剩下来的验证审核。 再后面的/lib64/security/pam_userdb.so表示该条审核将调用pam_userdb.so这个库函数进行。 最后的db=/etc/vsftpd/virtusers则指定了验证库函数将到这个指定的数据库中调用数据进行验证。 #KC: The entries for Vsftpd-PAM are added above.session optional pam_keyinit.so force revoke auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed auth required pam_shells.so auth include system-auth account include system-auth session include system-auth session required pam_loginuid.so
5.创建虚拟用户文件目录
# mkdir -p /opt/vsftp/{andy,bob}
6.定制虚拟用户配置文件,即外面的配置文件是全局的,这个目录下面的配置文件是定制的,当变量相同时,以定制为准
# vim /etc/vsftpd/vconf/andy -------------------------------- local_root=/opt/vsftp/andy #指定虚拟用户的具体主路径。 anonymous_enable=NO #设定不允许匿名用户访问。 write_enable=YES #设定允许写操作。 local_umask=022 #设定上传文件权限掩码。 anon_upload_enable=NO #设定不允许匿名用户上传。 anon_mkdir_write_enable=NO #设定不允许匿名用户建立目录。 idle_session_timeout=600 #设定空闲连接超时时间。 data_connection_timeout=120 #设定单次连续传输最大时间。 max_clients=10 #设定并发客户端访问个数。 max_per_ip=5 #设定单个客户端的最大线程数,这个配置主要来照顾Flashget、迅雷等多线程下载软件。 local_max_rate=50000 #设定该用户的最大传输速率,单位b/s。0表示不限制
7.更改虚拟用户的主目录的属主为虚拟宿主用户:
# chown -R overlord.overlord /opt/vsftp/
8.检查权限:
[root@master /opt/vsftp]#ll total 8 drwxr-xr-x 2 overlord overlord 4096 Nov 5 16:57 andy drwxr-xr-x 2 overlord overlord 4096 Nov 5 16:57 bob
9.启动服务
# service vsftpd start Starting vsftpd for vsftpd: [ OK ]
10.防火墙先关闭测试,在其他机器上面
[root@master ~]#lftp andy:123456@192.168.170.10 lftp andy@192.168.170.10:~> mkdir abc mkdir ok, `abc' created lftp andy@192.168.170.10:~> ls drwxr-xr-x 2 501 501 4096 Nov 05 09:03 abc lftp andy@192.168.170.10:~> put file1 lftp andy@192.168.170.10:~> ls drwxr-xr-x 2 501 501 4096 Nov 05 09:03 abc -rw-r--r-- 1 501 501 0 Nov 05 09:04 file1 在服务端,可以看到创建的文件 [root@master /opt/vsftp/andy]#ll total 4 drwxr-xr-x 2 overlord overlord 4096 Nov 5 17:03 abc -rw-r--r-- 1 overlord overlord 0 Nov 5 17:04 file1
ftp模式配置
FTP支持两种模式,一种方式叫做Standard (也就是 PORT方式,主动方式),一种是 Passive(也就是PASV,被动方式)。 Standard模式 FTP的客户端发送 PORT 命令到FTP服务器。Passive模式FTP的客户端发送 PASV命令到 FTP Server。
下面介绍一个这两种方式的工作原理:
Port
所谓主动模式,指的是FTP服务器“主动”去连接客户端的数据端口来传输数据。具体过程:FTP 客户端首先和FTP服务器的TCP 21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。 PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的TCP 20端口连接至客户端的指定端口发送数据。 FTP server必须和客户端建立一个新的连接用来传送数据。
Passive
所谓被动模式,指的是FTP服务器“被动”等待客户端来连接自己的数据端口。具体过程:在建立控制通道的时候和Standard模式类似,但建立连接后发送的不是Port命令,而是Pasv命令。FTP服务器收到Pasv命令后,随机打开一个高端端口(端口号大于1024)并且通知客户端在这个端口上传送数据的请求,客户端连接FTP服务器此端口,然后FTP服务器将通过这个端口进行数据的传送,这个时候FTP server不再需要建立一个新的和客户端之间的连接。(注意此模式下的FTP服务器不需要开启tcp 20端口了)
–
两种模式的比较:
(1)PORT(主动)模式模式只要开启服务器的21和20端口,而PASV(被动)模式需要开启服务器大于1024所有tcp端口和21端口。
(2)如果客户端是在内网,而服务端是在公网上,这时使用被动模式比较好,不用在客户端公网出口做映射即可成功访问服务端
FTP工具或者浏览器默认使用的都是PASV模式连接FTP服务器,下面配置vsftpd开启pasv(被动)模式
–
(1)修改 /etc/vsftpd/vsftpd.conf 文件配置
pasv_enable=yes (Default: YES) 设置是否允许pasv模式 #pasv_promiscuous=no (Default: NO) 是否屏蔽对pasv进行安全检查,(当有安全隧道时可禁用) pasv_max_port=10250 (Default: 0 (use any port)) pasv使用的最大端口 pasv_min_port=10240 (Default: 0 (use any port)) pasv使用的最小端口 默认情况下vsftpd是支持PASV模式访问的,可以不作修改。
(2)给防火墙添加FTP访问转换支持模块,修改 /etc/sysconfig/iptables-config 文件配置,这样就可以只开21号端口和状态为ESTABLISHED,RELATED的都可以正常通行
// 添加以下两行: IPTABLES_MODULES="ip_conntrack_ftp" IPTABLES_MODULES="ip_nat_ftp" 请一定注意两行内容的位置关系不要搞反了。如果将"ip_nat_ftp"放到前面是加载不到的。 如果你的ftp服务是过路由或者防火墙(即内网映射方式一定需要此模块)。以上等同于在 加载iptables之前运行modprobe命令加载"ip_nat_ftp"和"ip_conntrack_ftp"模块。
(3)给防火墙添加访问规则允许
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j
(4)重启防火墙服务
service iptables restart
(5)检查模块是否加载成功
#lsmod |grep ftp p_nat_ftp 7361 0 ip_nat 21229 1 ip_nat_ftp ip_conntrack_ftp 11569 1 ip_nat_ftp ip_conntrack 53665 4 ip_nat_ftp,ip_nat,ip_conntrack_ftp,xt_state
修改默认监听端口
编辑/etc/vsftpd/vsftpd.conf 文件,比如要改成2121端口,在该配置文件中添加此行:
listen_port=2121
修改防火墙,这里需要将数据高位端口放行,不然连不上
vim /etc/sysconfig/iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 10240:10250 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 2121 -j ACCEPT
–
对chroot_list_file=/etc/vsftpd.chroot_list的一点说明 http://www.linuxidc.com/Linux/2013-09/90560.htm
vsftpd的安全配置案例分析 http://www.linuxidc.com/Linux/2012-12/76501.htm
参考文档:vsftp配置教程
–
–
–
评论前必须登录!
注册