Centos 7 最小化部署FTP服务

部署环境

操作系统:Centos 7.4

软件版本:vsftpd 3.0

服务地址:192.168.1.112

 

工作原理

vsftpd工作原理分为主动模式与被动模式

  • 主动模式:用来做数据连接,用来上传或者下载数据,不支持ftp命令;
  • 被动模式:用来做命令连接,用来进行客户端与服务端之间进行命令传递;(包括数据的上传及下载)

 

主动模式(PORT)原理如下

  1. 客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路;
  2. 当需要传送数据时,客户端在命令链路上用PORT命令告诉服务器:“我打开了'N'端口,你过来连接我”;
  3. 于是服务器从20数据端口向客户端的'N'端口发送连接请求,建立一条数据链路来传送数据。

 

被动模式(PASV)原理如下:

  1. 客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。
  2. 当需要传送数据时,服务器在命令链路上用PASV命令告诉客户端:“我打开了'N'端口,你过来连接我”。
  3. 于是客户端向服务器的'N'端口发送连接请求,建立一条数据链路来传送数据。

 

主动模式与本地用户

1、关闭selinux

sh-4.2# sed -i 's/enforcing/disabled/' /etc/selinux/config 
sh-4.2# reboot    # 一定要重启,已经不知道第几次在这个玩意上吃亏了

 

2、卸载防火墙

sh-4.2# rpm -qa | grep "firewall" | xargs rpm -e --nodeps
sh-4.2# rpm -qa | grep "iptables" | xargs rpm -e --nodeps

  

3、配置本地源

sh-4.2# mount -t iso9660 -o loop /opt/CentOS-7-x86_64-Everything-1708.iso /media/
sh-4.2# find /etc/yum.repos.d/ -ignore_readdir_race -type f -exec mv {} /etc/yum.repos.d/back/ \;
sh-4.2# cat /etc/yum.repos.d/GuGe.repo 
[GuGe]
name=GuGe
baseurl=file:///media
gpgcheck=0
enable=1

sh-4.2# yum clean all
sh-4.2# yum makecache all

 

4、安装程序

sh-4.2# yum -y install vsftpd

  

5、配置程序

sh-4.2# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
sh-4.2# vi /etc/vsftpd/vsftpd.conf    # 将主配置文件中内容替换成如下内容
anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
allow_writeable_chroot=YES
local_umask=022
reverse_lookup_enable=NO
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
pasv_enable=NO
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

sh-4.2# touch /etc/vsftpd/chroot_list
sh-4.2# useradd -s /sbin/nologin -d /test test
sh-4.2# echo 'password' | passwd --stdin test

 

6、启动测试

sh-4.2# systemctl start vsftpd
sh-4.2# systemctl enable vsftpd

 

注解:因为这里是用主动模式,只能进行上传下载,并且不支持被动命令;我这里采用windows 下面的filezlia客户端进行测试;filezlia下载地址:https://filezilla-project.org/download.php?type=client

 

主动模式与匿名用户

1、关闭selinux

sh-4.2# sed -i 's/enforcing/disabled/' /etc/selinux/config 
sh-4.2# reboot    # 一定要重启,已经不知道第几次在这个玩意上吃亏了

  

2、卸载防火墙

sh-4.2# rpm -qa | grep "firewall" | xargs rpm -e --nodeps
sh-4.2# rpm -qa | grep "iptables" | xargs rpm -e --nodeps

 

3、配置本地源

sh-4.2# mount -t iso9660 -o loop /opt/CentOS-7-x86_64-Everything-1708.iso /media/
sh-4.2# find /etc/yum.repos.d/ -ignore_readdir_race -type f -exec mv {} /etc/yum.repos.d/back/ \;
sh-4.2# cat /etc/yum.repos.d/GuGe.repo 
[GuGe]
name=GuGe
baseurl=file:///media
gpgcheck=0
enable=1

sh-4.2# yum clean all
sh-4.2# yum makecache all

 

