FTP 是 File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:”下载”(Download)和”上传”(Upload)。
一般在各种linux的发行版中,默认带有的ftp软件是vsftp,从各个linux发行版对vsftp的认可可以看出,vsftp应该是一款不错的ftp软件。
1、安装 FTP 服务
检查是否已安装vsftpd软件
rpm -qa |grep vsftpd
如果没有安装,使用YUM命令进行安装
yum install vsftpd -y
2、启动 VSFTPD 服务
安装完成后,启动 FTP 服务:
systemctl start vsftpd.service
# 老版本执行命令:
service vsftpd start
启动后,可以看到系统已经监听了 21 端口:
netstat -nltp | grep 21
此时,访问 ftp://< ip 地址 > 可浏览机器上的 /var/ftp 目录了。
停止 ftp 服务
systemctl stop vsftpd.service
# 老版本执行命令:
service vsftpd stop
重启 ftp 服务
systemctl restart vsftpd.service
# 老版本执行命令:
service vsftpd restart
3、配置 FTP 权限
目前 FTP 服务登陆允许匿名登陆,也无法区分用户访问,我们需要配置 FTP 访问权限;
了解 VSFTP 配置:
vsftpd.conf 为主要配置文件
ftpusers 配置禁止访问 FTP 服务器的用户列表
user_list 配置用户访问控制
阻止匿名访问和切换根目录:
vim /etc/vsftpd/vsftpd.conf
编辑 /etc/vsftpd/vsftpd.conf,找到以下配置并修改或添加:
# 禁用匿名用户
anonymous_enable=NO
# 禁止切换根目录
chroot_local_user=YES
# 设置FTP主目录
local_root=/data/ftp
# 配置FTP被动模式的端口
pasv_min_port=30000
pasv_max_port=30000
修改配置后,重新启动 FTP 服务,让配置生效;
匿名访问让所有人都可以上传文件到服务器上而无需鉴权,而允许切换根目录则可能产生越权访问问题。
4、创建 FTP 用户
创建一个用户
useradd user1
为用户设置密码
echo "password1" | passwd user1 --stdin
限制该用户仅能通过 FTP 访问
usermod -s /sbin/nologin user1
限制用户 user1只能通过 FTP 访问服务器,而不能直接登录服务器:
vsftpd 的配置目录为 /etc/vsftpd,包含下列的配置文件:
为用户分配主目录
# 创建目录:
mkdir -p /data/ftp/pub
# 创建登录欢迎说明文件:
echo "Welcome to use FTP service." > /data/ftp/welcome.txt
# 设置访问权限:
chmod a-w /data/ftp && chmod 777 -R /data/ftp/pub
# 设置为用户的主目录: 即用户通过 FTP 登录后看到的根目录
usermod -d /data/ftp user1
为用户创建主目录并约定:
/data/ftp 为主目录, 该目录不可上传文件
/data/ftp/pub 文件只能上传到该目录下
5、访问 FTP 服务
通过资源管理器的地址栏或浏览器地址栏访问:
ftp://user1:Password@<IP 地址>
通过 FTP 客户端工具访问
1) FileZilla - 跨平台的 FTP 客户端,支持 Windows 和 Mac
FileZilla可以处理同时传输,并支持跨平台FTP,SFTP和FTPS客户端,有很多有用的功能和直观的图形用户界面。
FileZilla还支持IPv6,书签,选项卡式用户界面,运行在Windows,Linux,Mac OS X等,远程文件编辑,目录比较,拖放支持,远程文件搜索等等。
2) WinSCP - Windows 下的 FTP 和 SFTP 连接客户端
WinSCP是一个用于Windows的开源免费SFTP客户端,FTP客户端,WebDAV客户端和SCP客户端。 它的主要功能是在本地和远程计算机之间进行文件传输。 除此之外,WinSCP提供脚本和基本文件管理器功能。
WinSCP包括图形用户界面,提供多种语言,与Windows集成,批处理文件脚本和命令行界面集成,以及各种其他有用的功能。
6、 配置SELinux
VSFTPD是一个FTP服务器程序,然后SELinux是CentOS的防火墙组件。由于 vsftpd 默认被 SELinux 拦截,所以会遇到访问FTP出现以下的问题:
226 Transfer done (but failed to open directory).(传输完成,但是打开路径失败)
550 Failed to change directory(更改路径失败)
553 Could not create file.
解决方法一:降低SELinux安全级别
此方法原理是:降低SELinux安全级别,把enforcing降低到permissive,但降低整体系统安全作为代价来解决一个小问题,这总不是最佳方案。
编辑SELinux配置
vim /etc/sysconfig/selinux
1
设置SELINUX=enforcing改为SELINUX=permissive
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=permissive
# SELINUXTYPE= can take one of three two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
重启vsftpd服务,即可正常访问FTP
解决方法二:在SELinux中设置FTP允许访问
首先查看SELinux中有关FTP的设置状态:
getsebool -a | grep ftp
1
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
# 此行--- ftpd_full_access --> off ---默认为off状态
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
tftp_home_dir --> off
设置ftpd_full_access为开启状态
setsebool -P ftpd_full_access=on
1
重启vsftpd服务,即可正常访问FTP
-P是保存选项,每次重启时不必重新执行这个命令了
7、配置防火墙
配置 iptables 防火墙
1、解决vsftpd在iptables开启后,无法使用被动模式的问题
编辑/etc/sysconfig/iptables-config添加以下内容
# 添加以下内容,注意顺序不能调换
IPTABLES_MODULES="ip_conntrack_ftp"
IPTABLES_MODULES="ip_nat_ftp"
2、开启21端口
编辑/etc/sysconfig/iptables添加以下内容
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 30000 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
置 firewalld 防火墙
1、开启21端口
查询所有已开启端口
firewall-cmd --zone=public --list-ports
查询是否开启21端口
firewall-cmd --zone=public --query-port=21/tcp
开启21端口(如未开启)
firewall-cmd --zone=public --add-port=21/tcp --permanent (--permanent永久生效,无参数重启后失效)
# 开启被动模式30000端口(vsftpd.conf中相应配置)
firewall-cmd --zone=public --add-port=30000/tcp --permanent
重新载入防火墙规则
firewall-cmd --reload
再次查询,开启成功;
2、firewalld常用命令
查看防火墙状态
firewall-cmd --state
查看版本
firewall-cmd --version
查看帮助
firewall-cmd --help
其他命令
# 查看所有打开的端口:
firewall-cmd --zone=public --list-ports
# 更新防火墙规则:
firewall-cmd --reload
# 查看区域信息:
firewall-cmd --get-active-zones
# 查看指定接口所属区域:
firewall-cmd --get-zone-of-interface=eth0
# 拒绝所有包:
firewall-cmd --panic-on
# 取消拒绝状态:
firewall-cmd --panic-off
# 查看是否拒绝:
firewall-cmd --query-panic
systemctl相关命令
systemctl是CentOS7的服务管理工具中主要的工具,它融合之前service和chkconfig的功能于一体。
# 启动一个服务:
systemctl start firewalld.service
# 关闭一个服务:
systemctl stop firewalld.service
# 重启一个服务:
systemctl restart firewalld.service
# 显示一个服务的状态:
systemctl status firewalld.service
# 在开机时启用一个服务:
systemctl enable firewalld.service
# 在开机时禁用一个服务:
systemctl disable firewalld.service
# 查看服务是否开机启动:
systemctl is-enabled firewalld.service
# 查看已启动的服务列表:
systemctl list-unit-files|grep enabled
# 查看启动失败的服务列表:
systemctl --failed
8、配置端口转发与端口映射
有外围防火墙的在防火墙上做映射
系统防火墙做映射
iptables -t nat -A PREROUTING -d 外网IP -p tcp --dport 端口 -j DNAT --to 内网IP:端口
iptables -t nat -A POSTROUTING -d 内网IP -p tcp --dport 端口 -j SNAT --to 外网IP:端口
iptables save
PREROUTING:是目的地址转换(DNAT),要把别人的公网IP换成你们内部的IP,才让访问到你们内部受防火墙保护的服务器。
POSTROUTING:是源地址转换(SNAT),要把你内部网络上受防火墙保护的ip地址转换成你本地的公网地址才能让它们上网。
---------------------