CentOS7下ftp服务器的搭建及常见问题解决
1.前言
在学校里面,有时候在机房需要用到自己的电脑上的文件。我很懒,经常忘记把U盘里面的文件进行即时同步;整个学校是个巨大的局域网,但是经过测试封锁了445端口,因而不能使用windows的smb,所以想要自己建立一个FTP服务器。
2.资源及需求分析
2.1 资源分析
- 学校内的所有设备都连接在同一个局域网下~~(这里要夸一夸某科)~~
- 我的寝室里有一台路由器(OpenWrt,在校园网的地址为10.11.12.13)连接到了校园局域网
- 寝室的路由器下面连接了一台工控主机(CentOS7,内网IP为192.168.1.192)我准备在这个设备上搭建FTP服务器
2.2 需求分析
- 连接了校园局域网的任何设备以及我的路由下的设备都可以访问到我的FTP服务器
- FTP服务器无需登录就可以使用(为了快速方便和分享我电脑里面的软件)
2.3 体系设计
- FTP服务器上有三个文件夹
- share 临时存放的文件,任何人都可以增删改
- software 分享的软件,只能读取
- system 分享的系统安装包,只能读取
- 使用vsftpd作为服务
- vsftpd的防火墙为匿名用户都可以更改文件,然后通过chmod控制文件的权限来达到特定的文件夹限制权限的目的
3.相关知识的学习
4.安装过程
4.1 安装所需的文件
yum install vsftpd
4.2. vsftpd设置
vsftpd的配置文件目录在/etc/vsftpd/vsftpd.conf
cd /etc/vsftpd/vsftpd.conf
cp vsftpd.conf vsftpd.conf.bak
vi vsftpd.conf
修改为以下配置
#anoymous settings
anonymous_enable=YES #开启匿名访问
no_anon_password=YES #匿名登录无需密码
#anon_max_rate=1000000 #匿名用户最大速率 bps
data_connection_timeout=120 #数据
idle_session_timeout=600 #无操作超时
max_clients=50 #最大客户端数量
max_per_ip=5 #每个IP的最大连接数目
write_enable=YES #ftp服务器允许更改
anon_other_write_enable=YES #允许匿名用户写入
anon_mkdir_write_enable=YES #允许匿名用户创建文件夹
anon_upload_enable=YES #允许匿名用户上传文件
anon_umask=022 #上传的文件的权限为rw-r--r--
#local user
local_enable=NO #关闭用户名密码登录
#server condition
use_localtime=YES #使用本地时间
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES #允许使用20端口连接
xferlog_std_format=YES
listen=YES #开放监听
pam_service_name=vsftpd
tcp_wrappers=YES
banner_file=/etc/vsftpd/welecome.txt #欢迎文字
anon_root=/mnt/NAS/3_public #ftp的默认目录,请修改为你要的目录
#pasv settings
pasv_enable=YES #开启被动模式
pasv_address=10.11.12.13 #设为ftp的外网IP
pasv_min_port=50000 #被动模式端口设置
pasv_max_port=50050
pasv_promiscuous=YES #关闭被动模式安全检查
#nopriv_user=nobody
其中,注意:
pasv_address=10.11.12.13
10.11.12.13为ftp服务器的外网IP,如果所有的客户端和服务器在同一个局域网下,请注释banner_file=/etc/vsftpd/welecome.txt
欢迎文字,可以通过修改该目录下的welecome.txt来修改欢迎文字
3.non_root=/mnt/NAS/3_public
ftp的默认目录,请修改为你要的目录请务必在ftp发布前,检查FTP目录的权限- 本设置中vsftp允许了匿名用户的读写权限,是通过chmod修改文件目录的权限来控制匿名用户的读写。请务必在ftp发布前,检查FTP默认目录的权限
4.4文件目录的权限配置
给予ftp根目录所有用户的r-x权限
cd /mnt/NAS/
chmod 755 3_public
给予ftp目录内share文件夹所有用户的rwx权限,其他文件所有用户的r-x权限
cd /3_public
chmod 777 share
chmod 755 software
chmod 755
全部完毕后可以使用ll
命令查看目录权限,我的权限设置如下
[root@localhost NAS]# ll
总用量 40
drwxr-xr-x. 5 hjl_smb hjl_smb 4096 12月 26 15:11 3_public
[root@localhost NAS]# cd 3_public/
[root@localhost 3_public]# ll
总用量 32
-rwxr--r--. 1 hjl_smb hjl_smb 262 12月 26 15:15 README.txt
drwxrwxrwx. 2 hjl_smb hjl_smb 4096 12月 26 15:42 share
drwxr-xr-x. 20 hjl_smb hjl_smb 4096 12月 26 14:38 software
drwxr-xr-x. 4 hjl_smb hjl_smb 4096 12月 26 15:14 system
[root@localhost 3_public]#
请务必严格控制所有用户的w权限所在的文件夹,因为这些文件夹内的文件可以被所有用户更改(包括删除)。
4.5 防火墙设置
FTP需用到21模式进行连接通信,主动模式20进行传输数据,被动模式在高端口随机开放一个端口。这里建议在vsftpd.conf中限制被动模式端口范围,本例限制为了50000-50050。
#开启FTP通信端口21
firewall-cmd --permanent --add-port=21/tcp
#开启FTP主动端口20
firewall-cmd --permanent --add-port=20/tcp
#开启FTP被动端口(注意要与vsftpd.conf中的设置一致)
firewall-cmd --permanent --add-port=50000-50050/tcp
#使更改立即生效
firewall-cmd --reload
4.6 SELinux设置
4.6.1 查看当前的和FTP相关的SELinux设置
[root@localhost NAS]# getsebool -a |grep ftp
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> 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
4.6.2 修改SELinux设置
setsebool -P ftpd_full_access=1
5.常见问题:
5.1 ftp: connect: No route to host
5.1.1问题描述
使用Linux客户端访问时候无法连接,错误代码:
ftp: connect: No route to host
hjl_ubuntu@HJL-Surface:/$ ftp 10.11.12.13
ftp: connect: No route to host
ftp>
5.1.2原因分析
防火墙阻止了FTP的21通信端口
5.1.3解决方案
一定要保证防火墙的21端口开启。见步骤 3.防火墙的设置。
5.2 500 Illegal PORT command. ftp: bind: Address already in use
5.2.1问题描述
使用Linux客户端访问时候可以正常登录但不能访问文件,错误代码
500 Illegal PORT command.
ftp: bind: Address already in use
hjl_ubuntu@HJL-Surface:/mnt/c/Users/hjlbb$ ftp 10.11.12.13
Connected to 10.11.12.13.
220 (vsFTPd 3.0.2)
Name (10.11.12.13:hjl_ubuntu): anonymous
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
500 Illegal PORT command.
ftp: bind: Address already in use
ftp>
5.2.2原因
linux ftp命令默认使用主动模式进行连接,当20端口被防火墙或挡住时候,主动模式不再可用。
此处的防火墙不一定是ftp服务器的防火墙,也可能是学校封锁了局域网中的20端口。我所在的学校,当我的设备在自己搭建的局域网下时候,主动模式和被动模式都能正常使用;但是在校园范围内访问时,学校封锁了20端口,因而无法使用主动模式。
某科还封锁了445端口,造成了smaba文件共享无法使用,使用smb进行文件共享时还得做端口转发来绕过。
5.2.3解决方案
5.2.3.1检查ftp服务器的防火墙
一定要保证防火墙的20端口开启。见步骤 3.防火墙的设置。
5.2.3.2使用被动模式
- 修改
/etc/vsftpd/vsftpd.conf
添加以下项目
pasv_enable=YES #开启被动模式
pasv_min_port=50000 #设置被动模式端口
pasv_max_port=50050
- 连接时使用
ftp> passive
hjl_ubuntu@HJL-Surface:/$ ftp 10.11.12.13
Connected to 10.11.12.13.
220 (vsFTPd 3.0.2)
Name (10.11.12.13:hjl_ubuntu): anonymous
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
500 Illegal PORT command.
ftp: bind: Address already in use
ftp> passive
Passive mode on.
ftp> ls
227 Entering Passive Mode (10,11,12,13,195,98).
150 Here comes the directory listing.
-rwxr--r-- 1 1001 1001 262 Dec 26 15:15 README.txt
226 Directory send OK.
ftp>
5.3 227 Entering Passive Mode卡死
5.3.1 问题描述
在外网访问局域网内的ftp服务器时,切换到被动模式后在227 Entering Passive Mode (192,168,1,192,195,92).
处卡死。
hjl_ubuntu@HJL-Surface:/$ ftp 10.11.12.13
Connected to 10.11.12.13.
220 (vsFTPd 3.0.2)
Name (10.11.12.13:hjl_ubuntu): anonymous
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
500 Illegal PORT command.
ftp: bind: Address already in use
ftp> passive
Passive mode on.
ftp> ls
227 Entering Passive Mode (192,168,1,192,195,92).
5.3.2 原因分析
观察到(192,168,1,192,195,92)前一段是ftp在局域网内的IP,猜测在被动模式下,ftp服务器错误的将自己的内网ip告诉了客户端,客户端在外网当然无法访问到ftp。此处有待深入学习FTP的过程
5.3.3 解决方案
在/etc/vsftpd/vsftpd.conf
中加入
pasv_address=10.11.12.13 #设置被动模式ip,10.11.12.13设为ftp的外网IP
并且在路由器的管理端口设置,20,21以及被动模式端口的端口转发。
5.4 ftp: bind: Address already in use
5.4.1 问题描述
在连接时显示错误代码ftp: bind: Address already in use
hjl_ubuntu@HJL-Surface:/$ ftp 10.11.12.13
Connected to 10.11.12.13.
220 (vsFTPd 3.0.2)
Name (10.11.12.13:hjl_ubuntu): anonymous
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
500 Illegal PORT command.
ftp: bind: Address already in use
ftp>
5.4.2 原因分析
原因未知
此处有待深入学习
5.4.3 解决方案
在/etc/vsftpd/vsftpd.conf
中加入
pasv_promiscuous=YES #关闭被动模式安全检查
5.5 无读写权限
5.5.1 问题描述
可以登录服务器,但是不能打开文件目录,错误代码
226 Transfer done (but failed to open directory).
hjl_ubuntu@HJL-Surface:/$ ftp 10.11.12.13
Connected to 10.11.12.13.
220 (vsFTPd 3.0.2)
Name (10.11.12.13:hjl_ubuntu): anonymous
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> passive
Passive mode on.
ftp> ls
227 Entering Passive Mode (10,11,12,13,195,80).
150 Here comes the directory listing.
226 Transfer done (but failed to open directory).
ftp>
5.5.2 原因及解决方案
- vsftpd的防火墙配置
/etc/vsftpd/vsftpd.conf
中一定要有
write_enable=YES
anon_other_write_enable=YES
anon_mkdir_write_enable=YES
anon_upload_enable=YES
- 文件目录没有权限
见4.4文件目录的权限设置 - SELinux
见4.6SELinux的权限设置
6 总结反思与残留问题
6.1 残留问题
- FTP相关知识的学习整理
- 5.4中5.4 ftp: bind: Address already in use的原因分析
- 5.3中227 Entering Passive Mode原因分析
- 想办法限制匿名用户在share文件夹里面的删除操作
6.2 总结反思
这是我第一次以笔记的形式记下我搭建FTP服务器和处理FTP服务器相关问题。因为是一个小白,所以其中还有许多错误需要更改,希望大家批评指正。同时发现问题并解决的部分是我自己搭建过程中遇到的问题,参考了其他大佬的解决方案,但是忘了记下他们的来源,这里一并向他们表示感谢,下次一定记录来源。