Linux --- CentOS 7 搭建FTP服务器详解

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 的配置目录为 /etc/vsftpd,包含下列的配置文件:

  • 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 服务,让配置生效;

匿名访问让所有人都可以上传文件到服务器上而无需鉴权,而允许切换根目录则可能产生越权访问问题。

4、创建 FTP 用户

  • 创建一个用户
useradd user1
  • 为用户设置密码
echo "password1" | passwd user1 --stdin
  • 限制该用户仅能通过 FTP 访问
usermod -s /sbin/nologin user1

限制用户 user1只能通过 FTP 访问服务器,而不能直接登录服务器:

  • 为用户分配主目录
// 创建目录:
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
  • 设置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
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
  • 重启vsftpd服务,即可正常访问FTP

-P是保存选项,每次重启时不必重新执行这个命令了

7、配置iptables防火墙

解决vsftpd在iptables开启后,无法使用被动模式的问题

  • 编辑/etc/sysconfig/iptables-config添加以下内容
#添加以下内容,注意顺序不能调换  
IPTABLES_MODULES="ip_conntrack_ftp"  
IPTABLES_MODULES="ip_nat_ftp"  
  • 编辑/etc/sysconfig/iptables添加以下内容
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

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地址转换成你本地的公网地址才能让它们上网。

总结


参考

iptables安装与配置

猜你喜欢

转载自blog.csdn.net/hakey/article/details/80665834