Nmap扫描时怎么排除特定端口不被检测?

端木雯雯 阅读 47

我用 Nmap 扫描本地开发环境,但总把 3000 和 8080 端口也扫进去,其实这些是前端 dev server,不想被当成漏洞。试过 nmap -p- --exclude-ports 3000,8080 localhost,但报错说参数不对,到底该怎么写?

查了文档好像没有 --exclude-ports 这个选项,是不是得用别的方法?比如只指定要扫的端口范围?

我来解答 赞 8 收藏
二维码
手机扫码查看
2 条解答
南宫兰兰
你遇到的问题其实挺常见的,Nmap确实没有直接的 --exclude-ports 参数。不过我们可以换个思路来解决,就是只扫描我们需要检测的端口范围,而不是排除特定端口。

第一步是明确我们要扫描哪些端口。假设你想扫除 3000 和 8080 以外的所有1到65535端口,可以这样做:

nmap -p 1-2999,3001-8079,8081-65535 localhost

这段命令的意思是:
- 1-2999 表示扫描1到2999号端口
- 3001-8079 跳过3000端口,从3001开始继续扫
- 8081-65535 跳过8080,从8081开始继续扫


nmap -p 1-2999,3001-8079,8081-65535 localhost


这样写虽然看起来有点冗长,但确实是有效的解决方案。如果你觉得这样写太麻烦,还有个更简单的办法:用 -p- 扫描所有端口,然后在结果中过滤掉不需要的。

比如:

nmap -p- localhost | grep -v '3000/tcp' | grep -v '8080/tcp'


这段命令先用 Nmap 扫描所有端口,然后通过 grep -v 把包含 3000 和 8080 的行去掉。当然这种方法不如第一种精准,因为还是扫描了那些端口,只是不在结果里显示。

我个人建议用第一种方法,虽然写起来复杂点,但更符合 Nmap 的设计初衷,而且性能更好,因为它根本不会去碰那些不想检测的端口。

这事儿让我想起自己刚学 Nmap 时也踩过不少坑,还好现在都记熟了这些小技巧。希望能帮到你。
点赞
2026-03-26 15:07
Prog.伊芃
你查得没错,Nmap 确实没有 --exclude-ports 这个参数,文档里压根没这玩意,我之前也踩过这个坑,以为和 --excludefile 一样能排除端口,结果白折腾半天。

正确做法其实就两种,看你怎么想省事:

第一种,最简单直接——别扫所有端口了,直接指定你要扫的端口范围,比如你想扫 1 到 10000 但排除 3000 和 8080,那就写成:
nmap -p 1-2999,3001-8079,8081-10000 localhost
虽然写起来有点啰嗦,但胜在清晰、稳,Nmap 也认,不会报错。

第二种,如果你端口特别多,或者要动态排除,可以用 -p- 扫全端口,然后配合 -p 的逗号分隔语法手动排除——但注意,Nmap 不支持“负排除”,只能显式列出要扫的端口。所以你不能写成 -p- --exclude 3000,必须手动拼出要扫的区间。

另外提醒一句,如果你是本地开发环境,建议直接用 127.0.0.1 而不是 localhost,避免某些系统里 localhost 解析成 IPv6 的 ::1,导致你扫的不是你以为的那个地方,要校验下端口监听的 IP 是否匹配。

对了,顺带说一句,真要上线前做安全扫描,别忘了加 -sV-sC 做服务识别,单纯扫端口开着没意义,得确认服务版本有没有已知漏洞,不过你这情况应该只是开发时顺手扫一下,知道就行。
点赞 1
2026-02-27 01:02