FTP
1. 尝试在redhat 上搭建一个服务器:
yum install vsftpd
vim /etc/vsftpd/vsftpd.conf
service vsftpd start
adduser -gftp -s /sbin/nologin vivi
2. FTP 流程:
从另一条linux ftp 到 自己搭建的server, 输入用户名密码登陆。抓包观察,
server->client Response 220 Welcom to xx ftp server.
client->server Request USER xxx
server->client Response 331 Please specify the password.
client->server Request PASS 1234
server->client Response 230 Login successful.
client->server Request : PORT
server->client Response: 200 Command okay.
从抓包可以看出,用户名和密码都是明文传送的,不安全。
PS PASS PORT USER 都是ftp的命令。
FTP有控制连接和数据连接。控制连接就是用上述命令来实现的。
数据连接就是用户请求数据的时候建立起来的。数据传送完毕就关闭此连接,但是控制连接一直都存在,知道用户发送QUIT命令请求退出的时候:
client->server Request: QUIT
server->client Response: 221 Goodbye.
3. ftp的两种模式:
PASV vs PORT (被动模式 vs 主动模式)
首先,所谓的“模式”是相对于ftp server来说的,所以
PASV 模式也就是说 ftp server是被动的,被动的等待 client来连接它!
PORT模式就是说 ftp server 主动的去连接client。
并且,都是指的数 据连接阶段是 “主动” 还是 “被动”。
大家都知道,ftp 使用21 端口 作为控制连接,使用 20 端口作为数据连接。实际上,21端口确实一直是用户和ftpserver建立控制连接的端口,但是
20 却不一定是 数据传输的端口。
只有在 PORT模式下(主动模式下),ftp server 才会主动使用自己的 20 端口去和 用户的另一个 协商好的端口 连接。
在PASV模式下,ftp server等待用户来连接自己的 数据连接的端口。 这个端口是敞开的,如果仍使用小端口,会存在安全隐患。所以,在 PASV模式下,ftp server 使用的是一个随机的 端口(一般为大端口) 而不是20 来与 用户建立数据连接。
具体意思,下图大概能表示出来:
PORT
/===============================================\
| |
| [ ftpClient ] [ftp Server ]
|
| (TCP:21 连接初始化,控制端口) |
| SYN |
| Port xxxx ----------------------> Port21 [TCP] |
| SYN+ACK |
| Port xxxx <---------------------- Port21 |
| ACK |
| Port xxxx ----------------------> Port21 |
| |
| (控制操作: 用户列目录或传输文件) |
| |
| Port, IP, Port yyyy |
| Port xxxx <---------------------- Port21 |
| Port Seccussful |
| Port xxxx <---------------------- Port21 |
| List, Retr or |
| Port xxxx ----------------------> Port21 |
| (TCP:20 连接初始化,数据端口) |
| SYN |
| Port yyyy <---------------------- Port20 |
SYN+ACK |
| Port yyyy ----------------------> Port20 |
| ACK |
| Port yyyy <---------------------- Port20 |
| |
| |
| (数据操作: 数据传输) |
| Data + ACK |
| Port yyyy <---------------------> Port 20 |
| . |
| |
\===========================================/
/================================================\ PASV
| |
| [ ftp Client ] [ ftp Server ] |
| |
| (TCP:21 连接初始化,控制端口) |
| SYN |
| Port xxxx ----------------------> Port 21 [TCP] |
| SYN+ACK |
| Port xxxx <---------------------- Port 21 |
| ACK |
| Port xxxx ----------------------> Port 21 |
| |
| (PASV操作: 被动连接数据端口初始化) |
| |
| PASV |
| Port xxxx ----------------------> Port 21 |
| PASV OK, IP, Port yyyy |
| Port xxxx <---------------------- Port 21 |
| SYN |
| Port zzzz ----------------------> Port yyyy |
| SYN+ACK |
| Port zzzz <---------------------- Port yyyy |
| ACK |
| Port zzzz ----------------------> Port yyyy |
| |
| |
| (数据操作: 数据传输) |
| List, Retr or Stor |
| Port xxxx ----------------------> Port 21 |
| Data + ACK |
| Port zzzz <---------------------> Port yyyy |
| . |
| . |
| . |
| |
\=================================================/
4. ftp 协议~
1. ftp://ftp.pku.edu.cn
用户访问这个网址的时候,像IP一样,需要一个DNS解析的过程,将这个域名解析为IP地址。
HTTP 报文头中会有一个 URL 位,所以根据HTTP报文,我们可以得到用户请求访问的域名。
但是 ftp 报文简单,用户发起请求的时候,user 这端自己去解析DNS-》ip,后续对ftp抓包显示
报文就得不到这个域名了。(实际上抓包显示ftp报文,确实很简单,只有几个简单的命令)
2. 在browser 中直接输入 ftp://ftp.pku.edu.cn , ftp协议是在http协议之上的--》ftp over http
ftp有很多类似工具,在此工具里打开 ftp://ftp.pku.edu.cn 的话,就是pure 的ftp