แƒฉแƒ•แƒ”แƒœ แƒ•แƒฌแƒ”แƒ แƒ— แƒ“แƒแƒชแƒ•แƒแƒก DDoS แƒจแƒ”แƒขแƒ”แƒ•แƒ”แƒ‘แƒ˜แƒกแƒ’แƒแƒœ XDP-แƒ–แƒ”. แƒ‘แƒ˜แƒ แƒ—แƒ•แƒฃแƒšแƒ˜ แƒœแƒแƒฌแƒ˜แƒšแƒ˜

eXpress แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒ˜แƒšแƒ˜แƒ™แƒ˜แƒก (XDP) แƒขแƒ”แƒฅแƒœแƒแƒšแƒแƒ’แƒ˜แƒ แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ˜แƒซแƒšแƒ”แƒ•แƒ แƒขแƒ แƒแƒคแƒ˜แƒ™แƒ˜แƒก แƒ—แƒ•แƒ˜แƒ—แƒœแƒ”แƒ‘แƒฃแƒ แƒ˜ แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ Linux แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒ”แƒ‘แƒ–แƒ”, แƒกแƒแƒœแƒแƒ› แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜ แƒจแƒ”แƒ•แƒ แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒ“แƒแƒกแƒขแƒแƒจแƒ˜. XDP-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ - แƒ“แƒแƒชแƒ•แƒ DDoS แƒจแƒ”แƒขแƒ”แƒ•แƒ”แƒ‘แƒ˜แƒกแƒ’แƒแƒœ (CloudFlare), แƒ แƒ—แƒฃแƒšแƒ˜ แƒคแƒ˜แƒšแƒขแƒ แƒ”แƒ‘แƒ˜, แƒกแƒขแƒแƒขแƒ˜แƒกแƒขแƒ˜แƒ™แƒ˜แƒก แƒจแƒ”แƒ’แƒ แƒแƒ•แƒ”แƒ‘แƒ (Netflix). XDP แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ”แƒ‘แƒ˜ แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ eBPF แƒ•แƒ˜แƒ แƒขแƒฃแƒแƒšแƒฃแƒ แƒ˜ แƒ›แƒแƒœแƒฅแƒแƒœแƒ˜แƒก แƒ›แƒ˜แƒ”แƒ  แƒ“แƒ, แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒกแƒแƒ“, แƒแƒฅแƒ•แƒก แƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒ•แƒ”แƒ‘แƒ˜ แƒ แƒแƒ’แƒแƒ แƒช แƒ›แƒแƒ— แƒ™แƒแƒ“แƒ–แƒ”, แƒแƒกแƒ”แƒ•แƒ” แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ› แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ–แƒ”, แƒคแƒ˜แƒšแƒขแƒ แƒ˜แƒก แƒขแƒ˜แƒžแƒ˜แƒก แƒ›แƒ˜แƒฎแƒ”แƒ“แƒ•แƒ˜แƒ—.

แƒกแƒขแƒแƒขแƒ˜แƒ แƒ›แƒ˜แƒ–แƒœแƒแƒ“ แƒ˜แƒกแƒแƒฎแƒแƒ•แƒก XDP-แƒ–แƒ” แƒแƒ แƒกแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒ แƒแƒ•แƒแƒšแƒ˜ แƒ›แƒแƒกแƒแƒšแƒ˜แƒก แƒœแƒแƒ™แƒšแƒแƒ•แƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒแƒœแƒแƒ–แƒฆแƒแƒฃแƒ แƒ”แƒ‘แƒแƒก. แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒ แƒ˜แƒ’แƒจแƒ˜, แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒ”แƒœ แƒ›แƒ–แƒ แƒ™แƒแƒ“แƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ“แƒแƒฃแƒงแƒแƒ•แƒœแƒ”แƒ‘แƒšแƒ˜แƒ• แƒ’แƒ•แƒ”แƒ แƒ“แƒก แƒฃแƒ•แƒšแƒ˜แƒก XDP-แƒ˜แƒก แƒ›แƒแƒฎแƒแƒกแƒ˜แƒแƒ—แƒ”แƒ‘แƒšแƒ”แƒ‘แƒก: แƒ›แƒแƒ›แƒ–แƒแƒ“แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ’แƒแƒ“แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒแƒœ แƒซแƒแƒšแƒ˜แƒแƒœ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜แƒ แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒฌแƒแƒ แƒ›แƒแƒจแƒแƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ›แƒแƒ’แƒ•แƒ˜แƒแƒœแƒ”แƒ‘แƒ˜แƒ— แƒชแƒ“แƒ˜แƒšแƒแƒ‘แƒ— แƒ“แƒแƒฌแƒ”แƒ แƒแƒ— แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ แƒ™แƒแƒ“แƒ˜ แƒœแƒฃแƒšแƒ˜แƒ“แƒแƒœ, แƒแƒ  แƒ’แƒ”แƒกแƒ›แƒ˜แƒ—, แƒ แƒ แƒฃแƒœแƒ“แƒ แƒ’แƒแƒแƒ™แƒ”แƒ—แƒแƒ— แƒขแƒ˜แƒžแƒ˜แƒฃแƒ  แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ”แƒ‘แƒ—แƒแƒœ. แƒ›แƒ”แƒแƒ แƒ”แƒช, แƒ˜แƒก แƒแƒ  แƒ›แƒแƒ˜แƒชแƒแƒ•แƒก XDP แƒแƒ“แƒ’แƒ˜แƒšแƒแƒ‘แƒ แƒ˜แƒ•แƒแƒ“ แƒขแƒ”แƒกแƒขแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒ’แƒ–แƒ”แƒ‘แƒก VM-แƒ˜แƒกแƒ แƒ“แƒ แƒแƒžแƒแƒ แƒแƒขแƒฃแƒ แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”, แƒ›แƒ˜แƒฃแƒฎแƒ”แƒ“แƒแƒ•แƒแƒ“ แƒ˜แƒ›แƒ˜แƒกแƒ, แƒ แƒแƒ› แƒ›แƒแƒ— แƒแƒฅแƒ•แƒ— แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ แƒฎแƒแƒ แƒ•แƒ”แƒ–แƒ”แƒ‘แƒ˜. แƒขแƒ”แƒฅแƒกแƒขแƒ˜ แƒ’แƒแƒœแƒ™แƒฃแƒ—แƒ•แƒœแƒ˜แƒšแƒ˜แƒ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒกแƒขแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒ™แƒแƒ แƒ’แƒแƒ“ แƒ˜แƒชแƒœแƒแƒ‘แƒ”แƒœ แƒฅแƒกแƒ”แƒšแƒ”แƒ‘แƒกแƒ แƒ“แƒ Linux-แƒก, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒ“แƒแƒ˜แƒœแƒขแƒ”แƒ แƒ”แƒกแƒ”แƒ‘แƒฃแƒšแƒœแƒ˜ แƒแƒ แƒ˜แƒแƒœ XDP-แƒ˜แƒ— แƒ“แƒ eBPF-แƒ˜แƒ—.

แƒแƒ› แƒœแƒแƒฌแƒ˜แƒšแƒจแƒ˜ แƒฉแƒ•แƒ”แƒœ แƒ“แƒ”แƒขแƒแƒšแƒฃแƒ แƒแƒ“ แƒ’แƒแƒ•แƒ˜แƒ’แƒ”แƒ‘แƒ—, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒแƒ แƒ˜แƒก แƒแƒฌแƒงแƒแƒ‘แƒ˜แƒšแƒ˜ XDP แƒคแƒ˜แƒšแƒขแƒ แƒ˜ แƒ“แƒ แƒ แƒแƒ’แƒแƒ  แƒจแƒ”แƒ•แƒแƒ›แƒแƒฌแƒ›แƒแƒ— แƒ˜แƒ’แƒ˜, แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ“แƒแƒ•แƒฌแƒ”แƒ แƒ— แƒชแƒœแƒแƒ‘แƒ˜แƒšแƒ˜ SYN แƒฅแƒฃแƒฅแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ”แƒฅแƒแƒœแƒ˜แƒ–แƒ›แƒ˜แƒก แƒ›แƒแƒ แƒขแƒ˜แƒ• แƒ•แƒ”แƒ แƒกแƒ˜แƒแƒก แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ–แƒ”. แƒกแƒแƒœแƒแƒ› แƒแƒ  แƒจแƒ”แƒ•แƒฅแƒ›แƒœแƒ˜แƒ— "แƒ—แƒ”แƒ—แƒ  แƒกแƒ˜แƒแƒก"
แƒ“แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜, แƒจแƒ”แƒ˜แƒœแƒแƒฎแƒ”แƒ— แƒ›แƒ แƒ˜แƒชแƒฎแƒ•แƒ”แƒšแƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ›แƒแƒ แƒ—แƒ”แƒ— แƒคแƒ˜แƒšแƒขแƒ แƒ˜ - แƒกแƒแƒ™แƒ›แƒแƒ แƒ˜แƒกแƒ˜ แƒŸแƒฃแƒ แƒœแƒแƒšแƒ˜.

แƒฉแƒ•แƒ”แƒœ แƒ“แƒแƒ•แƒฌแƒ”แƒ แƒ— C - แƒ”แƒก แƒแƒ  แƒแƒ แƒ˜แƒก แƒ›แƒแƒ“แƒฃแƒ แƒ˜, แƒ›แƒแƒ’แƒ แƒแƒ› แƒžแƒ แƒแƒฅแƒขแƒ˜แƒ™แƒฃแƒšแƒ˜. แƒงแƒ•แƒ”แƒšแƒ แƒ™แƒแƒ“แƒ˜ แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒ GitHub-แƒ–แƒ” แƒ‘แƒแƒšแƒ แƒ‘แƒ›แƒฃแƒšแƒ–แƒ” แƒ“แƒ แƒ“แƒแƒงแƒแƒคแƒ˜แƒšแƒ˜แƒ แƒ•แƒแƒšแƒ“แƒ”แƒ‘แƒฃแƒšแƒ”แƒ‘แƒ”แƒ‘แƒแƒ“ แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ แƒแƒฆแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜ แƒœแƒแƒ‘แƒ˜แƒฏแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒฎแƒ”แƒ“แƒ•แƒ˜แƒ—.

แƒžแƒแƒกแƒฃแƒฎแƒ˜แƒกแƒ›แƒ’แƒ”แƒ‘แƒšแƒแƒ‘แƒ˜แƒก แƒฃแƒแƒ แƒงแƒแƒคแƒ. แƒกแƒขแƒแƒขแƒ˜แƒ˜แƒก แƒ›แƒกแƒ•แƒšแƒ”แƒšแƒแƒ‘แƒ˜แƒกแƒแƒก แƒจแƒ”แƒ›แƒฃแƒจแƒแƒ•แƒ“แƒ”แƒ‘แƒ แƒ›แƒ˜แƒœแƒ˜ แƒ’แƒแƒ“แƒแƒฌแƒงแƒ•แƒ”แƒขแƒ DDoS แƒจแƒ”แƒขแƒ”แƒ•แƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒกแƒแƒ’แƒ”แƒ แƒ˜แƒ”แƒ‘แƒšแƒแƒ“, แƒ แƒแƒ“แƒ’แƒแƒœ แƒ”แƒก แƒแƒ แƒ˜แƒก แƒ แƒ”แƒแƒšแƒ˜แƒกแƒขแƒฃแƒ แƒ˜ แƒแƒ›แƒแƒชแƒแƒœแƒ XDP-แƒกแƒ—แƒ•แƒ˜แƒก แƒ“แƒ แƒฉแƒ”แƒ›แƒ˜ แƒขแƒ”แƒ แƒ˜แƒขแƒแƒ แƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒ—แƒฃแƒ›แƒชแƒ, แƒ›แƒ—แƒแƒ•แƒแƒ แƒ˜ แƒ›แƒ˜แƒ–แƒแƒœแƒ˜ แƒขแƒ”แƒฅแƒœแƒแƒšแƒแƒ’แƒ˜แƒ˜แƒก แƒ’แƒแƒ’แƒ”แƒ‘แƒแƒ, แƒ”แƒก แƒแƒ  แƒแƒ แƒ˜แƒก แƒ›แƒ–แƒ แƒ“แƒแƒชแƒ•แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒก แƒกแƒแƒฎแƒ”แƒšแƒ›แƒซแƒฆแƒ•แƒแƒœแƒ”แƒšแƒ. แƒกแƒแƒ›แƒ”แƒฃแƒ แƒ•แƒ”แƒ แƒ™แƒแƒ“แƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒก แƒแƒžแƒขแƒ˜แƒ›แƒ˜แƒ–แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ“แƒ แƒ’แƒแƒ›แƒแƒขแƒแƒ•แƒ”แƒ‘แƒก แƒ–แƒแƒ’แƒ˜แƒ”แƒ แƒ— แƒœแƒ˜แƒฃแƒแƒœแƒกแƒก.

XDP-แƒ˜แƒก แƒ›แƒแƒ™แƒšแƒ” แƒ›แƒ˜แƒ›แƒแƒฎแƒ˜แƒšแƒ•แƒ

แƒ“แƒแƒ•แƒแƒกแƒแƒฎแƒ”แƒšแƒ”แƒ‘ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“ แƒžแƒฃแƒœแƒฅแƒขแƒ”แƒ‘แƒก, แƒ แƒแƒ—แƒ แƒแƒ  แƒ›แƒแƒฎแƒ“แƒ”แƒก แƒ“แƒแƒ™แƒฃแƒ›แƒ”แƒœแƒขแƒแƒชแƒ˜แƒ˜แƒก แƒ“แƒ แƒแƒ แƒกแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒกแƒขแƒแƒขแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ“แƒฃแƒ‘แƒšแƒ˜แƒ แƒ”แƒ‘แƒ.

แƒแƒกแƒ” แƒ แƒแƒ›, แƒคแƒ˜แƒšแƒขแƒ แƒ˜แƒก แƒ™แƒแƒ“แƒ˜ แƒ˜แƒขแƒ•แƒ˜แƒ แƒ—แƒ”แƒ‘แƒ แƒ‘แƒ˜แƒ แƒ—แƒ•แƒจแƒ˜. แƒคแƒ˜แƒšแƒขแƒ แƒก แƒ’แƒแƒ“แƒแƒ”แƒชแƒ”แƒ›แƒ แƒจแƒ”แƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜. แƒจแƒ”แƒ“แƒ”แƒ’แƒแƒ“, แƒคแƒ˜แƒšแƒขแƒ แƒ›แƒ แƒฃแƒœแƒ“แƒ แƒ›แƒ˜แƒ˜แƒฆแƒแƒก แƒ’แƒแƒ“แƒแƒฌแƒงแƒ•แƒ”แƒขแƒ˜แƒšแƒ”แƒ‘แƒ: แƒ’แƒแƒ“แƒแƒกแƒชแƒ”แƒก แƒžแƒแƒ™แƒ”แƒขแƒ˜ แƒ‘แƒ˜แƒ แƒ—แƒ•แƒก (XDP_PASS), แƒฉแƒแƒ›แƒแƒแƒ’แƒ“แƒ” แƒžแƒแƒ™แƒ”แƒขแƒ˜ (XDP_DROP) แƒแƒœ แƒ’แƒแƒฃแƒ’แƒ–แƒแƒ•แƒœแƒ” แƒฃแƒ™แƒแƒœ (XDP_TX). แƒคแƒ˜แƒšแƒขแƒ แƒก แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒจแƒ”แƒชแƒ•แƒแƒšแƒแƒก แƒžแƒแƒ™แƒ”แƒขแƒ˜, แƒ”แƒก แƒ’แƒแƒœแƒกแƒแƒ™แƒฃแƒ—แƒ แƒ”แƒ‘แƒ˜แƒ— แƒ”แƒฎแƒ”แƒ‘แƒ XDP_TX. แƒ—แƒฅแƒ•แƒ”แƒœ แƒแƒกแƒ”แƒ•แƒ” แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ“แƒแƒจแƒแƒšแƒแƒ— แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ (XDP_ABORTED) แƒ“แƒ แƒฉแƒแƒ›แƒแƒแƒ’แƒ“แƒ”แƒ— แƒžแƒแƒ™แƒ”แƒขแƒ˜, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ”แƒก แƒแƒœแƒแƒšแƒแƒ’แƒ˜แƒฃแƒ แƒ˜แƒ assert(0) - แƒ’แƒแƒ›แƒแƒ แƒ—แƒ•แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

