CentOS 6.5安装FTP并配置虚拟用户

1,199 阅读7分钟

CentOS 6.5安装FTP并配置虚拟用户

本文介绍了在CentOS 6.5下安装vsftpd、配置虚拟用户登录FTP的过程。

1. FTP服务简介

ftp 命令使用文件传输协议(File Transfer Protocol, FTP)在本地主机和远程主机之间或者在两个远程主机之间进行文件传输。

FTP服务传输数据分为三种传输模式:

  • 主动模式: 主动传输模式,有FTP服务器向客户端发送一个用于数据传输的连接,客户端的连接端口由服务器和客户端通过协商确定, 即FTP服务器用端口20与客户端的临时端口进行连接并传输数据,客户端用于接收状态。
  • 被动模式: 被动传输模式,由客户端发送PASV命令使服务器处于被动模式,FTP的数据连接和控制连接方向一致,由客户端向服务器端发送一个用于数据传输的连接, 客户端的连接端口是发起该数据请求时使用的端口。
  • 单端口模式: 单端口模式,由服务器端发起,使用该模式时,客户端的控制连接端口和数据连接端口一致,这种模式无法在短时间内连续输入数据并传送命令, 因此笔者不建议大家使用此模式。

2. FTP安装

2.1 环境准备

准备CentOS机器,centos6/7环境yum安装的vsftp版本分别是2.2及3.x。两个版本配置文件在个别参数上略有区别。

IP 操作系统 vsftp版本
192.168.0.101 CentOS6.5 vsftpd-2.2.2
192.168.0.103 CentOS7.2 vsftpd-3.0.2

2.2 关闭selinux

配置前可以关闭setenforce及设置防火墙。

#临时关闭selinux:
$getenforce
Enforcing

$setenforce 0
$getenforce
Permissive

#永久关闭,SELINUX=enforcing 改为 SELINUX=disabled
重启机器reboot
$vim /etc/sysconfig/selinux

#iptable 
iptables -L 

2.3 创建目录及用户

计划把ftp目录设置为/data1/vsftpd。并创建ftp相关用户,ftpadmin,ftpuser,ftppub。

#用户登录终端设为/bin/false(即:使之不能登录系统)
useradd vsftpd -d /data1/vsftpd -s /bin/false
chown -R vsftpd:vsftpd /data1/vsftpd
#创建其它用户
useradd ftpadmin
useradd ftpuser 

2.4 安装vsftp软件

#安装,centos6/7安装的vsftp版本有点区别
yum install -y vsftpd 

说明:

# rpm -ql vsftpd   ##查看在安装vftpd软件包时,所产生的配置文件。(这里只做常用的文件)  
/usr/sbin/vsftpd    ##Vsftpd主程序  
/etc/rc.d/init.d/vsftpd    ##用于启动终止脚本  
/etc/vsftpd/vsftpd.conf     ##Vsftpd主配置文件  
/etc/pam.d/vsftpd           ##PAM认证文件  
/etc/vsftpd.ftpusers        ##禁止使用Vsftpd的用户列表  
/etc/vsftpd.user_list       ##禁止或允许使用Vsftpd的用户列表  
/var/ftp        ##匿名用户的下载目录  
/var/ftp/pub    ##匿名用户默认访问目录  
/etc/logrotate.d/vsftpd.log     ##vsftpd的日志文件 

3. 配置vsftpd

  • 备份vsftpd的默认配置文件。
$cd /etc/vsftpd/ 
$cp vsftpd.conf vsftpd.conf.bak

3.1 基本配置

anonymous_enable=NO //设定不允许匿名访问
local_enable=YES //设定本地用户可以访问。
local_umask=022 #不想上传后的文件执行(找到并去掉注释)

#日志配置
xferlog_enable=YES
xferlog_std_format=YES
xferlog_file=/var/log/vsftpd.log
dual_log_enable=YES 

#配置PASV模式vsftpd默认没有开启PASV模式,现在FTP只能通过PORT模式连接,要开启PASV默认需要通过下面的配置
pasv_enable=YES //开启PASV模式
pasv_min_port=40000 //最小端口号
pasv_max_port=40010 //最大端口号
pasv_promiscuous=YES

//注:如使用虚拟宿主用户,在local_enable设定为NO的情况下所有虚拟用户将无法访问
chroot_list_enable=YES //使用户不能离开主目录
ascii_upload_enable=YES
ascii_download_enable=YES //设定支持ASCII模式的上传和下载功能
pam_service_name=vsftpd //PAM认证文件名。PAM将根据/etc/pam.d/vsftpd进行认证。

CentOS6最终配置vsftpd.conf

