ftp
FTP
FTP:文件传输协议,采用两个TCP连接来传输一个文件
- 控制连接以C/S方式建立,服务器以被动的方式打开21端口等待客户连接,客户以主动方式打开21,控制连接始终等待客户于服务器之间的通信,该连接将命令从客户传到服务器,并传回服务器的应答
当文件开始在客户和服务器之间传输时,创建一个数据连接(20),具体过程如下:
- 客户发出命令请求建立数据连接,连接在客户的控制下建立
- 客户在客户端上选择一个临时端口号,从该端口发布
- 客户通过控制连接把端口号发送给服务器
- 服务器在控制连接上接收端口信号,并向客户端上的端口发布一个主动的打开,服务器使用的数据连接端口为20
主动模式
但有时FTP服务器处在的环境不允许直接被外部的主机访问,这时需要采用被动模式,让FTP服务端去连接客户端。具体如下
- FTP客户端连接到FTP服务器21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,发送PASV命令到FTP服务器, 服务器在本地随机开放一个端口(1024以上),然后把开放的端口告诉客户端, 客户端再连接到服务器开放的端口进行数据传输
实验
匿名
修改配置文件后重启
vi /etc/vsftpd/vsftpd.conf anonymous_enable=YES
anon_umask=022
anon_upload_enable=Yes anon_mkdir_write_enable=Yes
anon_other_write_enable=Yes local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES
listen=NO
listen_ipv6=YES pam_service_name=vsftpd userlist_enable=YES
tcp_wrappers=YES
系统用户
修改配置文件后重启
vi /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES
listen=NO
listen_ipv6=YES pam_service_name=vsftpd userlist_enable=YES
tcp_wrappers=YES
在/etc/vsftpd/ftpuser /etc/vsftpd/user_list这两个文件中的用户被视为黑名单
虚拟用户
创建FTP用户数据库文件,奇数行用户名,偶数行密码,用db_load命令加密转换成数据库文件,删除明文信息文件
[root@server1 ~]# cd /etc/vsftpd/
[root@server1 vsftpd]# vi vuser.list
[root@server1 vsftpd]# db_load -T -t hash -f vuser.list vuser.db
[root@server1 vsftpd]# file vuser.db
vuser.db: Berkeley DB (Hash, version 9, native byte-order)
[root@server1 vsftpd]# chmod 600 vuser.db
rm -rf vuser.list
创建一个用作代理的本地用户
[root@server1 vsftpd]# useradd -d /var/ftproot -s /sbin/nologin virtual
[root@server1 vsftpd]# ls -ld /var/ftproot/
drwx------. 2 virtual virtual 62 1月 17 18:38 /var/ftproot/
chmod -Rf 777 /var/ftproot
建立一个用于虚拟用户认证的PAM文件
[root@server1 vsftpd]# vi /etc/pam.d/vsftpd.vu
auth required pam_userdb.so db=/etc/vsftpd/vuser account required pam_userdb.so db=/etc/vsftpd/vuser
修改配置文件,注意配置文件每行尾都不能有空格,不然会报错
[root@server1 vsftpd]# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
[root@server1 vsftpd]# vi /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
guest_enable=YES
guest_username=virtual
allow_writeable_chroot=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd.vu
userlist_enable=YES
tcp_wrappers=YES
[root@server1 vsftpd]# systemctl restart vsftpd
[root@server1 var]# ftp 192.168.226.148
Connected to 192.168.226.148 (192.168.226.148).
220 (vsFTPd 3.0.2)
Name (192.168.226.148:root): user1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
评论已关闭