我编写了一个 C# 应用程序,用于监听端口 789。它运行在 Windows XP Professional 计算机上。正在运行
netstat -an | find "789"
TCP 0.0.0.0:789 0.0.0.0:0 LISTENING
当我nmap -A -vv ip
在不同的 Linux 机器(但同一子网)上运行时,它只报告主机上打开的其他端口(即 mysql、vnc 等),但不报告我的应用程序打开的端口。
然而,当我跑步时nmap -p 789 ip
我得到:
PORT STATE SERVICE
789/tcp open unknown
为什么两次 nmap 扫描之间存在差异?我可以做些什么来确保 nmap 在进行完整扫描时检测到开放端口?
答案1
默认情况下,nmap 仅扫描“常用”端口(我认为每个协议最常用的 1000 个端口)。由于 789 不是常用端口,因此找不到它。如果您这样做
nmap -A -vv -p- ip
它应该扫描端口 1-65535。
以下是 nmap 文档,其中说明了默认扫描哪些端口: http://nmap.org/book/man-port-specification.html
答案2
唯一可以做到这一点的方法是修改 nmap 的服务文件,但不推荐这样做。该-A
选项运行高级选项,包括服务检测、操作系统检测、跟踪路由等 - 它不会扫描整个范围。如果要扫描所有 65k 个端口,请使用选项-p-
。除此之外,您只需使用指定端口即可-p 789
。最好的选择可能是创建一个执行的别名nmap -p 789
,以节省时间。
如果您确实需要更改服务文件(默认情况下为 /usr/local/share/nmap/nmap-services),请找到该行unknown 789/tcp 0.000075
并将其替换为您的程序名称,并将数字放在末尾0.9
,这样它就是 nmap 包含的顶级端口。不过,使用别名会更好。
答案3
我不确定。它检测到它是“打开的”,这正是你想要的,对吧?所以它是听。为什么用 -A 找不到它,我不确定。
编辑 - 这是来自旧文档,可能不适用于您的版本。运行man nmap
并让我们知道您拥有的版本。
从文档中我看到:
“默认设置是扫描 1 到 1024 之间的所有端口以及 nmap 附带的服务文件中列出的任何端口。”
因此,即使您的服务文件中没有 789,也应该扫描它(因为它被标记为“未知”,所以我确定它不是。)
因此,我不知道。检查您的 man 文件以了解您的 nmap 版本,也许它使用 -A 扫描哪些端口的行为与我找到的文档不同?
这个不太可能,但可能值得调查 - 差异可能在于 Linux 机器上的用户 ID。NMap 的特权用户和非特权用户具有不同的默认扫描类型。具有 root 权限的用户可以执行 TCP SYN 扫描,没有 root 权限的用户将默认使用 TCP connect() 。
答案4
nmap-A
是一个激进的命令,因为它会在后台运行多个脚本,这也是它能给你更多结果的主要原因。它将版本检测-sV
与操作系统检测-O
(大写字母 O 而不是数字零)和其他发现脚本结合在一起。默认情况下,Nmap 将扫描前 1000 个最常用的端口(如果没有指定具体端口号,则这些端口在nmap 服务文件,您可以编辑)。可以将您想要扫描的端口输入到 assault 命令中,这样您就不会得到除了您想要扫描的端口 TCP 789 之外的其他端口的结果
nmap -p 789 -A TARGET_IP_ADDRESS_OR_IP_RANGE
而如果你只想检查端口(在你的情况下为 789)是否打开/关闭/过滤
nmap -p 789 TARGET_IP_ADDRESS_OR_IP_RANGE
由于-A
执行了多个脚本并且声音很大(就网络流量而言),它很容易被IDS标记,而且很可能会被防火墙或IPS阻止,这可能是它无法提供正确端口状态的原因之一。