FTP 参数详细解释与简单搭建和测试

linux下ftp配置文件详解

如果是默认安装vsftpd的话,以下是一些文件的位置约定:
/usr/sbin/vsftpd ---- VSFTPD的主程序
/etc/rc.d/init.d/vsftpd ---- 启动脚本
/etc/vsftpd/vsftpd.conf ---- 主配置文件
/etc/pam.d/vsftpd ---- PAM认证文件
/etc/vsftpd/ftpusers ---- 禁止使用VSFTPD的用户列表文件
/etc/vsftpd/user_list ---- 禁止或允许使用VSFTPD的用户列表文件
/var/ftp ---- 匿名用户主目录
/var/ftp/pub ---- 匿名用户的下载目录
/etc/vsftpd/chroot_list  ---此文件包含对服务器上所有FTP内容有权限的用户名。对其他用户来说,他们在服务器上的主目录对他们显示为根目录
/etc/shells  --在允许本地用户登录之前,系统默认检查是否有有效的用户 shell。以防 PAM 认证不可用的情况

FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文件传输协议”。
用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。
vsftpd 是一个基于GPL发布的FTP服务器软件。其中的vs是“ Very Secure”的缩写
控制连接:TCP 21,用于发送FTP命令信息
数据连接:TCP 20,用于上传、下载数据

Vsftp工作模式
FTP协议有两种工作方式:PORT方式和PASV方式,中文意思为主动式和被动式
主动模式:服务端从20端口主动向客户端发起连接
被动模式:服务端在指定范围内某个端口被动等待客户端连接
VSFTP传输模式
文本模式:ASCII模式,以文本序列传输数据
二进制模式:Binary模式,以二进制序列传输数据
FTP用户的类型
匿名用户:anonymous或ftp
本地用户:帐号名称、密码等信息保存在passwd/shadow文件中
虚拟用户:使用独立的帐号/密码数据文件

--配置文件

[root@db1 vsftpd]#  cat /etc/vsftpd/vsftpd.conf | grep -v '^#' | grep -v '^$'
#常用全局配置,配置文件中=两边值不能有空格
listen_address=192.168.4.1 设置监听的IP地址
listen=YES #是否以独立运行的方式监听服务
listen_port=21 #设置监听FTP服务的端口号
download_enable=YES #是否允许下载文件
max_clients=0 #限制并发客户端连接数
max_per_ip=0 #限制同一IP地址的并发连接数
pasv_enable=yes #开启被动模式
pasv_min_port=9981 #设置最小的被动端口号
pasv_max_port=9981 #设置最大的被动端口号

# 匿名用户配置,说明:匿名用户账号名称默认为ftp或anonymous,不需要登录密码,默认只能下载无法上传。
anonymous_enable=YES         # 是否允许匿名ftp,如否则选择NO
anon_umask=022 #匿名用户所上传文件的权限掩码
anon_upload_enable=YES       # 匿名用户是否能上传
anon_mkdir_write_enable=YES  # 匿名用户是否能创建目录 
anon_other_write_enable=YES  # 修改文件名和删除文件
anon_root=/var/ftp #匿名用户的FTP根目录
anon_max_rate=0 #限制最大传输速率(字节/秒)