eBPF (แƒ’แƒแƒคแƒแƒ แƒ—แƒแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ‘แƒ”แƒ แƒ™แƒšแƒ˜แƒก แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒคแƒ˜แƒšแƒขแƒ แƒ˜) แƒ•แƒ˜แƒ แƒขแƒฃแƒแƒšแƒฃแƒ แƒ˜ แƒ›แƒแƒœแƒฅแƒแƒœแƒ แƒ’แƒแƒœแƒ–แƒ แƒแƒฎ แƒ’แƒแƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ˜แƒกแƒ”, แƒ แƒแƒ› แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ›แƒ แƒจแƒ”แƒซแƒšแƒแƒก แƒจแƒ”แƒแƒ›แƒแƒฌแƒ›แƒแƒก, แƒ แƒแƒ› แƒ™แƒแƒ“แƒ˜ แƒแƒ  แƒฎแƒ•แƒ“แƒ”แƒ‘แƒ แƒ“แƒ แƒแƒ  แƒแƒ–แƒ˜แƒแƒœแƒ”แƒ‘แƒก แƒกแƒฎแƒ•แƒ แƒแƒ“แƒแƒ›แƒ˜แƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ”แƒฎแƒกแƒ˜แƒ”แƒ แƒ”แƒ‘แƒแƒก. แƒ™แƒฃแƒ›แƒฃแƒšแƒแƒชแƒ˜แƒฃแƒ แƒ˜ แƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒ•แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ”แƒ‘แƒ˜:

  • แƒ›แƒแƒ แƒงแƒฃแƒŸแƒ”แƒ‘แƒ˜ (แƒฃแƒ™แƒแƒœ แƒ’แƒแƒ“แƒแƒฎแƒขแƒแƒ›แƒ) แƒแƒ™แƒ แƒซแƒแƒšแƒฃแƒšแƒ˜แƒ.
  • แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒกแƒขแƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒก (แƒงแƒ•แƒ”แƒšแƒ C แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ แƒฃแƒœแƒ“แƒ แƒ˜แƒงแƒแƒก แƒฉแƒแƒกแƒ›แƒฃแƒšแƒ˜).
  • แƒแƒ™แƒ แƒซแƒแƒšแƒฃแƒšแƒ˜แƒ แƒฌแƒ•แƒ“แƒแƒ›แƒ แƒ›แƒ”แƒฎแƒกแƒ˜แƒ”แƒ แƒ”แƒ‘แƒแƒ–แƒ” แƒกแƒขแƒ”แƒ™แƒ˜แƒกแƒ แƒ“แƒ แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒ‘แƒฃแƒคแƒ”แƒ แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒ—.
  • แƒ™แƒแƒ“แƒ˜แƒก แƒ–แƒแƒ›แƒ แƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒฃแƒšแƒ˜แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒžแƒ แƒแƒฅแƒขแƒ˜แƒ™แƒแƒจแƒ˜ แƒ”แƒก แƒแƒ  แƒแƒ แƒ˜แƒก แƒซแƒแƒšแƒ˜แƒแƒœ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœแƒ˜.
  • แƒ“แƒแƒกแƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒกแƒžแƒ”แƒชแƒ˜แƒแƒšแƒฃแƒ แƒ˜ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜ (eBPF แƒ“แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ”แƒ‘แƒ˜).

แƒคแƒ˜แƒšแƒขแƒ แƒ˜แƒก แƒจแƒ”แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ แƒ“แƒ แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ แƒแƒกแƒ” แƒ’แƒแƒ›แƒแƒ˜แƒงแƒฃแƒ แƒ”แƒ‘แƒ:

  1. แƒฌแƒงแƒแƒ แƒแƒก แƒ™แƒแƒ“แƒ˜ (แƒ›แƒแƒ’. kernel.c) แƒแƒฌแƒงแƒแƒ‘แƒก แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒก (kernel.o) eBPF แƒ•แƒ˜แƒ แƒขแƒฃแƒแƒšแƒฃแƒ แƒ˜ แƒ›แƒแƒœแƒฅแƒแƒœแƒ˜แƒก แƒแƒ แƒฅแƒ˜แƒขแƒ”แƒฅแƒขแƒฃแƒ แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. 2019 แƒฌแƒšแƒ˜แƒก แƒแƒฅแƒขแƒแƒ›แƒ‘แƒ แƒ˜แƒก แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ˜แƒ—, eBPF-แƒจแƒ˜ แƒจแƒ”แƒ“แƒ’แƒ”แƒœแƒแƒก แƒ›แƒฎแƒแƒ แƒก แƒฃแƒญแƒ”แƒ แƒก Clang แƒ“แƒ แƒ“แƒแƒžแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ GCC 10.1-แƒจแƒ˜.
  2. แƒ—แƒฃ แƒแƒ› แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜แƒก แƒ™แƒแƒ“แƒจแƒ˜ แƒแƒ แƒ˜แƒก แƒ–แƒแƒ แƒ”แƒ‘แƒ˜ แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ”แƒ‘แƒ–แƒ” (แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒชแƒฎแƒ แƒ˜แƒšแƒ”แƒ‘แƒกแƒ แƒ“แƒ แƒ›แƒ แƒ˜แƒชแƒฎแƒ•แƒ”แƒšแƒ”แƒ‘แƒ–แƒ”), แƒ›แƒแƒ—แƒ˜ ID-แƒ”แƒ‘แƒ˜แƒก แƒœแƒแƒชแƒ•แƒšแƒแƒ“ แƒแƒ แƒ˜แƒก แƒœแƒฃแƒšแƒ”แƒ‘แƒ˜, แƒแƒœแƒฃ แƒแƒกแƒ”แƒ—แƒ˜ แƒ™แƒแƒ“แƒ˜ แƒแƒ  แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ“แƒ”แƒก. แƒ‘แƒ˜แƒ แƒ—แƒ•แƒจแƒ˜ แƒฉแƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒแƒ›แƒ“แƒ”, แƒ”แƒก แƒœแƒฃแƒšแƒ”แƒ‘แƒ˜ แƒฃแƒœแƒ“แƒ แƒจแƒ”แƒ˜แƒชแƒ•แƒแƒšแƒแƒก แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒ’แƒแƒ›แƒแƒซแƒแƒฎแƒ”แƒ‘แƒ˜แƒ— แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒšแƒ˜ แƒ™แƒแƒœแƒ™แƒ แƒ”แƒขแƒฃแƒšแƒ˜ แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ”แƒ‘แƒ˜แƒก ID-แƒ”แƒ‘แƒ˜แƒ— (แƒ“แƒแƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ— แƒ™แƒแƒ“แƒ˜). แƒแƒ›แƒ˜แƒก แƒ’แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ’แƒแƒ แƒ” แƒ™แƒแƒ›แƒฃแƒœแƒแƒšแƒฃแƒ แƒ˜ แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒ—, แƒแƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ“แƒแƒฌแƒ”แƒ แƒแƒ— แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ“แƒแƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒก แƒ“แƒ แƒฉแƒแƒขแƒ•แƒ˜แƒ แƒ—แƒแƒ•แƒก แƒ™แƒแƒœแƒ™แƒ แƒ”แƒขแƒฃแƒš แƒคแƒ˜แƒšแƒขแƒ แƒก.
  3. แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜ แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒก แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒก แƒฉแƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒแƒก. แƒ˜แƒก แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒก แƒชแƒ˜แƒ™แƒšแƒ”แƒ‘แƒ˜แƒก แƒแƒ แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒแƒก แƒ“แƒ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒกแƒ แƒ“แƒ แƒกแƒขแƒ”แƒ™แƒ˜แƒก แƒกแƒแƒ–แƒฆแƒ•แƒ แƒ”แƒ‘แƒ˜แƒ“แƒแƒœ แƒแƒ  แƒ’แƒแƒกแƒ•แƒšแƒแƒก. แƒ—แƒฃ แƒจแƒ”แƒ›แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ”แƒšแƒก แƒแƒ  แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒ“แƒแƒแƒ›แƒขแƒ™แƒ˜แƒชแƒแƒก, แƒ แƒแƒ› แƒ™แƒแƒ“แƒ˜ แƒกแƒฌแƒแƒ แƒ˜แƒ, แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ แƒฃแƒแƒ แƒงแƒแƒคแƒ˜แƒšแƒ˜แƒ - แƒ›แƒแƒก แƒฃแƒœแƒ“แƒ แƒ›แƒแƒ”แƒฌแƒแƒœแƒแƒก.
  4. แƒฌแƒแƒ แƒ›แƒแƒขแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ’แƒแƒ“แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜ แƒแƒ’แƒ แƒแƒ•แƒ”แƒ‘แƒก eBPF แƒแƒ แƒฅแƒ˜แƒขแƒ”แƒฅแƒขแƒฃแƒ แƒ˜แƒก แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜แƒก แƒ™แƒแƒ“แƒก แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ˜แƒก แƒแƒ แƒฅแƒ˜แƒขแƒ”แƒฅแƒขแƒฃแƒ แƒ˜แƒก แƒ›แƒแƒœแƒฅแƒแƒœแƒ˜แƒก แƒ™แƒแƒ“แƒจแƒ˜ (แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒ“แƒ แƒแƒฃแƒšแƒแƒ“).
  5. แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ แƒ”แƒ แƒ—แƒ•แƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒก แƒ“แƒ แƒ˜แƒฌแƒงแƒ”แƒ‘แƒก แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒแƒก.

แƒ•แƒ˜แƒœแƒแƒ˜แƒ“แƒแƒœ XDP แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก แƒ‘แƒ˜แƒ แƒ—แƒ•แƒจแƒ˜, แƒ’แƒแƒ›แƒแƒ แƒ—แƒ•แƒ แƒ”แƒคแƒฃแƒซแƒœแƒ”แƒ‘แƒ แƒ™แƒ•แƒแƒšแƒ˜แƒก แƒŸแƒฃแƒ แƒœแƒแƒšแƒ”แƒ‘แƒก แƒ“แƒ, แƒคแƒแƒฅแƒขแƒแƒ‘แƒ แƒ˜แƒ•แƒแƒ“, แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒก, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒกแƒแƒช แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ แƒคแƒ˜แƒšแƒขแƒ แƒแƒ•แƒก แƒแƒœ แƒฅแƒ›แƒœแƒ˜แƒก. แƒ—แƒฃแƒ›แƒชแƒ, eBPF แƒ˜แƒœแƒแƒฎแƒแƒ•แƒก แƒฉแƒแƒ›แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒฃแƒš แƒ™แƒแƒ“แƒก แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒแƒกแƒ” แƒ แƒแƒ› แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ”แƒฅแƒกแƒžแƒ”แƒ แƒ˜แƒ›แƒ”แƒœแƒขแƒ˜ XDP-แƒ˜แƒ— แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ  แƒ—แƒฅแƒ•แƒ”แƒœแƒก แƒแƒ“แƒ’แƒ˜แƒšแƒแƒ‘แƒ แƒ˜แƒ• Linux-แƒ–แƒ”.

แƒ’แƒแƒ แƒ”แƒ›แƒแƒก แƒ›แƒแƒ›แƒ–แƒแƒ“แƒ”แƒ‘แƒ

แƒแƒกแƒแƒ›แƒ‘แƒšแƒ”แƒ

Clang-แƒก แƒแƒ  แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ  แƒ’แƒแƒกแƒชแƒ”แƒก แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜แƒก แƒ™แƒแƒ“แƒ˜ eBPF แƒแƒ แƒฅแƒ˜แƒขแƒ”แƒฅแƒขแƒฃแƒ แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒแƒ›แƒ˜แƒขแƒแƒ› แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜ แƒจแƒ”แƒ“แƒ’แƒ”แƒ‘แƒ แƒแƒ แƒ˜ แƒ”แƒขแƒแƒžแƒ˜แƒกแƒ’แƒแƒœ:

  1. C แƒ™แƒแƒ“แƒ˜แƒก แƒจแƒ”แƒ“แƒ’แƒ”แƒœแƒ LLVM แƒ‘แƒแƒ˜แƒขแƒ˜แƒ™แƒแƒ“แƒจแƒ˜ (clang -emit-llvm).
  2. แƒ’แƒแƒ“แƒแƒ˜แƒงแƒ•แƒแƒœแƒ”แƒ— แƒ‘แƒแƒ˜แƒขแƒ˜แƒ™แƒแƒ“แƒ˜ eBPF แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜แƒก แƒ™แƒแƒ“แƒจแƒ˜ (llc -march=bpf -filetype=obj).

แƒคแƒ˜แƒšแƒขแƒ แƒ˜แƒก แƒ“แƒแƒฌแƒ”แƒ แƒ˜แƒกแƒแƒก แƒกแƒแƒกแƒแƒ แƒ’แƒ”แƒ‘แƒšแƒ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒคแƒแƒ˜แƒšแƒ˜ แƒ“แƒแƒ›แƒฎแƒ›แƒแƒ แƒ” แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒ—แƒ แƒ“แƒ แƒ›แƒแƒ™แƒ แƒแƒ”แƒ‘แƒ˜แƒ— แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒขแƒ”แƒกแƒขแƒ”แƒ‘แƒ˜แƒ“แƒแƒœ. แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœแƒ˜แƒ, แƒ แƒแƒ› แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒแƒ“แƒ”แƒก แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒ•แƒ”แƒ แƒกแƒ˜แƒแƒก (KVER). แƒฉแƒแƒ›แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ”แƒ— แƒ˜แƒกแƒ˜แƒœแƒ˜ helpers/:

export KVER=v5.3.7
export BASE=https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/plain/tools/testing/selftests/bpf
wget -P helpers --content-disposition "${BASE}/bpf_helpers.h?h=${KVER}" "${BASE}/bpf_endian.h?h=${KVER}"
unset KVER BASE

Makefile Arch Linux-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก (แƒ™แƒ”แƒ แƒœแƒ”แƒšแƒ˜ 5.3.7):

CLANG ?= clang
LLC ?= llc

KDIR ?= /lib/modules/$(shell uname -r)/build
ARCH ?= $(subst x86_64,x86,$(shell uname -m))

CFLAGS = 
    -Ihelpers 
    
    -I$(KDIR)/include 
    -I$(KDIR)/include/uapi 
    -I$(KDIR)/include/generated/uapi 
    -I$(KDIR)/arch/$(ARCH)/include 
    -I$(KDIR)/arch/$(ARCH)/include/generated 
    -I$(KDIR)/arch/$(ARCH)/include/uapi 
    -I$(KDIR)/arch/$(ARCH)/include/generated/uapi 
    -D__KERNEL__ 
    
    -fno-stack-protector -O2 -g

xdp_%.o: xdp_%.c Makefile
    $(CLANG) -c -emit-llvm $(CFLAGS) $< -o - | 
    $(LLC) -march=bpf -filetype=obj -o $@

.PHONY: all clean

all: xdp_filter.o

