Linux下ftp服务搭建之小试牛刀
之前分享了ftp实现原理,但没有在linux下搭建过ftp server。最近有个迫切需求:在linux中下载有些安装包较慢,所以想将电脑下载的安装包通过ftp方式传到虚机内部!催生了此次实践:在Ubuntu操作系统虚机中安装一个ftp服务(client和server)。
你可以学到四点:0) ftp的安装;1) ftp各个使用场景;2) ftp各个场景的配置;3) 对ftp协议更加清楚。
ftp版本安装及安装后检查
安装部分可以参考之前一篇文章Ubuntu下安装源设置和服务安装命令apt-get以及apt安装版本检查
1. 先获取apt-get的安装源:
Ubuntu安装源apt-get方法2. 然后安装sftp版本:
Ubuntu下apt-get安装服务3. 安装后,ftp版本检查:
apt list | grep vsftp
检查ftp版本号4. 安装后,ftp服务/进程和端口检查:
ftp服务/进程/端口检查通过查看ftp服务或进程可以找到ftp服务的主程序目录/usr/sbin/vsftpd,ftp主配置文件/etc/vsftpd.conf。启动脚本的目录为/etc/init.d/vsftpd。
主配置文件/etc/vsftpd.conf默认配置如图
vsftpd.conf默认配置可从配置文件中获取到如下信息依次是:ftp服务默认不监听IP V4,监听的是IP V6,不允许匿名登录,允许本地用户登录, 切换目录时显示目录下.message的内容,用户使用本地时间,允许ftp日志打印,默认控制连接端口为21,主动方式下数据连接时ftp服务端的端口为20,ssl加密不开启即ftp非sftp。
ftp常用的场景
根据一个主机上的ftp服务个数,ftp常用的场景大致分为单个ftp服务和多个ftp服务。根据是否加密又分为ftp和sftp。场景列表如下:
1. ftp服务:默认21控制连接端口配置,主动模式下服务端的数据连接端口固定为20,被动模式下数据连接端口由协议栈随机分配端口范围,只有下载权限
2. ftp服务:控制连接端口改为10021,主动模式下服务端的数据连接端口不为20由协议栈随机分配端口,被动模式下服务端的数据连接端口由ftp程序随机分配端口范围,有写权限(创建目录文件和上传文件)
3. sftp服务:控制连接端口改为10022,主动模式下服务端的数据连接端口为10020,被动模式下服务端的数据连接端口由ftp程序随机分配端口范围,有读写权限,最多有几个客户端同时连接,同一个ip允许多少个连接。
4. 一个主机上运行多个ftp应用
单个ftp服务的参数配置
通用处理:修改完vsftpd.conf,需要重启ftp服务,使配置生效。
1. 场景1的ftp主配置文件,如图:
场景1的配置文件ftp服务监听IP V4,不允许匿名登录,允许本地用户登录, 不配置则默认控制连接端口为21,主动方式下ftp服务端进行数据连接时端口为20,ssl加密不开启即ftp非sftp,默认不配置pasv_enable=YES开启被动模式。
1) chroot_local_user=yes #限制所有用户都在家目录
2) chroot_list_enable=YES #调用限制在家目录的用户名单
3) chroot_list_file=/etc/vsftpd/chroot_list #限制在家目录的用户名单所在路径
注释:2)和3)配置时,vsftpd.chroot_list文件中用户限制在自己目录(一个账户写一行)
1) 2)和3)配置时所有的ftp用户都限制在自己的目录,vsftpd.chroot_list文件中用户反而不受限制在自己目录,FAQ1中限制自己目录的用户不具有可写权限。
4) xferlog_enable=YES #激活上传/下载日志
5)xferlog_file=/var/log/vsftpd.log#日志路径
6)xferlog_std_format=YES #标准日志格式
7) connect_from_port_20=YES #主动方式数据连接ftp客户端时ftp服务端的端口
8) data_connection_timeout=120 #数据连接空闲超时,单位秒
9) write_enable=YES #本地用户的写权限
10) local_umask=022 #FTP的本地文件权限(文件所有者有可写权限),可读r=4, 可写w=2, 可执行x=1,三个组依次为文件所有者/文件所属组/其他的权限。
创建用户组和用户
groupadd ftpuser #创建用户组ftpuser
mkdir /home/remote1
useradd -g ftpuser remote1 #将用户remote1加到用户组ftpuser
passwd remote1 #设置用户remote1
# 输入新密码
vi /etc/passwd #文件中在remote1用户记录行添加/sbin/nologin
remote1:x:1001:1001::/home/remote1:/sbin/nologin
vi /etc/shells #在最末尾添加一行
/sbin/nologin
chown -R remote1:ftpuser /home/remote1 #设置ftp目录的文件所有者和文件所属组
chmod 500 /home/remote1 #设置ftp目录所有者的可读可执行权限,见FAQ1。
ftp登录简单测试
ftp登录输入用户名和密码,下载文件成功(可读权限)但上传创建文件失败(可写权限)!只能到限制的目录内。
ftp登录测试设置ftp客户端为被动模式,然后登录ftp,查看报文,控制连接服务端端口21,进入pasv被动模式并告知客户端:服务端数据连接的端口为61120
被动模式下报文设置ftp客户端主被动模式,然后登录ftp,查看报文,控制连接服务端端口21(抓包时端口改为10021),port告知告知服务端:客户端的数据连接端口56717,服务端用20端口进行数据连接客户端
主动模式下报文2. 场景2的ftp主配置文件,如图:
场景2的配置文件1) connect_from_port_20=NO #FTP PORT主动模式数据传输时不使用20端口。
2) listen_port=10021 #控制连接服务端端口
3) pasv_enable=YES # 开启被动模式
4) pasv_min_port=5000#被动模式服务端数据连接的最小端口
5) pasv_max_port=5005 #被动模式服务端数据连接的最大端口
6) chroot_local_user=NO #不限制所有用户都在自己的家目录
创建用户和用户组同场景1
设置ftp目录的文件所有者和文件所属组,设置ftp目录所有者的可读可写可执行权限。
设置ftp目录属性ftp登录简单测试
ftp登录输入用户名和密码,下载文件成功(可读权限)和上传创建文件成功(可写权限)!并没有限制在自己的目录内。
场景2 ftp可读可写权限测试设置ftp客户端为被动模式,然后登录ftp,查看报文,控制连接服务端端口10021,进入pasv被动模式并告知客户端:服务端数据连接的端口为50004(在指定范围内)
场景2被动模式设置ftp客户端主被动模式,然后登录ftp,查看报文,控制连接服务端端口10021,port告知告知服务端:客户端的数据连接端口56717,服务端没有用20端口进行数据连接客户端。
FAQ篇
FAQ1:场景1若chmod 700 /home/remote1,报错“500 OOPS: vsftpd: refusing to run with writable root inside chroot ()”
从2.3.5之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报该错误。
解决方法1: 命令chmod a-w /home/remote1 去除用户主目录的写权限。
方法2:在vsftpd的配置文件中增加下列两项中的一项:allow_writeable_chroot=YES
FAQ2: 场景2主动模式下ftp服务端主动连接ftp客户端失败,Windows主机的防火墙将相应端口屏蔽
解决方法:在Windows下将ftp客户端程序允许通过Windows防火墙进行通信。
允许ftp客户端通过防火墙本期实践了ftp两个场景的配置和测试,收获颇丰!你有收获嘛?
纸上得来终觉浅,觉知此事要躬行!
要知sftp各个场景如何搭建和主机上同时运行多个ftp应用,请下两回分享!
sftp服务搭建涉及几个问题:sftp如何加密配置的,ftp客户端和服务端如何安全交互。
多个ftp运行涉及几个问题:ftp软件安装几次,ftp进程目录修改,ftp参数配置。
参考资料: