背景
操作系统:centos 7
server(A1):
服务器搭建了vsftpd服务,服务的端口号:21,设置了一个操作系统用户ftp,客户端机器(B1)通过ftp用户访问服务器/home/ftp下的文件(具体如何搭建vsftpd服务请查看:
https://blog.csdn.net/qq_15760109/article/details/81224049
)
client(B1):B1机器是作为客户端(需要安装ftp客户端连接工具),通过ftp命令方式连接A1服务器
建立连接原理
前提:client(B1)机器可以ping
A1服务器,即网络需要通,要不A1是一个公网IP,要不A1与B1在同一个局域网
协议:TCP协议(3次握手成功)
1.B1机器通过ftp A1向A1机器发生连接请求
2.A1机器收到来自vsftpd 服务的本机21号端口发生的连接请求,请求的包中有B1机器的IP及端口号(假设:
52614)
3.B1收到来自A1的包告知A1,此次连接成功,即命令链路已经建立联系(A1:21-----B1:52614)
备注:表示202.96.184.162是作为server(A1),A1的21号端口与client(B1)的端口号52614建立命令连接,可以通信
数据传输方式
被动模式:
在A1与B1建立连接成功后,B1客户端输入passive命令,表示通过被动模式建立连接(此种方式建立连接需要A1在配置文件/etc/vsftpd/vsftpd.conf文件中设置允许被动模式连接pasv_enable=YES
),客户端(B1)通过52614端口向服务端(A1)的21端口发送passive命令,A1收到后立刻打开另外一个端口(随机假设31222),并通过之前建立的命令链路告知客户端(B1):当前我打开了一个随机端口号31222用来作为数据传输。客户端(B1)收到这条命令后向A1的31222端口发送:客户端B1也打开
一个随机端口号49256与A1建立数据链路进行传输。
实验验证:
如何找到服务端与客户端建立的命令链路端口及数据链路端口?
流程步骤:
1.A1服务器开启vsftpd服务(service vsftpd
start),不同操作系统启动服务的命令不一致,但总的原则是找到vsftpd命令既可以
2.在B1服务器上通过ftp A1(输入IP地址),根据提示输入用户名及密码
3.在A1服务器输入命令netstat -tunlp|grep
vsftpd,可以查看到21号端口被监听,vsftpd服务正常
服务端(A1)
4.B1服务器通过命令netstat -nap|grep
ftp查看B1服务器生成的随机端口与A1:21端口建立连接
客户端服务器(B1)
备注:A1:21与B1:52614建立了通信(命令链路),这里有个小细节:A1与B1使用netstat命令的参数不一样,如果在B1也使用tunlp参数查找不到B1的这条结果,原因是tunlp命令是查看所有监听的结果,而nap是所有监听的和没有监听的端口,详细请查看man
netstat)
5.验证数据链路是否有另外建立一条通信,需要再B1上建立成功后输入passive命令之后,下载一个大的文件(最好你可以监控到,不是一下就完了),然后在B1上再次输入netstat
-nap|grep ftp
6.B1服务器通过命令netstat -nap|grep
ftp查看B1服务器生成的随机端口与A1:21端口建立连接
备注:数据传输完成后建立的数据链路通信就会释放
个人理解的被动与主动:服务端A1接收到客户端的请求,被动的生成一个随机端口告知客户端与其建立数据链路通信;而主动模式是服务端之前已经默认一个端口号,客户端需要随机生成一个端口号与服务端默认的端口号建立数据链路通信。
在学习这之前我碰到如下错误:
1.成功搭建vsftpd之后,客户端连接时出现错误:
500 Illegal PORT command.
ftp: bind: Address already in use
了解了客户端连接服务端的连接模式才明白,原因在于客户端默认连接是主动模式(PORT),但是配置vsftpd.conf文件是我写入了pasv_enable=YES,使用被动模式连接,导致数据链路这条通信模式出错,并没有建立成功,这个时候只需输入:passive命令就可以,目前我是每次ftp命令进去后都输入passive,如何改成自动被动模式连接还不知道?
刚发现数据链路的端口由来:
数据链路是每输入一个命令建立数据链路通信进行数据传输,当命令结束,端口即释放