clean:
    rm -f ./*.o

KDIR แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒก แƒ’แƒ–แƒแƒก แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒกแƒแƒ—แƒแƒฃแƒ แƒ”แƒ‘แƒ˜แƒกแƒ™แƒ”แƒœ, ARCH - แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒฃแƒ แƒ˜ แƒแƒ แƒฅแƒ˜แƒขแƒ”แƒฅแƒขแƒฃแƒ แƒ. แƒ‘แƒ˜แƒšแƒ˜แƒ™แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒฎแƒ”แƒšแƒกแƒแƒฌแƒงแƒแƒ”แƒ‘แƒ˜ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒแƒ“แƒœแƒแƒ• แƒ’แƒแƒœแƒกแƒฎแƒ•แƒแƒ•แƒ“แƒ”แƒ‘แƒแƒ“แƒ”แƒก แƒ’แƒแƒœแƒแƒฌแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒก แƒจแƒแƒ แƒ˜แƒก.

แƒ’แƒแƒœแƒกแƒฎแƒ•แƒแƒ•แƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜ Debian 10-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก (แƒ™แƒ”แƒ แƒœแƒ”แƒšแƒ˜ 4.19.67)

# ะดั€ัƒะณะฐั ะบะพะผะฐะฝะดะฐ
CLANG ?= clang
LLC ?= llc-7

# ะดั€ัƒะณะพะน ะบะฐั‚ะฐะปะพะณ
KDIR ?= /usr/src/linux-headers-$(shell uname -r)
ARCH ?= $(subst x86_64,x86,$(shell uname -m))

# ะดะฒะฐ ะดะพะฟะพะปะฝะธั‚ะตะปัŒะฝั‹ั… ะบะฐั‚ะฐะปะพะณะฐ -I
CFLAGS = 
    -Ihelpers 
    
    -I/usr/src/linux-headers-4.19.0-6-common/include 
    -I/usr/src/linux-headers-4.19.0-6-common/arch/$(ARCH)/include 
    # ะดะฐะปะตะต ะฑะตะท ะธะทะผะตะฝะตะฝะธะน

CFLAGS แƒ›แƒแƒ˜แƒชแƒแƒ•แƒก แƒ“แƒ˜แƒ แƒ”แƒฅแƒขแƒแƒ แƒ˜แƒแƒก แƒ“แƒแƒ›แƒฎแƒ›แƒแƒ แƒ” แƒกแƒแƒ—แƒแƒฃแƒ แƒ”แƒ‘แƒ˜แƒ— แƒ“แƒ แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ“แƒ˜แƒ แƒ”แƒฅแƒขแƒแƒ แƒ˜แƒแƒก แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒกแƒแƒ—แƒแƒฃแƒ แƒ”แƒ‘แƒ˜แƒ—. แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒ __KERNEL__ แƒœแƒ˜แƒจแƒœแƒแƒ•แƒก, แƒ แƒแƒ› UAPI (userspace API) แƒกแƒแƒ—แƒแƒฃแƒ แƒ”แƒ‘แƒ˜ แƒ’แƒแƒœแƒกแƒแƒ–แƒฆแƒ•แƒ แƒฃแƒšแƒ˜แƒ แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒ™แƒแƒ“แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ•แƒ˜แƒœแƒแƒ˜แƒ“แƒแƒœ แƒคแƒ˜แƒšแƒขแƒ แƒ˜ แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ‘แƒ˜แƒ แƒ—แƒ•แƒจแƒ˜.

แƒ“แƒแƒกแƒขแƒ˜แƒก แƒ“แƒแƒชแƒ•แƒ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ’แƒแƒ›แƒแƒ แƒ—แƒแƒ— (-fno-stack-protector) แƒ˜แƒ›แƒ˜แƒขแƒแƒ›, แƒ แƒแƒ› eBPF แƒ™แƒแƒ“แƒ˜แƒก แƒจแƒ”แƒ›แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ”แƒšแƒ˜ แƒ›แƒแƒ˜แƒœแƒช แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒก แƒ“แƒแƒขแƒ˜แƒก แƒกแƒแƒ–แƒฆแƒ•แƒ แƒ”แƒ‘แƒก แƒแƒ  แƒ’แƒแƒกแƒชแƒ“แƒ”แƒก. แƒ“แƒแƒฃแƒงแƒแƒ•แƒœแƒ”แƒ‘แƒšแƒ˜แƒ• แƒฃแƒœแƒ“แƒ แƒฉแƒแƒ แƒ—แƒแƒ— แƒแƒžแƒขแƒ˜แƒ›แƒ˜แƒ–แƒแƒชแƒ˜แƒ, แƒ แƒแƒ“แƒ’แƒแƒœ eBPF แƒ‘แƒแƒ˜แƒขแƒ˜แƒ™แƒแƒ“แƒ˜แƒก แƒ–แƒแƒ›แƒ แƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒฃแƒšแƒ˜แƒ.

แƒ“แƒแƒ•แƒ˜แƒฌแƒงแƒแƒ— แƒคแƒ˜แƒšแƒขแƒ แƒ˜แƒ—, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ’แƒแƒ“แƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒ แƒžแƒแƒ™แƒ”แƒขแƒก แƒ“แƒ แƒแƒ แƒแƒคแƒ”แƒ แƒก แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒก:

#include <uapi/linux/bpf.h>

#include <bpf_helpers.h>

SEC("prog")
int xdp_main(struct xdp_md* ctx) {
    return XDP_PASS;
}

char _license[] SEC("license") = "GPL";

แƒ’แƒฃแƒœแƒ“แƒ˜ make แƒแƒ’แƒ แƒแƒ•แƒ”แƒ‘แƒก xdp_filter.o. แƒกแƒแƒ“ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒแƒฎแƒšแƒ แƒขแƒ”แƒกแƒขแƒ˜แƒ แƒ”แƒ‘แƒ?

แƒกแƒแƒขแƒ”แƒกแƒขแƒ แƒกแƒขแƒ”แƒœแƒ“แƒ˜

แƒกแƒขแƒ”แƒœแƒ“แƒ˜ แƒฃแƒœแƒ“แƒ แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒ“แƒ”แƒก แƒแƒ  แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒก: แƒ แƒแƒ›แƒ”แƒšแƒ–แƒ”แƒ“แƒแƒช แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒคแƒ˜แƒšแƒขแƒ แƒ˜ แƒ“แƒ แƒกแƒแƒ˜แƒ“แƒแƒœแƒแƒช แƒ’แƒแƒ˜แƒ’แƒ–แƒแƒ•แƒœแƒ”แƒ‘แƒ แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜. แƒ”แƒก แƒฃแƒœแƒ“แƒ แƒ˜แƒงแƒแƒก แƒกแƒ แƒฃแƒšแƒ˜ Linux แƒ›แƒแƒฌแƒงแƒแƒ‘แƒ˜แƒšแƒแƒ‘แƒ”แƒ‘แƒ˜ แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ IP-แƒ”แƒ‘แƒ˜แƒ—, แƒ แƒแƒ—แƒ แƒจแƒ”แƒแƒ›แƒแƒฌแƒ›แƒแƒ— แƒ แƒแƒ’แƒแƒ  แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก แƒ แƒ”แƒ’แƒฃแƒšแƒแƒ แƒฃแƒšแƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜ แƒฉแƒ•แƒ”แƒœแƒก แƒคแƒ˜แƒšแƒขแƒ แƒ—แƒแƒœ.

แƒฉแƒ•แƒ”แƒœแƒ—แƒ•แƒ˜แƒก แƒจแƒ”แƒกแƒแƒคแƒ”แƒ แƒ˜แƒกแƒ˜แƒ แƒ˜แƒกแƒ”แƒ—แƒ˜ แƒ›แƒแƒฌแƒงแƒแƒ‘แƒ˜แƒšแƒแƒ‘แƒ”แƒ‘แƒ˜, แƒ แƒแƒ’แƒแƒ แƒ˜แƒชแƒแƒ veth (แƒ•แƒ˜แƒ แƒขแƒฃแƒแƒšแƒฃแƒ แƒ˜ แƒ”แƒ—แƒ”แƒ แƒœแƒ”แƒขแƒ˜): แƒ”แƒก แƒแƒ แƒ˜แƒก แƒฌแƒงแƒ•แƒ˜แƒšแƒ˜ แƒ•แƒ˜แƒ แƒขแƒฃแƒแƒšแƒฃแƒ แƒ˜ แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ  "แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ" แƒ”แƒ แƒ—แƒ›แƒแƒœแƒ”แƒ—แƒ—แƒแƒœ. แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒจแƒ”แƒฅแƒ›แƒœแƒแƒ— แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒแƒกแƒ” (แƒแƒ› แƒ’แƒแƒœแƒงแƒแƒคแƒ˜แƒšแƒ”แƒ‘แƒแƒจแƒ˜ แƒงแƒ•แƒ”แƒšแƒ แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ ip แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒกแƒแƒฌแƒงแƒ˜แƒกแƒ˜ root):

ip link add xdp-remote type veth peer name xdp-local

แƒแƒฅ xdp-remote ะธ xdp-local - แƒ›แƒแƒฌแƒงแƒแƒ‘แƒ˜แƒšแƒแƒ‘แƒ”แƒ‘แƒ˜แƒก แƒกแƒแƒฎแƒ”แƒšแƒ”แƒ‘แƒ˜. แƒฉแƒแƒ แƒ—แƒฃแƒšแƒ˜แƒ xdp-local (192.0.2.1/24) แƒ“แƒแƒ›แƒแƒ’แƒ แƒ“แƒ”แƒ‘แƒ แƒคแƒ˜แƒšแƒขแƒ แƒ˜, แƒ—แƒแƒœ xdp-remote (192.0.2.2/24) แƒจแƒ”แƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ แƒขแƒ แƒแƒคแƒ˜แƒ™แƒ˜ แƒ’แƒแƒ˜แƒ’แƒ–แƒแƒ•แƒœแƒ”แƒ‘แƒ. แƒ—แƒฃแƒ›แƒชแƒ, แƒแƒ แƒ˜แƒก แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ: แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒ”แƒ‘แƒ˜ แƒ”แƒ แƒ—แƒกแƒ แƒ“แƒ แƒ˜แƒ›แƒแƒ•แƒ” แƒ›แƒแƒœแƒฅแƒแƒœแƒแƒ–แƒ”แƒ แƒ“แƒ Linux แƒแƒ  แƒ’แƒแƒฃแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก แƒขแƒ แƒแƒคแƒ˜แƒ™แƒก แƒ”แƒ แƒ— แƒ›แƒแƒ—แƒ’แƒแƒœแƒก แƒ›แƒ”แƒแƒ แƒ˜แƒก แƒ›แƒ”แƒจแƒ•แƒ”แƒแƒ‘แƒ˜แƒ—. แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ’แƒแƒ“แƒแƒญแƒ แƒแƒ— แƒ แƒ—แƒฃแƒšแƒ˜ แƒฌแƒ”แƒกแƒ”แƒ‘แƒ˜แƒ— iptables, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒแƒ— แƒ›แƒแƒฃแƒฌแƒ”แƒ•แƒ— แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒชแƒ•แƒšแƒ, แƒ แƒแƒช แƒ›แƒแƒฃแƒฎแƒ”แƒ แƒฎแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒ’แƒแƒ›แƒแƒ แƒ—แƒ•แƒ˜แƒกแƒแƒก. แƒฃแƒ›แƒฏแƒแƒ‘แƒ”แƒกแƒ˜แƒ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒแƒ— แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒกแƒแƒฎแƒ”แƒšแƒ—แƒ แƒกแƒ˜แƒ•แƒ แƒชแƒ”แƒ”แƒ‘แƒ˜ (แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒกแƒแƒฎแƒ”แƒšแƒ—แƒ แƒกแƒ˜แƒ•แƒ แƒชแƒ”แƒ”แƒ‘แƒ˜, แƒจแƒ”แƒ›แƒ“แƒ’แƒแƒ›แƒ˜ แƒฅแƒกแƒ”แƒšแƒ”แƒ‘แƒ˜).

แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒกแƒแƒฎแƒ”แƒšแƒ—แƒ แƒกแƒ˜แƒ•แƒ แƒชแƒ” แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒก แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒ”แƒ‘แƒ˜แƒก แƒ™แƒแƒ›แƒžแƒšแƒ”แƒฅแƒขแƒก, แƒ›แƒแƒ แƒจแƒ แƒฃแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒก แƒชแƒฎแƒ แƒ˜แƒšแƒ”แƒ‘แƒก แƒ“แƒ NetFilter-แƒ˜แƒก แƒฌแƒ”แƒกแƒ”แƒ‘แƒก, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒ˜แƒ–แƒแƒšแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒกแƒฎแƒ•แƒ แƒฅแƒกแƒ”แƒšแƒ”แƒ‘แƒ˜แƒก แƒ›แƒกแƒ’แƒแƒ•แƒกแƒ˜ แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ”แƒ‘แƒ˜แƒกแƒ’แƒแƒœ. แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜ แƒ’แƒแƒ“แƒ˜แƒก แƒ’แƒแƒ แƒ™แƒ•แƒ”แƒฃแƒš แƒกแƒแƒฎแƒ”แƒšแƒ—แƒ แƒกแƒ˜แƒ•แƒ แƒชแƒ”แƒจแƒ˜ แƒ“แƒ แƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒแƒ› แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ”แƒ‘แƒ˜. แƒœแƒแƒ’แƒฃแƒšแƒ˜แƒกแƒฎแƒ›แƒ”แƒ•แƒแƒ“, แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒแƒก แƒแƒฅแƒ•แƒก แƒ”แƒ แƒ—แƒ˜แƒแƒœแƒ˜ แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒกแƒแƒฎแƒ”แƒšแƒ”แƒ‘แƒ˜แƒก แƒกแƒ˜แƒ•แƒ แƒชแƒ” แƒงแƒ•แƒ”แƒšแƒ แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒแƒกแƒ” แƒ แƒแƒ› แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ˜แƒ›แƒฃแƒจแƒแƒแƒ— Linux-แƒ–แƒ” แƒ“แƒ แƒแƒ  แƒ˜แƒชแƒแƒ“แƒ”แƒ— แƒฅแƒกแƒ”แƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘.

แƒ›แƒแƒ“แƒ˜แƒ— แƒจแƒ”แƒ•แƒฅแƒ›แƒœแƒแƒ— แƒแƒฎแƒแƒšแƒ˜ แƒกแƒแƒฎแƒ”แƒšแƒ—แƒ แƒกแƒ˜แƒ•แƒ แƒชแƒ” xdp-test แƒ“แƒ แƒ˜แƒฅ แƒ’แƒแƒ“แƒแƒแƒ“แƒ’แƒ˜แƒšแƒ”แƒ‘แƒ xdp-remote.

ip netns add xdp-test
ip link set dev xdp-remote netns xdp-test

แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜ แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ”แƒแƒ‘แƒก xdp-test, แƒแƒ  "แƒ•แƒœแƒแƒฎแƒแƒ•" xdp-local (แƒœแƒแƒ’แƒฃแƒšแƒ˜แƒกแƒฎแƒ›แƒ”แƒ•แƒแƒ“ แƒ“แƒแƒ แƒฉแƒ”แƒ‘แƒ netns-แƒจแƒ˜) แƒ“แƒ 192.0.2.1-แƒ–แƒ” แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒกแƒแƒก แƒ’แƒแƒ˜แƒ•แƒšแƒ˜แƒก แƒ›แƒแƒก xdp-remote, แƒ แƒแƒ“แƒ’แƒแƒœ แƒ”แƒก แƒแƒ แƒ˜แƒก แƒ”แƒ แƒ—แƒแƒ“แƒ”แƒ แƒ—แƒ˜ แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒ˜ 192.0.2.0/24-แƒ–แƒ”, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒ แƒแƒ› แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒ”แƒก แƒแƒกแƒ”แƒ•แƒ” แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก แƒกแƒแƒžแƒ˜แƒ แƒ˜แƒกแƒžแƒ˜แƒ แƒแƒ“.

แƒฅแƒกแƒ”แƒšแƒ”แƒ‘แƒก แƒจแƒแƒ แƒ˜แƒก แƒ’แƒแƒ“แƒแƒแƒ“แƒ’แƒ˜แƒšแƒ”แƒ‘แƒ˜แƒกแƒแƒก, แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒ˜ แƒ˜แƒจแƒšแƒ”แƒ‘แƒ แƒ“แƒ แƒ™แƒแƒ แƒ’แƒแƒ•แƒก แƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒก. แƒฅแƒกแƒ”แƒšแƒ”แƒ‘แƒจแƒ˜ แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒ˜แƒก แƒ“แƒแƒกแƒแƒงแƒ”แƒœแƒ”แƒ‘แƒšแƒแƒ“, แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ’แƒแƒฃแƒจแƒ•แƒแƒ— ip ... แƒแƒ› แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒกแƒแƒฎแƒ”แƒšแƒ—แƒ แƒกแƒ˜แƒ•แƒ แƒชแƒ”แƒจแƒ˜ ip netns exec:

ip netns exec xdp-test 
    ip address add 192.0.2.2/24 dev xdp-remote
ip netns exec xdp-test 
    ip link set xdp-remote up

แƒ แƒแƒ’แƒแƒ แƒช แƒฎแƒ”แƒ“แƒแƒ•แƒ—, แƒ”แƒก แƒแƒ  แƒ’แƒแƒœแƒกแƒฎแƒ•แƒแƒ•แƒ“แƒ”แƒ‘แƒ แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ˜แƒกแƒ’แƒแƒœ xdp-local แƒœแƒแƒ’แƒฃแƒšแƒ˜แƒกแƒฎแƒ›แƒ”แƒ•แƒ˜ แƒกแƒแƒฎแƒ”แƒšแƒ”แƒ‘แƒ˜แƒก แƒกแƒ˜แƒ•แƒ แƒชแƒ”แƒจแƒ˜:

    ip address add 192.0.2.1/24 dev xdp-local
    ip link set xdp-local up

แƒ—แƒฃ แƒ’แƒแƒ˜แƒฅแƒชแƒ”แƒ•แƒ tcpdump -tnevi xdp-local, แƒ—แƒฅแƒ•แƒ”แƒœ แƒฎแƒ”แƒ“แƒแƒ•แƒ—, แƒ แƒแƒ› แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜ แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒšแƒ˜แƒ xdp-test, แƒ›แƒ˜แƒ”แƒฌแƒแƒ“แƒ”แƒ‘แƒ แƒแƒ› แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒก:

ip netns exec xdp-test   ping 192.0.2.1

แƒ›แƒแƒกแƒแƒฎแƒ”แƒ แƒฎแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒญแƒฃแƒ แƒ•แƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ xdp-test. แƒกแƒแƒชแƒแƒ•แƒก แƒแƒฅแƒ•แƒก แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒ˜แƒ แƒ”แƒ‘แƒก แƒกแƒขแƒ”แƒœแƒ“แƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒแƒก, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ“แƒแƒแƒงแƒ”แƒœแƒแƒ— แƒกแƒขแƒ”แƒœแƒ“แƒ˜ แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ˜แƒ— sudo ./stand up แƒ“แƒ แƒแƒ›แƒแƒ˜แƒฆแƒ”แƒ— แƒ˜แƒ’แƒ˜ sudo ./stand down.

แƒ›แƒ˜แƒ™แƒ•แƒšแƒ”แƒ•แƒ

แƒคแƒ˜แƒšแƒขแƒ แƒ˜ แƒ›แƒ˜แƒ›แƒแƒ’แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ›แƒแƒฌแƒงแƒแƒ‘แƒ˜แƒšแƒแƒ‘แƒแƒ–แƒ” แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒœแƒแƒ˜แƒ แƒแƒ“:

ip -force link set dev xdp-local xdp object xdp_filter.o verbose

แƒงแƒ•แƒ˜แƒ—แƒ”แƒšแƒ˜ -force แƒกแƒแƒญแƒ˜แƒ แƒแƒ แƒแƒฎแƒแƒšแƒ˜ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒก แƒ“แƒแƒกแƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒšแƒแƒ“, แƒ—แƒฃ แƒกแƒฎแƒ•แƒ แƒฃแƒ™แƒ•แƒ” แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ. "No news is good news" แƒแƒ  แƒแƒ แƒ˜แƒก แƒแƒ› แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘, แƒ’แƒแƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ แƒ›แƒแƒ˜แƒœแƒช แƒ›แƒแƒชแƒฃแƒšแƒแƒ‘แƒ˜แƒ—แƒ˜แƒ. แƒ›แƒ˜แƒฃแƒ—แƒ˜แƒ—แƒ”แƒ— verbose แƒกแƒฃแƒ แƒ•แƒ˜แƒšแƒ˜แƒกแƒแƒ›แƒ”แƒ‘แƒ , แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒแƒกแƒ—แƒแƒœ แƒ”แƒ แƒ—แƒแƒ“ แƒฉแƒœแƒ“แƒ”แƒ‘แƒ แƒแƒœแƒ’แƒแƒ แƒ˜แƒจแƒ˜ แƒ™แƒแƒ“แƒ˜แƒก แƒ“แƒแƒ›แƒแƒ“แƒแƒกแƒขแƒฃแƒ แƒ”แƒ‘แƒ”แƒšแƒ˜ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ แƒแƒกแƒแƒ›แƒ‘แƒšแƒ”แƒ แƒ˜แƒก แƒฉแƒแƒ›แƒแƒœแƒแƒ—แƒ•แƒแƒšแƒ˜แƒ—:

Verifier analysis:

0: (b7) r0 = 2
1: (95) exit

แƒแƒ›แƒแƒ˜แƒฆแƒ”แƒ— แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒ˜แƒ“แƒแƒœ:

ip link set dev xdp-local xdp off

แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒจแƒ˜ แƒ”แƒก แƒแƒ แƒ˜แƒก แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜ sudo ./stand attach ะธ sudo ./stand detach.

แƒคแƒ˜แƒšแƒขแƒ แƒ˜แƒก แƒจแƒ”แƒ™แƒ•แƒ แƒ˜แƒ— แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ“แƒแƒ แƒฌแƒ›แƒฃแƒœแƒ“แƒ”แƒ— แƒแƒ›แƒแƒจแƒ˜ ping แƒแƒ’แƒ แƒซแƒ”แƒšแƒ”แƒ‘แƒก แƒ›แƒฃแƒจแƒแƒแƒ‘แƒแƒก, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก แƒ—แƒฃ แƒแƒ แƒ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ? แƒ›แƒแƒ“แƒ˜แƒ— แƒ“แƒแƒ•แƒแƒ›แƒแƒขแƒแƒ— แƒšแƒแƒ’แƒแƒ”แƒ‘แƒ˜. แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ bpf_trace_printk() แƒ›แƒกแƒ’แƒแƒ•แƒกแƒ˜ printf(), แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒฎแƒแƒ แƒก แƒฃแƒญแƒ”แƒ แƒก แƒ›แƒฎแƒแƒšแƒแƒ“ แƒกแƒแƒ› แƒแƒ แƒ’แƒฃแƒ›แƒ”แƒœแƒขแƒก, แƒ’แƒแƒ แƒ“แƒ แƒจแƒแƒ‘แƒšแƒแƒœแƒ˜แƒกแƒ แƒ“แƒ แƒกแƒžแƒ”แƒชแƒ˜แƒคแƒ˜แƒ™แƒแƒขแƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒฃแƒš แƒกแƒ˜แƒแƒก. แƒ›แƒแƒ™แƒ แƒ bpf_printk() แƒแƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ”แƒ‘แƒก แƒ–แƒแƒ แƒก.

   SEC("prog")
   int xdp_main(struct xdp_md* ctx) {
+      bpf_printk("got packet: %pn", ctx);
       return XDP_PASS;
   }

แƒ’แƒแƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ แƒ›แƒ˜แƒ“แƒ˜แƒก แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒ™แƒ•แƒแƒšแƒ˜แƒก แƒแƒ แƒฎแƒ–แƒ”, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฃแƒœแƒ“แƒ แƒ˜แƒงแƒแƒก แƒฉแƒแƒ แƒ—แƒฃแƒšแƒ˜:

echo -n 1 | sudo tee /sys/kernel/debug/tracing/options/trace_printk

แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒœแƒแƒ™แƒแƒ“แƒ˜แƒก แƒœแƒแƒฎแƒ•แƒ:

cat /sys/kernel/debug/tracing/trace_pipe

แƒแƒ แƒ˜แƒ•แƒ” แƒ”แƒก แƒ’แƒฃแƒœแƒ“แƒ˜ แƒ–แƒแƒ แƒก แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒก sudo ./stand log.

Ping-แƒ›แƒ แƒแƒฎแƒšแƒ แƒฃแƒœแƒ“แƒ แƒแƒฌแƒแƒ แƒ›แƒแƒแƒก แƒ›แƒแƒกแƒจแƒ˜ แƒ›แƒกแƒ’แƒแƒ•แƒกแƒ˜ แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜:

<...>-110930 [004] ..s1 78803.244967: 0: got packet: 00000000ac510377

แƒ—แƒฃ แƒงแƒฃแƒ แƒแƒ“แƒฆแƒ”แƒ‘แƒ˜แƒ— แƒ“แƒแƒแƒ™แƒ•แƒ˜แƒ แƒ“แƒ”แƒ‘แƒ˜แƒ— แƒ•แƒ”แƒ แƒ˜แƒคแƒ˜แƒ™แƒแƒขแƒแƒ แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒก, แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒจแƒ”แƒแƒ›แƒฉแƒœแƒ˜แƒแƒ— แƒฃแƒชแƒœแƒแƒฃแƒ แƒ˜ แƒ’แƒแƒ›แƒแƒ—แƒ•แƒšแƒ”แƒ‘แƒ˜:

0: (bf) r3 = r1
1: (18) r1 = 0xa7025203a7465
3: (7b) *(u64 *)(r10 -8) = r1
4: (18) r1 = 0x6b63617020746f67
6: (7b) *(u64 *)(r10 -16) = r1
7: (bf) r1 = r10
8: (07) r1 += -16
9: (b7) r2 = 16
10: (85) call bpf_trace_printk#6
<...>

แƒคแƒแƒฅแƒขแƒ˜แƒ, แƒ แƒแƒ› eBPF แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ”แƒ‘แƒก แƒแƒ  แƒแƒฅแƒ•แƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ’แƒแƒœแƒงแƒแƒคแƒ˜แƒšแƒ”แƒ‘แƒ, แƒแƒ›แƒ˜แƒขแƒแƒ› แƒคแƒแƒ แƒ›แƒแƒขแƒ˜แƒก แƒกแƒขแƒ แƒ˜แƒฅแƒแƒœแƒ˜แƒก แƒ™แƒแƒ“แƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒ”แƒ แƒ—แƒแƒ“แƒ”แƒ แƒ—แƒ˜ แƒ’แƒ–แƒ แƒแƒ แƒ˜แƒก VM แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒฃแƒจแƒฃแƒแƒšแƒ แƒแƒ แƒ’แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜:

$ python -c "import binascii; print(bytes(reversed(binascii.unhexlify('0a7025203a74656b63617020746f67'))))"
b'got packet: %pn'

แƒแƒ› แƒ›แƒ˜แƒ–แƒ”แƒ–แƒ˜แƒ—, แƒ’แƒแƒ›แƒแƒ แƒ—แƒ•แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒœแƒแƒ“ แƒแƒคแƒฃแƒญแƒ”แƒ‘แƒก แƒจแƒ”แƒ“แƒ”แƒ’แƒแƒ“ แƒ™แƒแƒ“แƒก.

XDP แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ

แƒ›แƒแƒ“แƒ˜แƒ— แƒจแƒ”แƒ•แƒชแƒ•แƒแƒšแƒแƒ— แƒคแƒ˜แƒšแƒขแƒ แƒ˜: แƒœแƒ”แƒ‘แƒ แƒ›แƒ˜แƒ”แƒชแƒ˜แƒ— แƒ›แƒแƒก แƒฃแƒ™แƒแƒœ แƒ’แƒแƒ›แƒแƒแƒ’แƒ–แƒแƒ•แƒœแƒแƒก แƒงแƒ•แƒ”แƒšแƒ แƒจแƒ”แƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ˜. แƒ”แƒก แƒแƒ แƒแƒกแƒฌแƒแƒ แƒ˜แƒ แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒ—แƒ•แƒแƒšแƒกแƒแƒ–แƒ แƒ˜แƒกแƒ˜แƒ—, แƒ แƒแƒ“แƒ’แƒแƒœ แƒกแƒแƒญแƒ˜แƒ แƒ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒแƒ“แƒ แƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒชแƒ•แƒšแƒ แƒกแƒแƒ—แƒแƒฃแƒ แƒ”แƒ‘แƒจแƒ˜, แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒฎแƒšแƒ แƒžแƒ แƒ˜แƒœแƒชแƒ˜แƒžแƒจแƒ˜ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœแƒ˜แƒ.

       bpf_printk("got packet: %pn", ctx);
-      return XDP_PASS;
+      return XDP_TX;
   }

แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ tcpdump on xdp-remote. แƒ›แƒแƒœ แƒฃแƒœแƒ“แƒ แƒแƒฉแƒ•แƒ”แƒœแƒแƒก แƒ˜แƒ“แƒ”แƒœแƒขแƒฃแƒ แƒ˜ แƒ’แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ แƒ“แƒ แƒจแƒ”แƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ ICMP Echo แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ แƒ“แƒ แƒจแƒ”แƒฌแƒงแƒ•แƒ˜แƒขแƒแƒก ICMP Echo Reply-แƒ˜แƒก แƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒ. แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒ  แƒฉแƒแƒœแƒก. แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก XDP_TX แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒแƒจแƒ˜ xdp-local แƒกแƒแƒญแƒ˜แƒ แƒแƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒ˜แƒก แƒ“แƒแƒกแƒแƒฌแƒงแƒ•แƒ˜แƒšแƒ”แƒ‘แƒšแƒแƒ“ xdp-remote แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒแƒช แƒ“แƒแƒ˜แƒœแƒ˜แƒจแƒœแƒ, แƒ—แƒฃแƒœแƒ“แƒแƒช แƒชแƒแƒ แƒ˜แƒ”แƒšแƒ˜ แƒ˜แƒงแƒ แƒ“แƒ แƒแƒ›แƒแƒฆแƒšแƒ“แƒ.

แƒกแƒแƒ˜แƒ“แƒแƒœ แƒ•แƒ˜แƒชแƒแƒ“แƒ˜?

แƒ‘แƒ˜แƒ แƒ—แƒ•แƒจแƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ’แƒ–แƒ˜แƒก แƒ›แƒ˜แƒ™แƒ•แƒšแƒ”แƒ•แƒ perf แƒ›แƒแƒ•แƒšแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ”แƒฅแƒแƒœแƒ˜แƒ–แƒ›แƒ˜ แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ˜แƒซแƒšแƒ”แƒ•แƒ, แƒกแƒฎแƒ•แƒแƒ—แƒ แƒจแƒแƒ แƒ˜แƒก, แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒแƒ— แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒ•แƒ˜แƒ แƒขแƒฃแƒแƒšแƒฃแƒ แƒ˜ แƒ›แƒแƒœแƒฅแƒแƒœแƒ, แƒแƒœแƒฃ eBPF แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ eBPF-แƒ˜แƒ— แƒ“แƒแƒจแƒšแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒ‘แƒแƒ แƒแƒขแƒ”แƒ‘แƒ˜แƒกแƒ’แƒแƒœ แƒกแƒ˜แƒ™แƒ”แƒ—แƒ” แƒฃแƒœแƒ“แƒ แƒ’แƒแƒ›แƒแƒ˜แƒ›แƒฃแƒจแƒแƒ•แƒ, แƒ แƒแƒ“แƒ’แƒแƒœ แƒกแƒฎแƒ•แƒ แƒแƒ แƒแƒคแƒ”แƒ แƒ˜แƒ แƒ’แƒแƒกแƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒ”แƒšแƒ˜.

$ sudo perf trace --call-graph dwarf -e 'xdp:*'
   0.000 ping/123455 xdp:xdp_bulk_tx:ifindex=19 action=TX sent=0 drops=1 err=-6
                                     veth_xdp_flush_bq ([veth])
                                     veth_xdp_flush_bq ([veth])
                                     veth_poll ([veth])
                                     <...>

แƒ แƒ แƒแƒ แƒ˜แƒก แƒ™แƒแƒ“แƒ˜ 6?

$ errno 6
ENXIO 6 No such device or address

แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ veth_xdp_flush_bq() แƒ˜แƒฆแƒ”แƒ‘แƒก แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ˜แƒก แƒ™แƒแƒ“แƒก veth_xdp_xmit(), แƒกแƒแƒ“แƒแƒช แƒซแƒ˜แƒ”แƒ‘แƒ ENXIO แƒ“แƒ แƒ˜แƒžแƒแƒ•แƒœแƒ”แƒ— แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜.

แƒแƒฆแƒแƒ“แƒ’แƒ˜แƒœแƒ”แƒ— แƒ›แƒ˜แƒœแƒ˜แƒ›แƒแƒšแƒฃแƒ แƒ˜ แƒคแƒ˜แƒšแƒขแƒ แƒ˜ (XDP_PASS) แƒคแƒแƒ˜แƒšแƒจแƒ˜ xdp_dummy.c, แƒ“แƒแƒแƒ›แƒแƒขแƒ”แƒ— แƒ˜แƒ’แƒ˜ Makefile-แƒจแƒ˜, แƒ“แƒแƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ— xdp-remote:

ip netns exec remote 
    ip link set dev int xdp object dummy.o

แƒแƒฎแƒšแƒ tcpdump แƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒก แƒ แƒ แƒแƒ แƒ˜แƒก แƒ›แƒแƒกแƒแƒšแƒแƒ“แƒœแƒ”แƒšแƒ˜:

62:57:8e:70:44:64 > 26:0e:25:37:8f:96, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 13762, offset 0, flags [DF], proto ICMP (1), length 84)
    192.0.2.2 > 192.0.2.1: ICMP echo request, id 46966, seq 1, length 64
62:57:8e:70:44:64 > 26:0e:25:37:8f:96, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 13762, offset 0, flags [DF], proto ICMP (1), length 84)
    192.0.2.2 > 192.0.2.1: ICMP echo request, id 46966, seq 1, length 64

แƒ—แƒฃ แƒ›แƒ˜แƒก แƒœแƒแƒชแƒ•แƒšแƒแƒ“ แƒœแƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒ˜แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ ARP, แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒแƒ›แƒแƒ˜แƒฆแƒแƒ— แƒคแƒ˜แƒšแƒขแƒ แƒ”แƒ‘แƒ˜ (แƒ”แƒก แƒฎแƒ“แƒ˜แƒก sudo ./stand detach), แƒ›แƒแƒ“แƒ˜แƒ— ping, แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ“แƒแƒแƒ˜แƒœแƒกแƒขแƒแƒšแƒ˜แƒ แƒ”แƒ— แƒคแƒ˜แƒšแƒขแƒ แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒกแƒชแƒแƒ“แƒ”แƒ— แƒฎแƒ”แƒšแƒแƒฎแƒšแƒ. แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ แƒ˜แƒก แƒแƒ แƒ˜แƒก, แƒ แƒแƒ› แƒคแƒ˜แƒšแƒขแƒ แƒ˜ XDP_TX แƒ’แƒแƒ•แƒšแƒ”แƒœแƒแƒก แƒแƒฎแƒ“แƒ”แƒœแƒก ARP-แƒ–แƒ”แƒช แƒ“แƒ แƒ—แƒฃ แƒกแƒขแƒ”แƒ™แƒ˜
แƒกแƒแƒฎแƒ”แƒšแƒ—แƒ แƒกแƒ˜แƒ•แƒ แƒชแƒ”แƒ”แƒ‘แƒ˜ xdp-test แƒ›แƒแƒแƒฎแƒ”แƒ แƒฎแƒ MAC แƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ˜แƒก "แƒ“แƒแƒ•แƒ˜แƒฌแƒงแƒ”แƒ‘แƒ" 192.0.2.1, แƒ˜แƒก แƒ•แƒ”แƒ  แƒจแƒ”แƒซแƒšแƒ”แƒ‘แƒก แƒแƒ› IP-แƒก แƒ’แƒแƒ“แƒแƒญแƒ แƒแƒก.

แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ แƒ’แƒแƒœแƒชแƒฎแƒแƒ“แƒ”แƒ‘แƒ

แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ“แƒแƒ•แƒ˜แƒ“แƒ”แƒ— แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒฃแƒš แƒแƒ›แƒแƒชแƒแƒœแƒแƒ–แƒ”: แƒฉแƒแƒฌแƒ”แƒ แƒ”แƒ— SYN แƒฅแƒฃแƒฅแƒ˜-แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ˜แƒก แƒ›แƒ”แƒฅแƒแƒœแƒ˜แƒ–แƒ›แƒ˜ XDP-แƒ–แƒ”.

แƒแƒ› แƒ“แƒ แƒแƒ›แƒ“แƒ”, SYN flood แƒ แƒฉแƒ”แƒ‘แƒ แƒžแƒแƒžแƒฃแƒšแƒแƒ แƒฃแƒš DDoS แƒจแƒ”แƒขแƒ”แƒ•แƒแƒ“, แƒ แƒแƒ›แƒšแƒ˜แƒก แƒแƒ แƒกแƒ˜ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜แƒ. แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜ แƒ“แƒแƒ›แƒงแƒแƒ แƒ“แƒ”แƒ‘แƒ (TCP แƒฎแƒ”แƒšแƒ˜แƒก แƒฉแƒแƒ›แƒแƒ แƒ—แƒ›แƒ”แƒ•แƒ), แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜ แƒ˜แƒฆแƒ”แƒ‘แƒก SYN-แƒก, แƒ’แƒแƒ›แƒแƒงแƒแƒคแƒก แƒ แƒ”แƒกแƒฃแƒ แƒกแƒ”แƒ‘แƒก แƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒžแƒแƒกแƒฃแƒฎแƒแƒ‘แƒก SYNACK แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒ— แƒ“แƒ แƒ”แƒšแƒแƒ“แƒ”แƒ‘แƒ ACK-แƒก. แƒ—แƒแƒ•แƒ“แƒแƒ›แƒกแƒฎแƒ›แƒ”แƒšแƒ˜ แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก SYN แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒก แƒงแƒแƒšแƒ‘แƒ˜ แƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ”แƒ‘แƒ˜แƒ“แƒแƒœ แƒฌแƒแƒ›แƒจแƒ˜ แƒแƒ—แƒแƒกแƒแƒ‘แƒ˜แƒ— แƒแƒ“แƒ”แƒœแƒแƒ‘แƒ˜แƒ— แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒฐแƒแƒกแƒขแƒ˜แƒ“แƒแƒœ แƒ›แƒ แƒแƒ•แƒแƒšแƒแƒ—แƒแƒกแƒ˜แƒแƒœ แƒ‘แƒแƒขแƒœแƒ”แƒขแƒจแƒ˜. แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜ แƒ˜แƒซแƒฃแƒšแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ’แƒแƒ›แƒแƒงแƒแƒก แƒ แƒ”แƒกแƒฃแƒ แƒกแƒ”แƒ‘แƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒฉแƒแƒ›แƒแƒกแƒ•แƒšแƒ˜แƒกแƒ—แƒแƒœแƒแƒ•แƒ”, แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒ—แƒแƒ•แƒ˜แƒกแƒฃแƒคแƒšแƒ”แƒ‘แƒก แƒ›แƒแƒก แƒ“แƒ˜แƒ“แƒ˜ แƒฎแƒœแƒ˜แƒก แƒ’แƒแƒœแƒ›แƒแƒ•แƒšแƒแƒ‘แƒแƒจแƒ˜, แƒ แƒ˜แƒก แƒจแƒ”แƒ“แƒ”แƒ’แƒแƒ“แƒแƒช แƒ›แƒ”แƒฎแƒกแƒ˜แƒ”แƒ แƒ”แƒ‘แƒ แƒแƒœ แƒšแƒ˜แƒ›แƒ˜แƒขแƒ”แƒ‘แƒ˜ แƒแƒ›แƒแƒ˜แƒฌแƒฃแƒ แƒ”แƒ‘แƒ, แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ˜ แƒแƒ  แƒ›แƒ˜แƒ˜แƒฆแƒ”แƒ‘แƒ, แƒกแƒ”แƒ แƒ•แƒ˜แƒกแƒ˜ แƒ›แƒ˜แƒฃแƒฌแƒ•แƒ“แƒแƒ›แƒ”แƒšแƒ˜แƒ.

แƒ—แƒฃ แƒ—แƒฅแƒ•แƒ”แƒœ แƒแƒ  แƒแƒœแƒแƒฌแƒ˜แƒšแƒ”แƒ‘แƒ— แƒ แƒ”แƒกแƒฃแƒ แƒกแƒ”แƒ‘แƒก SYN แƒžแƒแƒ™แƒ”แƒขแƒ–แƒ”, แƒ›แƒแƒ’แƒ แƒแƒ› แƒžแƒแƒกแƒฃแƒฎแƒแƒ‘แƒ— แƒ›แƒฎแƒแƒšแƒแƒ“ SYNACK แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒ—, แƒ›แƒแƒจแƒ˜แƒœ แƒ แƒแƒ’แƒแƒ  แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ›แƒ แƒ’แƒแƒ˜แƒ’แƒแƒก, แƒ แƒแƒ› แƒ›แƒแƒ’แƒ•แƒ˜แƒแƒœแƒ”แƒ‘แƒ˜แƒ— แƒ›แƒแƒกแƒฃแƒš ACK แƒžแƒแƒ™แƒ”แƒขแƒ˜ แƒ”แƒ™แƒฃแƒ—แƒ•แƒœแƒ˜แƒก SYN แƒžแƒแƒ™แƒ”แƒขแƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒ  แƒ˜แƒงแƒ แƒจแƒ”แƒœแƒแƒฎแƒฃแƒšแƒ˜? แƒงแƒแƒ•แƒ”แƒšแƒ˜แƒ•แƒ” แƒแƒ›แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒ—แƒแƒ•แƒ“แƒแƒ›แƒกแƒฎแƒ›แƒ”แƒšแƒก แƒแƒกแƒ”แƒ•แƒ” แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒจแƒ”แƒฅแƒ›แƒœแƒแƒก แƒงแƒแƒšแƒ‘แƒ˜ ACK-แƒ”แƒ‘แƒ˜. SYN แƒฅแƒฃแƒฅแƒ˜-แƒคแƒแƒ˜แƒšแƒ˜แƒก แƒแƒ แƒกแƒ˜ แƒแƒ แƒ˜แƒก แƒ“แƒแƒจแƒ˜แƒคแƒ•แƒ แƒ seqnum แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜, แƒ แƒแƒ’แƒแƒ แƒช แƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ”แƒ‘แƒ˜แƒก แƒฐแƒ”แƒจแƒ˜, แƒžแƒแƒ แƒขแƒ”แƒ‘แƒ˜ แƒ“แƒ แƒชแƒ•แƒแƒšแƒ”แƒ‘แƒแƒ“แƒ˜ แƒ›แƒแƒ แƒ˜แƒšแƒ˜. แƒ—แƒฃ ACK-แƒ›แƒ แƒ›แƒแƒแƒฎแƒ”แƒ แƒฎแƒ แƒ›แƒแƒ แƒ˜แƒšแƒ˜แƒก แƒจแƒ”แƒชแƒ•แƒšแƒแƒ›แƒ“แƒ” แƒฉแƒแƒ›แƒแƒกแƒ•แƒšแƒ, แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ™แƒ•แƒšแƒแƒ• แƒ’แƒแƒ›แƒแƒ—แƒ•แƒแƒšแƒแƒ— แƒฐแƒ”แƒจแƒ˜ แƒ“แƒ แƒจแƒ”แƒแƒ“แƒแƒ แƒแƒ— acknum. แƒงแƒแƒšแƒ‘แƒ˜ acknum แƒ—แƒแƒ•แƒ“แƒแƒ›แƒกแƒฎแƒ›แƒ”แƒšแƒก แƒแƒ  แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ, แƒ แƒแƒ“แƒ’แƒแƒœ แƒ›แƒแƒ แƒ˜แƒšแƒ˜ แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒก แƒกแƒแƒ˜แƒ“แƒฃแƒ›แƒšแƒแƒก แƒ“แƒ แƒแƒ  แƒ”แƒฅแƒœแƒ”แƒ‘แƒ แƒ“แƒ แƒ แƒ›แƒ˜แƒกแƒ˜ แƒ“แƒแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒฃแƒšแƒ˜ แƒแƒ แƒฎแƒ˜แƒก แƒ’แƒแƒ›แƒ.

SYN แƒฅแƒฃแƒฅแƒ˜-แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒ˜ แƒ“แƒ˜แƒ“แƒ˜ แƒฎแƒแƒœแƒ˜แƒ แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ˜แƒšแƒ˜แƒ Linux-แƒ˜แƒก แƒ‘แƒ˜แƒ แƒ—แƒ•แƒจแƒ˜ แƒ“แƒ แƒ›แƒแƒ—แƒ˜ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒฃแƒ แƒแƒ“ แƒฉแƒแƒ แƒ—แƒ•แƒแƒช แƒ™แƒ˜ แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ, แƒ—แƒฃ SYN-แƒ”แƒ‘แƒ˜ แƒซแƒแƒšแƒ˜แƒแƒœ แƒกแƒฌแƒ แƒแƒคแƒแƒ“ แƒ“แƒ แƒ›แƒแƒกแƒแƒ‘แƒ แƒ˜แƒ•แƒแƒ“ แƒฉแƒแƒ›แƒแƒ•แƒ.

แƒกแƒแƒ’แƒแƒœแƒ›แƒแƒœแƒแƒ—แƒšแƒ”แƒ‘แƒšแƒ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ TCP แƒฎแƒ”แƒšแƒ˜แƒก แƒฉแƒแƒ›แƒแƒ แƒ—แƒ›แƒ”แƒ•แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘

TCP แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒแƒก แƒ‘แƒแƒ˜แƒขแƒ”แƒ‘แƒ˜แƒก แƒœแƒแƒ™แƒแƒ“แƒ˜แƒก แƒกแƒแƒฎแƒ˜แƒ—, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, HTTP แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ”แƒ‘แƒ˜ แƒ’แƒแƒ“แƒแƒ˜แƒชแƒ”แƒ›แƒ TCP-แƒ–แƒ”. แƒœแƒแƒ™แƒแƒ“แƒ˜ แƒœแƒแƒฌแƒ˜แƒš-แƒœแƒแƒฌแƒ˜แƒš แƒ’แƒแƒ“แƒแƒ˜แƒชแƒ”แƒ›แƒ แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒจแƒ˜. แƒงแƒ•แƒ”แƒšแƒ TCP แƒžแƒแƒ™แƒ”แƒขแƒก แƒแƒฅแƒ•แƒก แƒšแƒแƒ’แƒ˜แƒ™แƒฃแƒ แƒ˜ แƒ“แƒ แƒแƒจแƒ”แƒ‘แƒ˜ แƒ“แƒ 32-แƒ‘แƒ˜แƒขแƒ˜แƒแƒœแƒ˜ แƒ›แƒ˜แƒ›แƒ“แƒ”แƒ•แƒ แƒแƒ‘แƒ˜แƒก แƒœแƒแƒ›แƒ แƒ”แƒ‘แƒ˜:

  • แƒ“แƒ แƒแƒจแƒ”แƒ‘แƒ˜แƒก แƒ™แƒแƒ›แƒ‘แƒ˜แƒœแƒแƒชแƒ˜แƒ แƒ’แƒแƒœแƒกแƒแƒ–แƒฆแƒ•แƒ แƒแƒ•แƒก แƒ™แƒแƒœแƒ™แƒ แƒ”แƒขแƒฃแƒšแƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ แƒแƒšแƒก. SYN แƒ“แƒ แƒแƒจแƒ แƒœแƒ˜แƒจแƒœแƒแƒ•แƒก, แƒ แƒแƒ› แƒ”แƒก แƒแƒ แƒ˜แƒก แƒ’แƒแƒ›แƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ˜ แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ–แƒ”. ACK แƒ“แƒ แƒแƒจแƒ แƒœแƒ˜แƒจแƒœแƒแƒ•แƒก, แƒ แƒแƒ› แƒ’แƒแƒ›แƒ’แƒ–แƒแƒ•แƒœแƒ›แƒ แƒ›แƒ˜แƒ˜แƒฆแƒ แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ˜ แƒ‘แƒแƒ˜แƒขแƒแƒ›แƒ“แƒ”. acknum. แƒžแƒแƒ™แƒ”แƒขแƒก แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒฐแƒฅแƒแƒœแƒ“แƒ”แƒก แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ“แƒ แƒแƒจแƒ แƒ“แƒ แƒ“แƒแƒกแƒแƒฎแƒ”แƒšแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ›แƒแƒ—แƒ˜ แƒ™แƒแƒ›แƒ‘แƒ˜แƒœแƒแƒชแƒ˜แƒ˜แƒก แƒ›แƒ˜แƒฎแƒ”แƒ“แƒ•แƒ˜แƒ—, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, SYNACK แƒžแƒแƒ™แƒ”แƒขแƒ˜.

  • แƒ›แƒ˜แƒ›แƒ“แƒ”แƒ•แƒ แƒแƒ‘แƒ˜แƒก แƒœแƒแƒ›แƒ”แƒ แƒ˜ (seqnum) แƒ’แƒแƒœแƒกแƒแƒ–แƒฆแƒ•แƒ แƒแƒ•แƒก แƒแƒคแƒกแƒ”แƒขแƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒœแƒแƒ™แƒแƒ“แƒจแƒ˜ แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒ‘แƒแƒ˜แƒขแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ’แƒแƒ˜แƒ’แƒ–แƒแƒ•แƒœแƒ”แƒ‘แƒ แƒแƒ› แƒžแƒแƒ™แƒ”แƒขแƒจแƒ˜. แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒ—แƒฃ แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒžแƒแƒ™แƒ”แƒขแƒจแƒ˜ X แƒ‘แƒแƒ˜แƒขแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒ— แƒ”แƒก แƒ แƒ˜แƒชแƒฎแƒ•แƒ˜ แƒ˜แƒงแƒ N, แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒžแƒแƒ™แƒ”แƒขแƒจแƒ˜ แƒแƒฎแƒแƒšแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒ— แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ N+X. แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒ“แƒแƒกแƒแƒฌแƒงแƒ˜แƒกแƒจแƒ˜ แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒ›แƒฎแƒแƒ แƒ” แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ˜แƒ— แƒ˜แƒ แƒฉแƒ”แƒ•แƒก แƒแƒ› แƒ แƒ˜แƒชแƒฎแƒ•แƒก.

  • แƒ“แƒแƒ“แƒแƒกแƒขแƒฃแƒ แƒ”แƒ‘แƒ˜แƒก แƒœแƒแƒ›แƒ”แƒ แƒ˜ (acknum) - แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒแƒคแƒกแƒ”แƒขแƒ˜, แƒ แƒแƒ’แƒแƒ แƒช seqnum, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ˜แƒก แƒ’แƒแƒœแƒกแƒแƒ–แƒฆแƒ•แƒ แƒแƒ•แƒก แƒแƒ แƒ แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒฃแƒšแƒ˜ แƒ‘แƒแƒ˜แƒขแƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒแƒก, แƒแƒ แƒแƒ›แƒ”แƒ“ แƒ›แƒ˜แƒ›แƒฆแƒ”แƒ‘แƒ˜แƒก แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒ‘แƒแƒ˜แƒขแƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒแƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ’แƒแƒ›แƒ’แƒ–แƒแƒ•แƒœแƒ›แƒ แƒ•แƒ”แƒ  แƒœแƒแƒฎแƒ.

แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒ“แƒแƒกแƒแƒฌแƒงแƒ˜แƒกแƒจแƒ˜ แƒ›แƒฎแƒแƒ แƒ”แƒ”แƒ‘แƒ˜ แƒฃแƒœแƒ“แƒ แƒจแƒ”แƒ—แƒแƒœแƒฎแƒ›แƒ“แƒœแƒ”แƒœ seqnum ะธ acknum. แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜ แƒ—แƒแƒ•แƒ˜แƒกแƒ—แƒแƒœ แƒ”แƒ แƒ—แƒแƒ“ แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก SYN แƒžแƒแƒ™แƒ”แƒขแƒก seqnum = X. แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜ แƒžแƒแƒกแƒฃแƒฎแƒแƒ‘แƒก SYNACK แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒ—, แƒกแƒแƒ“แƒแƒช แƒ˜แƒก แƒฌแƒ”แƒ แƒก แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒก seqnum = Y แƒ“แƒ แƒแƒ›แƒฎแƒ”แƒšแƒก acknum = X + 1. แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜ แƒžแƒแƒกแƒฃแƒฎแƒแƒ‘แƒก SYNACK-แƒก ACK แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒ—, แƒกแƒแƒ“แƒแƒช seqnum = X + 1, acknum = Y + 1. แƒแƒ›แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒคแƒแƒฅแƒขแƒแƒ‘แƒ แƒ˜แƒ•แƒ˜ แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒ แƒ˜แƒฌแƒงแƒ”แƒ‘แƒ.

แƒ—แƒฃ แƒ—แƒแƒœแƒแƒ›แƒแƒกแƒแƒฃแƒ‘แƒ แƒ” แƒแƒ  แƒแƒ“แƒแƒกแƒขแƒฃแƒ แƒ”แƒ‘แƒก แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒแƒก, TCP แƒฎแƒ”แƒšแƒแƒฎแƒšแƒ แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก แƒ›แƒแƒก แƒ“แƒ แƒแƒ˜แƒก แƒแƒ›แƒแƒฌแƒฃแƒ แƒ•แƒ˜แƒ—.

แƒ แƒแƒขแƒแƒ› แƒแƒ  แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ SYN แƒฅแƒฃแƒฅแƒ˜แƒ”แƒ‘แƒ˜ แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก?

แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜, แƒ—แƒฃ SYNACK แƒแƒœ ACK แƒ“แƒแƒ˜แƒ™แƒแƒ แƒ’แƒ”แƒ‘แƒ, แƒ›แƒแƒ’แƒ˜แƒฌแƒ”แƒ•แƒ— แƒ•แƒ”แƒšแƒแƒ“แƒแƒ— แƒฎแƒ”แƒšแƒแƒฎแƒšแƒ แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒแƒก - แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒ“แƒแƒ›แƒงแƒแƒ แƒ”แƒ‘แƒ แƒจแƒ”แƒœแƒ”แƒšแƒ“แƒ”แƒ‘แƒ. แƒ›แƒ”แƒแƒ แƒ”แƒช, SYN แƒžแƒแƒ™แƒ”แƒขแƒจแƒ˜ - แƒ“แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ›แƒแƒกแƒจแƒ˜! - แƒ’แƒแƒ“แƒแƒชแƒ”แƒ›แƒฃแƒšแƒ˜แƒ แƒ›แƒ แƒแƒ•แƒแƒšแƒ˜ แƒ•แƒแƒ แƒ˜แƒแƒœแƒขแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ’แƒแƒ•แƒšแƒ”แƒœแƒแƒก แƒแƒฎแƒ“แƒ”แƒœแƒก แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ’แƒแƒ› แƒ›แƒฃแƒจแƒแƒแƒ‘แƒแƒ–แƒ”. แƒแƒ  แƒแƒฎแƒกแƒแƒ•แƒก แƒจแƒ”แƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ SYN แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜, แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜ แƒฃแƒ’แƒฃแƒšแƒ”แƒ‘แƒ”แƒšแƒงแƒแƒคแƒก แƒแƒ› แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒก, แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒจแƒ˜ แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜ แƒ›แƒแƒ— แƒแƒฆแƒแƒ  แƒ’แƒแƒฃแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก. TCP แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ˜แƒ›แƒฃแƒจแƒแƒแƒก แƒแƒ› แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒ›แƒแƒ’แƒ แƒแƒ› แƒกแƒแƒฌแƒงแƒ˜แƒก แƒ”แƒขแƒแƒžแƒ–แƒ” แƒ›แƒแƒ˜แƒœแƒช แƒจแƒ”แƒ›แƒชแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒฎแƒแƒ แƒ˜แƒกแƒฎแƒ˜.

แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒ—แƒ•แƒแƒšแƒกแƒแƒ–แƒ แƒ˜แƒกแƒ˜แƒ—, XDP แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒแƒ› แƒฃแƒœแƒ“แƒ แƒ’แƒแƒแƒ™แƒ”แƒ—แƒแƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜:

  • แƒฃแƒžแƒแƒกแƒฃแƒฎแƒ”แƒ— SYN-แƒก SYNACK-แƒ˜แƒ— แƒฅแƒฃแƒฅแƒ˜แƒ˜แƒ—;
  • แƒฃแƒžแƒแƒกแƒฃแƒฎแƒ”แƒ— ACK RST-แƒ˜แƒ— (แƒ’แƒแƒขแƒ”แƒฎแƒ”แƒ— แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜);
  • แƒฉแƒแƒ›แƒแƒแƒ’แƒ“แƒ”แƒก แƒกแƒฎแƒ•แƒ แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜.

แƒแƒšแƒ’แƒแƒ แƒ˜แƒ—แƒ›แƒ˜แƒก แƒคแƒกแƒ”แƒ•แƒ“แƒแƒ™แƒแƒ“แƒ˜ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒแƒœแƒแƒšแƒ˜แƒ–แƒ—แƒแƒœ แƒ”แƒ แƒ—แƒแƒ“:

ะ•ัะปะธ ัั‚ะพ ะฝะต Ethernet,
    ะฟั€ะพะฟัƒัั‚ะธั‚ัŒ ะฟะฐะบะตั‚.
ะ•ัะปะธ ัั‚ะพ ะฝะต IPv4,
    ะฟั€ะพะฟัƒัั‚ะธั‚ัŒ ะฟะฐะบะตั‚.
ะ•ัะปะธ ะฐะดั€ะตั ะฒ ั‚ะฐะฑะปะธั†ะต ะฟั€ะพะฒะตั€ะตะฝะฝั‹ั…,               (*)
        ัƒะผะตะฝัŒัˆะธั‚ัŒ ัั‡ะตั‚ั‡ะธะบ ะพัั‚ะฐะฒัˆะธั…ัั ะฟั€ะพะฒะตั€ะพะบ,
        ะฟั€ะพะฟัƒัั‚ะธั‚ัŒ ะฟะฐะบะตั‚.
ะ•ัะปะธ ัั‚ะพ ะฝะต TCP,
    ัะฑั€ะพัะธั‚ัŒ ะฟะฐะบะตั‚.     (**)
ะ•ัะปะธ ัั‚ะพ SYN,
    ะพั‚ะฒะตั‚ะธั‚ัŒ SYN-ACK ั cookie.
ะ•ัะปะธ ัั‚ะพ ACK,
    ะตัะปะธ ะฒ acknum ะปะตะถะธั‚ ะฝะต cookie,
        ัะฑั€ะพัะธั‚ัŒ ะฟะฐะบะตั‚.
    ะ—ะฐะฝะตัั‚ะธ ะฒ ั‚ะฐะฑะปะธั†ัƒ ะฐะดั€ะตั ั N ะพัั‚ะฐะฒัˆะธั…ัั ะฟั€ะพะฒะตั€ะพะบ.    (*)
    ะžั‚ะฒะตั‚ะธั‚ัŒ RST.   (**)
ะ’ ะพัั‚ะฐะปัŒะฝั‹ั… ัะปัƒั‡ะฐัั… ัะฑั€ะพัะธั‚ัŒ ะฟะฐะบะตั‚.

แƒ”แƒ แƒ—แƒ˜ (*) แƒ›แƒแƒœแƒ˜แƒจแƒœแƒฃแƒšแƒ˜แƒ แƒฌแƒ”แƒ แƒขแƒ˜แƒšแƒ”แƒ‘แƒ˜, แƒกแƒแƒ“แƒแƒช แƒกแƒแƒญแƒ˜แƒ แƒแƒ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ˜แƒก แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ˜แƒก แƒ›แƒแƒ แƒ—แƒ•แƒ - แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒ”แƒขแƒแƒžแƒ–แƒ”, แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ’แƒแƒแƒ™แƒ”แƒ—แƒแƒ— แƒ›แƒแƒ— แƒ’แƒแƒ แƒ”แƒจแƒ” แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ TCP แƒฎแƒ”แƒšแƒ˜แƒก แƒฉแƒแƒ›แƒแƒ แƒ—แƒ›แƒ”แƒ•แƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ•แƒ˜แƒ— SYN แƒฅแƒฃแƒฅแƒ˜-แƒคแƒแƒ˜แƒšแƒ˜แƒก, แƒ แƒแƒ’แƒแƒ แƒช seqnum-แƒ˜แƒก แƒ’แƒ”แƒœแƒ”แƒ แƒ˜แƒ แƒ”แƒ‘แƒ˜แƒ—.

แฒกแƒแƒ˜แƒขแƒ–แƒ” (**), แƒกแƒแƒœแƒแƒ› แƒ›แƒแƒ’แƒ˜แƒ“แƒ แƒแƒ  แƒ’แƒ•แƒแƒฅแƒ•แƒก, แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ›แƒแƒ•แƒขแƒแƒ•แƒ”แƒ‘แƒ— แƒžแƒแƒ™แƒ”แƒขแƒก.

TCP แƒฎแƒ”แƒšแƒ˜แƒก แƒฉแƒแƒ›แƒแƒ แƒ—แƒ›แƒ”แƒ•แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ

แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒแƒœแƒแƒšแƒ˜แƒ–แƒ˜ แƒ“แƒ แƒ™แƒแƒ“แƒ˜แƒก แƒ’แƒแƒ“แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ

แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒกแƒแƒ—แƒแƒฃแƒ แƒ˜แƒก แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ”แƒ‘แƒ˜: Ethernet (uapi/linux/if_ether.h), IPv4 (uapi/linux/ip.h) แƒ“แƒ TCP (uapi/linux/tcp.h). แƒ‘แƒแƒšแƒ แƒ›แƒ” แƒ•แƒ”แƒ  แƒ“แƒแƒ•แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ” แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒ atomic64_tแƒ›แƒ” แƒ›แƒแƒ›แƒ˜แƒฌแƒ˜แƒ แƒกแƒแƒญแƒ˜แƒ แƒ แƒ’แƒแƒœแƒ›แƒแƒ แƒขแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ™แƒแƒžแƒ˜แƒ แƒ”แƒ‘แƒ แƒ™แƒแƒ“แƒจแƒ˜.

แƒงแƒ•แƒ”แƒšแƒ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ’แƒแƒ›แƒแƒ˜แƒ แƒฉแƒ”แƒ•แƒ C-แƒจแƒ˜ แƒฌแƒแƒ™แƒ˜แƒ—แƒฎแƒ•แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒฃแƒœแƒ“แƒ แƒ˜แƒงแƒแƒก แƒฉแƒแƒกแƒ›แƒฃแƒšแƒ˜ แƒ–แƒแƒ แƒ˜แƒก แƒแƒ“แƒ’แƒ˜แƒšแƒ–แƒ”, แƒ แƒแƒ“แƒ’แƒแƒœ แƒ‘แƒ˜แƒ แƒ—แƒ•แƒจแƒ˜ eBPF แƒ•แƒ”แƒ แƒ˜แƒคแƒ˜แƒ™แƒแƒขแƒแƒ แƒ˜ แƒ™แƒ แƒซแƒแƒšแƒแƒ•แƒก แƒฃแƒ™แƒแƒœแƒ แƒœแƒแƒฎแƒขแƒแƒ›แƒ”แƒ‘แƒก, แƒแƒœแƒฃ แƒคแƒแƒฅแƒขแƒแƒ‘แƒ แƒ˜แƒ•แƒแƒ“ แƒ›แƒแƒ แƒงแƒฃแƒŸแƒ”แƒ‘แƒก แƒ“แƒ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒซแƒแƒฎแƒ”แƒ‘แƒแƒก.

#define INTERNAL static __attribute__((always_inline))

แƒ›แƒแƒ™แƒ แƒ LOG() แƒ’แƒแƒ›แƒแƒ แƒ—แƒแƒ•แƒก แƒ‘แƒ”แƒญแƒ“แƒ•แƒแƒก แƒ’แƒแƒ›แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก แƒ•แƒ”แƒ แƒกแƒ˜แƒแƒจแƒ˜.

แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ แƒแƒ แƒ˜แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒšแƒกแƒแƒ“แƒ”แƒœแƒ˜. แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒ˜แƒฆแƒ”แƒ‘แƒก แƒžแƒแƒ™แƒ”แƒขแƒก, แƒ แƒแƒ›แƒ”แƒšแƒจแƒ˜แƒช แƒ›แƒแƒœแƒ˜แƒจแƒœแƒฃแƒšแƒ˜แƒ แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒกแƒ˜ แƒ“แƒแƒœแƒ˜แƒก แƒกแƒแƒ—แƒแƒฃแƒ แƒ˜, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, process_ether() แƒ”แƒšแƒแƒ“แƒ”แƒ‘แƒ แƒจแƒ”แƒ•แƒกแƒ”แƒ‘แƒแƒก ether. แƒกแƒแƒ•แƒ”แƒšแƒ” แƒแƒœแƒแƒšแƒ˜แƒ–แƒ˜แƒก แƒจแƒ”แƒ“แƒ”แƒ’แƒ”แƒ‘แƒ–แƒ” แƒ“แƒแƒงแƒ แƒ“แƒœแƒแƒ‘แƒ˜แƒ—, แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒแƒก แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ’แƒแƒ“แƒแƒขแƒแƒœแƒ แƒฃแƒคแƒ แƒ แƒ›แƒแƒฆแƒแƒš แƒ“แƒแƒœแƒ”แƒ–แƒ”. แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ˜แƒก แƒจแƒ”แƒ“แƒ”แƒ’แƒ˜ แƒแƒ แƒ˜แƒก XDP แƒ›แƒแƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒ. แƒกแƒแƒœแƒแƒ› SYN แƒ“แƒ ACK แƒ“แƒแƒ›แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒšแƒ”แƒ‘แƒ˜ แƒฃแƒจแƒ•แƒ”แƒ‘แƒ”แƒœ แƒงแƒ•แƒ”แƒšแƒ แƒžแƒแƒ™แƒ”แƒขแƒก.

struct Packet {
    struct xdp_md* ctx;

    struct ethhdr* ether;
    struct iphdr* ip;
    struct tcphdr* tcp;
};

INTERNAL int process_tcp_syn(struct Packet* packet) { return XDP_PASS; }
INTERNAL int process_tcp_ack(struct Packet* packet) { return XDP_PASS; }
INTERNAL int process_tcp(struct Packet* packet) { ... }
INTERNAL int process_ip(struct Packet* packet) { ... }

INTERNAL int
process_ether(struct Packet* packet) {
    struct ethhdr* ether = packet->ether;

    LOG("Ether(proto=0x%x)", bpf_ntohs(ether->h_proto));

    if (ether->h_proto != bpf_ntohs(ETH_P_IP)) {
        return XDP_PASS;
    }

    // B
    struct iphdr* ip = (struct iphdr*)(ether + 1);
    if ((void*)(ip + 1) > (void*)packet->ctx->data_end) {
        return XDP_DROP; /* malformed packet */
    }

    packet->ip = ip;
    return process_ip(packet);
}