# 本地用户配置,本地用户访问限制
local_enable=YES # 是否允许本地用户登录
local_umask=022  # umask 默认755,本地用户所上传文件的权限掩码
write_enable=YES #是否启用写入权限
local_root=/home/ftp #设置本地用户的FTP根目录(默认为用户的宿主目录)
local_max_rate=0 #限制最大传输速率(字节/秒)
chroot_local_user=YES  # 本地用户禁锢在宿主目录中
chroot_list_enable=YES # 是否将系统用户限止在自己的home目录下
chroot_list_file=/etc/vsftpd.chroot_list # 列出的是不chroot的用户的列表
chown_upload=YES  # 是否改变上传文件的属主
chown_username=username # 是否改变上传文件的属主,如果是则需要输入一个系统用户名
userlist_enable=YES #是否启用user_list列表文件
userlist_deny=NO 是否禁用user_list中的用户
deny_email_enable=YES # 是否允许禁止匿名用户使用某些邮件地址
banned_email_file=/etc/vsftpd.banned_emails # 禁止邮件地址的文件路径
ftpd_banner=Welcome to FTP service. # 定制欢迎信息
dirmessage_enable=YES # 是否显示目录说明文件, 需要手工创建.message文件
message_file= # 设置访问一个目录时获得的目录信息文件的文件名,默认是.message
xferlog_enable=YES # 是否记录ftp传输过程
xferlog_file=/var/log/vsftpd.log # ftp传输日志的路径和名字
xferlog_std_format=YES # 是否使用标准的ftp xferlog模式
ascii_upload_enable=YES   # 是否使用ascii码方式上传文件
ascii_download_enable=YES # 是否使用ascii码方式下载文件
connect_from_port_20=YES # 是否确信端口传输来自20(ftp-data)  
nopriv_user=ftpsecure # 运行vsftpd需要的非特权系统用户默认是nobody
async_abor_enable=YES # 是否允许运行特殊的ftp命令async ABOR.

# FTP服务器的资源限制
idle_session_timeout=600 # 设置session超时时间
data_connection_timeout=120 # 设置数据传输超时时间
max_clients=50 # 用户最大连接数 默认是0不限止 
max_per_ip=5   # 每个IP地址最大连接数
anon_max_rate=102400  # 匿名的下载速度 KB
local_max_rate=102400 # 普通用户的下载速度 KB 

!为执行外部操作系统的命令。

!为执行外部操作系统的命令。
ftp> help 列出 ftp 文件传输,可使用的任何命令。
ftp> !ls 列出本地工作站,目前目录下的所有文件名。
ftp> !pwd 列出本地工作站,目前所在的工作目录位置。
ftp> ls 列出远端工作站目前目录下的所有文件名。
ftp> dir 列出远端工作站目前目录下的所有文件名(略同于 UNIX 的 ls -l 指令).
ftp> pwd 列出远端工作站目前所在的目录位置。
ftp> cd dir1 更改远端工作站的工作目录位置至 dir1 下。
ftp> get file1 将远端工作站的文件 file1 ,拷贝到本地工作站中。
ftp> put file2 将本地工作站的文件 file2 ,拷贝到远端工作站中。
ftp> mget *.c 将远端工作站中,文件名后缀为 c 的所有文件,拷贝到本地工作站中。
ftp> mput *.txt 将本地工作站中,文件名后缀为 txt 的所有文件,拷贝到远端工作站中。
ftp> bin 以二进制方式传输文件,切记在传送可执行文件时要先执行此命令。
可以将ASCII文件按二进制方式传输,但决不能将二进制文件按ASCII方式传输,否则二进制文件的内容会遭到破坏而无法使用。
ftp> asc 以ASCII方式传输文件,只在传输ASCII文件时用,特别是在DOS和Solaris之间传输时用。
ftp> prompt 使用 mput/mget 时不用每个文件皆询问yes/no
ftp> quit 结束 ftp 工作。
ftp> bye 结束 ftp 工作,和quit一样。
注: 从PC到工作站间的文件传输也可在 PC端WIN95下的 FTP命令进行文件传输,用法与上所述大致相同。

#配置拥有所有权限的匿名用户

# yum -y install vsftpd
# chown ftp /var/ftp/pub/
# cp -a /etc/vsftpd/vsftpd.conf  /etc/vsftpd/vsftpd.conf.back
# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES     #启用匿名访问
anon_upload_enable=YES    #允许匿名用户可上传文件
anon_mkdir_write_enable=YES   #允许匿名用户可创建目录
anon_other_write_enable=YES   #开放其他写入权比如改名,需要手动添加
# systemctl restart vsftpd
#测试
在Windows上文件里面的地址栏输入ftp://10.11.9.11
在Linux中匿名登陆FTP服务器需要先yum install ftp软件,然后输入ftp 10.11.9.11,之后输入用户ftp或者anonymous,密码为空回车即可登陆。

#配置ftp本地用户的访问控制

