🕸️ 第三章 为Web提供支持的技术
📄 一句话概括

一台服务器只有一个地址,却同时开着网页、数据库、远程登录——端口号就是同一栋楼里不同房间的门牌;而其中最老的那位,正在退场。

📝 本节和前面几节的关系

3-7 讲完了加密这一层。这一节回到更具体的问题:请求到了服务器,怎么知道该交给哪个程序。答案就是端口号。教材把 FTP 和端口号放在同一条,也是因为 FTP 是【端口号】这个机制最典型的展示场。

一、为什么需要端口号

一台服务器只有一个 IP 地址,但它同时跑着网页服务、数据库、远程登录、邮件服务。地址只能定位到机器,定位不到程序。

端口号解决的就是这最后一跳:同一个地址加不同的端口,就是不同的服务。所以 IP 定位机器、端口定位程序,两者合起来才是一次完整的【敲门】。

约定俗成的部分叫知名端口:80 是 HTTP、443 是 HTTPS、22 是 SSH、53 是 DNS。小于 1024 的端口通常需要管理员权限才能占用,这也是为了不让普通程序冒充系统服务。

二、FTP:一个展示端口机制的活标本

FTP 是文件传输协议,出现得很早(1971 年),标准在 1985 年写定。

它最特别的地方是用了两个连接:21 端口传命令(登录、切换目录、下指令),另一个端口传数据(真正的文件内容)。

这个设计的年代痕迹很重——数据连接要对防火墙单独开口子,主动模式下甚至要服务器反过来连客户端。放在今天到处是 NAT 和防火墙的环境里,这一套非常难伺候。

三、动手 Demo:端口表与退场记录

先看一张常见的端口表,它是理解【服务器上都开着什么门】的最快方式。

ports = [(21, "FTP", "不加密"), (22, "SSH / SFTP", "加密"), (53, "DNS", "默认不加密"),
         (80, "HTTP", "不加密"), (443, "HTTPS", "加密"), (853, "DoT", "加密")]
for p, name, enc in ports:
    print("%-6d %-12s %s" % (p, name, enc))
print("Chrome 88 起移除 FTP 支持;移除前 FTP 占浏览器请求 < 0.1%")

实跑输出:

--------------------------------------------------------------------
D8  FTP 与端口号:同一台机器上,靠端口区分不同的服务
--------------------------------------------------------------------

  一台服务器只有一个 IP 地址,却同时开着网页、数据库、远程登录。
  怎么区分?靠端口号——它就是【同一栋楼里不同房间的门牌】。

  端口      协议                      用途                              是否加密
  ----------------------------------------------------------------------------------
  20 / 21   FTP                       传文件(命令 21、数据 20)        不加密
  22        SSH / SFTP                远程登录、安全传文件              加密
  25        SMTP                      发邮件                            看配置
  53        DNS                       域名解析                          默认不加密
  80        HTTP                      普通网页                          不加密
  443       HTTPS                     加密网页                          加密
  853       DoT                       加密的域名解析                    加密
  3306      MySQL                     数据库                            看配置
  3389      RDP                       远程桌面(Windows)               加密
  8080      HTTP 备用                 开发与测试常用                    不加密

  FTP 最早出现在 1971 年,标准在 1985 年写定,如今已经被后来者顶替:

  比什么        明文 FTP                          SFTP / FTPS
  ------------------------------------------------------------------------------------
  默认端口      21(命令)、20(数据)            SFTP 走 22,FTPS 走 990
  内容加密      完全没有,明文传输                都加密
  浏览器支持    Chrome 88 起已移除                本来也不靠浏览器
  防火墙友好度  差,数据端口要另开                好,只用固定端口
  2026 还多不多 老系统和 B2B 对接还在用           新项目一律用这两个

  2026 年的现状:
    · Chrome 从 88 版、Firefox 从 90 版起彻底移除 FTP 支持
    · 移除之前,FTP 流量已经不到浏览器请求量的 0.1%
    · 针对 FTP 的暴力破解,占全部入侵事件的 3%,比 SSH 和 RDP 都高

表里最值得注意的是加密与不加密的分界:21、80、53 默认是明文,22、443、853 是加密。端口号本身不决定安全,决定安全的是这个端口上跑的协议。

再看 FTP 那张对照表。它的退场是彻底的:Chrome 从 88 版、Firefox 从 90 版起彻底移除了 FTP 支持;移除前 FTP 的流量已经不到浏览器请求量的 0.1%。

但 FTP 并没有完全死掉——老系统和 B2B 对接还在用。这恰好是一个典型的例子:协议可以一边被淘汰、一边被需要,因为更换的成本集中在那些最难改的地方。

四、传文件该用什么

SFTP 是首选:它跑在 SSH 的 22 端口上,只开一个端口就够了,防火墙友好、天然加密,还支持用密钥代替密码。

FTPS 是给 FTP 套上 TLS,保留了两条连接的结构,适合必须兼容老系统但又要加密的场景。

判断标准很简单:能用 SFTP 就用 SFTP;只有在对方系统只认 FTP 的时候,才考虑 FTPS,而且绝不要在公网上跑明文 FTP——账号密码会直接暴露。

30 秒实验

  1. 在浏览器里输入 https://www.baidu.com:443,再输入 https://www.baidu.com:8443,对比两次结果——这就是端口决定服务最直观的演示。
  2. 在命令行运行 curl -I http://example.com:80 与 curl -I https://example.com:443,看两次返回有什么不同。
  3. 找一台你常用的服务器,在它的安全组或防火墙设置里数一数到底开了几个端口——开得越多,能被人敲的门就越多。

常见误区

  1. 错误:端口号是协议的一部分,不能改。——纠正:默认端口只是约定。HTTP 完全可以跑在 8080 上,SSH 也常被改到别的端口。改端口能少挨一些自动扫描,但它不构成安全措施——只是减少噪音而已。
  2. 错误:FTP 只是老,功能上没什么问题。——纠正:它的问题是不加密。账号、密码、文件内容全是明文,中间任何一台机器都能直接读到。这跟年代无关,是设计上的缺陷。
  3. 错误:既然浏览器都不支持 FTP 了,FTP 就彻底没了。——纠正:它在机房之间依然活着。大量老系统和 B2B 对接还在用它传数据,只是浏览器不再是它的客户端。淘汰一个协议,比淘汰用它的系统容易得多。
  4. 错误:端口开得越多越方便。——纠正:每一个开着的端口都是一扇门。用不到的服务就该关掉、该限制来源。最小开放原则是服务器安全里最便宜也最有效的一条。
自测三问(点开对答案) 1. 为什么有了 IP 地址还需要端口号? —— 因为 **IP 只能定位到机器,定位不到程序**。一台服务器同时跑着网页、数据库、远程登录,**端口号是这条链上最后一跳**——它决定这次请求交给哪个服务处理。 2. FTP 为什么被淘汰? —— 因为它**明文传输**(账号密码和文件内容都能被直接读到),而且**两条连接的结构对防火墙极不友好**。浏览器厂商干脆移除了支持——**FTP 流量在被移除前已不到 0.1%**。 3. 传文件现在应该用什么? —— **首选 SFTP**:走 22 端口、只开一个口、天然加密、支持密钥认证。只有在对方系统只认 FTP 时才退而用 FTPS,**并且绝不要在公网上跑明文 FTP**。

相关笔记