Nmap无法扫描到Wi-Fi热点主机的开放端口排查问询
问题描述
- 三台设备处于同一网段(10.0.0.x),可互相ping通:
- 树莓派(10.0.0.6,Ubuntu 22.04):作为Wi-Fi热点,运行Python客户端代码绑定8086端口,连接Xubuntu设备的8085端口传输视频流
- Xubuntu设备(10.0.0.52):连接热点,运行Python服务端代码绑定8085端口接收视频流
- Kali设备(10.0.0.86):连接热点,用于端口扫描
运行的代码
树莓派(客户端)代码
import cv2 import socket import sys import pickle import struct # Raspberry Pi camera setup cap = cv2.VideoCapture(0) cap.set(3, 640) # Set width cap.set(4, 480) # Set height # Create a socket connection to the receiver (Ubuntu machine) client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Bind the socket to a specific local address and port local_port = 8086 # Change this to your desired local port client_socket.bind(('10.0.0.6', local_port)) # Specify the remote server's IP address and port to connect to remote_server_ip = '10.0.0.52' remote_server_port = 8085 # Replace with your Ubuntu machine's port client_socket.connect((remote_server_ip, remote_server_port)) try: while True: # Read a frame from the camera ret, frame = cap.read() # Serialize the frame data = pickle.dumps(frame) # Send the frame size client_socket.sendall(struct.pack("L", len(data)) + data) except KeyboardInterrupt: cap.release() client_socket.close()
Xubuntu(服务端)代码
import cv2 import socket import pickle import struct # Create a socket server server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(('10.0.0.52', 8085)) # Use 0.0.0.0 to listen on all available network interfaces server_socket.listen(10) print("Waiting for a connection...") conn, addr = server_socket.accept() print("Connected to", addr) data = b"" payload_size = struct.calcsize("L") while True: while len(data) < payload_size: data += conn.recv(4096) packed_msg_size = data[:payload_size] data = data[payload_size:] msg_size = struct.unpack("L", packed_msg_size)[0] while len(data) < msg_size: data += conn.recv(4096) frame_data = data[:msg_size] data = data[msg_size:] # Deserialize the received frame frame = pickle.loads(frame_data) # Display the received frame cv2.imshow('Received Frame', frame) cv2.waitKey(1)
现象
- 树莓派上执行
sudo tcpdump -i wlan0 -nn,可见两台设备通过8085/8086端口正常收发数据包 - Kali上执行
sudo nmap -p 8080-8090 10.0.0.6,无法检测到8086端口开放 - Kali上执行
sudo nmap -p 8080-8090 10.0.0.52,能看到8085端口开放 - 已关闭树莓派所有防火墙规则
疑问
问题出在哪里?
问题原因及解决办法
核心原因
树莓派上的8086端口是主动发起连接的客户端端口,并非监听端口。Nmap扫描端口开放的逻辑是检测目标端口是否处于LISTEN(监听)状态——只有监听端口才会响应外部的连接请求,而客户端发起连接后,端口处于ESTABLISHED(已建立连接)状态,不会响应来自第三台设备的扫描请求。
对比Xubuntu的8085端口:它是服务端监听端口,始终处于LISTEN状态,所以Nmap能检测到开放。
验证方法
在树莓派上执行ss -tulpn | grep 8086,会看到该端口的状态是ESTAB(已连接),而非LISTEN;在Xubuntu上执行ss -tulpn | grep 8085,会看到状态是LISTEN。
补充说明
tcpdump能抓到数据包是因为该端口正在和10.0.0.52的8085端口进行双向数据传输,但这和端口是否处于监听状态是两回事。只有当端口处于监听状态时,才会接受来自任意IP的新连接请求,Nmap才能检测到端口开放。
内容的提问来源于stack exchange,提问作者JohnMickky
相关产品推荐
相关产品推荐

