1.FTP的连接类型
控制连接(持续连接) -> TCP21(命令信道) -> 用户收发FTP命令
数据连接(按需连接) -> TCP20(数据信道) -> 用于上传下载数据
2.FTP的工作模式
ftp模式分为主动模式(active mode)和被动模式(passive mode),ftp是tcp连接,所以要进行三次握手。
1.1active和passive模式的配置:
在命令行输入vim /etc/vsftpd/vsftpd.conf:
-
active mode:
pasv_enable=NO (passive模式关闭)pasv_min_port=3000pasv_max_port=4000port_enable=YES (active模式开启)connect_from_port_20=YES (即默认情况下,FTP PORT主动模式进行数据传输时使用20端口(ftp-data)。YES使用,NO不使用。)
-
passive mode:
pasv_enable=YESpasv_min_port=30000 pasv_max_port=40000设定在PASV模式下,建立数据传输所可以使用port范围的下界和上界,0 表示任意(1024 – 65535端口)。默认值为0。把端口范围设在比较高的一段范围内,比如30000 -40000。
在linux上,如果不配置pasv_enable=NO,默认是passive模式。(以前在镇江农商行,遇到文件传输过不去的问题,后来才发现为被动模式,但配置的为NO,改成YES即可。
-
service vsftpd restart 重启ftp服务;
-
通过命令行连接ftp server:
-
active mode: ftp -A 192.168.180.106
active模式连接ftp server时一定要加 -A
passive mode: 可以直接使用 ftp 192.168.180.106
1.2 active 模式:
在active模式下,如下图抓的包中,在命令连接部分(ftp类型的包),client端使用的端口是36439,这个端口是大于1024的任意端口,ftp server端用的端口是21:
如下图,在active模式下,要传输数据时,ftp client通过第23个包通过21号端口告诉server数据传输联系端口43187(大于1024的任意端口),并进行listen,server端用端口20主动和client端43187建立数据传输通道,并传输数据(第30,32,34个包)。这里是server知道了client端的数据通道监听端口后,主动建立了数据传输通道,所以是主动模式。
在active模式下,数据传输部分(FTP-DATA类型的包),ftp-server端用的端口是20,默认情况下,FTP PORT主动模式进行数据传输时使用20端口,ftp-client端用的是43187端口,是上一步client发给server的数据传输监听端口。
总结:active 模式
1.3 passive 模式:
在passive 模式下,如下图所抓的包中,在命令部分(ftp类型的包),client端使用的端口是36434,这个端口是大于1024的任意端口,ftp server用的端口是21.
在passive模式下,如下图的第28个包,是由client端发起PASV(passive mode)的数据传输通道连接请求,所以为被动模式。
而在passive模式的数据传输部分(FTP-DATA类型的包),ftp-server端用的端口是3542,这个端口是在/etc/vsftpd/vsftpd.conf文件中passive模式下设置的端口范围(3000-4000,可以自己设置)中任意选的一个端口,ftp-client端用的是53001端口,是大于1024的任意一个端口。
总结:
passive模式
3.FTP的传输模式
Binary模式: 不对数据进行任何处理,适合进行可执行文件、压缩文件、图片等。
ASCII模式:进行文本传输时,自动适应目标操作系统的结束符,如回车符等
LINUX的红帽发行版中VSFTP默认采用的是Binary模式,这样能保证绝大多数文件传输后能正常使用
切换方式:
4.FTP的安装
1 [root@localhost etc]# yum -y install vsftpd ftp 2 已加载插件:fastestmirror, langpacks 3 Loading mirror speeds from cached hostfile 4 epel/x86_64/metalink | 6.7 kB 00:00:00 5 * base: mirrors.zju.edu.cn 6 * epel: my.fedora.ipserverone.com 7 * extras: mirrors.163.com 8 * updates: mirrors.163.com 9 [root@localhost etc]# service vsftpd start 10 Redirecting to /bin/systemctl start vsftpd.service 11 [root@localhost etc]# netstat -antp 12 Active Internet connections (servers and established) 13 Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name 14 tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd 15 tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN 7421/X 16 tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 7737/dnsmasq 17 tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 7099/sshd 18 tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 7100/cupsd 19 tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 7360/master 20 tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN 18303/sshd: root@pt 21 tcp 0 0 192.168.180.106:22 192.168.180.1:51721 ESTABLISHED 18303/sshd: root@pt 22 tcp 0 0 192.168.180.106:22 192.168.180.1:51729 ESTABLISHED 18312/sshd: root@no 23 tcp6 0 0 :::111 :::* LISTEN 1/systemd 24 tcp6 0 0 :::6000 :::* LISTEN 7421/X 25 tcp6 0 0 :::21 :::* LISTEN 25188/vsftpd 26 tcp6 0 0 :::22 :::* LISTEN 7099/sshd 27 tcp6 0 0 ::1:631 :::* LISTEN 7100/cupsd 28 tcp6 0 0 ::1:25 :::* LISTEN 7360/master 29 tcp6 0 0 ::1:6010 :::* LISTEN 18303/sshd: root@pt
FTP的使用可以使用?查询所有命令
1 [root@localhost etc]# cd /var/ftp 2 [root@localhost ftp]# ls 3 pub 4 [root@localhost ftp]# touch test.txt 5 [root@localhost ftp]# cd 6 [root@localhost ~]# ftp 192.168.180.106 7 Connected to 192.168.180.106 (192.168.180.106). 8 220 (vsFTPd 3.0.2) 9 Name (192.168.180.106:root): ftp 10 331 Please specify the password. 11 Password: 12 230 Login successful. 13 Remote system type is UNIX. 14 Using binary mode to transfer files. 15 ftp> ? 16 Commands may be abbreviated. Commands are: 17 18 ! debug mdir sendport site 19 $ dir mget put size 20 account disconnect mkdir pwd status 21 append exit mls quit struct 22 ascii form mode quote system 23 bell get modtime recv sunique 24 binary glob mput reget tenex 25 bye hash newer rstatus tick 26 case help nmap rhelp trace 27 cd idle nlist rename type 28 cdup image ntrans reset user 29 chmod lcd open restart umask 30 close ls prompt rmdir verbose 31 cr macdef passive runique ? 32 delete mdelete proxy send 33 ftp> 34
5.匿名用户登录
注:关闭防火墙和SELINUX
anonymous_enable=YES #启用匿名访问 anon_umask=022 #匿名用户上传文件的权限掩码(755,644) anon_root=/var/ftp #FTP的根目录anon_upload_enable=YES #允许上传文件 anon_mkdir_write_enable=YES #允许创建目录anon_other_write_enable=YES #开放其他写入权anon_max_rate=0 #限制最大传输速率(0为不限速)
注:在客户端登录后,默认情况下可以下载,不能上传
FTP服务器端
FTP客户端
-
实现上传
anonymous_enable=YES #启用匿名访问 需要FTP服务器端的上传目录要有足够的权限(演示:第一次权限不足,第二次可以)
-
实现创建目录和文件其他操作
anon_mkdir_write_enable=YES #允许创建目录anon_other_write_enable=YES #开放其他写入权
-
-
实现文件下载
anon_umask=022 #匿名用户上传文件的权限掩码(755) 添加以后,就可以get了,拥有了r权限。
6.本地用户登录 (现在项目用的这种)
local_enable=YES #是否启用本地系统用户local_umask=022 #本地用户所上传文件的权限掩码(新建的目录 权限是755 ,文件的权限是 644)local_root=/var/ftp #设置本地用户的FTP根目录chroot_local_user=YES #是否将用户禁锢在主目录local_max_rate=0 #限制最大传输速率userlist_enable=YES&userlist_deny=YES #禁止/etc/vsftpd/user_list 文件中出现的用户名登录ftpuserlist_enable=YES&userlist_deny=NO#仅允许/etc/vsftpd/user_list 文件中出现的用户名登录ftp配置文件:ftpusers#禁止/etc/vsftpd/user_list 文件中出现的用户名登录ftp,权限比User_list更高,及时生效
-
创建的用户,不需要登录操作系统,仅用来登录VSFTP
[root@localhost ~]# useradd -s /sbin/nologin ftpuser[root@localhost ~]# passwd ftpuser更改用户 ftpuser 的密码 。新的 密码:无效的密码: 密码少于 8 个字符重新输入新的 密码:passwd:所有的身份验证令牌已经成功更新。[root@localhost ~]
创建的时候,如果想限制用户的家目录,可以这样创建
useradd -d /tz/ftp -s /sbin/nologin dhftpuser
-
将所有的用户禁锢在自己的家目录下(即不能随意切换路径)
chroot_local_user=YES
-
-
将部分用户禁锢在自己的家目录下
chroot_list_enable=YESchroot_list=file=/etc/vsftpd/chroot_list
注:白名单使用的前提,要把chroot_local_user=YES开启,测了几遍发现这个问题
-
配置文件:/etc/vsftpd/ftpusers
所有写入此文件内的用户名都不允许登录ftp,立即生效
-
修改被动模式数据传输使用端口
pasv_enable=YESpasv_min_port=30000pasv_max_port=35000
1 [root@localhost vsftpd]# vim vsftpd.user 2 #奇数行为用户,偶数行为密码 3 [root@localhost vsftpd]# db_load -T -t hash -f vsftpd.user vsftpd.db 4 #将用户密码的存放文本转化数据库类型,并使用hash加密 5 [root@localhost vsftpd]# ll 6 total 40 7 -rw-r--r-- 1 root root 13 May 26 01:03 chroot_list 8 -rw------- 1 root root 125 Mar 22 2017 ftpusers 9 -rw------- 1 root root 361 Mar 22 2017 user_list 10 -rw------- 1 root root 4638 May 26 01:09 vsftpd.conf 11 -rwxr--r-- 1 root root 338 Mar 22 2017 vsftpd_conf_migrate.sh 12 -rw-r--r-- 1 root root 12288 May 26 01:37 vsftpd.db 13 -rw-r--r-- 1 root root 33 May 26 01:36 vsftpd.user 14 [root@localhost vsftpd]# chmod 600 vsftpd.db 15 #修改文件权限为600,保证其安全性 16 [root@localhost wgr]# useradd -d /wgr/tz -s /sbin/nologin tzftpuser 17 #创建用户作为ftp的虚拟用户的映射用户 18 /wgr/tz这里的路径不要建,创建用户的时候会自己产生 19 20 [root@localhost wgr]# vim /etc/pam.d/vsftpd.pam 21 添加下面的内容 22 auth required pam_userdb.so db=/etc/vsftpd/vsftpd 23 account required pam_userdb.so db=/etc/vsftpd/vsftpd 24 修改 25 pam_service_name=vsftpd.pam 26 添加 27 guest_enable=YES 28 guest_username=tzftpuser 29 user_config_dir=/etc/vsftpd/dir
注:做虚拟用户配置文件设置时,将主配置文件中的自定义的匿名用户相关设置注释掉
anon_upload_enable=YES #允许上传文件 anon_mkdir_write_enable=YES #允许创建目录 anon_other_write_enable=YES #开放其他写入权
给3个配置文件赋予权限
a1: anon_upload_enable=YES #允许上传文件 a2: anon_mkdir_write_enable=YES #允许创建目录 a3: anon_upload_enable=YES #允许上传文件 anon_other_write_enable=YES #开放其他写入权
1 #创建dir目录,并给3个用户赋予不同的权限 2 [root@localhost dir]# ll 3 总用量 12 4 -rw-r--r--. 1 root root 23 5月 26 17:15 a1 5 -rw-r--r--. 1 root root 28 5月 26 17:15 a2 6 -rw-r--r--. 1 root root 50 5月 26 17:16 a3 7 [root@localhost dir]# 8 [root@localhost dir]# ls -ld /wgr/tz/ 9 drwx------. 3 tzftpuser tzftpuser 78 5月 26 17:08 /wgr/tz/ 10 # 注:要给映射用户的家目录 设置 O+r 让虚拟用户有读权限 11 [root@localhost dir]# chmod o+r /wgr/tz 12 [root@localhost dir]# ls -ld /wgr/tz/ 13 drwx---r--. 3 tzftpuser tzftpuser 78 5月 26 17:08 /wgr/tz/ 14 [root@localhost dir]#
8.OPENSSL+VSFTPD
[root@localhost ~]# tcpdump -i eth1 -nn -X -vv port 21 and ip host 192.168.88.1 -i #interface:指定tcpdump需要监听的接口 -n #对地址以数字方式显式,否则显式为主机名 -nn #除了—n的作用外,还把端口显示为数值,否则显示端口服务名 -X #输出包的头部数据,会以16进制和ASCII两种方式同时输出 -vv #产生更详细的输出 tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 65535 byte ^Z [1]+ Stopped tcpdump -i eth1 -nn -X -vv port 21 and ip host 192.168.88.1 # 查看是否安装了spenssl [root@localhost ~]# rpm -q opensll openssl-1.0.1e-57.el6.x86_64 # 查看vsftpd 是否支持spenssl [root@localhost ~]# ldd /usr/sbin/vsftpd | grep libssl libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f099d72f000) [root@localhost ~]# # 建立服务器私钥,生成RSA密钥 [root@localhost certs]# openssl genrsa -out vsftpd.key 2048 Generating RSA private key, 2048 bit long modulus .........+++ .......................................+++ e is 65537 (0x10001) [root@localhost certs]# ll total 1900 -rw-r--r--. 1 root root 885944 Nov 1 2016 ca-bundle.crt -rw-r--r--. 1 root root 1039370 Nov 1 2016 ca-bundle.trust.crt -rwxr-xr-x. 1 root root 610 Mar 22 2017 make-dummy-cert -rw-r--r--. 1 root root 2242 Mar 22 2017 Makefile -rwxr-xr-x. 1 root root 829 Mar 22 2017 renew-dummy-cert -rw-r--r-- 1 root root 1679 Jun 2 02:26 vsftpd.key [root@localhost certs]# #需要依次输入国家、地区、城市、组织等信息 [root@localhost certs]# openssl req -new -key vsftpd.key -out vsftpd.csr You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:JS Locality Name (eg, city) [Default City]:JS Organization Name (eg, company) [Default Company Ltd]:TZ Organizational Unit Name (eg, section) []:JJFA Common Name (eg, your name or your server's hostname) []:WGR Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: [root@localhost certs]# # 使用CA服务器签发证书,设置证书的有效期等信息 [root@localhost certs]# openssl x509 -req -days 365 -sha256 -in vsftpd.csr -signkey vsftpd.key -out vsftpd.crt Signature ok subject=/C=CN/ST=JS/L=JS/O=TZ/OU=JJFA/CN=WGR Getting Private key [root@localhost certs]# [root@localhost certs]# chmod 500 . [root@localhost certs]# ls -ld . dr-x------. 2 root root 4096 Jun 2 02:31 . [root@localhost certs]# #生成完秘钥和证书文件后,将本目录的权限修改500 #在生产环境后必须要在https证书厂商注册
接下来