cat /etc/vsftpd/vsftpd.conf |grep -v '#' |grep -v '^$'
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
use_localtime=YES
listen_port=21
idle_session_timeout=300
pasv_enable=YES
pasv_promiscuous=YES
pasv_min_port=40000
pasv_max_port=40010
xferlog_enable=YES
xferlog_std_format=YES
xferlog_file=/var/log/vsftpd.log
guest_username=ftp
user_config_dir=/etc/vsftpd/vconf
data_connection_timeout=1
accept_timeout=5
connect_timeout=1

CentOS7最终配置vsftpd.conf:

cat /etc/vsftpd/vsftpd.conf |grep -v '#' |grep -v '^$'
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
anon_mkdir_write_enable=NO
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
chown_uploads=YES
xferlog_std_format=YES
async_abor_enable=YES
ascii_upload_enable=YES
ascii_download_enable=YES
ftpd_banner=Welcome to blah FTP service.
chroot_local_user=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
use_localtime=YES
listen_port=21
idle_session_timeout=300
guest_enable=YES
guest_username=vsftpd
user_config_dir=/etc/vsftpd/vconf
data_connection_timeout=1
virtual_use_local_privs=YES
pasv_min_port=40000
pasv_max_port=40010
accept_timeout=5
connect_timeout=1
allow_writeable_chroot=YES

4. 配置虚似用户

4.1 建立ftp虚似用户

分别建立ftpadmin,ftpuser用户。

建立用户文件 vim /etc/vsftpd/virtusers 第一行为用户名,第二行为密码。不能使用root作为用户名

cat /etc/vsftpd/virtusers
ftpadmin
ftpadmin123
ftpuser
ftpuser123

4.2 生成用户数据文件

明文信息既不安全,也不符合让vsftpd服务程序直接加载的格式,因此需要使用db_load命令用哈希(hash)算法将原始的明文信息文件转换成数据库文件,并且降低数据库文件的mod权限(避免其他人看到数据库文件的内容),然后再把原始的明文信息文件删除。

#安装Berkeley DB工具:
$install yum install db4 db4-utils
#生成虚拟用户认证的db文件
db_load -T -t hash -f /etc/vsftpd/virtusers /etc/vsftpd/virtusers.db
#设定PAM验证文件,并指定对虚拟用户数据库文件进行读取
chmod 600 /etc/vsftpd/virtusers.db 
#为了安全可以删除明文文件
#rm -rf virtusers

4.3 修改pam文件

修改认证文件/etc/pam.d/vsftpd。

#修改前先备份 
$cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak
$vim /etc/pam.d/vsftpd
#先将配置文件中原有的 auth 及 account,session的所有配置行均注释掉
auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/virtusers 
account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/virtusers 
#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

4.4 建立虚拟个人目录

分别建立ftpadmin,ftpuser用户。

mkdir /etc/vsftpd/vconf
cd /etc/vsftpd/vconf

ftpadmin用户:

#建立虚拟用户ftpadmin配置文件
cat /etc/vsftpd/vconf/ftpadmin
local_root=/data1/vsftpd
write_enable=YES
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

ftpuser用户:

#建立虚拟用户ftpuser配置文件
touch /etc/vsftpd/vconf/ftpuser
#编辑ftpuser用户配置文件,内容如下
vim /etc/vsftpd/vconf/ftpuser
local_root=/data1/vsftpd/pub
anon_world_readable_only=NO
#建立目录
mkdir -p /data1/vsftpd/pub

创建chroot_list:

#添加用户
vim /etc/vsftpd/chroot_list
ftpadmin
ftpuser
ftppub

4.5 修改目录属性

配置完成后结构如下:

tree /etc/vsftpd/
/etc/vsftpd/
├── ftpusers
├── user_list
├── vconf
│   ├── ftpadmin
│   ├── ftpuser
│   └── guest
├── virtusers
├── virtusers.db
├── vsftpd.conf
└── vsftpd_conf_migrate.sh

修改目录属性:

chmod -R 775 /data1/vsftpd/
chown -R vsftpd:vsftpd /data1/vsftpd

5. 防火墙

防火墙:

chkconfig iptables off 
setenforce 0
#IPtables 的设置方式:
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 40000:40010 -j ACCEPT

#centos6
iptables -I INPUT 1 -p tcp --dport 20:21 -j ACCEPT  
service iptables save            ##保存iptables设置  
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]

6.启动FTP

启动ftp:

#centos6 
/etc/init.d/vsftpd start

#centos7重启
systemctl start vsftpd.service
systemctl status vsftpd.service

查看日志:

$cat /etc/vsftpd/vsftpd.conf  |grep -v '#' |grep -v '^$'
xferlog_enable=YES
xferlog_std_format=YES
xferlog_file=/var/log/vsftpd.log
dual_log_enable=YES 

$cat /etc/logrotate.d/vsftpd   
#查看日志
$tail -f /var/log/vsftpd.log

开机自启动:

