偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Go語言助力安全測試:24小時(shí)內(nèi)發(fā)送5億次HTTP/1.1請求

開發(fā) 前端
為了進(jìn)一步提高發(fā)送效率,我將HTTP請求發(fā)送器部署到了DigitalOcean的Kubernetes集群中。DigitalOcean提供了每月2TB的免費(fèi)流量,足以滿足我的測試需求。

作為一名安全研究人員,我需要定期對大量的目標(biāo)主機(jī)進(jìn)行安全掃描。最近,我遇到了一個(gè)挑戰(zhàn):需要在短時(shí)間內(nèi)向250萬臺(tái)主機(jī)發(fā)送5億次非RFC標(biāo)準(zhǔn)的HTTP/1.1請求,理想情況下是在幾個(gè)小時(shí)內(nèi)完成。經(jīng)過一番研究和實(shí)踐,我成功地使用Go語言構(gòu)建了一個(gè)高效的“HTTP大炮”,并成功完成了任務(wù)。

為什么選擇Go語言

在眾多編程語言中,我最終選擇了Go語言作為實(shí)現(xiàn)工具,主要原因有三點(diǎn):

  • 簡潔易懂: Go語言語法簡潔,易于學(xué)習(xí)和使用,即使像我這樣并非專業(yè)的Go語言開發(fā)者也能快速上手。
  • 并發(fā)支持: Go語言內(nèi)置了強(qiáng)大的并發(fā)原語,例如goroutine和channel,可以輕松地實(shí)現(xiàn)高并發(fā)程序。
  • 運(yùn)行速度快: Go語言編譯型語言,運(yùn)行速度非???,可以充分利用多核CPU的性能。

當(dāng)然,我也嘗試過使用Rust語言來實(shí)現(xiàn),但異步tokio類型的復(fù)雜性讓我望而卻步。相比之下,Go語言的并發(fā)模型更加直觀易懂,即使是JS開發(fā)者也能輕松駕馭。

5億次HTTP/1.1請求意味著什么

你可能會(huì)問,5億次HTTP/1.1請求到底意味著什么?這是一個(gè)很大的數(shù)字嗎?答案是肯定的。

如果使用curl命令逐個(gè)發(fā)送這些請求,即使每秒發(fā)送2個(gè)請求,也需要7.9年才能完成。在實(shí)際情況下,由于服務(wù)器的速率限制和網(wǎng)絡(luò)延遲,所需時(shí)間會(huì)更長。