SEC("prog")
int xdp_main(struct xdp_md* ctx) {
    struct Packet packet;
    packet.ctx = ctx;

    // A
    struct ethhdr* ether = (struct ethhdr*)(void*)ctx->data;
    if ((void*)(ether + 1) > (void*)ctx->data_end) {
        return XDP_PASS;
    }

    packet.ether = ether;
    return process_ether(&packet);
}

แƒงแƒฃแƒ แƒแƒ“แƒฆแƒ”แƒ‘แƒแƒก แƒ•แƒแƒฅแƒชแƒ”แƒ• A แƒ“แƒ B แƒ›แƒแƒœแƒ˜แƒจแƒœแƒฃแƒš แƒฉแƒ”แƒ™แƒ”แƒ‘แƒก. แƒ—แƒฃ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒก แƒ’แƒแƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒ— A, แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ แƒแƒจแƒ”แƒœแƒ“แƒ”แƒ‘แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒฉแƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ˜แƒกแƒแƒก แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒ’แƒแƒ“แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ:

Verifier analysis:

<...>
11: (7b) *(u64 *)(r10 -48) = r1
12: (71) r3 = *(u8 *)(r7 +13)
invalid access to packet, off=13 size=1, R7(id=0,off=0,r=0)
R7 offset is outside of the packet
processed 11 insns (limit 1000000) max_states_per_insn 0 total_states 0 peak_states 0 mark_read 0

