单IP做NAT支持的最大连接数问题
TCP/IP的端口数是16位的,最大也就支持65535个端口,难道单个IP地址做NAT的最大连接数就是65535?
我们知道,Linux做NAT的时候,将NAT前后的IP地址及端口都记录在/proc/net/ip_conntrack里,通过查找这个文件,可以推断出某个报文NAT前后的IP地址及端口,也就是所谓的一个连接。
下面我们来看一个实际的例子【1】:
处于同一子网内的主机A、B,IP地址分别为:192.168.1.2、192.168.1.3,他们使用TCP协议,使用相同的源端口访问不同目的IP地址的web服务,看看NAT前后的IP地址及端口:
tcp 6 431994 ESTABLISHED src=192.168.1.3 dst=121.194.0.206 sport=7777 dport=80 src=121.194.0.206 dst=60.16.128.110 sport=80 dport=7777 [ASSURED] use=1 tcp 6 431983 ESTABLISHED src=192.168.1.2 dst=60.215.128.148 sport=7777 dport=80 src=60.215.128.148 dst=60.16.128.110 sport=80 dport=7777 [ASSURED] use=1
从上面可以看出,NAT之后只是把数据包的源地址修改了,都改成60.16.128.110,他们的源端口依然不变。
我们继续看另外一个例子【2】:
同样是以上两台主机,同时TCP协议访问同一主机的web服务:
tcp 6 431997 ESTABLISHED src=192.168.1.3 dst=121.194.0.206 sport=6666 dport=80 src=121.194.0.206 dst=60.16.128.110 sport=80 dport=6666 [ASSURED] use=1 tcp 6 431990 ESTABLISHED src=192.168.1.2 dst=121.194.0.206 sport=6666 dport=80 src=121.194.0.206 dst=60.16.128.110 sport=80 dport=60121 [ASSURED] use=1
从结果可以看出,有一个连接的源端口号被修改成60121了。
比较上面两个例子,不难看出,识别一个连接只需5元组即可:
协议、源地址、源端口、目的地址、目的端口
对于【1】的两个连接,NAT前后的5元组为:
NAT前:
TCP、192.168.1.3、7777、121.194.0.206、80
TCP、192.186.1.2、7777、60.215.128.148、80
NAT后:
TCP、60.16.128.110、7777、121.194.0.206、80
TCP、60.16.128.110、7777、60.215.128.148、80
将内网地址修改成功网地址后,五元组中的目的地址不一致,可以区分两个连接,无需修改 源端口。
对于【2】的两个连接,NAT前的五元组为:
TCP、192.168.1.3、6666、121.194.0.206、80
TCP、192.168.1.2、6666、121.194.0.206、80
如果NAT服务器只是简单的将源地址替换成一个IP地址,则两个连接的五元组完全一致,无法区分两个连接,所以NAT后将其中一个连接的源端口做了相应的修改:
TCP、60.16.128.110、6666、121.194.0.206、80
TCP、60.16.128.110、60121、121.194.0.206、80
这样,两个连接的源端口不同,仍然可以区分两个连接。
从上面的分析,可以得出如下结论:
NAT支持最大连接数主要看可以产生多少个不重复的5元组。
因此单个IP地址做NAT支持的最大连接数是多少呢?
协议× 源地址×源端口×目的地址×目的端口 = 2 * 1 * 2^16 * 2^32 * 2^16 = 3.68934881e+019 个连接(理想状态)
最差的情况,所有的用户都访问同一个IP地址的同一协议的同一端口,则:
协议×源地址×源端口×目的地址×目的端口 = 1 * 1 * 2^16 * 1 * 1 = 65536个连接(最糟糕情况)。
补充: TCP/IP的四元组、五元组、七元组
四元组是:
源IP地址、目的IP地址、源端口、目的端口
五元组是:
源IP地址、目的IP地址、协议号、源端口、目的端口
七元组是:
源IP地址、目的IP地址、协议号、源端口、目的端口,服务类型以及接口索引
相关文章
- ip addr命令详解_ip link命令
- 单个用户及Ip请求频率限制思路(附java实现)
- 两个IP实现IIS和Apache公用80端口的设置方法
- linux设置预留端口号,防止监听端口被占用 ip_local_reserved_ports详解程序员
- 查看Linux系统的IP地址信息(获取linux的ip地址)
- 掌握Linux命令快速设置IP(linux命令设置ip)
- Linux下快速获取IP地址的技巧(linux下获取ip地址)
- 数据库Oracle IP数据库:提供无限可能性(oracle的ip)
- 地址快速配置Oracle的IP地址(oracle配置ip)
- MySQL数据库Grid:安全的IP授权访问(mysql授权ip访问)
- Linux 下 TCP/IP 转发功能实现(tcp转发linux)
- Linux 如何伪造 IP?(linux伪造ip)
- 冲突警告:Oracle监听器IP冲突(oracle监听是ip)
- IP库下载MySQL:构建你的网络保护基础(ip库下载mysql)
- Linux下实现外网IP配置的简易步骤(linux配置外网ip)
- Linux防火墙下保护:拒绝IP访问(linux 拒绝ip访问)
- Linux下的IP SAN技术:实现无限可能(ip san linux)
- mysql无需绑定IP,轻松配置访问安全(mysql不绑定ip)
- Oracle 全新IP修改体验(oracle 修改了ip)
- Oracle数据库修改主机IP实践指南(oracle修改主机ip)
- Redis连接IP查询精准解决方案(redis 连接ip查询)
- Redis 远程IP连接实现方式研究(redis远程ip连接)
- 轻松搞定Oracle网络IP配置(oracle ip配置)
- 使用Redis获取IP地址的方法(redis获取ip地址)
- Oracle19升级之路改变IP从此开始(oracle19更改ip)
- php中禁止单个IP与ip段访问的代码小结