# DDoS 基礎了解


## 基礎簡介

常常用到的網路協定包含：

* L3: ICMP
* L4: TCP/UDP
* L7: HTTP

打的受害目標：

* 網卡頻寬
* 一般電腦
  * CPU 的軟中斷 (%si)。即使頻寬沒滿，如果每秒湧入千萬個小封包，CPU 會花光所有時間在處理網卡中斷，導致系統崩潰
  * Kernel State Tables，SYN Backlog Queue 與 Conntrack Table。核心必須記住「誰還沒完成三次握手」。當這些表格滿了，系統會直接丟棄後續所有新連線
* 防火牆
  * 也是有 Conntrack Table
* 應用程式的資源，像是 Web Server (Nginx/Apache) 或資料庫
  * File Descriptors (FD)、Thread Pool、Memory、Database Connections

```bash
kola:~$ sysctl net.netfilter.nf_conntrack_max
net.netfilter.nf_conntrack_max = 262144
kola:~$ sysctl net.netfilter.nf_conntrack_count
net.netfilter.nf_conntrack_count = 213
kola:~$ cat /proc/sys/net/netfilter/nf_conntrack_buckets
262144
```

這是系統允許同時追蹤的最大連線數量。當這個數字滿了，系統就會開始丟棄新的連線封包，一般電腦不一定會用到 nf_conntrack，但很常會用到，像是 Docker 等應用程式。

### TCP/UDP

1. TCP 因為可能要三層握手，所以大部分攻擊時不能造假 IP，所以會需要像是殭屍網路有真的 IP 來發起攻擊
2. UDP 可以造假 IP，因為不用握手

## 頻寬消耗型攻擊

通常攻擊封包會偽造來源 IP 避免被禁用。

### L3

1. ICMP flood: 就是 Echo，不停地 Ping，對方也必須回應，所以會導致對方的上傳頻寬消耗（上傳頻寬比較稀有）
   1. 更進階的利用反射的攻擊叫做 Smurf Attack，等下章節會講
   2. ICMPv6 在 IPv6 比較重要，因為 IPv6 的鄰居發現（Neighbor Discovery, ND）和路由宣告（RA）都靠 ICMPv6
2. IGMP flood: 管理 Multicast 成員的協議，通常只能在 LAN 裡面發生

上面兩個現在都被 ISP 機制防禦了，在邊界路由器上都有設定 ICMP Rate Limiting（限速）。如果你發出的 Ping 流量大到像洪水，邊界設備在進到受害者網段前就會直接丟包（Drop）。

而 IGMP 是用來管理多播（Multicast）的協議。絕大多數的 ISP 邊界路由器會直接過濾掉來自外部（WAN 端）的 IGMP 封包，IGMP 的 TTL（存活時間）通常被強制設為 1。這代表這個封包「不准跨過路由器」。

### L4

* UDP flood: 根據設定封包的大小，可以對不同的受害者造成困擾
  * 小包：像是 64 byte，數量較多但小，對 router 造成困擾
  * 大包：像是 1500 byte，超過 MTU 單元，強迫受害者重組封包，數量較少但大包，對頻寬造成困擾
* TCP PUSH + ACK flood: 許多簡單的防火牆或路由器為了效能，會採用「無狀態（Stateless）」過濾。它們會直接放行所有帶著 ACK 的封包，因為這看起來像是「已經建立連線（Established）」的合法流量
  * 正常的 TCP 會為了效能把收到的資料先放在核心緩衝區（Buffer），等集滿一大塊再交給應用程式（如 NGINX）。但 PSH Flag 是在告訴核心：「不要等了，立刻（Push）把這段資料丟給應用程式處理！」
  * 收到 ACK 的時候，核心必須先在 TCP 連接表（TCB） 或 Conntrack 表 中搜尋：「這組 IP+Port 的連線真的存在嗎？」，如果不存在會回 RST 封包

這邊會有兩種表格：

* TCP 雜湊表 (TCP Hash Table)，核心都會有
* Conntrack Table，只有特定開啟才有

### 放大攻擊

UDP 放大攻擊是一種常見的反射型 DDoS 攻擊，攻擊者利用開放的 UDP 服務來產生比原始請求更大的回應流量，將這些流量反射到受害者身上，造成網路擁塞或服務中斷。

...

## L4 資源消耗型攻擊 (攻擊連接表)

如果攻擊者知道你沒開連線表，他可以發動更高級的 「無狀態攻擊」：因為你沒記住連線狀態，他可以繞過很多行為偵測規則。

所以這邊是假設對方已經開啟連接表，或者可能有防火牆，我們要打他，這時候連接表還是可能成為瓶頸，受到攻擊。

...

## L7 資源消耗型攻擊 (消耗目標 IO)

...

## 防禦

### L3/L4

...

### L7

...

## Reference

* [L4Drop: XDP DDoS Mitigations](https://blog.cloudflare.com/l4drop-xdp-ebpf-based-ddos-mitigations/)：2018 年使用 XDP
* [Cloudflare開源可用於防止DoS攻擊的XDP封包捕捉工具](https://www.ithome.com.tw/news/130244)
* [Cloudflare 如何自動緩解一起破世界紀錄的 3.8 Tbps DDoS 攻擊](https://blog.cloudflare.com/zh-tw/how-cloudflare-auto-mitigated-world-record-3-8-tbps-ddos-attack/)
* [SYN packet handling in the wild](https://blog.cloudflare.com/syn-packet-handling-in-the-wild/)

