NAT 端口耗尽
NAT 端口耗尽
问题现象
FortiGate 部署在 Internet 出口,并开启 NAT 功能实现内部用户上网。在使用过程中 FortiGate 产生了NAT port is exhausted. Socket is exhausted的系统事件日志。

date="2024-11-27" time="11:20:32" devid="FG101FTK2000XXXX" vd="root" type="event" subtype="system" bid=540114651 devname="FG101FTK2000XXXX" dstepid=3 dsteuid=3 dstip="8.8.8.8" dstport=53 dvid=2147 epid=3 euid=3 eventtime=1732492832315428126 id=7242716162855799960 level="critical" logdesc="Socket is exhausted" logid="0100020007" logver=604065868 msg="NAT port is exhausted." nat="33.43.111.222" proto=17 service="kernel" srcip="10.200.100.50" srcport=15651 status="failure" tz="-0500" vrf=0问题原因
在 FortiGate 上使用同一SNAT IP + 同一目的IP + 同一协议 + 同一目的端口(以下简称 四元组)时,支持 60416 个连接。如果同一 四元组已经存在了 60416 个连接,此时需要多一个连接,那么就会出现 NAT 端口耗尽的情况,新的连接无法建立,并产生以上日志。
对于其他连接,只要 四元组没有达到 60416 个连接,就不会产生以上问题。所以只要其他流量中的 SNAT IP、目的 IP、协议、目的端口有任意一项与已耗尽的 四元组不同,业务就不会受到影响。
FortiGate 端口使用规则
FortiOS 使用以上 四元组来确定 NAT 可用池的原因是 FortiGate 是基于会话的防火墙。 流量通过 FortiGate 设备进行连接时,会创建一个会话,并为该会话创建两个索引。 FortiGate 设备使用这些索引将匹配流量引导至匹配的会话。
使用这些属性来确定池的原因是 FortiOS 防火墙基于会话的设计。 通过 FortiGate 设备进行 TCP 连接时,会创建一个会话,并为该会话创建 2 个索引, FortiGate 设备使用这 2 个索引将匹配流量引导至会话:
-索引 1,用于流量发起方向的会话标识。
src-ip: 10.10.1.1 dst-ip: 202.1.1.1 proto: TCP src-port: 10240 dst-port: 443-索引 2,用于返回流量的会话标识。
src-ip: 202.1.1.1 dst-ip: 101.1.1.1 proto: TCP src-port: 80 dst-port: 46372- 其中 46372 是发起方向流量 SNAT 后 FortiGate 分配的端口。有了这 2 个索引,当流量与其中任一索引匹配时,流量所属的会话就能被唯一匹配。
FortiGate 在分配 NAT 端口时,只需确保所选 NAT 端口与 四元组相结合是唯一的,以便唯一标识会话。
举例,在以上流量已经创建会话的情况下,内网同一客户端 10.10.1.1 再与同一公网服务器 202.1.1.1 的 443 端口建立连接,此时 FortiGate 将创建另一个会话,返回方向上的索引如下。
src-ip: 202.1.1.1 dst-ip: 10.10.1.1 proto: TCP src-port: 443 dst-port: NPNP 的值可以是任何值,只要五个值加起来是唯一的。 例如,FortiGate 可以再次选择 46372,因为
src-port不一样。src-ip: 202.1.1.1 dst-ip: 10.10.1.1 proto: TCP src-port: 443 dst-port: 46372所以同一 四元组的情况下 FortiGate 可以建立的连接数,取决于
src-port的数量,FortiGate 支持的最大值为 60416。举例,如果访问的目的 IP 有 3 个,那么
同一SNAT IP + 同一目的端口最多可以在 FortiGate 上产生多少个连接?答案是60416 * 3 = 181248。