單IP做NAT支持的最大連接數問題

from: http://www.wenzk.com/archives/1356


單IP做NAT支持的最大連接數問題

和一些做NAT的老師接觸,談起NAT的問題,大多數都是自己用Linux使用iptables來搞定的,在具體談到地址池的時候,發現很多老師都習慣將1個C網絡NAT到一個單獨的IP地址上,如果有N個C類地址,那就需要寫N條iptables規則,當然這樣做的好處是用戶的源地址永遠不會變,便於事件的追查等,當問到爲什麼非要把1個C映射到一個IP地址上時,大家的回答都是:怕一個地址的端口數量不夠,導致連接數不夠。

想想也是,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地址及端口:

1
2
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服務:

1
2
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個連接(最糟糕情況)。

發佈了15 篇原創文章 · 獲贊 9 · 訪問量 35萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章