Error fetching program/map!

แƒ’แƒแƒกแƒแƒฆแƒ”แƒ‘แƒ˜แƒก แƒกแƒขแƒ แƒ˜แƒฅแƒแƒœแƒ˜ invalid access to packet, off=13 size=1, R7(id=0,off=0,r=0): แƒแƒ แƒ˜แƒก แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒ‘แƒ˜แƒšแƒ˜แƒ™แƒ”แƒ‘แƒ˜, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ‘แƒฃแƒคแƒ”แƒ แƒ˜แƒก แƒ“แƒแƒฌแƒงแƒ”แƒ‘แƒ˜แƒ“แƒแƒœ แƒ›แƒ”แƒชแƒแƒ›แƒ”แƒขแƒ” แƒ‘แƒแƒ˜แƒขแƒ˜ แƒแƒ แƒ˜แƒก แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ’แƒแƒ แƒ”แƒ—. แƒกแƒ˜แƒ˜แƒ“แƒแƒœ แƒซแƒœแƒ”แƒšแƒ˜แƒ แƒ˜แƒ›แƒ˜แƒก แƒ—แƒฅแƒ›แƒ, แƒ แƒแƒ›แƒ”แƒš แƒฎแƒแƒ–แƒ–แƒ” แƒ•แƒกแƒแƒฃแƒ‘แƒ แƒแƒ‘แƒ—, แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒ แƒ˜แƒก แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒฅแƒชแƒ˜แƒ˜แƒก แƒœแƒแƒ›แƒ”แƒ แƒ˜ (12) แƒ“แƒ แƒ“แƒ”แƒ›แƒแƒœแƒขแƒแƒŸแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒก แƒฌแƒงแƒแƒ แƒแƒก แƒ™แƒแƒ“แƒ˜แƒก แƒฎแƒแƒ–แƒ”แƒ‘แƒก:

llvm-objdump -S xdp_filter.o | less

แƒแƒ› แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒ˜แƒก แƒ›แƒ˜แƒฃแƒ—แƒ˜แƒ—แƒ”แƒ‘แƒก แƒฎแƒแƒ–แƒ–แƒ”

LOG("Ether(proto=0x%x)", bpf_ntohs(ether->h_proto));

แƒ แƒแƒช แƒชแƒฎแƒแƒ“แƒงแƒแƒคแƒก, แƒ แƒแƒ› แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ แƒแƒ แƒ˜แƒก ether. แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒแƒกแƒ” แƒ˜แƒฅแƒœแƒ”แƒ‘แƒแƒ“แƒ.

แƒžแƒแƒกแƒฃแƒฎแƒ˜ SYN-แƒ–แƒ”

แƒ›แƒ˜แƒ–แƒแƒœแƒ˜ แƒแƒ› แƒ”แƒขแƒแƒžแƒ–แƒ” แƒแƒ แƒ˜แƒก แƒกแƒฌแƒแƒ แƒ˜ SYNACK แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ’แƒ”แƒœแƒ”แƒ แƒ˜แƒ แƒ”แƒ‘แƒ แƒคแƒ˜แƒฅแƒกแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ seqnum, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒจแƒ˜ แƒจแƒ”แƒ˜แƒชแƒ•แƒšแƒ”แƒ‘แƒ SYN แƒฅแƒฃแƒฅแƒ˜แƒ˜แƒ—. แƒงแƒ•แƒ”แƒšแƒ แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ แƒฎแƒ“แƒ”แƒ‘แƒ process_tcp_syn() แƒ“แƒ แƒจแƒ”แƒ›แƒแƒ’แƒแƒ แƒ”แƒœแƒ˜.

แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ

แƒฃแƒชแƒœแƒแƒฃแƒ แƒแƒ“ แƒกแƒแƒ™แƒ›แƒแƒ แƒ˜แƒกแƒ˜แƒ, แƒแƒฅ แƒแƒ แƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒฆแƒ˜แƒ แƒกแƒจแƒ”แƒกแƒแƒœแƒ˜แƒจแƒœแƒแƒ•แƒ˜ แƒฎแƒแƒ–แƒ˜, แƒฃแƒคแƒ แƒ แƒกแƒฌแƒแƒ แƒแƒ“, แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜ แƒ›แƒแƒกแƒ–แƒ”:

/* Required to verify checksum calculation */
const void* data_end = (const void*)ctx->data_end;

แƒ™แƒแƒ“แƒ˜แƒก แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒก แƒ“แƒแƒฌแƒ”แƒ แƒ˜แƒกแƒแƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ˜แƒฅแƒœแƒ 5.1 แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜, แƒ แƒแƒ›แƒšแƒ˜แƒก แƒ’แƒแƒ“แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒกแƒแƒช แƒ˜แƒงแƒ แƒ’แƒแƒœแƒกแƒฎแƒ•แƒแƒ•แƒ”แƒ‘แƒ data_end ะธ (const void*)ctx->data_end. แƒฌแƒ”แƒ แƒ˜แƒก แƒ“แƒ แƒแƒก 5.3.1 แƒ‘แƒ˜แƒ แƒ—แƒ•แƒก แƒ”แƒก แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ แƒแƒ  แƒฅแƒแƒœแƒ“แƒ. แƒจแƒ”แƒกแƒแƒซแƒšแƒแƒ, แƒจแƒ”แƒ›แƒ“แƒ’แƒ”แƒœแƒ”แƒšแƒ˜ แƒšแƒแƒ™แƒแƒšแƒฃแƒ  แƒชแƒ•แƒšแƒแƒ“แƒ–แƒ” แƒฌแƒ•แƒ“แƒแƒ›แƒแƒก แƒกแƒฎแƒ•แƒแƒ’แƒ•แƒแƒ แƒแƒ“ แƒฌแƒ•แƒ“แƒ”แƒ‘แƒแƒ“แƒ, แƒ•แƒ˜แƒ“แƒ แƒ” แƒ•แƒ”แƒšแƒ–แƒ”. แƒ›แƒแƒ แƒแƒšแƒ˜ - แƒ“แƒ˜แƒ“ แƒ‘แƒฃแƒ“แƒ”แƒ–แƒ”, แƒ™แƒแƒ“แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ”แƒ‘แƒ แƒ“แƒแƒ’แƒ”แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒแƒ—.

แƒกแƒ˜แƒ’แƒ แƒซแƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ’แƒแƒ›แƒ˜ แƒ แƒฃแƒขแƒ˜แƒœแƒฃแƒšแƒ˜ แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ แƒ•แƒ”แƒ แƒ˜แƒคแƒ˜แƒ™แƒแƒขแƒแƒ แƒ˜แƒก แƒ“แƒ˜แƒ“แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก; แƒ MAX_CSUM_BYTES ะะธะถะต.

const u32 ip_len = ip->ihl * 4;
if ((void*)ip + ip_len > data_end) {
    return XDP_DROP; /* malformed packet */
}
if (ip_len > MAX_CSUM_BYTES) {
    return XDP_ABORTED; /* implementation limitation */
}

const u32 tcp_len = tcp->doff * 4;
if ((void*)tcp + tcp_len > (void*)ctx->data_end) {
    return XDP_DROP; /* malformed packet */
}
if (tcp_len > MAX_CSUM_BYTES) {
    return XDP_ABORTED; /* implementation limitation */
}

แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ’แƒแƒ•แƒ แƒชแƒ”แƒšแƒ”แƒ‘แƒ

แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒ•แƒกแƒ”แƒ‘แƒ— seqnum ะธ acknum, แƒ“แƒแƒแƒงแƒ”แƒœแƒ”แƒ— ACK (SYN แƒฃแƒ™แƒ•แƒ” แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ):

const u32 cookie = 42;
tcp->ack_seq = bpf_htonl(bpf_ntohl(tcp->seq) + 1);
tcp->seq = bpf_htonl(cookie);
tcp->ack = 1;

แƒจแƒ”แƒชแƒ•แƒแƒšแƒ”แƒ— TCP แƒžแƒแƒ แƒขแƒ”แƒ‘แƒ˜, IP แƒ“แƒ MAC แƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ”แƒ‘แƒ˜. แƒกแƒขแƒแƒœแƒ“แƒแƒ แƒขแƒฃแƒšแƒ˜ แƒ‘แƒ˜แƒ‘แƒšแƒ˜แƒแƒ—แƒ”แƒ™แƒ แƒแƒ  แƒแƒ แƒ˜แƒก แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜ XDP แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒ“แƒแƒœ, แƒแƒ›แƒ˜แƒขแƒแƒ› memcpy() - แƒ›แƒแƒ™แƒ แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ›แƒแƒšแƒแƒ•แƒก แƒ™แƒšแƒแƒœแƒ’แƒ˜แƒก แƒจแƒ˜แƒ’แƒ—แƒแƒ•แƒกแƒก.

const u16 temp_port = tcp->source;
tcp->source = tcp->dest;
tcp->dest = temp_port;

const u32 temp_ip = ip->saddr;
ip->saddr = ip->daddr;
ip->daddr = temp_ip;

struct ethhdr temp_ether = *ether;
memcpy(ether->h_dest, temp_ether.h_source, ETH_ALEN);
memcpy(ether->h_source, temp_ether.h_dest, ETH_ALEN);

แƒกแƒแƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ แƒฏแƒแƒ›แƒ˜แƒก แƒฎแƒ”แƒšแƒแƒฎแƒแƒšแƒ˜ แƒ’แƒแƒแƒœแƒ’แƒแƒ แƒ˜แƒจแƒ”แƒ‘แƒ

IPv4 แƒ“แƒ TCP แƒกแƒแƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ แƒฏแƒแƒ›แƒ”แƒ‘แƒ˜ แƒ›แƒแƒ˜แƒ—แƒฎแƒแƒ•แƒก แƒกแƒแƒ—แƒแƒฃแƒ แƒ”แƒ‘แƒจแƒ˜ แƒงแƒ•แƒ”แƒšแƒ 16-แƒ‘แƒ˜แƒขแƒ˜แƒแƒœแƒ˜ แƒกแƒ˜แƒขแƒงแƒ•แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒแƒก แƒ“แƒ แƒ›แƒแƒ—แƒจแƒ˜ แƒ˜แƒฌแƒ”แƒ แƒ”แƒ‘แƒ แƒกแƒแƒ—แƒแƒฃแƒ แƒ”แƒ‘แƒ˜แƒก แƒ–แƒแƒ›แƒ, แƒแƒœแƒฃ แƒจแƒ”แƒ“แƒ’แƒ”แƒœแƒ˜แƒก แƒ“แƒ แƒแƒก แƒฃแƒชแƒœแƒแƒ‘แƒ˜แƒ. แƒ”แƒก แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒแƒ, แƒ แƒแƒ“แƒ’แƒแƒœ แƒ•แƒ”แƒ แƒ˜แƒคแƒ˜แƒ™แƒแƒขแƒแƒ แƒ˜ แƒแƒ  แƒ’แƒแƒ›แƒแƒขแƒแƒ•แƒ”แƒ‘แƒก แƒœแƒแƒ แƒ›แƒแƒšแƒฃแƒ  แƒชแƒ˜แƒ™แƒšแƒก แƒกแƒแƒกแƒแƒ–แƒฆแƒ•แƒ แƒ แƒชแƒ•แƒšแƒแƒ“แƒแƒ›แƒ“แƒ”. แƒ›แƒแƒ’แƒ แƒแƒ› แƒกแƒแƒ—แƒแƒฃแƒ แƒ”แƒ‘แƒ˜แƒก แƒ–แƒแƒ›แƒ แƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒฃแƒšแƒ˜แƒ: แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ 64 แƒ‘แƒแƒ˜แƒขแƒแƒ›แƒ“แƒ”. แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ’แƒแƒแƒ™แƒ”แƒ—แƒแƒ— แƒ›แƒแƒ แƒงแƒฃแƒŸแƒ˜ แƒคแƒ˜แƒฅแƒกแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒ”แƒแƒ แƒ”แƒ‘แƒ˜แƒ—, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒแƒ“แƒ แƒ” แƒ“แƒแƒกแƒ แƒฃแƒšแƒ“แƒ”แƒก.

แƒแƒฆแƒ•แƒœแƒ˜แƒจแƒœแƒแƒ•, แƒ แƒแƒ› แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก RFC 1624 แƒ˜แƒ›แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒฃแƒœแƒ“แƒ แƒ’แƒแƒ›แƒแƒ•แƒ—แƒ•แƒแƒšแƒแƒ— แƒกแƒแƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ แƒฏแƒแƒ›แƒ˜ แƒœแƒแƒฌแƒ˜แƒšแƒแƒ‘แƒ แƒ˜แƒ•, แƒ—แƒฃ แƒจแƒ”แƒ˜แƒชแƒ•แƒšแƒ”แƒ‘แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒคแƒ˜แƒฅแƒกแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒกแƒ˜แƒขแƒงแƒ•แƒ”แƒ‘แƒ˜. แƒ—แƒฃแƒ›แƒชแƒ, แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒก แƒฃแƒœแƒ˜แƒ•แƒ”แƒ แƒกแƒแƒšแƒฃแƒ แƒ˜ แƒ“แƒ แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒœแƒแƒ แƒฉแƒฃแƒœแƒ”แƒ‘แƒ แƒฃแƒคแƒ แƒ แƒ แƒ—แƒฃแƒšแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ.

แƒกแƒแƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ แƒฏแƒแƒ›แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ—แƒ•แƒšแƒ˜แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ:

#define MAX_CSUM_WORDS 32
#define MAX_CSUM_BYTES (MAX_CSUM_WORDS * 2)

INTERNAL u32
sum16(const void* data, u32 size, const void* data_end) {
    u32 s = 0;
#pragma unroll
    for (u32 i = 0; i < MAX_CSUM_WORDS; i++) {
        if (2*i >= size) {
            return s; /* normal exit */
        }
        if (data + 2*i + 1 + 1 > data_end) {
            return 0; /* should be unreachable */
        }
        s += ((const u16*)data)[i];
    }
    return s;
}

แƒ›แƒ˜แƒฃแƒฎแƒ”แƒ“แƒแƒ•แƒแƒ“ แƒ˜แƒ›แƒ˜แƒกแƒ size แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ’แƒแƒ›แƒแƒซแƒแƒฎแƒ”แƒ‘แƒ˜แƒก แƒ™แƒแƒ“แƒ˜แƒ—, แƒ›แƒ”แƒแƒ แƒ” แƒ’แƒแƒกแƒแƒกแƒ•แƒšแƒ”แƒšแƒ˜ แƒžแƒ˜แƒ แƒแƒ‘แƒแƒ แƒกแƒแƒญแƒ˜แƒ แƒ, แƒ แƒแƒ—แƒ แƒจแƒ”แƒ›แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ”แƒšแƒ›แƒ แƒ“แƒแƒแƒ›แƒขแƒ™แƒ˜แƒชแƒแƒก แƒ›แƒแƒ แƒงแƒฃแƒŸแƒ˜แƒก แƒ“แƒแƒกแƒแƒกแƒ แƒฃแƒšแƒ˜.