# yum -y install vsftpd
# chown ftp /var/ftp/pub/
# cp -a /etc/vsftpd/vsftpd.conf  /etc/vsftpd/vsftpd.conf.back
# useradd user1
# useradd user2
# echo '123456' | passwd --stdin user1
# echo '123456' | passwd --stdin user2
# vim /etc/vsftpd/vsftpd.conf
local_enable=YES      #启用本地系统用户
local_umask=000      #修改权限掩码为000,用系统的setfacl权限限制即可
chroot_local_user=YES   #是否将用户禁锢在local_root设置的目录
local_root=/var/ftp      #设置本地用户的FTP根目录
chroot_list_enable=YES   #是否启用列表控制,启用后和chroot_list_file配合使用
chroot_list_file=/etc/vsftpd/chroot_list  #该文件要自己创建,列表中的用户将被禁锢在目录中
userlist_enable=YES      #是否开启用户列表访问控制
userlist_deny=YES        #拒绝访问FTP用户列表是否启用

说明:userlist_enable=YES对应/etc/vsftpd/user_list文件灵活控制用户访问
1 userlist_enable=YES,userlist_deny=YES 满足这两个条件时,出现在user_list文件里的用户会被拒绝访问FTP服务器
2 userlist_enable=YES,userlist_deny=NO 满足这两个条件时,只允许出现在user_list文件里的用户登录FTP服务器
3 只要出现在/etc/vsftpd/ftpusers文件里的用户都禁止登陆FTP服务器,优先级要高于上面的user_list文件

# service iptables stop //关闭iptables
# iptables -A INPUT -p tcp –dport 21 -j ACCEPT
防火墙配置VSFTPD 被动端口开放:
# iptables -A INPUT -p tcp –dport 30000:30100 -j ACCEPT //端口30000-30100只是举例,可以根据实际情况自定义
# service iptables save //保存iptables配置
# service iptables restart //重启防火墙
SELINUX永久开启FTP支持
# setsebool -P ftp_home_dir on
# setsebool -P allow_ftpd_full_access on
# setsebool -P allow_anon_write_enable on
关闭selinux
# /usr/sbin/setenforce 0 #临时
# sed -i 's/=enforcing/=disabled/' /etc/selinux/config #永久关闭
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO # 禁用匿名用户
local_enable=YES #是否允许本地用户访问
write_enable=NO #YES,ftp写的权限
local_umask=022 ##设置本地用户所上传文件的默认权限掩码值(反掩码)
dirmessage_enable=YES #连接打印的消息
xferlog_enable=YES
connect_from_port_20=YES #20端口 
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
chroot_local_user=YES #是否将FTP本地用户禁锢在宿主目录中
chroot_list_enable=YES #启动限制用户的列表 
chroot_list_file=/etc/vsftpd/chroot_list #每行一个用户名
pam_service_name=vsftpd
userlist_enable=YES #配置yes之后,user_list的用户不能访问ftp
tcp_wrappers=YES #是否启用tcp_wrappers主机访问控制
listen_ipv6=YES
listen_port=60021
pasv_enable=YES ##默认允许被动模式连接
local_root=/home/test ##设置本地用户的FTP根目录(默认为用户的宿主目录)
allow_writeable_chroot=YES #允许被限制用户的主目录具有写权限
download_enable=YES  #是否允许下载文件(建立仅限于浏览、上传的FTP服务器时,可将此项设置为“NO”);
userlist_enable=YES #是否启用userl_ist用户列表文件;
userlist_deny=YES #是否禁用user_list列表文件中的用户账号;
max_clients=0 #最多允许多少个客户端同时连接(0为无限制);
max_per_ip=0 #对来自同一个ip地址的客户端,最多允许多少个并发连接(0为无限制);
[root@localhost vsftpd]# vim /etc/vsftpd/chroot_list
#添加用户
###useradd ftpuser -s /sbin/nologin
[root@localhost vsftpd]# useradd -d /home/test/ -s /sbin/nologin test
[root@localhost vsftpd]# passwd test
[root@localhost home]# cat /etc/passwd |grep test
test:x:1000:1000::/home/test/:/sbin/nologin
[root@localhost vsftpd]# chown -R test /home/test/
[root@localhost vsftpd]# vim /etc/vsftpd/virtusers #多个ftp用户,可以分别写入
test
***
[root@localhost vsftpd]# db_load -T -t hash -f /etc/vsftpd/virtusers /etc/vsftpd/virtusers.db
[root@localhost vsftpd]# chmod 600 /etc/vsftpd/virtusers.db
[root@localhost vsftpd]# cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak
[root@localhost vsftpd]# vim /etc/pam.d/vsftpd
#先将配置文件中原有的 auth 及 account 的所有配置行均注释掉,如果系统为32位,上面lib64改为lib
auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/virtusers
account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/virtusers
#用户登录终端设为/bin/false(即:使之不能登录系统)
[root@localhost vsftpd]# useradd test -d /home/test -s /bin/false
[root@localhost vsftpd]# echo "t***" | passwd --stdin test
[root@localhost vsftpd]# chown -R test:test /home/test
#建立虚拟用户个人配置文件
[root@localhost vsftpd]# mkdir /etc/vsftpd/vconf
[root@localhost vsftpd]# cd /etc/vsftpd/vconf
#这里建立两个虚拟用户配合文件
[root@localhost vconf]# touch test
[root@localhost vconf]# vim test
    local_root=/home/test/test/
    write_enable=YES
    anon_world_readable_only=NO
    anon_upload_enable=YES
    anon_mkdir_write_enable=YES
    anon_other_write_enable=YES
[root@localhost vconf]# pwd
/etc/vsftpd/vconf
[root@localhost vconf]# more test
local_root=/home/test/
write_enable=YES
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

[root@localhost vconf]# mkdir -p /home/test/test/
[root@localhost vconf]# chmod -R 775 /home/test/test
#firewall-cmd --permanent --zone=public --add-service=ftp
#firewall-cmd --reload
#getsebool -a | grep ftp
#setsebool -P ftpd_full_access on
systemctl stop  vsftpd.service
systemctl start  vsftpd.service
#测试
[root@localhost ~]# cd /home/test/test/
[root@localhost test]# touch 1.txt 2.txt
[root@localhost vsftpd]# netstat -tuln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
tcp6       0      0 :::21                   :::*                    LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN     
tcp6       0      0 ::1:25                  :::*                    LISTEN 

错误:

500 OOPS: vsftpd: cannot locate user specified in 'guest_username':vsftpd
#注释配置文件中的guest_username
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
500 OOPS: 远程主机关闭连接。

添加参数 allow_writeable_chroot=YES

--在cmd中登录ftp
C:Usersadmin>ftp 10.11.9.11
连接到 10.11.9.11220 (vsFTPd 3.0.2)
200 Always in UTF8 mode.
用户(10.11.9.11:(none)): test
331 Please specify the password.
密码:
230 Login successful.
ftp> ls

---nginx代理ftp

[root@localhost nginx-1.16.1]# vim /usr/local/nginx/conf/nginx.conf
 35     server {
 36         listen       9060; # Nginx代理的端口
 37         server_name  10.11.9.11; # 服务器IP
 38     
 39         #charset koi8-r;
 40     
 41         #access_log  logs/host.access.log  main;
 42         location / {
 43         location / {
 44             root   /home/test; # 代理的ftp服务器文件夹觉得路径
 45             index  test; # 欢迎页,写上代理ftp服务器的文件夹
 46             autoindex on; # 打开文件目录列表
 47             autoindex_exact_size on; # 显示文件大小 单位字节
 48             autoindex_localtime on;# 显示时间
 49             charset uft-8,gbk;# 设置编码防止中午乱码
 50         }}

### test   /home/test/userphoto/;为ftp的用户和路径
/usr/local/nginx/sbin/nginx
#重启ftp和nginx
[root@localhost userphoto]# ps -ef|grep nginx
root      7582  6828  0 14:55 pts/0    00:00:00 grep --color=auto nginx
root     31218     1  0 11:55 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx

参考:https://blog.51cto.com/longlei/2068636

原文地址:https://www.cnblogs.com/yhq1314/p/12660233.html