4、安装程序

sh-4.2# yum -y install vsftpd

 

5、配置程序

sh-4.2# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
sh-4.2# vi /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
local_enable=YES
write_enable=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
allow_writeable_chroot=YES
reverse_lookup_enable=NO
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES  # 匿名登录不能关闭被动模式,即时是主动模式的情况下面;
#pasv_enable=NO
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

sh-4.2# touch /etc/vsftpd/chroot_list

sh-4.2# usermod -d /appl/ftp/pub/ ftp    # 匿名用户通过ftp用户来设置
sh-4.2# mkdir -p /appl/ftp/pub/          # 匿名用户的家目录需要手动创建
sh-4.2# chown -R ftp.ftp /appl/ftp/pub/  # 手动授权
sh-4.2# chmod -R a-w /appl/ftp/pub/      # 匿名用户登录,不能设置写入权限
sh-4.2# useradd -s /sbin/nologin -d /test test    # 匿名用户与本地用户可以同时使用
sh-4.2# echo 'password' | passwd --stdin test

  

6、启动测试

sh-4.2# systemctl start vsftpd.service
sh-4.2# touch /appl/ftp/pub/test
sh-4.2# chown -R ftp.ftp /appl/

 

 

被动模式与本地用户

1、关闭selinux

sh-4.2# sed -i 's/enforcing/disabled/' /etc/selinux/config 
sh-4.2# reboot    # 一定要重启,已经不知道第几次在这个玩意上吃亏了

 

2、卸载防火墙

sh-4.2# rpm -qa | grep "firewall" | xargs rpm -e --nodeps
sh-4.2# rpm -qa | grep "iptables" | xargs rpm -e --nodeps

 

3、配置本地源

sh-4.2# mount -t iso9660 -o loop /opt/CentOS-7-x86_64-Everything-1708.iso /media/
sh-4.2# find /etc/yum.repos.d/ -ignore_readdir_race -type f -exec mv {} /etc/yum.repos.d/back/ \;
sh-4.2# cat /etc/yum.repos.d/GuGe.repo 
[GuGe]
name=GuGe
baseurl=file:///media
gpgcheck=0
enable=1

sh-4.2# yum clean all
sh-4.2# yum makecache all

 

4、安装程序

sh-4.2# yum -y install vsftpd

 

5、配置程序

sh-4.2# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
sh-4.2# vi /etc/vsftpd/vsftpd.conf
reverse_lookup_enable=NO
anonymous_enable=NO
local_enable=YES
write_enable=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
allow_writeable_chroot=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=NO
pasv_enable=YES
pasv_min_port=1024
pasv_max_port=65536
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES


sh-4.2# touch /etc/vsftpd/chroot_list

sh-4.2# useradd -s /sbin/nologin -d /test test
sh-4.2# echo 'password' | passwd --stdin test

 

6、启动测试

sh-4.2# systemctl start vsftpd.service

 

被动模式与匿名用户

1、关闭selinux

sh-4.2# sed -i 's/enforcing/disabled/' /etc/selinux/config 
sh-4.2# reboot    # 一定要重启,已经不知道第几次在这个玩意上吃亏了

  

2、卸载防火墙

sh-4.2# rpm -qa | grep "firewall" | xargs rpm -e --nodeps
sh-4.2# rpm -qa | grep "iptables" | xargs rpm -e --nodeps

 

3、配置本地源

sh-4.2# mount -t iso9660 -o loop /opt/CentOS-7-x86_64-Everything-1708.iso /media/
sh-4.2# find /etc/yum.repos.d/ -ignore_readdir_race -type f -exec mv {} /etc/yum.repos.d/back/ \;
sh-4.2# cat /etc/yum.repos.d/GuGe.repo 
[GuGe]
name=GuGe
baseurl=file:///media
gpgcheck=0
enable=1

sh-4.2# yum clean all
sh-4.2# yum makecache all

 

4、安装程序