32-แƒ‘แƒ˜แƒขแƒ˜แƒแƒœแƒ˜ แƒกแƒ˜แƒขแƒงแƒ•แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ˜แƒšแƒ˜แƒ แƒฃแƒคแƒ แƒ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒ•แƒ”แƒ แƒกแƒ˜แƒ:

INTERNAL u32
sum16_32(u32 v) {
    return (v >> 16) + (v & 0xffff);
}

แƒ แƒ”แƒแƒšแƒฃแƒ แƒแƒ“ แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒฏแƒแƒ›แƒ”แƒ‘แƒ˜แƒก แƒฎแƒ”แƒšแƒแƒฎแƒแƒšแƒ˜ แƒ’แƒแƒ›แƒแƒ—แƒ•แƒšแƒ แƒ“แƒ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒฃแƒ™แƒแƒœ แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ:

ip->check = 0;
ip->check = carry(sum16(ip, ip_len, data_end));

u32 tcp_csum = 0;
tcp_csum += sum16_32(ip->saddr);
tcp_csum += sum16_32(ip->daddr);
tcp_csum += 0x0600;
tcp_csum += tcp_len << 8;
tcp->check = 0;
tcp_csum += sum16(tcp, tcp_len, data_end);
tcp->check = carry(tcp_csum);

return XDP_TX;

แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ carry() แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒก แƒกแƒแƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ แƒฏแƒแƒ›แƒก 32-แƒ‘แƒ˜แƒขแƒ˜แƒแƒœแƒ˜ แƒกแƒ˜แƒขแƒงแƒ•แƒ”แƒ‘แƒ˜แƒก 16-แƒ‘แƒ˜แƒขแƒ˜แƒแƒœแƒ˜ แƒฏแƒแƒ›แƒ˜แƒ“แƒแƒœ, RFC 791-แƒ˜แƒก แƒ›แƒ˜แƒฎแƒ”แƒ“แƒ•แƒ˜แƒ—.

TCP แƒฎแƒ”แƒšแƒ˜แƒก แƒฉแƒแƒ›แƒแƒ แƒ—แƒ›แƒ”แƒ•แƒ˜แƒก แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ

แƒคแƒ˜แƒšแƒขแƒ แƒ˜ แƒกแƒฌแƒแƒ แƒแƒ“ แƒแƒ›แƒงแƒแƒ แƒ”แƒ‘แƒก แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒก netcatแƒกแƒแƒ‘แƒแƒšแƒแƒ ACK-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒขแƒแƒ•แƒ”แƒ‘แƒ, แƒ แƒแƒ–แƒ”แƒช Linux-แƒ›แƒ แƒฃแƒžแƒแƒกแƒฃแƒฎแƒ RST แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒ—, แƒ แƒแƒ“แƒ’แƒแƒœ แƒฅแƒกแƒ”แƒšแƒ˜แƒก แƒ“แƒแƒกแƒขแƒแƒก แƒแƒ  แƒ›แƒ˜แƒฃแƒฆแƒ˜แƒ SYN - แƒ˜แƒก แƒ’แƒแƒ“แƒแƒ™แƒ”แƒ—แƒ“แƒ SYNACK-แƒจแƒ˜ แƒ“แƒ แƒฃแƒ™แƒแƒœ แƒ’แƒแƒ˜แƒ’แƒ–แƒแƒ•แƒœแƒ - แƒ“แƒ OS-แƒ˜แƒก แƒ—แƒ•แƒแƒšแƒกแƒแƒ–แƒ แƒ˜แƒกแƒ˜แƒ—, แƒฉแƒแƒ›แƒแƒ•แƒ˜แƒ“แƒ แƒžแƒแƒ™แƒ”แƒขแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒ  แƒ˜แƒงแƒ. แƒฆแƒ˜แƒ แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ—แƒแƒœ แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜.

$ sudo ip netns exec xdp-test   nc -nv 192.0.2.1 6666
192.0.2.1 6666: Connection reset by peer

แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœแƒ˜แƒ แƒกแƒ แƒฃแƒšแƒคแƒแƒกแƒแƒ•แƒแƒœแƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ แƒ“แƒ แƒ“แƒแƒ™แƒ•แƒ˜แƒ แƒ•แƒ”แƒ‘แƒ tcpdump on xdp-remote แƒ แƒแƒ“แƒ’แƒแƒœ, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, hping3 แƒแƒ  แƒžแƒแƒกแƒฃแƒฎแƒแƒ‘แƒก แƒแƒ แƒแƒกแƒฌแƒแƒ  แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒแƒก.

XDP-แƒ˜แƒก แƒ—แƒ•แƒแƒšแƒกแƒแƒ–แƒ แƒ˜แƒกแƒ˜แƒ—, แƒ—แƒ•แƒ˜แƒ— แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ แƒขแƒ แƒ˜แƒ•แƒ˜แƒแƒšแƒฃแƒ แƒ˜แƒ. แƒ’แƒแƒแƒœแƒ’แƒแƒ แƒ˜แƒจแƒ”แƒ‘แƒ˜แƒก แƒแƒšแƒ’แƒแƒ แƒ˜แƒ—แƒ›แƒ˜ แƒžแƒ แƒ˜แƒ›แƒ˜แƒขแƒ˜แƒฃแƒšแƒ˜แƒ แƒ“แƒ แƒกแƒแƒ•แƒแƒ แƒแƒฃแƒ“แƒแƒ“ แƒ“แƒแƒฃแƒชแƒ•แƒ”แƒšแƒ˜แƒ แƒ“แƒแƒฎแƒ•แƒ”แƒฌแƒ˜แƒšแƒ˜ แƒ—แƒแƒ•แƒ“แƒแƒ›แƒกแƒฎแƒ›แƒ”แƒšแƒ˜แƒก แƒ›แƒ˜แƒ›แƒแƒ แƒ—. แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, Linux-แƒ˜แƒก แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜ แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒก แƒ™แƒ แƒ˜แƒžแƒขแƒแƒ’แƒ แƒแƒคแƒ˜แƒฃแƒš SipHash-แƒก, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒ˜แƒกแƒ˜ แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ XDP-แƒกแƒ—แƒ•แƒ˜แƒก แƒแƒจแƒ™แƒแƒ แƒแƒ“ แƒกแƒชแƒ˜แƒšแƒ“แƒ”แƒ‘แƒ แƒแƒ› แƒกแƒขแƒแƒขแƒ˜แƒ˜แƒก แƒคแƒแƒ แƒ’แƒšแƒ”แƒ‘แƒก.

แƒ’แƒแƒ›แƒแƒฉแƒœแƒ“แƒ แƒแƒฎแƒแƒšแƒ˜ TODO-แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ’แƒแƒ แƒ” แƒฃแƒ แƒ—แƒ˜แƒ”แƒ แƒ—แƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒ”แƒ‘แƒ—แƒแƒœ:

  • XDP แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ แƒ•แƒ”แƒ  แƒ˜แƒœแƒแƒฎแƒแƒ•แƒก cookie_seed (แƒ›แƒแƒ แƒ˜แƒšแƒ˜แƒก แƒกแƒแƒ˜แƒ“แƒฃแƒ›แƒšแƒ แƒœแƒแƒฌแƒ˜แƒšแƒ˜) แƒ’แƒšแƒแƒ‘แƒแƒšแƒฃแƒ  แƒชแƒ•แƒšแƒแƒ“แƒจแƒ˜, แƒ’แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒแƒ— แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒ›แƒแƒฆแƒแƒ–แƒ˜แƒ, แƒ แƒแƒ›แƒšแƒ˜แƒก แƒฆแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ”แƒ‘แƒ แƒžแƒ”แƒ แƒ˜แƒแƒ“แƒฃแƒšแƒแƒ“ แƒ’แƒแƒœแƒแƒฎแƒšแƒ“แƒ”แƒ‘แƒ แƒกแƒแƒ˜แƒ›แƒ”แƒ“แƒ แƒ’แƒ”แƒœแƒ”แƒ แƒแƒขแƒแƒ แƒ˜แƒกแƒ’แƒแƒœ.

  • แƒ—แƒฃ ACK แƒžแƒแƒ™แƒ”แƒขแƒจแƒ˜ SYN แƒฅแƒฃแƒฅแƒ˜-แƒคแƒแƒ˜แƒšแƒ˜ แƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ, แƒ—แƒฅแƒ•แƒ”แƒœ แƒแƒ  แƒ’แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒแƒ— แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ‘แƒ”แƒญแƒ“แƒ•แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ’แƒแƒฎแƒกแƒแƒ•แƒ“แƒ”แƒ— แƒ“แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒก IP, แƒ แƒแƒ—แƒ แƒจแƒ”แƒ›แƒ“แƒ’แƒแƒ› แƒ’แƒแƒ›แƒแƒขแƒแƒ•แƒแƒ— แƒžแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜ แƒ›แƒ˜แƒกแƒ’แƒแƒœ.

แƒ“แƒแƒ“แƒแƒกแƒขแƒฃแƒ แƒ”แƒ‘แƒ แƒšแƒ”แƒ’แƒ˜แƒขแƒ˜แƒ›แƒฃแƒ แƒ˜ แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒก แƒ›แƒ˜แƒ”แƒ :

$ sudoip netns exec xdp-test   nc -nv 192.0.2.1 6666
192.0.2.1 6666: Connection reset by peer

แƒŸแƒฃแƒ แƒœแƒแƒšแƒ”แƒ‘แƒ›แƒ แƒฉแƒแƒฌแƒ”แƒ แƒ”แƒก แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ•แƒšแƒ (flags=0x2 แƒแƒ แƒ˜แƒก SYN, flags=0x10 แƒแƒ แƒ˜แƒก ACK):

Ether(proto=0x800)
  IP(src=0x20e6e11a dst=0x20e6e11e proto=6)
    TCP(sport=50836 dport=6666 flags=0x2)
Ether(proto=0x800)
  IP(src=0xfe2cb11a dst=0xfe2cb11e proto=6)
    TCP(sport=50836 dport=6666 flags=0x10)
      cookie matches for client 20200c0

แƒกแƒแƒœแƒแƒ› แƒแƒ  แƒแƒ แƒ˜แƒก แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒฃแƒšแƒ˜ IP-แƒ”แƒ‘แƒ˜แƒก แƒกแƒ˜แƒ, แƒแƒ  แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒ“แƒแƒชแƒ•แƒ แƒ—แƒแƒ•แƒแƒ“ SYN แƒฌแƒงแƒแƒšแƒ“แƒ˜แƒ“แƒแƒ‘แƒ˜แƒกแƒ’แƒแƒœ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒฅ แƒแƒ แƒ˜แƒก แƒ แƒ”แƒแƒฅแƒชแƒ˜แƒ แƒแƒ› แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ˜แƒ— แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒฃแƒš ACK แƒฌแƒงแƒแƒšแƒ“แƒ˜แƒ“แƒแƒ‘แƒแƒ–แƒ”:

sudo ip netns exec xdp-test   hping3 --flood -A -s 1111 -p 2222 192.0.2.1

แƒŸแƒฃแƒ แƒœแƒแƒšแƒ˜แƒก แƒฉแƒแƒœแƒแƒฌแƒ”แƒ แƒ”แƒ‘แƒ˜:

Ether(proto=0x800)
  IP(src=0x15bd11a dst=0x15bd11e proto=6)
    TCP(sport=3236 dport=2222 flags=0x10)
      cookie mismatch

แƒ“แƒแƒกแƒ™แƒ•แƒœแƒ

แƒ–แƒแƒ’แƒฏแƒ”แƒ  eBPF แƒ–แƒแƒ’แƒแƒ“แƒแƒ“ แƒ“แƒ XDP แƒ™แƒแƒœแƒ™แƒ แƒ”แƒขแƒฃแƒšแƒแƒ“ แƒฌแƒแƒ แƒ›แƒแƒ“แƒ’แƒ”แƒœแƒ˜แƒšแƒ˜แƒ แƒ แƒแƒ’แƒแƒ แƒช แƒฃแƒคแƒ แƒ แƒ›แƒแƒฌแƒ˜แƒœแƒแƒ•แƒ” แƒแƒ“แƒ›แƒ˜แƒœแƒ˜แƒกแƒขแƒ แƒแƒขแƒแƒ แƒ˜แƒก แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ˜, แƒ•แƒ˜แƒ“แƒ แƒ” แƒ’แƒแƒœแƒ•แƒ˜แƒ—แƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒžแƒšแƒแƒขแƒคแƒแƒ แƒ›แƒ. แƒ›แƒแƒ แƒ—แƒšแƒแƒช, XDP แƒแƒ แƒ˜แƒก แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒแƒจแƒ˜ แƒฉแƒแƒ แƒ”แƒ•แƒ˜แƒก แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ˜ แƒ“แƒ แƒแƒ แƒ แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒกแƒขแƒ”แƒ™แƒ˜แƒก แƒแƒšแƒขแƒ”แƒ แƒœแƒแƒขแƒ˜แƒ•แƒ, แƒ แƒแƒ’แƒแƒ แƒ˜แƒชแƒแƒ DPDK แƒ“แƒ แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒจแƒ”แƒ›แƒแƒ•แƒšแƒ˜แƒ—แƒ˜ แƒกแƒฎแƒ•แƒ แƒ•แƒแƒ แƒ˜แƒแƒœแƒขแƒ”แƒ‘แƒ˜. แƒ›แƒ”แƒแƒ แƒ”แƒก แƒ›แƒฎแƒ แƒ˜แƒ•, XDP แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒซแƒšแƒ”แƒ•แƒ— แƒ’แƒแƒœแƒแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒแƒ— แƒกแƒแƒ™แƒ›แƒแƒแƒ“ แƒ แƒ—แƒฃแƒšแƒ˜ แƒšแƒแƒ’แƒ˜แƒ™แƒ, แƒ แƒแƒช, แƒฃแƒคแƒ แƒ แƒ›แƒ”แƒขแƒ˜แƒช, แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜แƒ แƒ’แƒแƒœแƒแƒฎแƒšแƒ”แƒ‘แƒ แƒขแƒ แƒแƒคแƒ˜แƒ™แƒ˜แƒก แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ˜แƒก แƒžแƒแƒฃแƒ–แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”. แƒ•แƒ”แƒ แƒ˜แƒคแƒ˜แƒ™แƒแƒขแƒแƒ แƒ˜ แƒ“แƒ˜แƒ“ แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ”แƒ‘แƒก แƒแƒ  แƒฅแƒ›แƒœแƒ˜แƒก, แƒžแƒ˜แƒ แƒแƒ“แƒแƒ“ แƒ›แƒ” แƒฃแƒแƒ แƒก แƒแƒ  แƒ•แƒ˜แƒขแƒงแƒแƒ“แƒ˜ แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒกแƒ˜แƒ•แƒ แƒชแƒ˜แƒก แƒ™แƒแƒ“แƒ˜แƒก แƒœแƒแƒฌแƒ˜แƒšแƒ”แƒ‘แƒ–แƒ”.

แƒ›แƒ”แƒแƒ แƒ” แƒœแƒแƒฌแƒ˜แƒšแƒจแƒ˜, แƒ—แƒฃ แƒ—แƒ”แƒ›แƒ แƒกแƒแƒ˜แƒœแƒขแƒ”แƒ แƒ”แƒกแƒแƒ, แƒจแƒ”แƒ•แƒแƒ•แƒกแƒ”แƒ‘แƒ— แƒ•แƒ”แƒ แƒ˜แƒคแƒ˜แƒชแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒชแƒฎแƒ แƒ˜แƒšแƒก แƒ“แƒ แƒ•แƒแƒ แƒฆแƒ•แƒ”แƒ•แƒ— แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒก, แƒ’แƒแƒœแƒ•แƒแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ— แƒ›แƒ แƒ˜แƒชแƒฎแƒ•แƒ”แƒšแƒ”แƒ‘แƒก แƒ“แƒ แƒ“แƒแƒ•แƒฌแƒ”แƒ แƒ— userspace แƒฃแƒขแƒ˜แƒšแƒ˜แƒขแƒแƒก แƒคแƒ˜แƒšแƒขแƒ แƒ˜แƒก แƒกแƒแƒ›แƒแƒ แƒ—แƒแƒ•แƒแƒ“.

แƒ‘แƒ›แƒฃแƒšแƒ”แƒ‘แƒ˜:

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