为什么telnet可以用来检查TCP端口是否正常?

Posted 夏主

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么telnet可以用来检查TCP端口是否正常?相关的知识,希望对你有一定的参考价值。

为什么Telnet可以用来检查TCP端口是否正常?
【问题背景】我们在日常的网络运维中,经常一种场景,实施了网络安全策略变更后,如何验证TCP端口已经可以正常经过防火墙访问了,只要Telnet该服务器的TCP端口就可以了。那么为什么是Telnet,其他不行吗?为什么tetnet可以检查TCP端口正常打开?为什么是TCP端口,UDP端口不行吗?
【结论】先看结论,节约时间。其实除了Telnet,其他使用TCP端口的应用也是可以的,只不过Telnet比较容易看到结果,多数服务器支持,使用方便。Telnet之所以可以检查TCP端口,是因为Telnet使用了TCP协议。为什么UDP不行,因为Telnet使用的是TCP端口,UDP可以使用NetCat等应用检查。
【解】
一、TCP和UDP的区别,TCP三次握手
        正常知识储备,哪哪都有,这里不再说了,上一个三次握手的图,好结合下面的内容看一下。
图片来自网络,侵删
二、TCP模块是如何处理包的
    这里主要说一下服务器端的TCP模块是如何处理包的,网卡接收到数据包,一顿操作之后给到IP模块,IP模块一顿操作之后给到TCP模块。我们假设现在是接收到第一个TCP包,控制位SYN=1,TCP模块会检查包的接收方端口号,并确认在该端口上有没有与接收方端口号相同的且正处于等待连接状态的套接字。嘿,这里就检查了端口是否开通了。如果不存在该套接字,则向客户端返回一个表示接收方端口不存在等待连接状态套接字的ICMP消息。
    如果存在等待连接的套接字,则为这个套接字复制一个新的副本,并将发送方IP地址、端口号、序号初始值、窗口大小等必要参数写入这个套接字中,同时分配用于发送缓冲区和接收缓冲区的内存空间。然后生成代表接收确认的ACK号,用于从服务器向客户端发送的序号初始值,表示接收缓冲区剩余容量的窗口大小,并用这些信息生成TCP头部,委托IP模块发送给客户端。
    这个包到达客户端之后,客户端会返回表示接收确认的ACK号,当这个ACK号返回服务器之后,连接就完成了。
    这个过程,跟用什么应用是没关系的。
三、抓包分析
在虚拟机中创建一个TCP 2233端口如下图
在本地Telnet该端口,可以连接成功,用浏览器也能打开
用ssh是不行的
服务器端可以看到连接后的端口状态变化
因为使用的是http应用,所以浏览器能打开是很正常的一个事情,但浏览器不一定能打开其他程序的TCP端口,我们看到ssh是失败的,抓包看一下TCP是否建立成功
如上图所示,当我们使用ssh登录服务器时,TCP的三次握手是正常建立的,也就是说,检查TCP端口是否能正常建立连接,用其他应用也可以,不一定要Telnet。那么为什么还要用Telnet,可能只是比较方便,就好像我们刚才使用了ssh,其实也是可以看得出来成不成功的返回是有差异的,只不过没那么直观。


四、为什么是Telnet
    我们使用Telnet的时候,比如启用的是web应用,Telnet也能进入可编辑端口。我们都知道,Telnet可以远程登录远端设备,默认使用TCP 23。这里涉及Telnet的工作原理,Telnet并不是一个单纯的本地应用,登录使用Telnet服务时需要在服务器端启用Telnet服务器软件,并监控TCP 23端口。客户端使用Telnet登录远程服务器时,先建立TCP连接,TCP连接建立成功之后,Telnet客户端并没有检查所连TCP是否存在Telnet服务器应用,而是进入等待输入的状态,正常情况下应该输入用户名及口令或者命令发送给远程服务端,服务器Telnet应用将相应命令执行猴返回回显信息。显然,我们只需要利用Telnet建立TCP连接的特性即可看出TCP连接是否建立成功。




以上是关于为什么telnet可以用来检查TCP端口是否正常?的主要内容,如果未能解决你的问题,请参考以下文章

Windows telnet用法是啥?

验证TCP端口连通性-telnet方法和telnet协议RFC854

为啥ssh可以连接telnet连不上

如何测试udp端口是不是正常?

linux用户程序不能显示在telnet

怎样测试某个端口是不是打开