ftp-安装,原理,配置
本网站相关文章:
- 远程自动化工具
- ssh 基本安装和配置
- ssh 隧道转发功能以及应用
- ssh 代理转发介绍及应用场景
- ssh 代理中使用 https 以及二级代理的介绍
- ssh 数字证书生成以及 https 原理介绍
- ftp 安装,原理,配置
- ssh 远程执行命令和 bash 工作模式
What is ftp?
ftp
FTP(File Transfer Portocol)文本传输协议, 用于在网络上进行文件传输
的一套标准协议, 使用 C/S 模式, 处于 TCP/IP 五层协议的应用层.注意, FTP 关注于文件传送
, 而其他如 NFS 则关注于文件访问
.
工作模式
FTP 有两种模式用于实现 C/S 之间的通信和文件传输, 分别为:
- 主动模式(PORT): 客户端为控制流发起端, 服务器为数据流发起端,
同时打开并监听一个端口
- 被动模式(Passive): 客户端为控制流和数据流的发起端, 服务器仅创建一个监控
随机端口
的进程
主动模式: , 被动模式:
为何提出被动模式
?
在主动模式中存在一个 BUG, 其中 Server 需要主动连接
客户端随机端口, 一般而言 C/S 之间存在防火墙,此时服务器主动连接客户端的某一个端口需要Client
进行额外的配置, 这样不符合一个产品的易用性.所以提出了被动
模式, 在 Server 限定可以随机连接的端口范围, 生成随机端口并告知 Client, 由 Client 连接随机端口, Server被动
被连接, 开始数据流.
目标和缺点
FTP 在提出时希望实现的目的:
- 文件(程序, 数据)的共享
- 鼓励间接/隐式的使用远程计算机
- 向用户屏蔽不同主机中各种文件存储系统(File system)的细节
- 可靠和高效的传输数据
当然, 万事并非十全十美, 由于使用场景以及设计框架的局限性, FTP 在安全性以及小文件传输方面有一定的不足之处:
- 密码和文件内容都是明文传输, 不安全
- 控制流和数据流的分离, 控制流闲置过长可能被置为
超时
, 大量数据的传输可能会发生错误 - 在传输数量极多的小文件时, 性能不佳
What is vsftp?
Introduction
vsftp–Very Secure FTP Daemon, 一个为类 UNIX 系统开发的轻量, 安全, 稳定的 FTP服务器端
, 注意,它是 FTP 的服务器端, 并不包括 Client.
vsftp 功能:
- 使用 SSH/TLS 来保护 FTP
- 使用 Standalone or inetd 两种工作方式
- 限制用户登录, 限制连接数, 限制 chroot
- 允许上传, 本地用户登录, 匿名用户登录
- 限制传输带宽
- 支持 IPV6
- 支持虚拟用户, 虚拟路径
其中 vsftp 的性能可以参考官网: vsftp performance
Working
vsftp 有两种启动以及工作方式:
- standalone–独立守护进程工作方式
- xinetd–系统守护进程方式
其中standalone
一次启动, 并一直驻留在内存中, 不断的监听数据流和控制流
端口, 其优点:
- 快速的响应命令以及数据
- 适合大量访问的 FTP 服务器
- 便于 PAM 验证
相比standalone
高并发但是耗费系统大量资源, inetd
工作方式下的 ftp 仅仅在外部连接
请求到达时才会启动 FTP 进程, 所以不适合于大量连接
的应用场景. 类似某一个工作岗位, 在客流量很小的时候常常招聘兼职人员
, 相反则必须招聘专业全职人员
.
Install
Ubuntu
Standalone
1 | # 安装 |
配置文件所在地: /etc/vsftpd.conf
该文件中记录了 ftp 启动日志所在地以及其他关键信息匿名用户根路径: /srv/ftp
Xinetd Daemon
Super Daemon 方式
- 编辑 vsftpd.conf, 设置:
listen=NO
- 安装 xinetd:
sudo apt-get install xinetd
- 配置 xinetd, 编辑
/etc/xinetd.conf
文件 - 启动 xinetd 服务或者重启
其中 xinetd.conf 配置:
1 | service ftp |
重启:
1 | # 先关闭standalone |
查看进程是否启动: sudo netstat -npltu | grep 21
Mac
Mac 安装 vsftp 命令:
1 | # 安装 |
配置文件所在地: /usr/local/etc/vsftpd.conf
Configure vsftp?
通用配置
1 | # StandAlone模式就是该服务拥有自己的守护进程支持 |
匿名配置
1 | # 匿名访问 开启 |
其中对于匿名用户的权限配置:
- 匿名用户根路径:
/srv/ftp
- 匿名用户根目录权限: 不允许写
- 对于上传文件, 须创建单独的目录,
sudo chmod -R 777 /srv/ftp/upload
Chroot 配置
功能: 限制登录用户访问其他目录, 在登录之后当前用户根目录变为/
1 | # 限制所有用户 |
真实用户
对于真实用户登录 FTP 服务器, 此时需要先创建用户, 之后才能登录:
1 | # 在服务器上创建 |
配置:
1 | user_sub_token=$USER |
虚拟用户
虚拟用户的使用场景, 对于如下目录结构:
1 | /home/vsftpd/ |
希望创建 3 个虚拟用户: db1, db2, db3
分别对上述三个目录进行相应权限设置.
a) 设置虚拟用户数据库
文件内容格式 loguser.txt:
1 | user_id |
创建的文件内容如下:
1 | bamboo-read |
生成数据库
1 | sudo apt-get install db-util |
配置 PAM, /etc/pam.d/vsftpd
配置:
1 | auth sufficient pam_userdb.so db=/etc/vsftpd_login |
/etc/vsftpd.conf
更改配置: pam_service_name=vsftpd
b) 虚拟用户创建相应的目录:
1 | # 创建目录 |
c) 虚拟用户配置:
1 | # 只读配置bamboo-read |
其他配置
生成私钥
1 | sudo openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem |
软链接目录
ftp 服务器不支持软链接目录, 如果需要支持外接目录, 可以使用 mount 挂在另外一个目录, 该 mount 目录对于 vsftpd 而言是一个正常文件系统目录, 可以被 vsftp 正常使用.
1 | # 其中/opt/need_link_dir为待挂载目录, /data/ftp_dir为FTP中的目录 |
访问拒绝
在 ftp 服务器搭建完成, 在服务器本机上可以通过命令ftp -p ip1
可以正常访问, 但是通过其他机器时报错refused
, 基本上都是因为防火墙的问题, 需要通过防火墙开启 21/22 端口, 例如ubuntu 20.04
环境:
1 | # 1. ufw查看, 此时已经设置了ftp相关端口, 但仍然无法使用ftp |
Ftp Client
- FileZilla 客户端, 具有较为完善的客户端功能, 并且相比客户端更为稳定, 同时具备 Unix/Window 版本.
注意, 如果需要在 FileZilla 使用匿名用户, 必须选择登录类型为正常
, 输入anonymous
即可. - Mac Findler, Mac 下: 前往–>服务器–>ftp:username@hostname
PS: 在 MAC 之间使用 AirDrop 是最为方便快捷的传输方式, 当然, 限于局域网 - 命令行: 使用各种命令进行
控制流
操作, 从而传输数据
Example
Simple Anonymous in Mac
在 Mac 下配置一个简单的 vsftpd 服务器, 尽可能不变动原有的配置文件, 支持匿名用户
- chroot directory 目录, 默认
/usr/share/empty
- 增加其他配置, 如是否可写, PAM 服务支持虚拟用户等
- 重启 vsftpd 服务
- 通过
ftp 127.0.0.1
命令, 匿名用户anonmouse
来登录 ftp
新增配置
1 | pam_service_name=ftpd |
整个过程非常简单, 没有配置额外的用户, 仅仅支持匿名用户的下载操作.
Simple Anonymous in Ubuntu
在 ubuntu 上安装 vsftpd 之后, 会默认创建ftp
用户, 相应的用户主目录以及配置如下/etc/passwd
:
1 | ftp:x:112:119:ftp daemon,,,:/srv/ftp:/bin/false |
其中 ftp 用户默认就是匿名用户
, 故 FTP 开启匿名登录之后, 主目录就是/srv/ftp
. 新增或者更改
配置:
1 | # 开启匿名登录 |
在/srv/ftp
根目录下创建上传和下载目录, 因为根目录不允许进行写操作:
1 | cd /srv/ftp & mkdir upload & mkdir download |
重启 vsftpd 服务: service vsftpd restart
这里稍微介绍一下 umask 的计算公式, 其中默认情况下目录权限–777, 文件–666, 此时如果 umask 和
创建的目录或者文件关系:
umask 值 | 创建文件权限 | 创建目录权限 |
---|---|---|
022 | rw-rw-rw- -> rw-r–r– == 644 | rwxrwxrwx -> rwxr-xr-x =755 |
033 | rw-rw-rw- -> rw-r–r– == 644 | rwxrwxrwx -> rwxr–r– =744 |
055 | rw-rw-rw- -> rw–w–w- == 622 | rwxrwxrwx -> rwx-w–w- =722 |
注意, 需要转为二进制之后, 进行相应运算: binary(666) & ~(binary(umask))