sh-4.2# yum -y install vsftpd

 

5、配置程序

sh-4.2# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
sh-4.2# vi /etc/vsftpd/vsftpd.conf
reverse_lookup_enable=NO
anonymous_enable=YES
local_enable=YES
write_enable=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
allow_writeable_chroot=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=NO
pasv_enable=YES
pasv_min_port=1024
pasv_max_port=65536
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

sh-4.2# touch /etc/vsftpd/chroot_list

sh-4.2# usermod -d /appl/ftp/pub/ ftp
sh-4.2# mkdir -p /appl/ftp/pub/
sh-4.2# chown -R ftp.ftp /appl/ftp/pub/
sh-4.2# chmod -R a-w /appl/ftp/pub/
sh-4.2# useradd -s /sbin/nologin -d /test test
sh-4.2# echo 'password' | passwd --stdin test

 

6、启动测试

sh-4.2# systemctl restart vsftpd.service

 

主动模式与虚拟用户

1、关闭selinux

sh-4.2# sed -i 's/enforcing/disabled/' /etc/selinux/config 
sh-4.2# reboot    # 一定要重启,已经不知道第几次在这个玩意上吃亏了

  

2、卸载防火墙

sh-4.2# rpm -qa | grep "firewall" | xargs rpm -e --nodeps
sh-4.2# rpm -qa | grep "iptables" | xargs rpm -e --nodeps

 

3、配置本地源

sh-4.2# mount -t iso9660 -o loop /opt/CentOS-7-x86_64-Everything-1708.iso /media/
sh-4.2# find /etc/yum.repos.d/ -ignore_readdir_race -type f -exec mv {} /etc/yum.repos.d/back/ \;
sh-4.2# cat /etc/yum.repos.d/GuGe.repo 
[GuGe]
name=GuGe
baseurl=file:///media
gpgcheck=0
enable=1

sh-4.2# yum clean all
sh-4.2# yum makecache all

 

4、安装程序

sh-4.2# yum -y install vsftpd pam* libdb-utils libdb*
vsftpd:    FTP服务程序
libdb:     虚拟用户生成程序
pam:       虚拟用户验证模块

 

5、配置程序

sh-4.2# vi /etc/vsftpd/vsftpd
sh-4.2# cat /etc/vsftpd/vsftpd    
admin
admin
# /etc/vsftpd/vsftpd是虚拟用户配置文件,奇行是用户,偶行是密码


sh-4.2# db_load -T -t hash -f /etc/vsftpd/vsftpd /etc/vsftpd/vsftpd_login.db
# /etc/vsftpd/vsftpd_login.db虚拟用户验证文件,不要和配置文件名字重叠

sh-4.2# vi  /etc/pam.d/vsftpd
sh-4.2# cat /etc/pam.d/vsftpd 
#%PAM-1.0
auth       sufficient   /lib64/security/pam_userdb.so     db=/etc/vsftpd/vsftpd_login    # 被加行
account    sufficient   /lib64/security/pam_userdb.so     db=/etc/vsftpd/vsftpd_login    # 被加行
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        password-auth
account    include        password-auth
session    required     pam_loginuid.so
session    include        password-auth
# /lib64/security/pam_userdb.so是64位操作系统的位置,32位操作系统请自行查找位置

sh-4.2# useradd -s /sbin/nologin -M xiao

sh-4.2# vi /etc/vsftpd/vsftpd.conf
sh-4.2# cat /etc/vsftpd/vsftpd.conf
reverse_lookup_enable=NO
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
pasv_enable=NO
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
chroot_local_user=YES
allow_writeable_chroot=YES
guest_enable=YES
guest_username=xiao
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd/vsftpd_user_conf

sh-4.2# touch /etc/vsftpd/chroot_list
sh-4.2# mkdir -p /etc/vsftpd/vsftpd_user_conf    # 目录用来控制虚拟用户的权限及家目录
sh-4.2# vi /etc/vsftpd/vsftpd_user_conf/admin
sh-4.2# cat /etc/vsftpd/vsftpd_user_conf/admin 
local_root=/ftp/admin
write_enable=YES
anon_world_readable_only=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

sh-4.2# mkdir -p /ftp/admin
sh-4.2# chown -R xiao.xiao /ftp/
sh-4.2# usermod -d /ftp/ xiao
# 所有虚拟用户都需要一个本地用户进行映射

 

6、启动测试

sh-4.2# systemctl restart vsftpd.service

 

被动模式与虚拟用户

1、关闭selinux

sh-4.2# sed -i 's/enforcing/disabled/' /etc/selinux/config 
sh-4.2# reboot    # 一定要重启,已经不知道第几次在这个玩意上吃亏了

 

2、卸载防火墙

sh-4.2# rpm -qa | grep "firewall" | xargs rpm -e --nodeps
sh-4.2# rpm -qa | grep "iptables" | xargs rpm -e --nodeps

  

3、配置本地源

sh-4.2# mount -t iso9660 -o loop /opt/CentOS-7-x86_64-Everything-1708.iso /media/
sh-4.2# find /etc/yum.repos.d/ -ignore_readdir_race -type f -exec mv {} /etc/yum.repos.d/back/ \;
sh-4.2# cat /etc/yum.repos.d/GuGe.repo 
[GuGe]
name=GuGe
baseurl=file:///media
gpgcheck=0
enable=1

sh-4.2# yum clean all
sh-4.2# yum makecache all

 

 4、安装程序

sh-4.2# yum -y install vsftpd pam* libdb-utils libdb*
vsftpd:    FTP服务程序
libdb:     虚拟用户生成程序
pam:       虚拟用户验证模块

 

5、配置程序

sh-4.2# vi /etc/vsftpd/vsftpd
sh-4.2# cat /etc/vsftpd/vsftpd    
admin
admin
# /etc/vsftpd/vsftpd是虚拟用户配置文件,奇行是用户,偶行是密码


sh-4.2# db_load -T -t hash -f /etc/vsftpd/vsftpd /etc/vsftpd/vsftpd_login.db
# /etc/vsftpd/vsftpd_login.db虚拟用户验证文件,不要和配置文件名字重叠

sh-4.2# vi  /etc/pam.d/vsftpd
sh-4.2# cat /etc/pam.d/vsftpd 
#%PAM-1.0
auth       sufficient   /lib64/security/pam_userdb.so     db=/etc/vsftpd/vsftpd_login    # 被加行
account    sufficient   /lib64/security/pam_userdb.so     db=/etc/vsftpd/vsftpd_login    # 被加行
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        password-auth
account    include        password-auth
session    required     pam_loginuid.so
session    include        password-auth
# /lib64/security/pam_userdb.so是64位操作系统的位置,32位操作系统请自行查找位置

sh-4.2# useradd -s /sbin/nologin -M xiao

sh-4.2# vi /etc/vsftpd/vsftpd.conf
sh-4.2# cat /etc/vsftpd/vsftpd.conf
reverse_lookup_enable=NO
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=NO
pasv_enable=YES
pasv_min_port=1024
pasv_max_port=1028
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
chroot_local_user=YES
allow_writeable_chroot=YES
guest_enable=YES
guest_username=xiao
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd/vsftpd_user_conf


sh-4.2# touch /etc/vsftpd/chroot_list
sh-4.2# mkdir -p /etc/vsftpd/vsftpd_user_conf    # 目录用来控制虚拟用户的权限及家目录
sh-4.2# vi /etc/vsftpd/vsftpd_user_conf/admin
sh-4.2# cat /etc/vsftpd/vsftpd_user_conf/admin 
local_root=/ftp/admin
write_enable=YES
anon_world_readable_only=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

sh-4.2# mkdir -p /ftp/admin
sh-4.2# chown -R xiao.xiao /ftp/
sh-4.2# usermod -d /ftp/ xiao
# 所有虚拟用户都需要一个本地用户进行映射

 

