干貨!如何低成本建立RapidDNS.io網(wǎng)站
時(shí)間:2023-05-30 12:12:01 | 來源:網(wǎng)站運(yùn)營
時(shí)間:2023-05-30 12:12:01 來源:網(wǎng)站運(yùn)營
干貨!如何低成本建立RapidDNS.io網(wǎng)站:
http://RapidDNS.io是一個(gè)在線域名查詢和IP反向查詢的網(wǎng)站。有超過25億條記錄,支持5種(A,AAAA,CNAME,MX,CERT)數(shù)據(jù)類型。到目前為止,網(wǎng)站全球Alexa排名15萬左右并累計(jì)提供超過1億次查詢?,F(xiàn)每月網(wǎng)站流量超過1TB。除此之外網(wǎng)站也被加入到Amass,OneForAll,theHarvester,Sudomy,subfinder,ksubdomain等眾多知名開源項(xiàng)目中。
接下來我就跟大家分享建設(shè)這個(gè)網(wǎng)站的過程。
產(chǎn)生想法:2020年在做子域名收集的開發(fā)時(shí),想起了Rapid7的DNS數(shù)據(jù)。經(jīng)過對其進(jìn)行分析后,確認(rèn)是我需要的內(nèi)容。于是便有了做一個(gè)在線的網(wǎng)站的想法,即方便自己同時(shí)又可以方便其他有需要的人。
有了這個(gè)想法后就開始計(jì)劃目標(biāo),確定只做子域名查詢和IP地址反查。其實(shí)在開發(fā)時(shí),想自己跑數(shù)據(jù),但是資源有限。就決定先以Rapid7的DNS數(shù)據(jù)來嘗試。后續(xù)也可根據(jù)具體情況在增加功能。
面臨的問題:開始實(shí)現(xiàn)之前要考慮如何以最低的成本實(shí)現(xiàn)最好的效果。最好的效果即在多人同時(shí)訪問時(shí)保證查詢速度和系統(tǒng)穩(wěn)定。因?yàn)檫@將直接決定采用什么樣的架構(gòu)來實(shí)現(xiàn)。
先來分析下建設(shè)網(wǎng)站需要的東西。包括一個(gè)域名和至少一臺服務(wù)器,用來存放web和數(shù)據(jù)。數(shù)據(jù)存儲的空間至少要300gb,cpu至少雙核,內(nèi)存至少4g。這是沒有增量和保存歷史記錄的情況。到各家云廠商,idc機(jī)房,根據(jù)這個(gè)配置對比了其價(jià)格,最低的服務(wù)器成本也要5000塊一年(僅是數(shù)據(jù)存儲)。
因?yàn)榇蛩阕雒赓M(fèi)網(wǎng)站,這樣的成本超出了我的預(yù)期,而且也可能性能不夠。對于這個(gè)數(shù)據(jù),國外已經(jīng)有幾篇數(shù)據(jù)運(yùn)用的文章。其實(shí)現(xiàn)的思路有:1. 采用aws的Athena實(shí)現(xiàn),2. 開源的DNSGrep,包括RapidDNS上線后采用mongodb實(shí)現(xiàn)的開源項(xiàng)目等。因?yàn)榇蠖鄶?shù)圍繞的是子域名查詢,沒有IP地址反查功能。而且Athena將隨著用戶數(shù)量增加,其費(fèi)用也將非??植?,更適合自用。說了這么多,主要的問題說白了就是窮。
另外一個(gè)省錢的思路就是從已有資源來想辦法,這時(shí)想到了跟隨我多年聯(lián)想的筆記本電腦,它已經(jīng)吃灰好久了,這是一個(gè)可利用的資源。這樣只需要再買一個(gè)web服務(wù)器就可以了。根據(jù)之前調(diào)查的價(jià)格,這樣的服務(wù)器一年大概需要不到2000塊。
但是這就產(chǎn)生了另外一個(gè)問題,家里的網(wǎng)絡(luò)是光纖,沒有固定ip地址,而且之前測試發(fā)現(xiàn)外網(wǎng)ip是無法直接訪問的,映射端口是不行的。做端口轉(zhuǎn)發(fā)?這個(gè)的性能沒測試過,無法保證,也不打算采用。當(dāng)然這里我想到了一個(gè)解決辦法,在下面的內(nèi)容中會講到。
解決方案經(jīng)過上面的考慮,最終我采用下面的結(jié)構(gòu)。后來經(jīng)過線上的運(yùn)行情況,穩(wěn)定性和查詢速度還在接受的范圍內(nèi)。后續(xù)也可以增加worker和消息隊(duì)列來支持其他方式的數(shù)據(jù)增加。
本地服務(wù)器就是我的一臺筆記本電腦,其配置是3代i7,8G內(nèi)存。1.2TB的固態(tài)硬盤(1TB+250TB兩塊組成)。數(shù)據(jù)存儲與查詢使用的是elasticsearch,前面加了一層nginx,并配置了認(rèn)證。
外部服務(wù)器是一臺云主機(jī),配置好為雙核4G內(nèi)存。包括nginx反向代理和Flask做的web查詢界面。 外面又加了一層CDN。上面沒有公網(wǎng)IP的問題,取了個(gè)巧,因?yàn)楝F(xiàn)在家里的網(wǎng)絡(luò)都支持IPv6,所以外部服務(wù)器直接使用IPv6地址直連家里的筆記本電腦。
這里說點(diǎn)額外的,對于IPv6地址是可以直接連接的,不需要做映射。一般我們家里的電腦會分配多個(gè)IPv6地址,有至少一個(gè)臨時(shí)(temporary,我們連接其他電腦時(shí)使用)的地址和secured的。一般我們可以設(shè)置一個(gè)固定的即可。這里大家還是注意點(diǎn),避免泄漏IPv6地址。之前看一篇公眾號文章,發(fā)現(xiàn)對目標(biāo)的IPv4地址打碼了,卻沒有對IPv6地址打碼,這個(gè)挺危險(xiǎn)的。
以上這套結(jié)構(gòu)的成本為域名450元,cdn服務(wù)器免費(fèi)的,服務(wù)器每月費(fèi)用20美元(差不多140元),電費(fèi)每月大概60元。前期投入買了一塊三星的SSD,成本1000元。截止目前為止,共投入450+2400+1000=3850元。后續(xù)維持現(xiàn)狀基本是服務(wù)器加域名成本,一年2850元。
編碼需要的一些基礎(chǔ)知識:
1、html+javascript+css基礎(chǔ)
2、python+flask基礎(chǔ)
3、elasticsearch基礎(chǔ)
其實(shí)想好了方案,而且本身也不復(fù)雜,具體編碼就相對簡單了許多。比如查詢界面的開發(fā),我直接找了一套現(xiàn)成的模版,改改樣式就可以了。后端flask邊看文檔邊開發(fā)就可以了,沒啥好說的。唯一要說一下的是這里flask使用了協(xié)程,其查詢效果好了很多。當(dāng)然后面跟insight-labs的A牛溝通過可以換bjoern,據(jù)說效果很好,不過這個(gè)我沒測試,感興趣的可以試試看,看完也可以分享出來讓我學(xué)習(xí)學(xué)習(xí)。
主要的還是在Elasticsearch這里,這里選擇他主要因?yàn)槲冶容^熟悉,而且有IP字段類型,做IP段查詢時(shí)非常方便。這里換乘其他的如mongodb、mysql等也可以。mysql使用myisam,加上Partition問題也不大,Insight-labs的QQ群數(shù)據(jù)查詢就是成功案例。大家可以選擇自己擅長的。
后來有朋友過來交流查詢速度問題,說他那邊的查詢速度沒我的快。其實(shí)主要我這邊做了一些優(yōu)化處理。我在導(dǎo)入數(shù)據(jù)時(shí),對域名處理,將根域名單獨(dú)存放一個(gè)字段,剩下的部分單獨(dú)放一個(gè)字段。因?yàn)椴恍枰:ヅ?,查詢速度就會非常快,同時(shí)存儲空間也可以節(jié)省幾十G。當(dāng)然,這犧牲掉了模糊搜索的功能。具體字段可以看下圖:
創(chuàng)建mapping:
·
{ "mappings": { "domain": { "properties": { "name": { "type": "text"
}, "type": { "type": "keyword"
}, "value": { "type": "ip"
}, "domain": { "type": "keyword"
} } } }}
最關(guān)鍵的其實(shí)是導(dǎo)入程序,也是投入時(shí)間最多的,因?yàn)閿?shù)據(jù)量比較多。單純使用bulk速度很慢。使用SSD速度會提高幾倍。但是依然達(dá)不到預(yù)期,因?yàn)闀霈F(xiàn)es內(nèi)存耗盡,隊(duì)列太多等各種異常,比如導(dǎo)入到8億多數(shù)據(jù)時(shí)報(bào)錯。也嘗試通過迭代的方式來實(shí)現(xiàn)高性能文件讀取,但是最后主要的根源還是在es和字符串的處理上。最后采用多進(jìn)程方式。elasticsearch設(shè)置不刷新,0副本,并調(diào)整es的queue,線程,最大內(nèi)存等參數(shù)。這個(gè)需要根據(jù)自己機(jī)器配置去進(jìn)行調(diào)整。通過實(shí)際使用一天導(dǎo)入大概10億條記錄,當(dāng)然還是有優(yōu)化空間的。
修改index設(shè)置的方法:
{ "index": { "refresh_interval": -1, "number_of_replicas": 0 }}
導(dǎo)入完成后在修改回去即可。
以上elasticsearch使用的是6.7.1版本。其他版本可能會有差異,根據(jù)實(shí)際情況調(diào)整即可。
總結(jié):其實(shí)總體來說,本文技術(shù)上沒啥復(fù)雜度,實(shí)現(xiàn)起來也相對簡單。我覺得有點(diǎn)像以前革命時(shí)期八路軍的風(fēng)格(完了往自己臉上貼金了,勿噴),在有限的條件下來盡可能實(shí)現(xiàn)自己想要的效果。
希望本文對你有所幫助,對于上述內(nèi)容有任何疑問,可以給我發(fā)送消息一起交流。
大家也可以加微信:gogquick,獲取最新的網(wǎng)站功能、使用技巧等內(nèi)容。