Loading... 听到同事在聊,怎么探测对端的某个UDP端口?有的说用nc命令。我也插了一句这个测不准的。当然通过网上查找也是千篇一律的讲着nc命令介绍(对此,我很纳闷。`nc –help`介绍的不够详细吗,需要再写一遍放网上吗,是谁不会打几个字还是怎么的?)。 为什么我会第一反应是测不准的呢?我们都知道探测TCP端口我们都是用的telnet。TCP基于三次握手,握手成功那就判定端口通,相反则不通。那UDP呢?他没有三次握手,那又是基于什么来判断通和不通的呢?接下来往下看,一起来测试下。 # 实验测试 ## telnet测试 ### 正常情况 ```bash [root@client ~]# telnet 192.168.200.81 9100 Trying 192.168.200.81... Connected to 192.168.200.81. Escape character is '^]'. ^] telnet> quit Connection closed. [root@client ~]# ```  ### 禁用SYN回包 ```bash [root@server ~]# iptables -A OUTPUT -d 192.168.200.79/32 -p tcp -m tcp --tcp-flags ALL SYN,ACK -j DROP [root@client ~]# telnet 192.168.200.81 9100 Trying 192.168.200.81... telnet: connect to address 192.168.200.81: Connection timed out [root@client ~]# ```  丢弃SYN回包后,客户端的确无法建立连接。而且细心的可以发现,客户端SYN超时重传的时间间隔为1+2+4+8+16+32=63 秒。**客户端的 SYN 报文最大重传次数由 `tcp_syn_retries`内核参数控制,这个参数是可以自定义的,默认值一般是 5。每次超时的时间是上一次的 2 倍。** 参考的大佬[小林coding的博客](https://xiaolincoding.com/network/3_tcp/tcp_interview.html#%E7%AC%AC%E4%B8%80%E6%AC%A1%E6%8F%A1%E6%89%8B%E4%B8%A2%E5%A4%B1%E4%BA%86-%E4%BC%9A%E5%8F%91%E7%94%9F%E4%BB%80%E4%B9%88)。个人觉得他总结的很好,简单易懂。 ## nc测试 ### 正常情况 ```bash [root@server ~]# nc -lu 10000 #server开启UDP端口,只能使用一次。第二次连接会失败,需要重新执行该命令 [root@client ~]# nc -zvu 192.168.200.81 10000 #检测已开启的端口 Ncat: Version 7.50 ( https://nmap.org/ncat ) Ncat: Connected to 192.168.200.81:10000. Ncat: UDP packet sent successfully #显示发送成功 Ncat: 1 bytes sent, 0 bytes received in 2.01 seconds. [root@client ~]# nc -zvu 192.168.200.81 10001 #检测未开启的端口 Ncat: Version 7.50 ( https://nmap.org/ncat ) Ncat: Connected to 192.168.200.81:10001. Ncat: Connection refused. #显示连接拒绝 ```   UDP 1000端口正常连接,抓包只有一个数据包,UDP 1001端口连接拒绝。抓包有两个数据包,其中一个是ICMP回显包,TYPE3、CODE3。其他类型参考[百度百科](https://baike.baidu.com/item/ICMP/572452)。 nc启动的udp端口 ### 禁用ICMP回显 ```bash [root@server ~]# iptables -A OUTPUT -d 192.168.200.79/32 -p icmp -j DROP #禁止ICMP回显 [root@client ~]# nc -zvu 192.168.200.81 10000 Ncat: Version 7.50 ( https://nmap.org/ncat ) Ncat: Connected to 192.168.200.81:10000. Ncat: UDP packet sent successfully #显示发送成功 Ncat: 1 bytes sent, 0 bytes received in 2.02 seconds. [root@client ~]# nc -zvu 192.168.200.81 10001 Ncat: Version 7.50 ( https://nmap.org/ncat ) Ncat: Connected to 192.168.200.81:10001. Ncat: UDP packet sent successfully #显示发送成功,可我并没有开启该端口 Ncat: 1 bytes sent, 0 bytes received in 2.01 seconds. [root@client ~]# ```  抓的包中看到两个端口都没有ICMP回显。且都是成功,而在服务端并没开启10001端口。 # 总结 在用Telnet测试TCP端口时,它是基于三次握手来嗅探端口。而 在用nc测试UDP端口时,它是基于ICMP回显来嗅探端口。所以当我们使用nc测试UDP端口时候,提示`Connection refused` 那是一定的,可信的。提示`packet sent successfully` 那就不一定是真实的,也许存在该端口,也许不存在该端口。 Last modification:August 1, 2024 © Allow specification reprint Like 如果觉得我的文章对你有用,请随意赞赏