āĻāĻā§āĻ¸āĻĒā§āĻ°ā§āĻ¸ āĻĄā§āĻāĻž āĻĒāĻžāĻĨ (XDP) āĻĒā§āĻ°āĻ¯ā§āĻā§āĻ¤āĻŋ āĻĒā§āĻ¯āĻžāĻā§āĻāĻā§āĻ˛āĻŋ āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ āĻ¨ā§āĻāĻāĻ¯āĻŧāĻžāĻ°ā§āĻ āĻ¸ā§āĻā§āĻ¯āĻžāĻā§ āĻĒā§āĻ°āĻŦā§āĻļ āĻāĻ°āĻžāĻ° āĻāĻā§ āĻ˛āĻŋāĻ¨āĻžāĻā§āĻ¸ āĻāĻ¨ā§āĻāĻžāĻ°āĻĢā§āĻ¸ā§ āĻāĻ˛ā§āĻŽā§āĻ˛ā§ āĻā§āĻ°ā§āĻ¯āĻžāĻĢāĻŋāĻ āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻāĻ°āĻŖā§āĻ° āĻ āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻā§āĻ¯āĻŧāĨ¤ XDP-āĻāĻ° āĻĒā§āĻ°āĻ¯āĻŧā§āĻ - DDoS āĻāĻā§āĻ°āĻŽāĻŖā§āĻ° āĻŦāĻŋāĻ°ā§āĻĻā§āĻ§ā§ āĻ¸ā§āĻ°āĻā§āĻˇāĻž (āĻā§āĻ˛āĻžāĻāĻĄāĻĢā§āĻ˛ā§āĻ¯āĻŧāĻžāĻ°), āĻāĻāĻŋāĻ˛ āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ°, āĻĒāĻ°āĻŋāĻ¸āĻāĻā§āĻ¯āĻžāĻ¨ āĻ¸āĻāĻā§āĻ°āĻš (Netflix)āĨ¤ XDP āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽāĻā§āĻ˛āĻŋ eBPF āĻāĻžāĻ°ā§āĻā§āĻ¯āĻŧāĻžāĻ˛ āĻŽā§āĻļāĻŋāĻ¨ āĻĻā§āĻŦāĻžāĻ°āĻž āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻš āĻāĻ°āĻž āĻšāĻ¯āĻŧ, āĻ¤āĻžāĻ āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ° āĻĒā§āĻ°āĻāĻžāĻ°ā§āĻ° āĻāĻĒāĻ° āĻ¨āĻŋāĻ°ā§āĻāĻ° āĻāĻ°ā§ āĻ¤āĻžāĻĻā§āĻ° āĻā§āĻĄ āĻāĻŦāĻ āĻāĻĒāĻ˛āĻŦā§āĻ§ āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ āĻĢāĻžāĻāĻļāĻ¨ āĻāĻāĻ¯āĻŧā§āĻ° āĻāĻĒāĻ° āĻ¸ā§āĻŽāĻžāĻŦāĻĻā§āĻ§āĻ¤āĻž āĻ°āĻ¯āĻŧā§āĻā§āĨ¤
āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻāĻŋ XDP-āĻ¤ā§ āĻ āĻ¸āĻāĻā§āĻ¯ āĻāĻĒāĻžāĻĻāĻžāĻ¨ā§āĻ° āĻāĻžāĻāĻ¤āĻŋ āĻĒā§āĻ°āĻŖ āĻāĻ°āĻžāĻ° āĻāĻĻā§āĻĻā§āĻļā§āĻ¯ā§ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§āĨ¤ āĻĒā§āĻ°āĻĨāĻŽāĻ¤, āĻ¤āĻžāĻ°āĻž āĻ°ā§āĻĄāĻŋāĻŽā§āĻĄ āĻā§āĻĄ āĻ¸āĻ°āĻŦāĻ°āĻžāĻš āĻāĻ°ā§ āĻ¯āĻž āĻ āĻŦāĻŋāĻ˛āĻŽā§āĻŦā§ XDP-āĻāĻ° āĻŦā§āĻļāĻŋāĻˇā§āĻā§āĻ¯āĻā§āĻ˛āĻŋāĻā§ āĻŦāĻžāĻāĻĒāĻžāĻ¸ āĻāĻ°ā§: āĻāĻāĻŋ āĻ¯āĻžāĻāĻžāĻāĻ¯āĻŧā§āĻ° āĻāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻ¸ā§āĻ¤ā§āĻ¤ āĻŦāĻž āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻ¸ā§āĻˇā§āĻāĻŋ āĻāĻ°āĻ¤ā§ āĻā§āĻŦ āĻ¸āĻšāĻāĨ¤ āĻāĻĒāĻ¨āĻŋ āĻ¯āĻāĻ¨ āĻ¸ā§āĻā§āĻ°ā§āĻ¯āĻžāĻ āĻĨā§āĻā§ āĻāĻĒāĻ¨āĻžāĻ° āĻā§āĻĄ āĻ˛ā§āĻāĻžāĻ° āĻā§āĻˇā§āĻāĻž āĻāĻ°ā§āĻ¨, āĻ¤āĻāĻ¨ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻ¤ā§āĻ°ā§āĻāĻŋāĻā§āĻ˛āĻŋāĻ° āĻ¸āĻžāĻĨā§ āĻā§ āĻāĻ°āĻ¤ā§ āĻšāĻŦā§ āĻ¤āĻž āĻāĻĒāĻ¨āĻžāĻ° āĻā§āĻ¨ āĻ§āĻžāĻ°āĻŖāĻž āĻ¨ā§āĻāĨ¤ āĻĻā§āĻŦāĻŋāĻ¤ā§āĻ¯āĻŧāĻ¤, VM āĻāĻŦāĻ āĻšāĻžāĻ°ā§āĻĄāĻāĻ¯āĻŧā§āĻ¯āĻžāĻ° āĻāĻžāĻĄāĻŧāĻž āĻ¸ā§āĻĨāĻžāĻ¨ā§āĻ¯āĻŧāĻāĻžāĻŦā§ XDP āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻāĻ°āĻžāĻ° āĻāĻĒāĻžāĻ¯āĻŧāĻā§āĻ˛āĻŋ āĻāĻāĻžāĻ° āĻāĻ°āĻž āĻšāĻ¯āĻŧ āĻ¨āĻž, āĻ¯āĻĻāĻŋāĻ āĻ¤āĻžāĻĻā§āĻ° āĻ¨āĻŋāĻāĻ¸ā§āĻŦ āĻ¤ā§āĻ°ā§āĻāĻŋ āĻ°āĻ¯āĻŧā§āĻā§āĨ¤ āĻĒāĻžāĻ ā§āĻ¯āĻāĻŋ āĻ¨ā§āĻāĻāĻ¯āĻŧāĻžāĻ°ā§āĻāĻŋāĻ āĻāĻŦāĻ āĻ˛āĻŋāĻ¨āĻžāĻā§āĻ¸ā§āĻ° āĻ¸āĻžāĻĨā§ āĻĒāĻ°āĻŋāĻāĻŋāĻ¤ āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽāĻžāĻ°āĻĻā§āĻ° āĻāĻ¨ā§āĻ¯ āĻ¯āĻžāĻ°āĻž XDP āĻāĻŦāĻ eBPF-āĻ āĻāĻā§āĻ°āĻšā§āĨ¤
āĻāĻ āĻ
āĻāĻļā§, āĻāĻŽāĻ°āĻž āĻŦāĻŋāĻ¸ā§āĻ¤āĻžāĻ°āĻŋāĻ¤āĻāĻžāĻŦā§ āĻŦā§āĻāĻŦ āĻāĻŋāĻāĻžāĻŦā§ XDP āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ° āĻāĻāĻ¤ā§āĻ°āĻŋāĻ¤ āĻāĻ°āĻž āĻšāĻ¯āĻŧ āĻāĻŦāĻ āĻā§āĻāĻžāĻŦā§ āĻāĻāĻŋ āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻāĻ°āĻž āĻ¯āĻžāĻ¯āĻŧ, āĻ¤āĻžāĻ°āĻĒāĻ° āĻāĻŽāĻ°āĻž āĻĒā§āĻ¯āĻžāĻā§āĻ āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻāĻ°āĻŖ āĻ¸ā§āĻ¤āĻ°ā§ āĻ¸ā§āĻĒāĻ°āĻŋāĻāĻŋāĻ¤ SYN āĻā§āĻāĻŋāĻ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ° āĻāĻāĻāĻŋ āĻ¸āĻšāĻ āĻ¸āĻāĻ¸ā§āĻāĻ°āĻŖ āĻ˛āĻŋāĻāĻŦāĨ¤ āĻāĻŽāĻ°āĻž āĻāĻāĻ¨āĻ āĻāĻāĻāĻŋ "āĻ¸āĻžāĻĻāĻž āĻ¤āĻžāĻ˛āĻŋāĻāĻž" āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻŦ āĻ¨āĻž
āĻ¯āĻžāĻāĻžāĻāĻā§āĻ¤ āĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻ, āĻāĻžāĻāĻ¨ā§āĻāĻžāĻ° āĻ°āĻžāĻā§āĻ¨ āĻāĻŦāĻ āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ° āĻĒāĻ°āĻŋāĻāĻžāĻ˛āĻ¨āĻž āĻāĻ°ā§āĻ¨ - āĻ¯āĻĨā§āĻˇā§āĻ āĻ˛āĻāĨ¤
āĻāĻŽāĻ°āĻž āĻ¸āĻŋ-āĻ¤ā§ āĻ˛āĻŋāĻāĻŦ - āĻāĻāĻŋ āĻĢā§āĻ¯āĻžāĻļāĻ¨ā§āĻŦāĻ˛ āĻ¨āĻ¯āĻŧ, āĻ¤āĻŦā§ āĻāĻāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻŋāĻāĨ¤ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻā§āĻĄ āĻļā§āĻˇā§āĻ° āĻ˛āĻŋāĻā§āĻā§āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§ GitHub-āĻ āĻāĻĒāĻ˛āĻŦā§āĻ§ āĻāĻŦāĻ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§ āĻŦāĻ°ā§āĻŖāĻŋāĻ¤ āĻĒāĻ°ā§āĻ¯āĻžāĻ¯āĻŧ āĻ āĻ¨ā§āĻ¸āĻžāĻ°ā§ āĻāĻŽāĻŋāĻāĻā§āĻ˛āĻŋāĻ¤ā§ āĻŦāĻŋāĻāĻā§āĻ¤āĨ¤
āĻĻāĻžāĻŦāĻŋ āĻĒāĻ°āĻŋāĻ¤ā§āĻ¯āĻžāĻā§āĨ¤ āĻāĻ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻāĻŋ āĻāĻ˛āĻžāĻāĻžāĻ˛ā§āĻ¨, āĻāĻŽāĻŋ DDoS āĻāĻā§āĻ°āĻŽāĻŖ āĻŦāĻ¨ā§āĻ§ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻŽāĻŋāĻ¨āĻŋ-āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻŦ, āĻāĻžāĻ°āĻŖ āĻāĻāĻŋ XDP āĻāĻŦāĻ āĻāĻŽāĻžāĻ° āĻĻāĻā§āĻˇāĻ¤āĻžāĻ° āĻā§āĻˇā§āĻ¤ā§āĻ°ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻ¸āĻŽā§āĻŽāĻ¤ āĻāĻžāĻāĨ¤ āĻ¯āĻžāĻāĻšā§āĻ, āĻĒā§āĻ°āĻ§āĻžāĻ¨ āĻ˛āĻā§āĻˇā§āĻ¯ āĻĒā§āĻ°āĻ¯ā§āĻā§āĻ¤āĻŋ āĻŦā§āĻāĻž; āĻāĻāĻŋ āĻ¤ā§āĻ°āĻŋ āĻ¸ā§āĻ°āĻā§āĻˇāĻž āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻā§āĻļāĻŋāĻāĻž āĻ¨āĻ¯āĻŧāĨ¤ āĻāĻŋāĻāĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ˛ āĻā§āĻĄ āĻ āĻĒā§āĻāĻŋāĻŽāĻžāĻāĻ āĻāĻ°āĻž āĻšāĻ¯āĻŧ āĻ¨āĻž āĻāĻŦāĻ āĻāĻŋāĻā§ āĻ¸ā§āĻā§āĻˇā§āĻŽāĻ¤āĻž āĻŦāĻžāĻĻ āĻĻā§āĻ¯āĻŧāĨ¤
XDP āĻ¸āĻāĻā§āĻˇāĻŋāĻĒā§āĻ¤ āĻāĻāĻžāĻ°āĻāĻŋāĻ
āĻĄāĻā§āĻŽā§āĻ¨ā§āĻā§āĻļāĻ¨ āĻāĻŦāĻ āĻŦāĻŋāĻĻā§āĻ¯āĻŽāĻžāĻ¨ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§āĻ° āĻ¨āĻāĻ˛ āĻ¨āĻž āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻŽāĻŋ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻŽā§āĻ˛ āĻĒāĻ¯āĻŧā§āĻ¨ā§āĻāĻā§āĻ˛āĻŋāĻā§ āĻ°ā§āĻĒāĻ°ā§āĻāĻž āĻĻā§āĻŦāĨ¤
āĻ¸ā§āĻ¤āĻ°āĻžāĻ, āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ° āĻā§āĻĄ āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ā§ āĻ˛ā§āĻĄ āĻāĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻāĻ¨āĻāĻžāĻŽāĻŋāĻ āĻĒā§āĻ¯āĻžāĻā§āĻ āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ° āĻĒāĻžāĻ¸ āĻāĻ°āĻž āĻšāĻ¯āĻŧ. āĻĢāĻ˛āĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ°āĻāĻŋāĻā§ āĻ
āĻŦāĻļā§āĻ¯āĻ āĻāĻāĻāĻŋ āĻ¸āĻŋāĻĻā§āĻ§āĻžāĻ¨ā§āĻ¤ āĻ¨āĻŋāĻ¤ā§ āĻšāĻŦā§: āĻĒā§āĻ¯āĻžāĻā§āĻāĻāĻŋ āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ā§ āĻĒāĻžāĻ¸ āĻāĻ°ā§āĻ¨ (XDP_PASS
), āĻĄā§āĻ°āĻĒ āĻĒā§āĻ¯āĻžāĻā§āĻ (XDP_DROP
) āĻ
āĻĨāĻŦāĻž āĻĢā§āĻ°āĻ¤ āĻĒāĻžāĻ āĻžāĻ¨ (XDP_TX
) āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ° āĻĒā§āĻ¯āĻžāĻā§āĻ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§, āĻāĻāĻŋ āĻŦāĻŋāĻļā§āĻˇ āĻāĻ°ā§ āĻ¸āĻ¤ā§āĻ¯ XDP_TX
. āĻāĻĒāĻ¨āĻŋ āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽāĻāĻŋ āĻŦāĻžāĻ¤āĻŋāĻ˛ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨ (XDP_ABORTED
) āĻāĻŦāĻ āĻĒā§āĻ¯āĻžāĻā§āĻ āĻ°āĻŋāĻ¸ā§āĻ āĻāĻ°ā§āĻ¨, āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻāĻāĻŋ āĻ¸āĻžāĻĻā§āĻļā§āĻ¯āĻĒā§āĻ°ā§āĻŖ assert(0)
- āĻĄāĻŋāĻŦāĻžāĻ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯āĨ¤
eBPF (āĻŦāĻ°ā§āĻ§āĻŋāĻ¤ āĻŦāĻžāĻ°ā§āĻāĻ˛ā§ āĻĒā§āĻ¯āĻžāĻā§āĻ āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ°) āĻāĻžāĻ°ā§āĻā§āĻ¯āĻŧāĻžāĻ˛ āĻŽā§āĻļāĻŋāĻ¨āĻāĻŋ āĻāĻā§āĻāĻžāĻā§āĻ¤āĻāĻžāĻŦā§ āĻ¸āĻšāĻ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§ āĻ¯āĻžāĻ¤ā§ āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ āĻā§āĻ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§ āĻ¯ā§ āĻā§āĻĄāĻāĻŋ āĻ˛ā§āĻĒ āĻāĻ°ā§ āĻ¨āĻž āĻāĻŦāĻ āĻ āĻ¨ā§āĻ¯ āĻ˛ā§āĻā§āĻ° āĻŽā§āĻŽāĻ°āĻŋāĻ° āĻā§āĻˇāĻ¤āĻŋ āĻāĻ°ā§ āĻ¨āĻžāĨ¤ āĻā§āĻ°āĻŽāĻŦāĻ°ā§āĻ§āĻŽāĻžāĻ¨ āĻ¸ā§āĻŽāĻžāĻŦāĻĻā§āĻ§āĻ¤āĻž āĻāĻŦāĻ āĻā§āĻ:
- āĻ˛ā§āĻĒ (āĻĒāĻŋāĻāĻ¨ āĻĻāĻŋāĻā§) āĻ¨āĻŋāĻˇāĻŋāĻĻā§āĻ§āĨ¤
- āĻĄā§āĻāĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻ¸ā§āĻā§āĻ¯āĻžāĻ āĻāĻā§, āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻā§āĻ¨ āĻĢāĻžāĻāĻļāĻ¨ āĻ¨ā§āĻ (āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ¸āĻŋ āĻĢāĻžāĻāĻļāĻ¨ āĻāĻ¨āĻ˛āĻžāĻāĻ¨ āĻāĻ°āĻž āĻāĻŦāĻļā§āĻ¯āĻ)āĨ¤
- āĻ¸ā§āĻā§āĻ¯āĻžāĻ āĻāĻŦāĻ āĻĒā§āĻ¯āĻžāĻā§āĻ āĻŦāĻžāĻĢāĻžāĻ°ā§āĻ° āĻŦāĻžāĻāĻ°ā§ āĻŽā§āĻŽāĻ°āĻŋ āĻ ā§āĻ¯āĻžāĻā§āĻ¸ā§āĻ¸ āĻ¨āĻŋāĻˇāĻŋāĻĻā§āĻ§āĨ¤
- āĻā§āĻĄ āĻāĻāĻžāĻ° āĻ¸ā§āĻŽāĻŋāĻ¤, āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦā§ āĻāĻāĻŋ āĻā§āĻŦ āĻā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§āĻ°ā§āĻŖ āĻ¨āĻ¯āĻŧāĨ¤
- āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻŦāĻŋāĻļā§āĻˇ āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ āĻĢāĻžāĻāĻļāĻ¨ (eBPF āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯āĻāĻžāĻ°ā§) āĻāĻ˛ āĻāĻ°āĻžāĻ° āĻ āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻā§āĻāĻ¯āĻŧāĻž āĻšāĻ¯āĻŧāĨ¤
āĻāĻāĻāĻŋ āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ° āĻĄāĻŋāĻāĻžāĻāĻ¨ āĻāĻŦāĻ āĻāĻ¨āĻ¸ā§āĻāĻ˛ āĻāĻ°āĻž āĻāĻ āĻŽāĻ¤ āĻĻā§āĻāĻžāĻ¯āĻŧ:
- āĻ¸ā§āĻ°ā§āĻ¸ āĻā§āĻĄ (āĻ¯ā§āĻŽāĻ¨
kernel.c
) āĻ āĻŦāĻā§āĻā§āĻā§ āĻāĻŽā§āĻĒāĻžāĻāĻ˛ āĻāĻ°āĻž āĻšāĻ¯āĻŧ (kernel.o
) eBPF āĻāĻžāĻ°ā§āĻā§āĻ¯āĻŧāĻžāĻ˛ āĻŽā§āĻļāĻŋāĻ¨ āĻāĻ°ā§āĻāĻŋāĻā§āĻāĻāĻžāĻ°ā§āĻ° āĻāĻ¨ā§āĻ¯āĨ¤ āĻ āĻā§āĻā§āĻŦāĻ° 2019 āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤, eBPF-āĻāĻ° āĻ¸āĻāĻāĻ˛āĻ¨ Clang āĻĻā§āĻŦāĻžāĻ°āĻž āĻ¸āĻŽāĻ°ā§āĻĨāĻŋāĻ¤ āĻāĻŦāĻ GCC 10.1-āĻ āĻĒā§āĻ°āĻ¤āĻŋāĻļā§āĻ°ā§āĻ¤āĻŋ āĻĻā§āĻāĻ¯āĻŧāĻž āĻšāĻ¯āĻŧā§āĻā§āĨ¤ - āĻ¯āĻĻāĻŋ āĻāĻ āĻ āĻŦāĻā§āĻā§āĻ āĻā§āĻĄā§ āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ āĻ¸ā§āĻā§āĻ°āĻžāĻāĻāĻžāĻ°ā§ āĻāĻ˛ āĻĨāĻžāĻā§ (āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻā§āĻŦāĻŋāĻ˛ āĻāĻŦāĻ āĻāĻžāĻāĻ¨ā§āĻāĻžāĻ°), āĻ¤āĻžāĻĻā§āĻ° āĻāĻāĻĄāĻŋāĻā§āĻ˛āĻŋ āĻļā§āĻ¨ā§āĻ¯ āĻĻā§āĻŦāĻžāĻ°āĻž āĻĒā§āĻ°āĻ¤āĻŋāĻ¸ā§āĻĨāĻžāĻĒāĻŋāĻ¤ āĻšāĻ¯āĻŧ, āĻ¯āĻžāĻ° āĻŽāĻžāĻ¨ā§ āĻāĻ āĻ§āĻ°āĻ¨ā§āĻ° āĻā§āĻĄ āĻāĻžāĻ˛āĻžāĻ¨ā§ āĻ¯āĻžāĻŦā§ āĻ¨āĻžāĨ¤ āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ā§ āĻ˛ā§āĻĄ āĻāĻ°āĻžāĻ° āĻāĻā§, āĻāĻĒāĻ¨āĻžāĻā§ āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ āĻāĻ˛ā§āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻž āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻŦāĻ¸ā§āĻ¤ā§āĻ° āĻāĻāĻĄāĻŋāĻā§āĻ˛āĻŋāĻ° āĻ¸āĻžāĻĨā§ āĻāĻ āĻļā§āĻ¨ā§āĻ¯āĻā§āĻ˛āĻŋ āĻĒā§āĻ°āĻ¤āĻŋāĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻāĻ°āĻ¤ā§ āĻšāĻŦā§ (āĻā§āĻĄ āĻ˛āĻŋāĻā§āĻ āĻāĻ°ā§āĻ¨)āĨ¤ āĻāĻĒāĻ¨āĻŋ āĻŦāĻžāĻšā§āĻ¯āĻŋāĻ āĻāĻāĻāĻŋāĻ˛āĻŋāĻāĻŋāĻā§āĻ˛āĻŋāĻ° āĻ¸āĻžāĻĨā§ āĻāĻāĻŋ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨, āĻ āĻĨāĻŦāĻž āĻāĻĒāĻ¨āĻŋ āĻāĻāĻāĻŋ āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽ āĻ˛āĻŋāĻāĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨ āĻ¯āĻž āĻāĻāĻāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ° āĻ˛āĻŋāĻā§āĻ āĻāĻŦāĻ āĻ˛ā§āĻĄ āĻāĻ°āĻŦā§āĨ¤
- āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ āĻ˛ā§āĻĄ āĻāĻ°āĻž āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽ āĻ¯āĻžāĻāĻžāĻ āĻāĻ°ā§āĨ¤ āĻāĻā§āĻ°ā§āĻ° āĻ āĻ¨ā§āĻĒāĻ¸ā§āĻĨāĻŋāĻ¤āĻŋ āĻāĻŦāĻ āĻĒā§āĻ¯āĻžāĻā§āĻ āĻāĻŦāĻ āĻ¸ā§āĻā§āĻ¯āĻžāĻā§āĻ° āĻ¸ā§āĻŽāĻžāĻ¨āĻž āĻ āĻ¤āĻŋāĻā§āĻ°āĻŽ āĻāĻ°āĻ¤ā§ āĻŦā§āĻ¯āĻ°ā§āĻĨāĻ¤āĻž āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻāĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻ¯āĻĻāĻŋ āĻ¯āĻžāĻāĻžāĻāĻāĻžāĻ°ā§ āĻĒā§āĻ°āĻŽāĻžāĻŖ āĻāĻ°āĻ¤ā§ āĻ¨āĻž āĻĒāĻžāĻ°ā§ āĻ¯ā§ āĻā§āĻĄāĻāĻŋ āĻ¸āĻ āĻŋāĻ, āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽāĻāĻŋ āĻĒā§āĻ°āĻ¤ā§āĻ¯āĻžāĻā§āĻ¯āĻžāĻ¨ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§ - āĻāĻĒāĻ¨āĻžāĻā§ āĻ¤āĻžāĻā§ āĻā§āĻļāĻŋ āĻāĻ°āĻ¤ā§ āĻ¸āĻā§āĻˇāĻŽ āĻšāĻ¤ā§ āĻšāĻŦā§āĨ¤
- āĻ¸āĻĢāĻ˛ āĻ¯āĻžāĻāĻžāĻāĻāĻ°āĻŖā§āĻ° āĻĒāĻ°ā§, āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ āĻ¸āĻŋāĻ¸ā§āĻā§āĻŽ āĻāĻ°ā§āĻāĻŋāĻā§āĻāĻāĻžāĻ°ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻāĻ°ā§āĻāĻŋāĻā§āĻāĻāĻžāĻ° āĻ āĻŦāĻā§āĻā§āĻ āĻā§āĻĄāĻā§ āĻŽā§āĻļāĻŋāĻ¨ āĻā§āĻĄā§ āĻāĻŽā§āĻĒāĻžāĻāĻ˛ āĻāĻ°ā§ (āĻŽāĻžāĻ¤ā§āĻ°-āĻ¸āĻŽāĻ¯āĻŧā§)āĨ¤
- āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽāĻāĻŋ āĻāĻ¨ā§āĻāĻžāĻ°āĻĢā§āĻ¸ā§āĻ° āĻ¸āĻžāĻĨā§ āĻ¸āĻāĻ¯ā§āĻā§āĻ¤ āĻšāĻ¯āĻŧ āĻāĻŦāĻ āĻĒā§āĻ¯āĻžāĻā§āĻ āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻāĻ°āĻŖ āĻļā§āĻ°ā§ āĻāĻ°ā§āĨ¤
āĻ¯ā§āĻšā§āĻ¤ā§ XDP āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ā§ āĻāĻ˛ā§, āĻ¤āĻžāĻ āĻā§āĻ°ā§āĻ¸ āĻ˛āĻ āĻāĻŦāĻ āĻĒā§āĻ°āĻā§āĻ¤āĻĒāĻā§āĻˇā§, āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽ āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ° āĻŦāĻž āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻž āĻĒā§āĻ¯āĻžāĻā§āĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻĄāĻŋāĻŦāĻžāĻāĻŋāĻ āĻāĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻ¯āĻžāĻāĻšā§āĻ, eBPF āĻ¨āĻŋāĻļā§āĻāĻŋāĻ¤ āĻāĻ°ā§ āĻ¯ā§ āĻĄāĻžāĻāĻ¨āĻ˛ā§āĻĄ āĻāĻ°āĻž āĻā§āĻĄāĻāĻŋ āĻ¸āĻŋāĻ¸ā§āĻā§āĻŽā§āĻ° āĻāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻ°āĻžāĻĒāĻĻ, āĻ¤āĻžāĻ āĻāĻĒāĻ¨āĻŋ āĻ¸āĻ°āĻžāĻ¸āĻ°āĻŋ āĻāĻĒāĻ¨āĻžāĻ° āĻ¸ā§āĻĨāĻžāĻ¨ā§āĻ¯āĻŧ āĻ˛āĻŋāĻ¨āĻžāĻā§āĻ¸ā§ XDP āĻ¨āĻŋāĻ¯āĻŧā§ āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨āĨ¤
āĻĒāĻ°āĻŋāĻŦā§āĻļ āĻĒā§āĻ°āĻ¸ā§āĻ¤ā§āĻ¤ āĻāĻ°āĻž āĻšāĻā§āĻā§
āĻ¸āĻŽāĻžāĻŦā§āĻļ
āĻā§āĻ˛ā§āĻ¯āĻžāĻ āĻ¸āĻ°āĻžāĻ¸āĻ°āĻŋ āĻāĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻāĻ°ā§āĻāĻŋāĻā§āĻāĻāĻžāĻ°ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻ āĻŦāĻā§āĻā§āĻ āĻā§āĻĄ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§ āĻ¨āĻž, āĻ¤āĻžāĻ āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻāĻŋ āĻĻā§āĻāĻŋ āĻ§āĻžāĻĒ āĻ¨āĻŋāĻ¯āĻŧā§ āĻāĻ āĻŋāĻ¤:
- LLVM āĻŦāĻžāĻāĻāĻā§āĻĄā§ C āĻā§āĻĄ āĻāĻŽā§āĻĒāĻžāĻāĻ˛ āĻāĻ°ā§āĻ¨ (
clang -emit-llvm
). - āĻŦāĻžāĻāĻāĻā§āĻĄāĻā§ āĻāĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻ
āĻŦāĻā§āĻā§āĻ āĻā§āĻĄā§ āĻ°ā§āĻĒāĻžāĻ¨ā§āĻ¤āĻ° āĻāĻ°ā§āĻ¨ (
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
āĻāĻ°ā§āĻ āĻ˛āĻŋāĻ¨āĻžāĻā§āĻ¸ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻŽā§āĻāĻĢāĻžāĻāĻ˛ (āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ 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
- āĻ¸āĻŋāĻ¸ā§āĻā§āĻŽ āĻāĻ°ā§āĻāĻŋāĻā§āĻāĻāĻžāĻ°āĨ¤ āĻĒāĻžāĻĨ āĻāĻŦāĻ āĻā§āĻ˛ āĻŦāĻŋāĻ¤āĻ°āĻŖā§āĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻ¸āĻžāĻŽāĻžāĻ¨ā§āĻ¯ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻŋāĻ¤ āĻšāĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤
āĻĄā§āĻŦāĻŋāĻ¯āĻŧāĻžāĻ¨ 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
. āĻāĻŽāĻŋ āĻāĻāĻ¨ āĻā§āĻĨāĻžāĻ¯āĻŧ āĻā§āĻˇā§āĻāĻž āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°āĻŋ?
āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻ¸ā§āĻā§āĻ¯āĻžāĻ¨ā§āĻĄ
āĻ¸ā§āĻā§āĻ¯āĻžāĻ¨ā§āĻĄā§ āĻ āĻŦāĻļā§āĻ¯āĻ āĻĻā§āĻāĻŋ āĻāĻ¨ā§āĻāĻžāĻ°āĻĢā§āĻ¸ āĻ āĻ¨ā§āĻ¤āĻ°ā§āĻā§āĻā§āĻ¤ āĻĨāĻžāĻāĻ¤ā§ āĻšāĻŦā§: āĻ¯ā§āĻāĻžāĻ¨ā§ āĻāĻāĻāĻŋ āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ° āĻĨāĻžāĻāĻŦā§ āĻāĻŦāĻ āĻ¯ā§āĻāĻžāĻ¨ āĻĨā§āĻā§ āĻĒā§āĻ¯āĻžāĻā§āĻ āĻĒāĻžāĻ āĻžāĻ¨ā§ āĻšāĻŦā§āĨ¤ āĻāĻŽāĻžāĻĻā§āĻ° āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ°ā§āĻ° āĻ¸āĻžāĻĨā§ āĻ¨āĻŋāĻ¯āĻŧāĻŽāĻŋāĻ¤ āĻ ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨āĻā§āĻ˛āĻŋ āĻā§āĻāĻžāĻŦā§ āĻāĻžāĻ āĻāĻ°ā§ āĻ¤āĻž āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻā§āĻ˛āĻŋ āĻ āĻŦāĻļā§āĻ¯āĻ āĻ¤āĻžāĻĻā§āĻ° āĻ¨āĻŋāĻāĻ¸ā§āĻŦ āĻāĻāĻĒāĻŋ āĻ¸āĻš āĻ¸āĻŽā§āĻĒā§āĻ°ā§āĻŖ āĻ˛āĻŋāĻ¨āĻžāĻā§āĻ¸ āĻĄāĻŋāĻāĻžāĻāĻ¸ āĻšāĻ¤ā§ āĻšāĻŦā§āĨ¤
āĻā§āĻĨ (āĻāĻžāĻ°ā§āĻā§āĻ¯āĻŧāĻžāĻ˛ āĻāĻĨāĻžāĻ°āĻ¨ā§āĻ) āĻ§āĻ°āĻŖā§āĻ° āĻĄāĻŋāĻāĻžāĻāĻ¸āĻā§āĻ˛āĻŋ āĻāĻŽāĻžāĻĻā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻĒāĻ¯ā§āĻā§āĻ¤: āĻāĻā§āĻ˛āĻŋ āĻāĻā§ āĻ
āĻĒāĻ°ā§āĻ° āĻ¸āĻžāĻĨā§ āĻ¸āĻ°āĻžāĻ¸āĻ°āĻŋ "āĻ¸āĻāĻ¯ā§āĻā§āĻ¤" āĻāĻžāĻ°ā§āĻā§āĻ¯āĻŧāĻžāĻ˛ āĻ¨ā§āĻāĻāĻ¯āĻŧāĻžāĻ°ā§āĻ āĻāĻ¨ā§āĻāĻžāĻ°āĻĢā§āĻ¸ā§āĻ° āĻāĻāĻāĻŋ āĻā§āĻĄāĻŧāĻžāĨ¤ āĻāĻĒāĻ¨āĻŋ āĻ¤āĻžāĻĻā§āĻ° āĻāĻāĻžāĻŦā§ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨ (āĻāĻ āĻŦāĻŋāĻāĻžāĻā§ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻāĻŽāĻžāĻ¨ā§āĻĄ 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) āĻāĻ¨āĻāĻžāĻŽāĻŋāĻ āĻā§āĻ°āĻžāĻĢāĻŋāĻ āĻĒāĻžāĻ āĻžāĻ¨ā§ āĻšāĻŦā§āĨ¤ āĻ¯āĻžāĻāĻšā§āĻ, āĻāĻāĻāĻŋ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻ°āĻ¯āĻŧā§āĻā§: āĻāĻ¨ā§āĻāĻžāĻ°āĻĢā§āĻ¸āĻā§āĻ˛āĻŋ āĻāĻāĻ āĻŽā§āĻļāĻŋāĻ¨ā§ āĻ°āĻ¯āĻŧā§āĻā§ āĻāĻŦāĻ āĻ˛āĻŋāĻ¨āĻžāĻā§āĻ¸ āĻ¤āĻžāĻĻā§āĻ° āĻāĻāĻāĻŋāĻ¤ā§ āĻ
āĻ¨ā§āĻ¯āĻāĻŋāĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§ āĻā§āĻ°ā§āĻ¯āĻžāĻĢāĻŋāĻ āĻĒāĻžāĻ āĻžāĻŦā§ āĻ¨āĻžāĨ¤ āĻāĻĒāĻ¨āĻŋ āĻāĻāĻŋāĻ˛ āĻ¨āĻŋāĻ¯āĻŧāĻŽ āĻĻāĻŋāĻ¯āĻŧā§ āĻāĻāĻŋ āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨ iptables
, āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻ¤āĻžāĻĻā§āĻ° āĻĒā§āĻ¯āĻžāĻā§āĻ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻāĻ°āĻ¤ā§ āĻšāĻŦā§, āĻ¯āĻž āĻĄāĻŋāĻŦāĻžāĻāĻŋāĻāĻ¯āĻŧā§āĻ° āĻāĻ¨ā§āĻ¯ āĻ
āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻāĻ¨āĻāĨ¤ āĻ¨ā§āĻāĻāĻ¯āĻŧāĻžāĻ°ā§āĻ āĻ¨ā§āĻŽāĻ¸ā§āĻĒā§āĻ¸ (āĻāĻ° āĻĒāĻ°ā§ āĻ¨ā§āĻāĻāĻ¨āĻāĻ¸) āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻāĻžāĻ˛āĨ¤
āĻāĻāĻāĻŋ āĻ¨ā§āĻāĻāĻ¯āĻŧāĻžāĻ°ā§āĻ āĻ¨ā§āĻŽāĻ¸ā§āĻĒā§āĻ¸ āĻāĻ¨ā§āĻāĻžāĻ°āĻĢā§āĻ¸, āĻ°āĻžāĻāĻāĻŋāĻ āĻā§āĻŦāĻŋāĻ˛ āĻāĻŦāĻ āĻ¨ā§āĻāĻĢāĻŋāĻ˛ā§āĻāĻžāĻ° āĻ¨āĻŋāĻ¯āĻŧāĻŽāĻā§āĻ˛āĻŋāĻ° āĻāĻāĻāĻŋ āĻ¸ā§āĻ āĻ§āĻžāĻ°āĻŖ āĻāĻ°ā§ āĻ¯āĻž āĻ āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻ¨ā§āĻāĻāĻ¨āĻ¸ā§ āĻ āĻ¨ā§āĻ°ā§āĻĒ āĻŦāĻ¸ā§āĻ¤ā§ āĻĨā§āĻā§ āĻŦāĻŋāĻā§āĻāĻŋāĻ¨ā§āĻ¨āĨ¤ āĻĒā§āĻ°āĻ¤āĻŋāĻāĻŋ āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻāĻāĻāĻŋ āĻ¨ā§āĻŽāĻ¸ā§āĻĒā§āĻ¸ā§ āĻāĻ˛ā§ āĻāĻŦāĻ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ¸ā§āĻ āĻ¨ā§āĻāĻāĻ¨āĻāĻ¸ā§āĻ° āĻŦāĻ¸ā§āĻ¤ā§āĻā§āĻ˛āĻŋāĻ¤ā§ āĻ ā§āĻ¯āĻžāĻā§āĻ¸ā§āĻ¸ āĻĨāĻžāĻā§āĨ¤ āĻĄāĻŋāĻĢāĻ˛ā§āĻāĻ°ā§āĻĒā§, āĻ¸āĻŋāĻ¸ā§āĻā§āĻŽā§ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ āĻŦāĻā§āĻā§āĻā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻāĻāĻ āĻ¨ā§āĻāĻāĻ¯āĻŧāĻžāĻ°ā§āĻ āĻ¨āĻžāĻŽāĻ¸ā§āĻĨāĻžāĻ¨ āĻ°āĻ¯āĻŧā§āĻā§, āĻ¤āĻžāĻ āĻāĻĒāĻ¨āĻŋ āĻ˛āĻŋāĻ¨āĻžāĻā§āĻ¸ā§ āĻāĻžāĻ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨ āĻāĻŦāĻ āĻ¨ā§āĻāĻāĻ¨āĻ¸ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻāĻžāĻ¨ā§āĻ¨ āĻ¨āĻžāĨ¤
āĻāĻ¸ā§āĻ¨ āĻāĻāĻāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻ¨āĻžāĻŽāĻ¸ā§āĻĨāĻžāĻ¨ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻŋ 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-āĻ āĻāĻāĻŽāĻžāĻ¤ā§āĻ° āĻāĻ¨ā§āĻāĻžāĻ°āĻĢā§āĻ¸ āĻāĻ āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ¯āĻŧ āĻ
ā§āĻ¯āĻžāĻā§āĻ¸ā§āĻ¸āĻ¯ā§āĻā§āĻ¯āĨ¤ āĻāĻāĻŋ āĻŦāĻŋāĻĒāĻ°ā§āĻ¤ āĻĻāĻŋāĻā§āĻ āĻāĻžāĻ āĻāĻ°ā§āĨ¤
netns āĻāĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻāĻ˛āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ, āĻāĻ¨ā§āĻāĻžāĻ°āĻĢā§āĻ¸ āĻ¨āĻŋāĻā§ āĻ¯āĻžāĻ¯āĻŧ āĻāĻŦāĻ āĻ¤āĻžāĻ° āĻ āĻŋāĻāĻžāĻ¨āĻž āĻšāĻžāĻ°āĻžāĻ¯āĻŧāĨ¤ netns-āĻ āĻāĻ¨ā§āĻāĻžāĻ°āĻĢā§āĻ¸ āĻāĻ¨āĻĢāĻŋāĻāĻžāĻ° āĻāĻ°āĻ¤ā§, āĻāĻĒāĻ¨āĻžāĻā§ āĻāĻžāĻ˛āĻžāĻ¤ā§ āĻšāĻŦā§ 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
āĻ
āĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻāĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§ āĻ˛āĻŋāĻā§āĻ āĻāĻ°āĻž āĻĨāĻžāĻāĻ˛ā§ āĻāĻāĻāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽ āĻ˛āĻŋāĻā§āĻ āĻāĻ°āĻ¤ā§ āĻšāĻŦā§āĨ¤ "āĻā§āĻ¨ āĻ¸āĻāĻŦāĻžāĻĻāĻ āĻ¸ā§āĻ¸āĻāĻŦāĻžāĻĻ āĻ¨āĻ¯āĻŧ" āĻāĻ āĻāĻĻā§āĻļ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻ¨āĻ¯āĻŧ, āĻāĻĒāĻ¸āĻāĻšāĻžāĻ°āĻāĻŋ āĻ¯ā§ āĻā§āĻ¨āĻ āĻā§āĻˇā§āĻ¤ā§āĻ°ā§āĻ āĻŦāĻŋāĻļāĻžāĻ˛āĨ¤ āĻ¨āĻŋāĻ°ā§āĻĻā§āĻļ āĻāĻ°ā§ 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'
āĻāĻ āĻāĻžāĻ°āĻŖā§, āĻĄāĻŋāĻŦāĻžāĻ āĻāĻāĻāĻĒā§āĻ āĻŦā§āĻ¯āĻžāĻĒāĻāĻāĻžāĻŦā§ āĻĢāĻ˛āĻžāĻĢāĻ˛ āĻā§āĻĄ bloats.
XDP āĻĒā§āĻ¯āĻžāĻā§āĻ āĻĒāĻžāĻ āĻžāĻ¨ā§ āĻšāĻā§āĻā§
āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻāĻ°āĻž āĻ¯āĻžāĻ: āĻāĻāĻŋ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻāĻāĻ¤ āĻĒā§āĻ¯āĻžāĻā§āĻ āĻĢā§āĻ°āĻ¤ āĻĒāĻžāĻ āĻžāĻ¤ā§ āĻĻāĻŋāĻ¨āĨ¤ āĻ¨ā§āĻāĻāĻ¯āĻŧāĻžāĻ°ā§āĻā§āĻ° āĻĻā§āĻˇā§āĻāĻŋāĻā§āĻŖ āĻĨā§āĻā§ āĻāĻāĻŋ āĻā§āĻ˛, āĻ¯ā§āĻšā§āĻ¤ā§ āĻļāĻŋāĻ°ā§āĻ¨āĻžāĻŽāĻā§āĻ˛āĻŋāĻ¤ā§ āĻ āĻŋāĻāĻžāĻ¨āĻžāĻā§āĻ˛āĻŋ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻāĻ°āĻž āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨, āĻ¤āĻŦā§ āĻāĻāĻ¨ āĻ¨ā§āĻ¤āĻŋāĻāĻ¤āĻāĻžāĻŦā§ āĻāĻžāĻāĻāĻŋ āĻā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§āĻ°ā§āĻŖāĨ¤
bpf_printk("got packet: %pn", ctx);
- return XDP_PASS;
+ return XDP_TX;
}
āĻāĻžāĻ˛āĻžāĻ¨ tcpdump
āĻāĻĒāĻ° xdp-remote
. āĻāĻāĻŋ āĻ
āĻāĻŋāĻ¨ā§āĻ¨ āĻāĻāĻāĻā§āĻ¯āĻŧāĻŋāĻ āĻāĻŦāĻ āĻāĻ¨āĻāĻžāĻŽāĻŋāĻ ICMP āĻāĻā§ āĻ
āĻ¨ā§āĻ°ā§āĻ§ āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻ¨ āĻāĻ°āĻŦā§ āĻāĻŦāĻ ICMP āĻāĻā§ āĻāĻ¤ā§āĻ¤āĻ° āĻĻā§āĻāĻžāĻ¨ā§ āĻŦāĻ¨ā§āĻ§ āĻāĻ°āĻŦā§āĨ¤ āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻāĻāĻž āĻĻā§āĻāĻžāĻ¯āĻŧ āĻ¨āĻžāĨ¤ āĻāĻāĻž āĻāĻžāĻā§āĻ° āĻāĻ¨ā§āĻ¯ āĻ¯ā§ āĻ¸āĻā§āĻ°āĻŋāĻ¯āĻŧ āĻāĻāĻ XDP_TX
āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽā§ xdp-local
xdp-remote
āĻāĻāĻāĻŋ āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽāĻ āĻŦāĻ°āĻžāĻĻā§āĻĻ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻāĻŋāĻ˛, āĻāĻŽāĻ¨āĻāĻŋ āĻ¯āĻĻāĻŋ āĻāĻāĻŋ āĻāĻžāĻ˛āĻŋ āĻāĻŋāĻ˛, āĻāĻŦāĻ āĻ¤āĻžāĻā§ āĻāĻ¤ā§āĻĨāĻžāĻĒāĻŋāĻ¤ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻāĻŋāĻ˛āĨ¤
āĻāĻŽāĻŋ āĻāĻāĻž āĻāĻŋāĻāĻžāĻŦā§ āĻāĻžāĻ¨āĻ˛āĻžāĻŽ?
āĻāĻĒāĻ¨āĻžāĻā§ āĻ āĻŦāĻļā§āĻ¯āĻ āĻŽāĻ¨ā§āĻĻ āĻĨā§āĻā§ āĻāĻžāĻ˛ āĻāĻ°āĻ¤ā§ āĻšāĻŦā§, āĻāĻžāĻ°āĻŖ āĻāĻāĻŋ āĻĨā§āĻā§ āĻŦā§āĻ° āĻāĻ°āĻžāĻ° āĻāĻ° āĻāĻŋāĻā§āĻ āĻ¨ā§āĻāĨ¤
$ 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
, āĻāĻāĻŋ āĻŽā§āĻāĻĢāĻžāĻāĻ˛ā§ āĻ¯ā§āĻ āĻāĻ°ā§āĻ¨, āĻāĻāĻŋāĻā§ āĻāĻŦāĻĻā§āĻ§ āĻāĻ°ā§āĻ¨ 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 āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻāĻ°āĻ¤ā§ āĻ¸āĻā§āĻˇāĻŽ āĻšāĻŦā§ āĻ¨āĻžāĨ¤
āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻāĻ āĻ¨
āĻāĻ˛ā§āĻ¨ āĻŦāĻ°ā§āĻŖāĻŋāĻ¤ āĻāĻžāĻ¸ā§āĻā§ āĻāĻāĻŋāĻ¯āĻŧā§ āĻ¯āĻžāĻ: XDP-āĻ¤ā§ āĻāĻāĻāĻŋ SYN āĻā§āĻāĻŋāĻ āĻŽā§āĻāĻžāĻ¨āĻŋāĻāĻŽ āĻ˛āĻŋāĻā§āĻ¨āĨ¤
SYN āĻŦāĻ¨ā§āĻ¯āĻž āĻāĻāĻāĻŋ āĻāĻ¨āĻĒā§āĻ°āĻŋāĻ¯āĻŧ DDoS āĻāĻā§āĻ°āĻŽāĻŖ āĻ°āĻ¯āĻŧā§ āĻā§āĻā§, āĻ¯āĻžāĻ° āĻ¸āĻžāĻ°āĻŽāĻ°ā§āĻŽ āĻ¨āĻŋāĻŽā§āĻ¨āĻ°ā§āĻĒāĨ¤ āĻ¯āĻāĻ¨ āĻāĻāĻāĻŋ āĻ¸āĻāĻ¯ā§āĻ āĻĒā§āĻ°āĻ¤āĻŋāĻˇā§āĻ āĻŋāĻ¤ āĻšāĻ¯āĻŧ (TCP āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻļā§āĻ), āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻāĻāĻāĻŋ SYN āĻĒāĻžāĻ¯āĻŧ, āĻāĻŦāĻŋāĻˇā§āĻ¯āĻ¤ā§āĻ° āĻ¸āĻāĻ¯ā§āĻā§āĻ° āĻāĻ¨ā§āĻ¯ āĻ¸āĻāĻ¸ā§āĻĨāĻžāĻ¨ āĻŦāĻ°āĻžāĻĻā§āĻĻ āĻāĻ°ā§, āĻāĻāĻāĻŋ SYNACK āĻĒā§āĻ¯āĻžāĻā§āĻā§āĻ° āĻ¸āĻžāĻĨā§ āĻĒā§āĻ°āĻ¤āĻŋāĻā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻāĻžāĻ¨āĻžāĻ¯āĻŧ āĻāĻŦāĻ āĻāĻāĻāĻŋ ACK āĻāĻ° āĻāĻ¨ā§āĻ¯ āĻ āĻĒā§āĻā§āĻˇāĻž āĻāĻ°ā§āĨ¤ āĻāĻā§āĻ°āĻŽāĻŖāĻāĻžāĻ°ā§ āĻāĻāĻāĻŋ āĻŦāĻšā§-āĻšāĻžāĻāĻžāĻ°-āĻļāĻā§āĻ¤āĻŋāĻļāĻžāĻ˛ā§ āĻŦāĻāĻ¨ā§āĻā§ āĻĒā§āĻ°āĻ¤āĻŋāĻāĻŋ āĻšā§āĻ¸ā§āĻ āĻĨā§āĻā§ āĻ¸ā§āĻĒā§āĻĢ āĻāĻ°āĻž āĻ āĻŋāĻāĻžāĻ¨āĻžāĻā§āĻ˛āĻŋ āĻĨā§āĻā§ āĻĒā§āĻ°āĻ¤āĻŋ āĻ¸ā§āĻā§āĻ¨ā§āĻĄā§ āĻšāĻžāĻāĻžāĻ° āĻšāĻžāĻāĻžāĻ° SYN āĻĒā§āĻ¯āĻžāĻā§āĻ āĻĒāĻžāĻ āĻžāĻ¯āĻŧāĨ¤ āĻĒā§āĻ¯āĻžāĻā§āĻā§āĻ° āĻāĻāĻŽāĻ¨ā§āĻ° āĻ¸āĻžāĻĨā§ āĻ¸āĻžāĻĨā§ āĻ¸āĻžāĻ°ā§āĻāĻžāĻ°āĻā§ āĻ¸āĻāĻ¸ā§āĻĨāĻžāĻ¨ āĻŦāĻ°āĻžāĻĻā§āĻĻ āĻāĻ°āĻ¤ā§ āĻŦāĻžāĻ§ā§āĻ¯ āĻāĻ°āĻž āĻšāĻ¯āĻŧ, āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻāĻāĻāĻŋ āĻŦāĻĄāĻŧ āĻ¸āĻŽāĻ¯āĻŧ āĻļā§āĻˇ āĻšāĻāĻ¯āĻŧāĻžāĻ° āĻĒāĻ°ā§ āĻ¸ā§āĻā§āĻ˛āĻŋ āĻĒā§āĻ°āĻāĻžāĻļ āĻāĻ°ā§; āĻĢāĻ˛āĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻŽā§āĻŽāĻ°āĻŋ āĻŦāĻž āĻ¸ā§āĻŽāĻž āĻ¨āĻŋāĻāĻļā§āĻˇ āĻšāĻ¯āĻŧā§ āĻ¯āĻžāĻ¯āĻŧ, āĻ¨āĻ¤ā§āĻ¨ āĻ¸āĻāĻ¯ā§āĻ āĻā§āĻ°āĻšāĻŖ āĻāĻ°āĻž āĻšāĻ¯āĻŧ āĻ¨āĻž āĻāĻŦāĻ āĻĒāĻ°āĻŋāĻˇā§āĻŦāĻžāĻāĻŋ āĻ āĻ¨ā§āĻĒāĻ˛āĻŦā§āĻ§ āĻšāĻ¯āĻŧāĨ¤
āĻāĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ SYN āĻĒā§āĻ¯āĻžāĻā§āĻā§āĻ° āĻāĻĒāĻ° āĻāĻŋāĻ¤ā§āĻ¤āĻŋ āĻāĻ°ā§ āĻ¸āĻāĻ¸ā§āĻĨāĻžāĻ¨āĻā§āĻ˛āĻŋ āĻŦāĻ°āĻžāĻĻā§āĻĻ āĻ¨āĻž āĻāĻ°ā§āĻ¨, āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻāĻāĻāĻŋ SYNACK āĻĒā§āĻ¯āĻžāĻā§āĻā§āĻ° āĻ¸āĻžāĻĨā§ āĻ¸āĻžāĻĄāĻŧāĻž āĻĻā§āĻ¨, āĻ¤āĻžāĻšāĻ˛ā§ āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻāĻŋāĻāĻžāĻŦā§ āĻŦā§āĻāĻŦā§ āĻ¯ā§ ACK āĻĒā§āĻ¯āĻžāĻā§āĻāĻāĻŋ āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§āĻ¤ā§ āĻāĻ¸āĻž āĻāĻāĻāĻŋ SYN āĻĒā§āĻ¯āĻžāĻā§āĻāĻā§ āĻŦā§āĻāĻžāĻ¯āĻŧ āĻ¯āĻž āĻ¸āĻāĻ°āĻā§āĻˇāĻŖ āĻāĻ°āĻž āĻšāĻ¯āĻŧāĻ¨āĻŋ? āĻ¸āĻ°ā§āĻŦā§āĻĒāĻ°āĻŋ, āĻāĻāĻāĻ¨ āĻāĻā§āĻ°āĻŽāĻŖāĻāĻžāĻ°ā§āĻ āĻāĻžāĻ˛ ACK āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤ SYN āĻā§āĻāĻŋāĻ° āĻĒāĻ¯āĻŧā§āĻ¨ā§āĻ āĻšāĻ˛ āĻāĻāĻŋāĻā§ āĻāĻ¨āĻā§āĻĄ āĻāĻ°āĻž seqnum
āĻ āĻŋāĻāĻžāĻ¨āĻž, āĻĒā§āĻ°ā§āĻ āĻāĻŦāĻ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻŋāĻ¤ āĻ˛āĻŦāĻŖā§āĻ° āĻšā§āĻ¯āĻžāĻļ āĻšāĻŋāĻ¸āĻžāĻŦā§ āĻ¸āĻāĻ¯ā§āĻ āĻĒāĻ°āĻžāĻŽāĻŋāĻ¤āĻŋāĨ¤ āĻ¯āĻĻāĻŋ āĻāĻ¸āĻŋāĻā§ āĻ˛āĻŦāĻŖ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻāĻ°āĻžāĻ° āĻāĻā§ āĻĒā§āĻāĻāĻžāĻ¤ā§ āĻ¸āĻā§āĻˇāĻŽ āĻšāĻ¯āĻŧ, āĻ¤āĻžāĻšāĻ˛ā§ āĻāĻĒāĻ¨āĻŋ āĻāĻŦāĻžāĻ° āĻšā§āĻ¯āĻžāĻļ āĻāĻŖāĻ¨āĻž āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨ āĻāĻŦāĻ āĻāĻ° āĻ¸āĻžāĻĨā§ āĻ¤ā§āĻ˛āĻ¨āĻž āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨ acknum
. āĻĢāĻ°āĻ acknum
āĻāĻā§āĻ°āĻŽāĻŖāĻāĻžāĻ°ā§ āĻĒāĻžāĻ°ā§ āĻ¨āĻž, āĻ¯ā§āĻšā§āĻ¤ā§ āĻ˛āĻŦāĻŖā§āĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻā§āĻĒāĻ¨ā§āĻ¯āĻŧāĻ¤āĻž āĻ°āĻ¯āĻŧā§āĻā§ āĻāĻŦāĻ āĻ¸ā§āĻŽāĻŋāĻ¤ āĻā§āĻ¯āĻžāĻ¨ā§āĻ˛ā§āĻ° āĻāĻžāĻ°āĻŖā§ āĻāĻāĻŋ āĻŦāĻžāĻāĻžāĻ āĻāĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻĒāĻžāĻŦā§ āĻ¨āĻžāĨ¤
SYN āĻā§āĻāĻŋ āĻĻā§āĻ°ā§āĻāĻĻāĻŋāĻ¨ āĻ§āĻ°ā§ āĻ˛āĻŋāĻ¨āĻžāĻā§āĻ¸ āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ā§ āĻĒā§āĻ°āĻ¯āĻŧā§āĻ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§ āĻāĻŦāĻ āĻāĻŽāĻ¨āĻāĻŋ SYN āĻā§āĻ˛āĻŋ āĻā§āĻŦ āĻĻā§āĻ°ā§āĻ¤ āĻāĻŦāĻ āĻāĻāĻ¤ā§āĻ°ā§ āĻāĻ¸ā§ āĻĒā§āĻāĻāĻ˛ā§ āĻ¸ā§āĻŦāĻ¯āĻŧāĻāĻā§āĻ°āĻŋāĻ¯āĻŧāĻāĻžāĻŦā§ āĻ¸āĻā§āĻˇāĻŽ āĻšāĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤
TCP āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻļā§āĻ āĻāĻĒāĻ° āĻļāĻŋāĻā§āĻˇāĻžāĻŽā§āĻ˛āĻ āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽ
TCP āĻŦāĻžāĻāĻā§āĻ° āĻāĻāĻāĻŋ āĻ¸ā§āĻā§āĻ°ā§āĻŽ āĻšāĻŋāĻ¸āĻžāĻŦā§ āĻĄā§āĻāĻž āĻā§āĻ°āĻžāĻ¨ā§āĻ¸āĻŽāĻŋāĻļāĻ¨ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻāĻ°ā§, āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§āĻĒ, HTTP āĻ āĻ¨ā§āĻ°ā§āĻ§āĻā§āĻ˛āĻŋ TCP āĻāĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§ āĻĒā§āĻ°ā§āĻ°āĻŖ āĻāĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻĒā§āĻ°āĻŦāĻžāĻš āĻĒā§āĻ¯āĻžāĻā§āĻā§ āĻā§āĻāĻ°ā§ āĻā§āĻāĻ°ā§ āĻāĻ°ā§ āĻĒā§āĻ°ā§āĻ°āĻŖ āĻāĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻ¸āĻŽāĻ¸ā§āĻ¤ TCP āĻĒā§āĻ¯āĻžāĻā§āĻā§ āĻ˛āĻāĻŋāĻā§āĻ¯āĻžāĻ˛ āĻĢā§āĻ˛ā§āĻ¯āĻžāĻ āĻāĻŦāĻ 32-āĻŦāĻŋāĻ āĻ¸āĻŋāĻā§āĻ¯āĻŧā§āĻ¨ā§āĻ¸ āĻ¨āĻŽā§āĻŦāĻ° āĻ°āĻ¯āĻŧā§āĻā§:
-
āĻĒāĻ¤āĻžāĻāĻžāĻ° āĻ¸āĻāĻŽāĻŋāĻļā§āĻ°āĻŖ āĻāĻāĻāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻĒā§āĻ¯āĻžāĻā§āĻā§āĻ° āĻā§āĻŽāĻŋāĻāĻž āĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŖ āĻāĻ°ā§āĨ¤ SYN āĻĒāĻ¤āĻžāĻāĻž āĻ¨āĻŋāĻ°ā§āĻĻā§āĻļ āĻāĻ°ā§ āĻ¯ā§ āĻāĻāĻŋ āĻ¸āĻāĻ¯ā§āĻā§ āĻĒā§āĻ°ā§āĻ°āĻā§āĻ° āĻĒā§āĻ°āĻĨāĻŽ āĻĒā§āĻ¯āĻžāĻā§āĻāĨ¤ ACK āĻĒāĻ¤āĻžāĻāĻž āĻŽāĻžāĻ¨ā§ āĻĒā§āĻ°ā§āĻ°āĻ āĻŦāĻžāĻāĻ āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ¸āĻāĻ¯ā§āĻ āĻĄā§āĻāĻž āĻĒā§āĻ¯āĻŧā§āĻā§
acknum
. āĻāĻāĻāĻŋ āĻĒā§āĻ¯āĻžāĻā§āĻā§ āĻŦā§āĻļ āĻāĻ¯āĻŧā§āĻāĻāĻŋ āĻĒāĻ¤āĻžāĻāĻž āĻĨāĻžāĻāĻ¤ā§ āĻĒāĻžāĻ°ā§ āĻāĻŦāĻ āĻ¤āĻžāĻĻā§āĻ° āĻ¸āĻāĻŽāĻŋāĻļā§āĻ°āĻŖ āĻĻā§āĻŦāĻžāĻ°āĻž āĻŦāĻ˛āĻž āĻšāĻ¯āĻŧ, āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻāĻāĻāĻŋ SYNACK āĻĒā§āĻ¯āĻžāĻā§āĻāĨ¤ -
āĻ¸āĻŋāĻā§āĻ¯āĻŧā§āĻ¨ā§āĻ¸ āĻ¨āĻŽā§āĻŦāĻ° (seqnum) āĻāĻ āĻĒā§āĻ¯āĻžāĻā§āĻā§ āĻĒā§āĻ°ā§āĻ°āĻŋāĻ¤ āĻĒā§āĻ°āĻĨāĻŽ āĻŦāĻžāĻāĻā§āĻ° āĻāĻ¨ā§āĻ¯ āĻĄā§āĻāĻž āĻ¸ā§āĻā§āĻ°ā§āĻŽā§ āĻ āĻĢāĻ¸ā§āĻ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻāĻ°ā§āĨ¤ āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻ¯āĻĻāĻŋ āĻĒā§āĻ°āĻĨāĻŽ āĻĒā§āĻ¯āĻžāĻā§āĻā§ X āĻŦāĻžāĻāĻ āĻĄā§āĻāĻžāĻ° āĻāĻ āĻ¸āĻāĻā§āĻ¯āĻžāĻāĻŋ āĻāĻŋāĻ˛ N, āĻ¨āĻ¤ā§āĻ¨ āĻĄā§āĻāĻž āĻ¸āĻš āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§ āĻĒā§āĻ¯āĻžāĻā§āĻā§ āĻāĻāĻŋ āĻšāĻŦā§ N+Xā§ˇ āĻ¸āĻāĻ¯ā§āĻā§āĻ° āĻļā§āĻ°ā§āĻ¤ā§, āĻĒā§āĻ°āĻ¤āĻŋāĻāĻŋ āĻĒāĻā§āĻˇ āĻāĻ˛ā§āĻŽā§āĻ˛ā§āĻāĻžāĻŦā§ āĻāĻ āĻ¸āĻāĻā§āĻ¯āĻžāĻāĻŋ āĻŦā§āĻā§ āĻ¨ā§āĻ¯āĻŧāĨ¤
-
āĻ¸ā§āĻŦā§āĻā§āĻ¤āĻŋ āĻ¨āĻŽā§āĻŦāĻ° (āĻ ā§āĻ¯āĻžāĻāĻ¨āĻžāĻŽ) - āĻ¸ā§āĻāĻ¨āĻžāĻŽā§āĻ° āĻŽāĻ¤ā§ āĻāĻāĻ āĻ āĻĢāĻ¸ā§āĻ, āĻ¤āĻŦā§ āĻāĻāĻŋ āĻĒā§āĻ°ā§āĻ°āĻŖ āĻāĻ°āĻž āĻŦāĻžāĻāĻā§āĻ° āĻ¸āĻāĻā§āĻ¯āĻž āĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŖ āĻāĻ°ā§ āĻ¨āĻž, āĻ¤āĻŦā§ āĻĒā§āĻ°āĻžāĻĒāĻā§āĻ° āĻāĻžāĻ āĻĨā§āĻā§ āĻĒā§āĻ°āĻĨāĻŽ āĻŦāĻžāĻāĻā§āĻ° āĻ¸āĻāĻā§āĻ¯āĻž, āĻ¯āĻž āĻĒā§āĻ°ā§āĻ°āĻ āĻĻā§āĻā§āĻ¨āĻ¨āĻŋāĨ¤
āĻ¸āĻāĻ¯ā§āĻā§āĻ° āĻļā§āĻ°ā§āĻ¤ā§, āĻĒāĻā§āĻˇāĻā§āĻ˛āĻŋāĻā§ āĻ
āĻŦāĻļā§āĻ¯āĻ āĻāĻāĻŽāĻ¤ āĻšāĻ¤ā§ āĻšāĻŦā§ seqnum
и acknum
. āĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻ āĻ¤āĻžāĻ° āĻ¸āĻžāĻĨā§ āĻāĻāĻāĻŋ SYN āĻĒā§āĻ¯āĻžāĻā§āĻ āĻĒāĻžāĻ āĻžāĻ¯āĻŧ seqnum = X
. āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻāĻāĻāĻŋ SYNACK āĻĒā§āĻ¯āĻžāĻā§āĻā§āĻ° āĻ¸āĻžāĻĨā§ āĻĒā§āĻ°āĻ¤āĻŋāĻā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻāĻžāĻ¨āĻžāĻ¯āĻŧ, āĻ¯ā§āĻāĻžāĻ¨ā§ āĻāĻāĻŋ āĻ¤āĻžāĻ° āĻ°ā§āĻāĻ°ā§āĻĄ āĻāĻ°ā§ seqnum = Y
āĻāĻŦāĻ āĻĒā§āĻ°āĻāĻžāĻļ āĻāĻ°ā§ acknum = X + 1
. āĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻ āĻāĻāĻāĻŋ ACK āĻĒā§āĻ¯āĻžāĻā§āĻ āĻ¸āĻš SYNACK-āĻ āĻĒā§āĻ°āĻ¤āĻŋāĻā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻāĻžāĻ¨āĻžāĻ¯āĻŧ, āĻ¯ā§āĻāĻžāĻ¨ā§ seqnum = X + 1
, acknum = Y + 1
. āĻāĻ° āĻĒāĻ°ā§, āĻĒā§āĻ°āĻā§āĻ¤ āĻĄā§āĻāĻž āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻ¨ā§āĻ¤āĻ° āĻļā§āĻ°ā§ āĻšāĻ¯āĻŧāĨ¤
āĻ¯āĻĻāĻŋ āĻĒāĻŋāĻ¯āĻŧāĻžāĻ° āĻĒā§āĻ¯āĻžāĻā§āĻā§āĻ° āĻĒā§āĻ°āĻžāĻĒā§āĻ¤āĻŋ āĻ¸ā§āĻŦā§āĻāĻžāĻ° āĻ¨āĻž āĻāĻ°ā§, TCP āĻāĻāĻāĻŋ āĻ¸āĻŽāĻ¯āĻŧ āĻļā§āĻˇ āĻšāĻāĻ¯āĻŧāĻžāĻ° āĻĒāĻ°ā§ āĻāĻāĻŋ āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻĒāĻžāĻ āĻžāĻ¯āĻŧāĨ¤
āĻā§āĻ¨ SYN āĻā§āĻāĻŋāĻ āĻ¸āĻŦāĻ¸āĻŽāĻ¯āĻŧ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻšāĻ¯āĻŧ āĻ¨āĻž?
āĻĒā§āĻ°āĻĨāĻŽāĻ¤, SYNACK āĻŦāĻž ACK āĻšāĻžāĻ°āĻŋāĻ¯āĻŧā§ āĻā§āĻ˛ā§, āĻāĻĒāĻ¨āĻžāĻā§ āĻāĻāĻŋ āĻāĻŦāĻžāĻ° āĻĒāĻžāĻ āĻžāĻ¨ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻ āĻĒā§āĻā§āĻˇāĻž āĻāĻ°āĻ¤ā§ āĻšāĻŦā§ - āĻ¸āĻāĻ¯ā§āĻ āĻ¸ā§āĻāĻāĻĒāĻāĻŋ āĻ§ā§āĻ° āĻšāĻ¯āĻŧā§ āĻ¯āĻžāĻŦā§āĨ¤ āĻĻā§āĻŦāĻŋāĻ¤ā§āĻ¯āĻŧāĻ¤, SYN āĻĒā§āĻ¯āĻžāĻā§āĻā§ - āĻāĻŦāĻ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻāĻāĻŋāĻ¤ā§! - āĻŦā§āĻļ āĻāĻ¯āĻŧā§āĻāĻāĻŋ āĻŦāĻŋāĻāĻ˛ā§āĻĒ āĻĒā§āĻ°ā§āĻ°āĻŖ āĻāĻ°āĻž āĻšāĻ¯āĻŧ āĻ¯āĻž āĻ¸āĻāĻ¯ā§āĻā§āĻ° āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§ āĻ āĻĒāĻžāĻ°ā§āĻļāĻ¨āĻā§ āĻĒā§āĻ°āĻāĻžāĻŦāĻŋāĻ¤ āĻāĻ°ā§āĨ¤ āĻāĻ¨āĻāĻžāĻŽāĻŋāĻ SYN āĻĒā§āĻ¯āĻžāĻā§āĻāĻā§āĻ˛āĻŋ āĻŽāĻ¨ā§ āĻ¨āĻž āĻ°ā§āĻā§, āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻāĻāĻāĻžāĻŦā§ āĻāĻ āĻŦāĻŋāĻāĻ˛ā§āĻĒāĻā§āĻ˛āĻŋāĻā§ āĻāĻĒā§āĻā§āĻˇāĻž āĻāĻ°ā§; āĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻ āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§ āĻĒā§āĻ¯āĻžāĻā§āĻā§ āĻ¸ā§āĻā§āĻ˛āĻŋ āĻĒāĻžāĻ āĻžāĻŦā§ āĻ¨āĻžāĨ¤ āĻāĻā§āĻˇā§āĻ¤ā§āĻ°ā§ āĻāĻŋāĻ¸āĻŋāĻĒāĻŋ āĻāĻžāĻ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§, āĻ¤āĻŦā§ āĻ āĻ¨ā§āĻ¤āĻ¤ āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ āĻĒāĻ°ā§āĻ¯āĻžāĻ¯āĻŧā§ āĻ¸āĻāĻ¯ā§āĻā§āĻ° āĻŽāĻžāĻ¨ āĻāĻŽā§ āĻ¯āĻžāĻŦā§āĨ¤
āĻāĻāĻāĻŋ āĻĒā§āĻ¯āĻžāĻā§āĻ āĻĻā§āĻˇā§āĻāĻŋāĻā§āĻŖ āĻĨā§āĻā§, āĻāĻāĻāĻŋ XDP āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽ āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻāĻŋāĻ¤āĻā§āĻ˛āĻŋ āĻāĻ°āĻ¤ā§ āĻšāĻŦā§:
- āĻāĻāĻāĻŋ āĻā§āĻāĻŋāĻ° āĻ¸āĻžāĻĨā§ SYNACK-āĻāĻ° āĻ¸āĻžāĻĨā§ SYN-āĻāĻ° āĻĒā§āĻ°āĻ¤āĻŋāĻā§āĻ°āĻŋāĻ¯āĻŧāĻž;
- āĻāĻ°āĻāĻ¸āĻāĻŋ (āĻ¸āĻāĻ¯ā§āĻ āĻŦāĻŋāĻā§āĻāĻŋāĻ¨ā§āĻ¨) āĻĻāĻŋāĻ¯āĻŧā§ ACK-āĻā§ āĻ¸āĻžāĻĄāĻŧāĻž āĻĻāĻŋāĻ¨;
- āĻ āĻŦāĻļāĻŋāĻˇā§āĻ āĻĒā§āĻ¯āĻžāĻā§āĻ āĻŦāĻžāĻĻ āĻĻāĻŋāĻ¨āĨ¤
āĻĒā§āĻ¯āĻžāĻā§āĻ āĻĒāĻžāĻ°ā§āĻ¸āĻŋāĻ āĻ¸āĻš āĻ ā§āĻ¯āĻžāĻ˛āĻāĻ°āĻŋāĻĻāĻŽā§āĻ° āĻ¸āĻŋāĻāĻĄā§āĻā§āĻĄ:
ĐŅĐģи ŅŅĐž ĐŊĐĩ Ethernet,
ĐŋŅĐžĐŋŅŅŅиŅŅ ĐŋĐ°ĐēĐĩŅ.
ĐŅĐģи ŅŅĐž ĐŊĐĩ IPv4,
ĐŋŅĐžĐŋŅŅŅиŅŅ ĐŋĐ°ĐēĐĩŅ.
ĐŅĐģи Đ°Đ´ŅĐĩŅ в ŅĐ°ĐąĐģиŅĐĩ ĐŋŅОвĐĩŅĐĩĐŊĐŊŅŅ
, (*)
ŅĐŧĐĩĐŊŅŅиŅŅ ŅŅĐĩŅŅиĐē ĐžŅŅавŅиŅ
ŅŅ ĐŋŅОвĐĩŅĐžĐē,
ĐŋŅĐžĐŋŅŅŅиŅŅ ĐŋĐ°ĐēĐĩŅ.
ĐŅĐģи ŅŅĐž ĐŊĐĩ TCP,
ŅĐąŅĐžŅиŅŅ ĐŋĐ°ĐēĐĩŅ. (**)
ĐŅĐģи ŅŅĐž SYN,
ĐžŅвĐĩŅиŅŅ SYN-ACK Ņ cookie.
ĐŅĐģи ŅŅĐž ACK,
ĐĩŅĐģи в acknum ĐģĐĩĐļиŅ ĐŊĐĩ cookie,
ŅĐąŅĐžŅиŅŅ ĐŋĐ°ĐēĐĩŅ.
ĐĐ°ĐŊĐĩŅŅи в ŅĐ°ĐąĐģиŅŅ Đ°Đ´ŅĐĩŅ Ņ N ĐžŅŅавŅиŅ
ŅŅ ĐŋŅОвĐĩŅĐžĐē. (*)
ĐŅвĐĩŅиŅŅ RST. (**)
Đ ĐžŅŅĐ°ĐģŅĐŊŅŅ
ŅĐģŅŅĐ°ŅŅ
ŅĐąŅĐžŅиŅŅ ĐŋĐ°ĐēĐĩŅ.
āĻāĻ (*)
āĻ¯ā§ āĻĒāĻ¯āĻŧā§āĻ¨ā§āĻāĻā§āĻ˛āĻŋ āĻāĻĒāĻ¨āĻžāĻā§ āĻ¸āĻŋāĻ¸ā§āĻā§āĻŽā§āĻ° āĻ
āĻŦāĻ¸ā§āĻĨāĻž āĻĒāĻ°āĻŋāĻāĻžāĻ˛āĻ¨āĻž āĻāĻ°āĻ¤ā§ āĻšāĻŦā§ āĻ¸ā§āĻā§āĻ˛āĻŋ āĻāĻŋāĻšā§āĻ¨āĻŋāĻ¤ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§ - āĻĒā§āĻ°āĻĨāĻŽ āĻĒāĻ°ā§āĻ¯āĻžāĻ¯āĻŧā§ āĻāĻĒāĻ¨āĻŋ āĻ¸āĻŋāĻāĻ¨āĻžāĻŽ āĻšāĻŋāĻ¸āĻžāĻŦā§ āĻāĻāĻāĻŋ SYN āĻā§āĻāĻŋ āĻ¤ā§āĻ°āĻŋāĻ° āĻ¸āĻžāĻĨā§ āĻāĻāĻāĻŋ TCP āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻļā§āĻ āĻĒā§āĻ°āĻ¯āĻŧā§āĻ āĻāĻ°ā§ āĻ¸ā§āĻā§āĻ˛āĻŋ āĻāĻžāĻĄāĻŧāĻž āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨ā§ˇ
āĻšāĻžāĻ¤ā§āĻ¨āĻžāĻ¤ā§ (**)
, āĻāĻŽāĻžāĻĻā§āĻ° āĻāĻāĻāĻŋ āĻā§āĻŦāĻŋāĻ˛ āĻ¨āĻž āĻĨāĻžāĻāĻžāĻāĻžāĻ˛ā§āĻ¨, āĻāĻŽāĻ°āĻž āĻĒā§āĻ¯āĻžāĻā§āĻāĻāĻŋ āĻāĻĄāĻŧāĻŋāĻ¯āĻŧā§ āĻ¯āĻžāĻŦāĨ¤
TCP āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻļā§āĻ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨
āĻĒā§āĻ¯āĻžāĻā§āĻ āĻĒāĻžāĻ°ā§āĻ¸āĻŋāĻ āĻāĻŦāĻ āĻā§āĻĄ āĻ¯āĻžāĻāĻžāĻ
āĻāĻŽāĻžāĻĻā§āĻ° āĻ¨ā§āĻāĻāĻ¯āĻŧāĻžāĻ°ā§āĻ āĻšā§āĻĄāĻžāĻ° āĻ¸ā§āĻā§āĻ°āĻžāĻāĻāĻžāĻ°ā§āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ āĻšāĻŦā§: āĻāĻĨāĻžāĻ°āĻ¨ā§āĻ (uapi/linux/if_ether.h
), IPv4 (uapi/linux/ip.h
) āĻāĻŦāĻ TCP (uapi/linux/tcp.h
) āĻāĻ° āĻ¸āĻžāĻĨā§ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻāĻŋāĻ¤ āĻ¤ā§āĻ°ā§āĻāĻŋāĻ° āĻāĻžāĻ°āĻŖā§ āĻāĻŽāĻŋ āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§āĻāĻŋ āĻ¸āĻāĻ¯ā§āĻ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°āĻŋāĻ¨āĻŋ atomic64_t
, āĻāĻŽāĻžāĻā§ āĻā§āĻĄā§ āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ā§āĻ¯āĻŧ āĻ¸āĻāĻā§āĻāĻž āĻ
āĻ¨ā§āĻ˛āĻŋāĻĒāĻŋ āĻāĻ°āĻ¤ā§ āĻšāĻ¯āĻŧā§āĻāĻŋāĻ˛āĨ¤
āĻĒāĻ āĻ¨āĻ¯ā§āĻā§āĻ¯āĻ¤āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻ¸āĻŋ-āĻ¤ā§ āĻšāĻžāĻāĻ˛āĻžāĻāĻ āĻāĻ°āĻž āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻĢāĻžāĻāĻļāĻ¨ āĻāĻ˛ā§āĻ° āĻĒāĻ¯āĻŧā§āĻ¨ā§āĻā§ āĻāĻ¨āĻ˛āĻžāĻāĻ¨ āĻāĻ°āĻž āĻāĻŦāĻļā§āĻ¯āĻ, āĻ¯ā§āĻšā§āĻ¤ā§ āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ā§āĻ° āĻāĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻ¯āĻžāĻāĻžāĻāĻāĻžāĻ°ā§ āĻŦā§āĻ¯āĻžāĻāĻā§āĻ°ā§āĻ¯āĻžāĻāĻŋāĻ āĻ¨āĻŋāĻˇāĻŋāĻĻā§āĻ§ āĻāĻ°ā§, āĻ āĻ°ā§āĻĨāĻžā§, āĻ˛ā§āĻĒ āĻāĻŦāĻ āĻĢāĻžāĻāĻļāĻ¨ āĻāĻ˛āĨ¤
#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 āĻ āĻŋāĻāĻžāĻ¨āĻž āĻ
āĻĻāĻ˛āĻŦāĻĻāĻ˛ āĻāĻ°ā§āĻ¨āĨ¤ āĻāĻā§āĻ¸āĻĄāĻŋāĻĒāĻŋ āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽ āĻĨā§āĻā§ āĻ¸ā§āĻā§āĻ¯āĻžāĻ¨ā§āĻĄāĻžāĻ°ā§āĻĄ āĻ˛āĻžāĻāĻŦā§āĻ°ā§āĻ°āĻŋ āĻ
ā§āĻ¯āĻžāĻā§āĻ¸ā§āĻ¸āĻ¯ā§āĻā§āĻ¯ āĻ¨āĻ¯āĻŧ, āĻ¤āĻžāĻ 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 āĻŦāĻžāĻāĻ āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤āĨ¤ āĻāĻĒāĻ¨āĻŋ āĻāĻāĻāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻ¸āĻāĻā§āĻ¯āĻ āĻĒā§āĻ¨āĻ°āĻžāĻŦā§āĻ¤ā§āĻ¤āĻŋ āĻ¸āĻš āĻāĻāĻāĻŋ āĻ˛ā§āĻĒ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨, āĻ¯āĻž āĻ¤āĻžāĻĄāĻŧāĻžāĻ¤āĻžāĻĄāĻŧāĻŋ āĻļā§āĻˇ āĻšāĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤
āĻāĻŽāĻŋ āĻ¨ā§āĻ āĻ¯ā§ āĻāĻā§
āĻā§āĻāĻ¸āĻžāĻŽ āĻāĻŖāĻ¨āĻž āĻĢāĻžāĻāĻļāĻ¨:
#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()
RFC 32 āĻ
āĻ¨ā§āĻ¯āĻžāĻ¯āĻŧā§, 16-āĻŦāĻŋāĻ āĻļāĻŦā§āĻĻā§āĻ° 791-āĻŦāĻŋāĻ āĻ¯ā§āĻāĻĢāĻ˛ āĻĨā§āĻā§ āĻāĻāĻāĻŋ āĻā§āĻāĻ¸āĻžāĻŽ āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§āĨ¤
TCP āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻļā§āĻ āĻ¯āĻžāĻāĻžāĻāĻāĻ°āĻŖ
āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ° āĻ¸āĻ āĻŋāĻāĻāĻžāĻŦā§ āĻāĻ° āĻ¸āĻžāĻĨā§ āĻāĻāĻāĻŋ āĻ¸āĻāĻ¯ā§āĻ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻāĻ°ā§ netcat
, āĻā§āĻĄāĻŧāĻžāĻ¨ā§āĻ¤ ACK āĻ
āĻ¨ā§āĻĒāĻ¸ā§āĻĨāĻŋāĻ¤, āĻ¯ā§āĻāĻŋāĻ¤ā§ āĻ˛āĻŋāĻ¨āĻžāĻā§āĻ¸ āĻāĻāĻāĻŋ 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
āĻāĻĒāĻ° xdp-remote
āĻāĻžāĻ°āĻŖ, āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§āĻĒ, hping3
āĻā§āĻ˛ āĻā§āĻāĻ¸āĻžāĻŽāĻā§āĻ˛āĻŋāĻ¤ā§ āĻ¸āĻžāĻĄāĻŧāĻž āĻĻā§āĻ¯āĻŧ āĻ¨āĻžāĨ¤
SYN āĻā§āĻāĻŋ
XDP āĻĻā§āĻˇā§āĻāĻŋāĻā§āĻŖ āĻĨā§āĻā§, āĻ¯āĻžāĻāĻžāĻāĻāĻ°āĻŖ āĻ¨āĻŋāĻā§āĻ āĻ¤ā§āĻā§āĻāĨ¤ āĻāĻŖāĻ¨āĻž āĻ ā§āĻ¯āĻžāĻ˛āĻāĻ°āĻŋāĻĻāĻŽ āĻāĻĻāĻŋāĻŽ āĻāĻŦāĻ āĻ¸āĻŽā§āĻāĻŦāĻ¤ āĻāĻāĻāĻŋ āĻĒāĻ°āĻŋāĻļā§āĻ˛āĻŋāĻ¤ āĻāĻā§āĻ°āĻŽāĻŖāĻāĻžāĻ°ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻā§āĻāĻāĻŋāĻĒā§āĻ°ā§āĻŖāĨ¤ āĻ˛āĻŋāĻ¨āĻžāĻā§āĻ¸ āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛, āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻā§āĻ°āĻŋāĻĒā§āĻā§āĻā§āĻ°āĻžāĻĢāĻŋāĻ āĻ¸āĻŋāĻĒāĻšā§āĻ¯āĻžāĻļ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§, āĻ¤āĻŦā§ XDP-āĻāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻ° āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻ¸ā§āĻĒāĻˇā§āĻāĻāĻžāĻŦā§ āĻāĻ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§āĻ° āĻ¸ā§āĻ¯ā§āĻā§āĻ° āĻŦāĻžāĻāĻ°ā§āĨ¤
āĻŦāĻžāĻšā§āĻ¯āĻŋāĻ āĻ¯ā§āĻāĻžāĻ¯ā§āĻā§āĻ° āĻ¸āĻžāĻĨā§ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻāĻŋāĻ¤ āĻ¨āĻ¤ā§āĻ¨ TODO-āĻ° āĻāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻŦāĻ°ā§āĻ¤āĻŋāĻ¤:
-
XDP āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽ āĻ¸āĻāĻ°āĻā§āĻˇāĻŖ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§ āĻ¨āĻž
cookie_seed
(āĻ˛āĻŦāĻŖā§āĻ° āĻā§āĻĒāĻ¨ āĻ āĻāĻļ) āĻāĻāĻāĻŋ āĻā§āĻ˛ā§āĻŦāĻžāĻ˛ āĻā§āĻ°āĻŋāĻ¯āĻŧā§āĻŦāĻ˛ā§, āĻāĻĒāĻ¨āĻžāĻ° āĻāĻžāĻ°ā§āĻ¨ā§āĻ˛ā§ āĻ¸ā§āĻā§āĻ°ā§āĻ āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨, āĻ¯āĻžāĻ° āĻŽāĻžāĻ¨ āĻĒāĻ°ā§āĻ¯āĻžāĻ¯āĻŧāĻā§āĻ°āĻŽā§ āĻāĻāĻāĻŋ āĻ¨āĻŋāĻ°ā§āĻāĻ°āĻ¯ā§āĻā§āĻ¯ āĻā§āĻ¨āĻžāĻ°ā§āĻāĻ° āĻĨā§āĻā§ āĻāĻĒāĻĄā§āĻ āĻāĻ°āĻž āĻšāĻŦā§āĨ¤ -
āĻ¯āĻĻāĻŋ SYN āĻā§āĻāĻŋ ACK āĻĒā§āĻ¯āĻžāĻā§āĻā§āĻ° āĻ¸āĻžāĻĨā§ āĻŽāĻŋāĻ˛ā§ āĻ¯āĻžāĻ¯āĻŧ, āĻ¤āĻžāĻšāĻ˛ā§ āĻāĻĒāĻ¨āĻžāĻā§ āĻāĻāĻāĻŋ āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻĒā§āĻ°āĻŋāĻ¨ā§āĻ āĻāĻ°āĻžāĻ° āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ āĻ¨ā§āĻ, āĻ¤āĻŦā§ āĻāĻāĻŋ āĻĨā§āĻā§ āĻĒā§āĻ¯āĻžāĻā§āĻ āĻĒāĻžāĻ¸ āĻāĻ°āĻž āĻāĻžāĻ˛āĻŋāĻ¯āĻŧā§ āĻ¯āĻžāĻāĻ¯āĻŧāĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻ¯āĻžāĻāĻžāĻāĻā§āĻ¤ āĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻā§āĻ° 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
āĻ¯āĻĻāĻŋāĻ āĻ¯āĻžāĻāĻžāĻāĻā§āĻ¤ āĻāĻāĻĒāĻŋāĻā§āĻ˛āĻŋāĻ° āĻā§āĻ¨āĻ āĻ¤āĻžāĻ˛āĻŋāĻāĻž āĻ¨ā§āĻ, āĻ¸ā§āĻāĻžāĻ¨ā§ 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 āĻāĻĒāĻ¨āĻžāĻā§ āĻŦā§āĻļ āĻāĻāĻŋāĻ˛ āĻ¯ā§āĻā§āĻ¤āĻŋ āĻĒā§āĻ°āĻ¯āĻŧā§āĻ āĻāĻ°āĻ¤ā§ āĻĻā§āĻ¯āĻŧ, āĻ¯āĻž, āĻā§āĻ°āĻžāĻĢāĻŋāĻ āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻāĻ°āĻŖā§ āĻŦāĻžāĻ§āĻž āĻāĻžāĻĄāĻŧāĻžāĻ āĻāĻĒāĻĄā§āĻ āĻāĻ°āĻž āĻ¸āĻšāĻāĨ¤ āĻ¯āĻžāĻāĻžāĻāĻāĻžāĻ°ā§ āĻŦāĻĄāĻŧ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§ āĻ¨āĻž; āĻŦā§āĻ¯āĻā§āĻ¤āĻŋāĻāĻ¤āĻāĻžāĻŦā§, āĻāĻŽāĻŋ āĻāĻāĻāĻžāĻ°āĻ¸ā§āĻĒā§āĻ¸ āĻā§āĻĄā§āĻ° āĻ āĻāĻļāĻā§āĻ˛āĻŋāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻŋ āĻĒā§āĻ°āĻ¤ā§āĻ¯āĻžāĻā§āĻ¯āĻžāĻ¨ āĻāĻ°āĻŦ āĻ¨āĻžāĨ¤
āĻĻā§āĻŦāĻŋāĻ¤ā§āĻ¯āĻŧ āĻ āĻāĻļā§, āĻŦāĻŋāĻˇāĻ¯āĻŧāĻāĻŋ āĻāĻāĻ°ā§āĻˇāĻŖā§āĻ¯āĻŧ āĻšāĻ˛ā§, āĻāĻŽāĻ°āĻž āĻ¯āĻžāĻāĻžāĻāĻā§āĻ¤ āĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻ āĻāĻŦāĻ āĻ¸āĻāĻ¯ā§āĻ āĻŦāĻŋāĻā§āĻāĻŋāĻ¨ā§āĻ¨ āĻāĻ°āĻžāĻ° āĻā§āĻŦāĻŋāĻ˛āĻāĻŋ āĻ¸āĻŽā§āĻĒā§āĻ°ā§āĻŖ āĻāĻ°āĻŦ, āĻāĻžāĻāĻ¨ā§āĻāĻžāĻ°āĻā§āĻ˛āĻŋ āĻĒā§āĻ°āĻ¯āĻŧā§āĻ āĻāĻ°āĻŦ āĻāĻŦāĻ āĻĢāĻŋāĻ˛ā§āĻāĻžāĻ° āĻĒāĻ°āĻŋāĻāĻžāĻ˛āĻ¨āĻž āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻāĻāĻāĻžāĻ°āĻ¸ā§āĻĒā§āĻ¸ āĻāĻāĻāĻŋāĻ˛āĻŋāĻāĻŋ āĻ˛āĻŋāĻāĻŦāĨ¤
āĻ°ā§āĻĢāĻžāĻ°ā§āĻ¨ā§āĻ¸:
GitHub-āĻ āĻ¸āĻŽā§āĻĒā§āĻ°ā§āĻŖ āĻā§āĻĄ bpftrace āĻāĻŋāĻ āĻļā§āĻ BPF āĻāĻŦāĻ XDP āĻ°ā§āĻĢāĻžāĻ°ā§āĻ¨ā§āĻ¸ āĻāĻžāĻāĻĄ XDP āĻāĻŋāĻāĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ˛ PoC: Rust āĻĨā§āĻā§ eBPF-āĻ āĻāĻŽā§āĻĒāĻžāĻāĻ˛ āĻāĻ°āĻž
āĻāĻ¤ā§āĻ¸: www.habr.com