You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 07:23:36