#centos6
chkconfig --list | grep ftp
vsftpd          0:off   1:off   2:off   3:off   4:off   5:off   6:off
#CentOS6设置开机启动
chkconfig vsftpd on
chkconfig --list | grep ftp
vsftpd          0:off   1:off   2:on    3:on    4:on    5:on    6:off

#centos7
systemctl enable vsftpd.service  开机自启
systemctl disable vsftpd.service 关闭开机自启

#centos7启动/停止
systemctl start vsftpd.service
systemctl stop vsftpd.service
#查看状态
systemctl status vsftpd.service

7. FTP使用

7.1 FTP命令

FTP 登录:

$man ftp
#登录 
ftp ftp.tao-ops.com   #输入账号/密码

FTP常用命令:

#ftp命令  描述
ls  列出远程机的当前目录
cd  在远程机上改变工作目录
lcd 在本地机上改变工作目录
ascii   设置文件传输方式为 ASCII 模式
binary  设置文件传输方式为二进制模式
close   终止当前的 ftp 会话
get (mget)  从远程机传送指定文件到本地机
put (mput)  从本地机传送指定文件到远程机
open    连接远程 ftp 站点
quit    断开与远程机的连接并退出 ftp
?   显示本地帮助信息
!   转到 Shell 中
prompt 1    关闭交互模式

7.2 文件下载

文件下载除了用ftp get命令外,还可以用ftp客户程序,wget或浏览器等完成。

  • wget下载:
wget -P /tmp  ftp://ftp.tao-ops.com:21/README.md  --ftp-user=xx --ftp-password=xxxx 
  • mac 下载: 直接在浏览器上输入ftp地址,连接ftp服务进行下载。
    ftp.png

8. FAQ

8.1 FTP登录失败

1)是否Selinux或防火墙:

关闭Selinux或者设置Selinux。

#临时关闭:
$getenforce
$setenforce 0
#永久关闭
# vim /etc/sysconfig/selinux

#或者设置Selinux
getsebool -a |grep ftp
setsebool -P ftp_home_dir=on //设置ftp可以使用home目录
sersebool -P allow_ftpd_full_access=on //设置ftp用户可以有所有权限

2)防火墙

#开启配置文件vsftpd.conf中pasv_min_port,pasv_max_port对应port
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 40000:40010 -j ACCEPT

3)设置FTP根目录权限

#最新的vsftpd要求对主目录不能有写的权限所以ftp为755,主目录下面的子目录再设置777权限。
chmod R 755 /data1
chmod -R 777 /data1/vsftpd
chown -R vsftpd:vsftpd /data1/vsftpd

8.2 500 OOPS: could not read chroot()

  • 方法1)找到vsftpd.conf以下三行,注释掉就行可以了。不安全
vim /etc/vsftpd/vsftpd.conf #编辑vsftpd配置文件
#chroot_local_user=YES
#chroot_list_enable=YES
# (default follows)
#chroot_list_file=/etc/vsftpd/chroot_list
  • 方法2)
$vim /etc/vsftpd/vsftpd.conf
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list

$vim /etc/vsftpd/chroot_list
#写入ftp用户名
ftpadmin
ftpuser

8.3 外网访问内网环境中ftp服务

#文章1: http://ask.apelearn.com/question/1003
有两台机器,其中一台A 有内网和外网,B机器只有内网。
想达到的目的: 通过A机器的外网去访问B机器的ftp(21)
环境:
A机器外网IP为  123.234.12.22(eth1)  内网IP为 192.168.10.20 (eth0)
B机器内网为 192.168.10.21

实现方法:
1.  让你的linux支持ftp的端口转发
modprobe ip_nat_ftp ###加载ip_nat_ftp模块(若没有编译进内核),以使ftp能被正确NAT
modprobe ip_conntrack_ftp ###加载ip_conntrack_ftp模块
2.  在A机器上打开端口转发功能
vi  /etc/sysctl.conf
使 net.ipv4.ip_forward = 1
sysctl -p
3.  在A机器上创建iptables规则
iptables -t nat -I PREROUTING -d 123.234.12.22   -p tcp --dport 21 -j DNAT --to 192.168.10.21:21  (把访问外网21端口的包转发到内网ftp服务器)
iptables -t nat -I POSTROUTING -d 192.168.10.21 -p tcp --dport 21 -j SNAT --to 192.168.10.20 (把到内网ftp服务器的包回源到内网网卡上,不然包只能转到ftp服务器,而返回的包不能到达客户端)


#文章2:
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -I FORWARD -p tcp --sport 21 -j ACCEPT
iptables -I FORWARD -p tcp --dport 21 -j ACCEPT
iptables -t nat -I PREROUTING  -p tcp --dport 21 -j DNAT --to 192.168.0.3
iptables -t nat -I POSTROUTING -p tcp --dport 21 -j MASQUERADE

参考: