核心点:
ftp server主动模式、被动模式的差别以及适用场景。
FTP协议有两种工作方式:PORT方式和PASV方式,中文意思为主动式和被动式。
(ftp server)主动模式:服务器向客户端敲门,然后客户端开门
(ftp server)被动模式:客户端向服务器敲门,然后服务器开门
所以,如果你是如果通过代理上网的话,就不能用主动模式,因为服务器敲的是上网代理服务器的门,而不是敲客户端的门 ;
而且有时候,客户端也不是轻易就开门的,因为有防火墙阻挡,除非客户端开放大于1024的高端端口
linux客户端开启主动被动:
>passive
Passive mode off.
windows ftp client:
quote PORT //主动模式
quote PASV //被动模式
centos:
yum install -y vsftpd //安装vsftpd 服务。
添加ftp用户:
#useradd -d /var/ftp/ -s /sbin/nologin ftp
#chsh -s $(command -v nologin) ftp //修改ftp 用户为不可登录用户
#chmod -R 755 /var/ftp/
#usermod -u 1001 ftp //修改ftp 用户的uid,gid
#groupmod -g 1001 ftp
#id ftp
-
vsftpd被动模式
比如用户是nat网络的情况下,vsftpd server就只能配置成被动模式,等待ftp client主动发起请求,与server建立连接。vsftpd服务的配置文件/etc/vsftpd/vsftpd.conf,被动模式配置:
anonymous_enable=NO
local_enable=YES
local_root=/var/ftp/third
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
pasv_promiscuous=YES
pasv_enable=YES
pasv_address=xx.xx.xx.xx //ecs的外网IP地址
pasv_min_port=9001
pasv_max_port=9010 //vsftpd被动模式下,数据连接的端口范围。
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
xferlog_std_format=YES
tcp_wrappers=YES
allow_writeable_chroot=YES
listen=YES
listen_ipv6=NO
pam_service_name=vsftpd
userlist_enable=YES
这需要ftp client在连接进来的时候,需要关闭被动模式,如下:
#ftp xx.xx.xx.xx (ftp server的公网ip)
Name: ftp
Password: XXX //输入ftp设置的对应密码。
ftp > passive
Passive mode off. //关闭被动模式
ftp > dir
在client端,开通如下如下防火墙策略:
-A INPUT -s 47.103.33.182 -p tcp -m tcp --dport 9001:9010 -j ACCEPT
-
vsftpd主动模式
这个适用于客户端是带外网ip的场景。
我们有个aliyun ecs,在分配机器的时候,分配的外网ip是nat模式,并没有分配虚拟网卡到主机上。导致vsftp server只能用主动模式,还要求ftp client必须是带外网IP的主机,支持主动模式。
配置如下:
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
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
allow_writeable_chroot=YES
local_root=/var/ftp/test
max_per_ip=0
anon_upload_enable=YES //允许用户上传文件。
上传文件脚本:
ftp -v -n xx.xx.xx.xx<<EOF
user [username] [passwd]
binary
passive
cd test
put x.txt
bye
EOF