從數(shù)據(jù)傳輸?shù)慕嵌葋砜矗?億次HTTP/1.1請求的數(shù)據(jù)量并不算太大:

  • 請求數(shù)據(jù):5億 * 1KB(平均請求大小) ≈ 478GB
  • 響應(yīng)數(shù)據(jù):5億 * 5KB(平均響應(yīng)大?。?≈ 2.33TB

真正的挑戰(zhàn)在于如何高效地建立連接、發(fā)送請求和處理響應(yīng)。

發(fā)送單個(gè)HTTP/1.1請求的步驟

雖然在代碼層面,發(fā)送一個(gè)HTTP/1.1請求只需要簡單的幾行代碼,例如:

resp, err := http.Get("https://example.com")

但在底層,HTTP庫需要執(zhí)行一系列操作:

  • DNS解析: 將域名解析為IP地址。
  • TCP連接: 與目標(biāo)服務(wù)器建立TCP連接。
  • TLS握手: 進(jìn)行TLS握手,協(xié)商加密密鑰。
  • 請求準(zhǔn)備: 編碼HTTP請求頭和請求體。
  • 發(fā)送請求: 將HTTP請求發(fā)送到服務(wù)器。
  • 接收響應(yīng): 接收服務(wù)器返回的HTTP響應(yīng)。
  • 解析響應(yīng): 解碼HTTP響應(yīng)頭和響應(yīng)體。
  • 關(guān)閉連接: 關(guān)閉TCP連接(可選)。

需要注意的是,上述任何一個(gè)步驟都可能失敗,因此需要進(jìn)行錯(cuò)誤處理和重試。

優(yōu)化HTTP請求發(fā)送的思路

為了提高發(fā)送效率,我們需要盡可能地減少每個(gè)請求的耗時(shí)。通過分析單個(gè)HTTP請求的步驟,我們可以找到優(yōu)化的方向:

  • 請求解析: 在我的用例中,發(fā)送的HTTP請求并非標(biāo)準(zhǔn)的RFC請求,而是手工構(gòu)造的,因此可以跳過請求解析的步驟。
  • DNS解析: 可以預(yù)先將所有目標(biāo)主機(jī)的域名解析為IP地址,避免在發(fā)送請求時(shí)進(jìn)行DNS解析。
  • 連接復(fù)用: 對于同一個(gè)目標(biāo)主機(jī),可以復(fù)用已經(jīng)建立的TCP連接,減少連接建立的開銷。
  • 并發(fā)發(fā)送: 可以使用多線程或協(xié)程并發(fā)發(fā)送請求,提高CPU利用率。

HTTP請求發(fā)送器的設(shè)計(jì)與實(shí)現(xiàn)

基于上述優(yōu)化思路,我設(shè)計(jì)了一個(gè)多級(jí)流水線式的HTTP請求發(fā)送器,主要包括三個(gè)模塊:

  1. 請求生成模塊: 負(fù)責(zé)生成待發(fā)送的HTTP請求數(shù)據(jù)。
  2. 發(fā)送模塊: 負(fù)責(zé)將HTTP請求數(shù)據(jù)發(fā)送到目標(biāo)服務(wù)器。
  3. 響應(yīng)處理模塊: 負(fù)責(zé)接收和處理服務(wù)器返回的HTTP響應(yīng)數(shù)據(jù)。

為了提高內(nèi)存利用率和減少對象創(chuàng)建的開銷,我使用了對象池來管理HTTP連接和請求/響應(yīng)對象。同時(shí),為了避免單個(gè)目標(biāo)服務(wù)器過載,我對每個(gè)目標(biāo)服務(wù)器的請求頻率進(jìn)行了限制。

關(guān)鍵代碼實(shí)現(xiàn)

1. 使用fasthttp庫

為了追求極致的性能,我選擇了fasthttp庫來替代Go語言標(biāo)準(zhǔn)庫中的net/http。fasthttp是一個(gè)輕量級(jí)、高性能的HTTP庫,經(jīng)過 benchmark 測試,其速度比net/http快了將近10倍。

2. 自定義Dial函數(shù)

為了跳過DNS解析步驟,我自定義了一個(gè)Dial函數(shù),直接使用預(yù)先解析好的IP地址建立TCP連接。

req.SetDial(func(addr string) (net.Conn, error) {
    return customDialer.Dial(resolved_ip)
})

3. 禁用請求標(biāo)準(zhǔn)化

由于我發(fā)送的是手工構(gòu)造的非RFC標(biāo)準(zhǔn)HTTP請求,因此可以禁用fasthttp庫中的請求標(biāo)準(zhǔn)化功能,進(jìn)一步提高性能。

req := rawfasthttp.AcquireRequest()
resp := rawfasthttp.AcquireResponse()

rawBytes := []byte("GET / HTTP/1.1\r\nHost: example.com\r\n\r\n")

req.SetRequestRaw(rawBytes)

err := client.Do(req, resp)

使用Kubernetes進(jìn)行橫向擴(kuò)展

為了進(jìn)一步提高發(fā)送效率,我將HTTP請求發(fā)送器部署到了DigitalOcean的Kubernetes集群中。DigitalOcean提供了每月2TB的免費(fèi)流量,足以滿足我的測試需求。

為了實(shí)現(xiàn)自動(dòng)化的彈性伸縮,我編寫了一個(gè)簡單的JavaScript腳本,根據(jù)任務(wù)隊(duì)列的長度動(dòng)態(tài)調(diào)整Kubernetes Deployment的副本數(shù)量。

挑戰(zhàn)與解決方案

在測試過程中,我遇到了一些挑戰(zhàn),例如:

  • DDoS攻擊風(fēng)險(xiǎn): 由于發(fā)送的請求量非常大,我自己的網(wǎng)絡(luò)一度被DDoS攻擊,導(dǎo)致Kubernetes節(jié)點(diǎn)無法正常工作。為了解決這個(gè)問題,我降低了每個(gè)Pod的請求頻率,并對目標(biāo)服務(wù)器進(jìn)行了分片。
  • IP封禁: 一些安全防護(hù)軟件會(huì)對異常流量進(jìn)行封禁,為了避免被封禁,我使用了DigitalOcean提供的動(dòng)態(tài)IP功能,每臺(tái)Droplet都使用不同的公網(wǎng)IP地址。

測試結(jié)果

最終,我成功地構(gòu)建了一個(gè)高效的HTTP請求發(fā)送器,并在幾個(gè)小時(shí)內(nèi)完成了向250萬臺(tái)主機(jī)發(fā)送5億次HTTP/1.1請求的任務(wù)。

  • 每個(gè)Pod的發(fā)送速率達(dá)到了每秒100-400個(gè)請求。
  • Kubernetes集群最多擴(kuò)展到了60個(gè)Pod。

總結(jié)

通過這次實(shí)踐,我深刻體會(huì)到了Go語言在網(wǎng)絡(luò)編程方面的強(qiáng)大能力,也學(xué)習(xí)到了很多關(guān)于HTTP協(xié)議和網(wǎng)絡(luò)安全的知識(shí)。我相信,這些經(jīng)驗(yàn)將會(huì)對我未來的安全研究工作有所幫助。

責(zé)任編輯:武曉燕 來源: 源自開發(fā)者
相關(guān)推薦

2022-01-23 16:13:06

比特幣加密貨幣暴跌

2013-05-30 10:41:50

2021-05-20 06:36:18

比特幣區(qū)塊鏈加密貨幣

2014-04-22 13:44:12

微軟

2023-05-26 10:50:38

模型AI

2020-09-18 17:40:49

TikTok程序禁令

2013-06-04 13:43:53

2021-11-26 05:53:59

蜜罐惡意軟件網(wǎng)絡(luò)攻擊

2016-07-05 10:56:49

2015-05-11 10:38:50

程序員編程問題

2009-03-23 08:55:37

IE瀏覽器微軟

2013-09-27 13:34:09

BAT百度騰訊

2023-11-27 08:57:24

GoGET

2014-07-01 10:05:15

遠(yuǎn)程銀行華為

2021-02-22 11:08:37

比特幣區(qū)塊鏈加密貨幣

2013-04-24 10:19:47

Firefox OS火狐手機(jī)

2012-12-19 11:10:54

2022-04-01 15:46:51

聯(lián)想

2013-05-15 09:27:58

2021-01-12 13:53:20

比特幣區(qū)塊鏈加密貨幣
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)