📡 第五章 防火墙功能与防范威胁的对策
📄 一句话概括

NAT 的核心是「把地址换成地址加端口」——因为端口比地址多得多。 一个公网 IP 能带几千台主机,靠的不是地址复用,是端口复用。

📝 本节和前面几节的关系

上一节讲策略(让不让过),这一节讲 NAT(过去之后变成谁)。 03.05 讲 IP 路由时提过 NAT 会破坏端到端,这一节把这笔账算完。

一、三种 NAT,改的地方不同

静态 NAT:一对一,私网地址永久映射到一个公网地址。动态 NAT:多对多,从地址池里临时分配。 NAPT(端口复用):多对一,靠端口区分——这才是「一个公网 IP 带几千台主机」的做法。

类型 映射关系 改什么


静态 NAT 一对一 只改地址 动态 NAT 多对多 只改地址 NAPT 多对一 改地址加端口

注意「改端口」这件事的代价:TCP 的校验和要重算(因为伪首部里有地址), 而且「源端口」被改了之后,如果有应用把端口号写进了载荷(比如某些老协议),就会失效。 这就是为什么有些协议要专门的「ALG」来处理。

二、出去容易,进来难

NAT 天生是单向的: 内网主动发起,NAT 建一条映射,回包能对上;外网主动发起,NAT 表里没有对应条目,包就被丢了。

这个「不对称」带来两个后果: 好的一面:内网主机天生隐藏,外网扫不到。 坏的一面:外面的服务想主动连进来,必须手工做「端口映射」。

端口映射的风险在于「它是个洞」: 一条「公网 8080 → 内网 10.0.0.5:80」的映射,等于把内网一台机器的 80 端口直接暴露在公网。 如果那台机器有漏洞,防火墙的策略再严也没用——因为这条映射是「显式允许」的。

所以端口映射必须遵守三条:只映射必要的端口、只映射到 DMZ、并且记录在案。 第三条最常被忽略,而它恰恰是排障与审计的依据。

三、NAT 破坏了什么

NAT 不是「免费的好事」,它破坏了 IP 的一个基本设计:端到端可达。

具体破坏了三样: 一、外到内的连接:需要端口映射才能进。二、把地址写进载荷的协议:要 ALG 专门处理才能过。 三、需要知道「自己公网地址」的应用:要 STUN 之类的机制去问。

第三条正是 VoIP 与 P2P 麻烦的根源: 两台都在 NAT 后面的主机想直连,谁也不知道对方的公网地址与端口, 于是需要「打洞」——先各自往外发一个包,让各自的 NAT 表里留下一条记录,再借这条记录通信。

而 IPv6 的设计目标之一就是「取消 NAT,恢复端到端」。 但现实中 IPv6 也常配防火墙,所以「端到端」恢复得并不彻底——这件事说明:NAT 解决的问题(地址不够)与它带来的副作用(不可达)是两笔账。

四、动手 Demo:一个公网 IP 能带多少台内网主机

这段先算一个公网 IP 有多少可用端口,再真的用一张映射表把三台源端口相同的主机「摊开」, 最后算不同规模要几个公网 IP。

table = {}
next_port = 40001
for s, sp, d, dp in lines:
    key = (s, sp, d, dp)
    table[key] = next_port
    next_port += 1

实跑输出:

--------------------------------------------------------------------
一个公网 IP 能带多少台内网主机
--------------------------------------------------------------------
**NAT 的核心是把「地址」变成「地址加端口」**,**因为端口比地址多得多。**

**先算一个公网 IP 有多少个可用端口**:
  端口空间 65536 个,减去 0~1023 的知名端口(本地发起时不能用太低的):
  可用约 64512 个。

**再用一张真的映射表看看它是怎么变的**:

  192.168.1.10:50000 → 8.8.8.8:53   改写成  203.0.113.7:40001
  192.168.1.11:50000 → 8.8.8.8:53   改写成  203.0.113.7:40002
  192.168.1.12:50000 → 8.8.8.8:53   改写成  203.0.113.7:40003

**三台主机的源端口都是 50000,但出去之后变成了三个不同的端口**——**冲突在出口被「摊开」了。**

**回来的时候靠这张表反查**:
  收到 203.0.113.7:40001 → 还原成 192.168.1.10:50000
  收到 203.0.113.7:40002 → 还原成 192.168.1.11:50000
  收到 203.0.113.7:40003 → 还原成 192.168.1.12:50000

**算能带多少台**(每台平均 100 条并发连接):

  1,000 台主机 → 100,000 条会话 → 2 个公网 IP。
  10,000 台主机 → 1,000,000 条会话 → 16 个公网 IP。

**这就是 NAT 的扩展性上限:它靠端口复用撑住,但会话数一多,公网 IP 就得跟着加。**

三台主机的源端口都是 50000,出去之后变成三个不同端口——这一幕就是 NAPT 的全部原理,没有更多。 冲突在出口被摊开,回来靠这张表反查。

注意 D140 那个「热门目的地」的陷阱: 如果几千台主机同时访问同一个服务器的同一个端口,那么能用的只有「源端口」这一个维度, 上限就是 6.4 万。这是 NAT 扩展性的真实天花板。

最后一句话要记住:NAT 靠端口复用撑住规模,但会话数一多,公网 IP 就得跟着加。 所以「我们有 NAT,所以不需要公网 IP」这个说法是错的——你只是把需求从「每台一个」降到了「每几千条并发一个」。

30 秒实验

  1. 查一下你单位出口有几个公网 IP。
  2. 看 NAT 表的当前条目数,算一下离 6.4 万还有多远。
  3. 想一想:为什么 VoIP 在 NAT 后面特别容易出问题?

常见误区

  1. 以为 NAT 是安全机制。它只是「外面进不来」,不是「进来干什么都不行」。
  2. 以为一个公网 IP 只能带 254 台主机。NAPT 靠端口,能带几千台。
  3. 以为端口映射没有风险。它等于在防火墙上开了一个显式的洞。
自测三问(点开对答案) 1. NAPT 与静态 NAT 最本质的差别是什么? —— NAPT 会改源端口,靠「地址加端口」区分会话,因此能多对一。 2. 为什么 TCP 的 NAT 要重算校验和? —— 因为 TCP 伪首部里含地址,地址一改校验和就不对了。 3. NAT 破坏的「端到端」具体带来哪三类麻烦? —— 外到内连不进、地址写在载荷里的协议过不去、应用不知道自己的公网地址。

下一节:把两个私网用一个加密隧道连起来,就是 VPN。

相关笔记