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.11。 220 (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