6、启动测试

sh-4.2# systemctl restart vsftpd.service

 

 

经典错误

错误一:530 Login incorrect

通过查看/var/logs/secure发现有如下面的错误:

pam_userdb(vsftpd:auth): user_lookup: could not open database `/etc/vsftpd/vsftpd_login.db': No such file or directory

  到/etc/vsftpd查看下加密过的认证文件,发现为vsftpd.login.db ,错把 "_" 写成了点 ,重命名该文件,问题解决。不过该问题还有可能是因为/etc/vsftpd.conf中没有加入pam_service_name=vsftpd 或 /etc/pam.d/vsftpd文件认证配置不正确引起的,需要在该文件后加入下面的两行。

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

:如果是32位系统,上面的lib64需要换成lib ,最后的认证文件vsftpd_login后面没有".db" ,系统会自动增加的 。如果加上 ".db" 将会出错 。还可以参考这篇文档:https://www.jianshu.com/p/91c7d4a115e0 

 

错误二:500 OOPS: cannot change directory错误 。

selinux未关闭

参考文档:http://www.361way.com/ftp-error/1832.html

 

错误三:530 pam_unix(vsftpd:auth): check pass; user unknown

pam_unix(vsftpd:auth): check pass; user unknown
pam_unix(vsftpd:auth): authentication failure; logname= uid=0 euid=0 tty=ftp ruser=anonymous rhost=192.168.10.138
具体报错信息

上述内容中明显可以看到是pam验证密码失败了,530基本基本就是密码验证失败的意思,解决办法如下:

vi  /etc/pam.d/vsftpd
ession    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      password-auth
account    include      password-auth
session    required     pam_loginuid.so
session    include      password-auth

这个问题是Centos 7.4以上版本才会出现的,应该是因为vsftpd版本与Centos 7.4以上版本的模块不兼容的原因导致的

参考文档来自于谷歌搜索:https://www.4spaces.org/ftp-login-error-530-solved/

 

错误四:完事具备,就是不行

试试用明文

 

相关日志

/var/log/xferlog:上传下载日志

/var/log/secure:验证日志

/var/log/message:启动运行日志

 

相关命令

登录ftp

sh-4.2# ftp 192.168.21.49
Connected to 192.168.21.49 (192.168.21.49).
220 (vsFTPd 3.0.2)
Name (192.168.21.49:root): Technical
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 (192,168,21,49,187,163).
150 Here comes the directory listing.-rw-r--r--    1 1001     1001           21 Jul 16 10:29 readme
drwxr-xr-x   19 1001     1001         4096 Nov 26 07:22 tm
... 226 Directory send OK.

 

切换ftp目录

ftp> cd tm
250 Directory successfully changed.

 

切换ftp本地接收目录

ftp> lcd /tmp
Local directory now /tmp

 

下载文件

ftp> get 账户口令台账.xlsx
local: 账户口令台账.xlsx remote: 账户口令台账.xlsx
227 Entering Passive Mode (192,168,21,49,78,254).
150 Opening BINARY mode data connection for 账户口令台账.xlsx (16577 bytes).
226 Transfer complete.
16577 bytes received in 0.000662 secs (25040.79 Kbytes/sec)

 

多个下载文件

mget *.xls
# 我打算下载所有以 .xls 结尾的文件,mget支持通配符

 

上传文件

ftp> put aaa
local: aaa remote: aaa
227 Entering Passive Mode (192,168,21,49,135,102).
150 Ok to send data.
226 Transfer complete.
8 bytes sent in 2.9e-05 secs (275.86 Kbytes/sec)

 

上传多个文件

mput *.xls

 

关闭连接

bye
exit
quit
# 这三种都可以安全关闭连接

 

配置详解

posted @ 2019-03-08 17:50  寻真丶  阅读(406)  评论(0编辑  收藏  举报