サマリー:電商系統(tǒng)大考雙十一過(guò)去了,可以找點(diǎn)時(shí)間寫(xiě)點(diǎn)東西了。這次說(shuō)說(shuō)提升工作效率。講工程效率提升的文章有很多,我們先不看團(tuán)隊(duì)的。從個(gè)體小處如何減少機(jī)械性,重復(fù)性的工作,是切切實(shí)實(shí)提高個(gè)人幸福感的一件事。由于工作上的原因,經(jīng)常需要給外包服務(wù)商開(kāi)通訪問(wèn)內(nèi)部系統(tǒng)的白名單。我們知道根據(jù)網(wǎng)絡(luò)上通路到達(dá)web系統(tǒng)不同,大致上可以分為兩類訪問(wèn)控制:nginx上的七層訪問(wèn)控制,完全由應(yīng)用上的配置文件控制訪問(wèn)IP,該方式的好
電商系統(tǒng)大考雙十一過(guò)去了,可以找點(diǎn)時(shí)間寫(xiě)點(diǎn)東西了。
這次說(shuō)說(shuō)提升工作效率。講工程效率提升的文章有很多,我們先不看團(tuán)隊(duì)的。從個(gè)體小處如何減少機(jī)械性,重復(fù)性的工作,是切切實(shí)實(shí)提高個(gè)人幸福感的一件事。
由于工作上的原因,經(jīng)常需要給外包服務(wù)商開(kāi)通訪問(wèn)內(nèi)部系統(tǒng)的白名單。我們知道根據(jù)網(wǎng)絡(luò)上通路到達(dá)web系統(tǒng)不同,大致上可以分為兩類訪問(wèn)控制:
nginx上的七層訪問(wèn)控制,完全由應(yīng)用上的配置文件控制訪問(wèn)IP,該方式的好處也是壞處,就是需要開(kāi)發(fā)明確知道并維護(hù)nginx上的白名單配置文件,同樣的只要有了這份配置文件,理論上名單不會(huì)丟,應(yīng)用基線可以保證多機(jī)房部署。
防火墻控制,此種方式對(duì)應(yīng)用透明,應(yīng)用開(kāi)發(fā)不需要關(guān)心白名單控制,問(wèn)題也是明顯的,防火墻ACL控制在跨機(jī)房時(shí)并不能跟隨,有幾個(gè)機(jī)房就要同時(shí)維護(hù)幾份白名單,對(duì)運(yùn)維系統(tǒng)也有要求,同一份IP段要支持多機(jī)房下發(fā)。
故事的起點(diǎn)就在這,防火墻的ACL控制下發(fā)要求提供CIDR格式的規(guī)則。什么是CIDR格式?直接看自由的百科全書(shū)的解釋:
無(wú)類別域間路由(Classless Inter-Domain Routing、CIDR)是一個(gè)用于給用戶分配IP地址以及在互聯(lián)網(wǎng)上有效地路由IP數(shù)據(jù)包的對(duì)IP地址進(jìn)行歸類的方法。
CIDR看起來(lái)就是這樣的: 208.130.29.0/24
比如有個(gè)需求就是208.130.29.30-35這個(gè)IP段換成CIDR格式,有幾個(gè)只學(xué)過(guò)基礎(chǔ)網(wǎng)絡(luò)知識(shí)的開(kāi)發(fā)懂這個(gè)?
作為一個(gè)開(kāi)發(fā)人員做這個(gè)換算是很費(fèi)勁的,比如要去網(wǎng)上用類似以下這個(gè)巨難用的表格來(lái)做網(wǎng)段和CIDR格式的換算,還要搞清楚/32 /31 /29 這些似乎跟web開(kāi)發(fā)沒(méi)有多大關(guān)系的知識(shí)。
在經(jīng)歷了痛苦和挫折后,一個(gè)偶然的機(jī)會(huì),發(fā)現(xiàn)python居然有現(xiàn)成的類庫(kù)支持此類網(wǎng)絡(luò)操作與換算。 將以上的需求翻譯成python只要幾行代碼搞定:
# 確定起始和結(jié)尾IP,無(wú)論多復(fù)雜都可以轉(zhuǎn)換 startip = '208.130.29.30' endip = '208.130.29.35' cidrs = netaddr.iprange_to_cidrs(startip, endip) for k, v in enumerate(cidrs): iplist = v print iplist
輸出:
208.130.29.30/31
208.130.29.32/30
反過(guò)來(lái),CIDR也能直接轉(zhuǎn)成IP地址段:
from netaddr import * ip = IPNetwork('192.0.2.16/29') ip_list = list(ip) print(ip_list)
輸出:[IPAddress('192.0.2.16'), IPAddress('192.0.2.17'), …, IPAddress('192.0.2.22'), IPAddress('192.0.2.23')]
感謝python大法!