公众号旧文
80 端口一定是 HTTP 网站?我用 Nmap 扫了自己,才发现事情没那么简单。
很多人对端口号,大概会有一种条件反射。
比如:
- 80 = HTTP
- 443 = HTTPS
- 3389 = 远程桌面
- 22 = SSH
仿佛这些数字天然就对应着某种服务。
刚刚,我用 Nmap 扫了自己的电脑,才发现事情并没有那么简单。
一、事情的开始
我刚在 Windows 上安装了 Nmap。
它最常见的用途,就是扫描一台机器开放了哪些端口。
比如扫描我自己的电脑:
nmap 127.0.0.1
结果输出是这样的:
PORT STATE SERVICE
80/tcp open http
135/tcp open msrpc
445/tcp open microsoft-ds
902/tcp open iss-realsecure
912/tcp open apex-mesh
1038/tcp open mtqp
3389/tcp open ms-wbt-server
5357/tcp open wsdapi
10000/tcp open snet-sensor-mgmt
其中有一行非常显眼:
80/tcp open http
看到这里,第一反应是:
我电脑什么时候开网站了?
但问题是,我并没有装 nginx,也没有装 Apache,更没开 IIS。
于是我继续往下查。
二、到底是谁占用了 80 端口?
netstat -ano | findstr ":80 "
结果如下:
TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 7160
意思是:
有一个 PID 为 7160 的进程,正在监听 80 端口。
再接着查:
tasklist /fi "PID eq 7160"
结果让我更懵了:
映像名称 PID 会话名 会话# 内存使用
========= ======== ======= ======= ===========
svchost.exe 7160 Services 0 12,772 K
这不是 Web 服务器。
这是 Windows 系统进程。
三、答案出现
但 svchost.exe 本身并不是真正的服务。
它只是服务宿主进程。
很多 Windows 服务,都会挂在 svchost.exe 里面运行。
于是我继续执行:
tasklist /svc /fi "PID eq 7160"
结果终于出来了:
映像名称 PID 服务
=========== ======== =========
svchost.exe 7160 iphlpsvc
也就是 IP Helper(IP 帮助服务)
四、为什么 IP 帮助服务会监听 80 端口?
这时候,产生了一个巨大的认知冲击:
80 端口,不是 HTTP 吗?
实际上,并不是。
准确地说,80 只是通常被 HTTP 使用。
它并不是硬性规定。
端口号本质上只是一个数字。
真正决定通信内容的,是应用层协议。
也就是说任何程序,都可以监听任何端口。
五、很多人从来没意识到的事情
比如:
- SSH 可以跑在 443
- 游戏服务器可以跑在 53
- 数据库甚至可以监听 80
现实世界里,端口号和协议之间,并不是强绑定关系。
很多时候只是约定俗成。
六、那为什么 Nmap 会显示 HTTP?
因为 Nmap 只是根据常见端口习惯做猜测。
当它看到:
80/tcp
就会倾向于标记成:
HTTP
但这并不代表,我的电脑里面真的跑着网站。
七、一个更有意思的问题
很多人学习网络时,记住的都是端口号对应表。
比如:
- 80 → HTTP
- 443 → HTTPS
- 22 → SSH
但真实世界里的网络,并不是背端口号对应表那么简单。
真正重要的是:
- 谁在监听
- 监听在哪个地址
- 使用什么协议
- 是否允许外部访问
- 是否经过代理或转发
比如:
0.0.0.0:80
和:
127.0.0.1:80
安全意义完全不同。
前者意味着,所有网卡都能访问。
后者则意味着,只有本机能访问。
八、最后的反直觉结论
很多人以为:
80 端口 = 网站
但这次我意识到:
端口号从来都不等于服务本身。
它只是一个入口编号。
真正决定通信内容的,是程序和协议。
扩展阅读: