準備入職這家公司,在元旦期間研究了下mirai代碼,元旦結束入職的一周就看dpdk的文檔,然后看了下example下的幾個代碼試著修改了下,然后需要寫針對tcp相關的syn,ack等發包程序,需要達到一定的性能。對于10Gbits/s的光纖口,小包64字節的,需要達到1480w+每秒,然后寫了多線程發包和收包,達不到最佳,然后又改,里面有好些點不是很清楚,隨著思考的深入,后來對于一個線程處理一個port的端口,性能就達到要求了,使用這個主要是構造攻擊包測試。
第二/三周開發了數據庫相關接口并測試;接著就對另外一個同事寫的程序,也就是現在做的項目,進行優化;主要是針對框架,業務處理部分進行調優[開始的業務不是很復雜,與目前做的沒有重合],一開始使用的是gprof,但不支持多線程,后面改用了perf。原有框架有很大問題,到目前為止一共嘗試了五種框架,不斷的測試,再加上后面的具體業務,選擇了目前的框架,也算是更優的。到目前為止,在業務代碼方面的優化主要作了如下幾種工作,還算不錯的:
1 代碼中有很多的判斷,比如判斷一個包的合法性,把很多的if判斷改用了switch;
2 在不改變業務正確性的前提下,盡量減少不必要的計算,比如延遲再計算;
3 怎么合并計算,即利用上一次計算結果來避免后面的計算;
4 充分利用cache,服務器的架構等特點;
5 避免多線程之間的競爭,變量局部化,減少鎖的使用等;
6 還有一些關于dpdk自身的一些參數,這個需要不斷調整測試;
以上調優過程比較漫長,需要不斷的測試與對比,還要保證原有的功能正確。
年后就開始真正的研究常見的攻擊手段和防御了。
有攻擊才有針對性的防御,是檢測到了具體的攻擊類型才觸發對應的防御策略,前者開發工作量不是很重,有些是想不到的,需要抓取真實的攻擊包分析提取特征。防御攻能的開發需要保證不誤殺的情況下能防住,不然會被打趴。然后就是具體的策略了,比如對于syn攻擊,對于真實源發起的怎么判斷,如果是非真實的呢?里面有很多點是需要注意的。
后來經過了兩輪線上測試,一次是169G的流量,一次是199G的流量,前一個在測試的時候把一個判斷給注釋了,資源回收的時候沒有考慮其他一些點,所以導致了syn大包沒防住,且后面正常業務不通。然后修改了并調整了相關的代碼自測,后一次測試最后放行流量為700多兆,其中有些包被網卡miss掉了,在白名單中的能正常業務,非白名單不行,那會框架還是有些問題,且邏輯有點復雜,導致了線程處理不過來。
后來針對以上出現的問題分析制作相應修改,調整框架,分析包的特征,然后在linux上是沒問題了,不管是真實源還是非真實的,都能正常處理,且業務正常,后來發現在mac和windows下該特征不同,所以得重新考慮...現在一期差不多完成了,剩下的就是測試和優化,再加上未考慮全面的攻擊類型。
怎么說呢,以前對tcp/ip協議方面沒有往底層深入了解過,只知道網絡編程模型原理和基本的三次握手和四次揮手的過程及一些問題。有次客戶端發起連接,發了syn包后,服務器回了個錯誤的syn ack且并沒有checksum[這個過程比較費時],然后客戶端沒有回rst包,看tcp三次握手的源碼時才知道它會先檢查checksum,不正確就不會接著檢查ack了,接著對錯誤的ack回rst包,所以服務器這邊要checksum,客戶端那邊checksum正確后檢查ack發現不對就回rst包了。
過程中也面試了一些候選人,出了一套基礎筆試題,還是感覺基礎很重要。
做這個項目成長很多,對知識點和考慮問題不走常規路線,反其道而行,有很大的提升,雖然一天到晚工作,很少看手機,而且就和我和另一位同事在開發,比較緊的,但有些成就感,希望把它做好。