āĻ†āĻŽāĻ°āĻž XDP-āĻ¤ā§‡ DDoS āĻ†āĻ•ā§āĻ°āĻŽāĻŖā§‡āĻ° āĻŦāĻŋāĻ°ā§āĻĻā§āĻ§ā§‡ āĻ¸ā§āĻ°āĻ•ā§āĻˇāĻž āĻ˛āĻŋāĻ–āĻ›āĻŋāĨ¤ āĻĒāĻžāĻ°āĻŽāĻžāĻŖāĻŦāĻŋāĻ• āĻ…āĻ‚āĻļ

āĻāĻ•ā§āĻ¸āĻĒā§āĻ°ā§‡āĻ¸ āĻĄā§‡āĻŸāĻž āĻĒāĻžāĻĨ (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 āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯āĻ•āĻžāĻ°ā§€) āĻ•āĻ˛ āĻ•āĻ°āĻžāĻ° āĻ…āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻā§‡āĻ“āĻ¯āĻŧāĻž āĻšāĻ¯āĻŧāĨ¤

āĻāĻ•āĻŸāĻŋ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ° āĻĄāĻŋāĻœāĻžāĻ‡āĻ¨ āĻāĻŦāĻ‚ āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°āĻž āĻāĻ‡ āĻŽāĻ¤ āĻĻā§‡āĻ–āĻžāĻ¯āĻŧ:

  1. āĻ¸ā§‹āĻ°ā§āĻ¸ āĻ•ā§‹āĻĄ (āĻ¯ā§‡āĻŽāĻ¨ kernel.c) āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸā§‡ āĻ•āĻŽā§āĻĒāĻžāĻ‡āĻ˛ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ (kernel.o) eBPF āĻ­āĻžāĻ°ā§āĻšā§āĻ¯āĻŧāĻžāĻ˛ āĻŽā§‡āĻļāĻŋāĻ¨ āĻ†āĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āĻšāĻžāĻ°ā§‡āĻ° āĻœāĻ¨ā§āĻ¯āĨ¤ āĻ…āĻ•ā§āĻŸā§‹āĻŦāĻ° 2019 āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤, eBPF-āĻāĻ° āĻ¸āĻ‚āĻ•āĻ˛āĻ¨ Clang āĻĻā§āĻŦāĻžāĻ°āĻž āĻ¸āĻŽāĻ°ā§āĻĨāĻŋāĻ¤ āĻāĻŦāĻ‚ GCC 10.1-āĻ āĻĒā§āĻ°āĻ¤āĻŋāĻļā§āĻ°ā§āĻ¤āĻŋ āĻĻā§‡āĻ“āĻ¯āĻŧāĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤
  2. āĻ¯āĻĻāĻŋ āĻāĻ‡ āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸ āĻ•ā§‹āĻĄā§‡ āĻ•āĻžāĻ°ā§āĻ¨ā§‡āĻ˛ āĻ¸ā§āĻŸā§āĻ°āĻžāĻ•āĻšāĻžāĻ°ā§‡ āĻ•āĻ˛ āĻĨāĻžāĻ•ā§‡ (āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻŸā§‡āĻŦāĻŋāĻ˛ āĻāĻŦāĻ‚ āĻ•āĻžāĻ‰āĻ¨ā§āĻŸāĻžāĻ°), āĻ¤āĻžāĻĻā§‡āĻ° āĻ†āĻ‡āĻĄāĻŋāĻ—ā§āĻ˛āĻŋ āĻļā§‚āĻ¨ā§āĻ¯ āĻĻā§āĻŦāĻžāĻ°āĻž āĻĒā§āĻ°āĻ¤āĻŋāĻ¸ā§āĻĨāĻžāĻĒāĻŋāĻ¤ āĻšāĻ¯āĻŧ, āĻ¯āĻžāĻ° āĻŽāĻžāĻ¨ā§‡ āĻāĻ‡ āĻ§āĻ°āĻ¨ā§‡āĻ° āĻ•ā§‹āĻĄ āĻšāĻžāĻ˛āĻžāĻ¨ā§‹ āĻ¯āĻžāĻŦā§‡ āĻ¨āĻžāĨ¤ āĻ•āĻžāĻ°ā§āĻ¨ā§‡āĻ˛ā§‡ āĻ˛ā§‹āĻĄ āĻ•āĻ°āĻžāĻ° āĻ†āĻ—ā§‡, āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ•āĻžāĻ°ā§āĻ¨ā§‡āĻ˛ āĻ•āĻ˛ā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻŦāĻ¸ā§āĻ¤ā§āĻ° āĻ†āĻ‡āĻĄāĻŋāĻ—ā§āĻ˛āĻŋāĻ° āĻ¸āĻžāĻĨā§‡ āĻāĻ‡ āĻļā§‚āĻ¨ā§āĻ¯āĻ—ā§āĻ˛āĻŋ āĻĒā§āĻ°āĻ¤āĻŋāĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ (āĻ•ā§‹āĻĄ āĻ˛āĻŋāĻ™ā§āĻ• āĻ•āĻ°ā§āĻ¨)āĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻŦāĻžāĻšā§āĻ¯āĻŋāĻ• āĻ‡āĻ‰āĻŸāĻŋāĻ˛āĻŋāĻŸāĻŋāĻ—ā§āĻ˛āĻŋāĻ° āĻ¸āĻžāĻĨā§‡ āĻāĻŸāĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨, āĻ…āĻĨāĻŦāĻž āĻ†āĻĒāĻ¨āĻŋ āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽ āĻ˛āĻŋāĻ–āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ āĻ¯āĻž āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ° āĻ˛āĻŋāĻ™ā§āĻ• āĻāĻŦāĻ‚ āĻ˛ā§‹āĻĄ āĻ•āĻ°āĻŦā§‡āĨ¤
  3. āĻ•āĻžāĻ°ā§āĻ¨ā§‡āĻ˛ āĻ˛ā§‹āĻĄ āĻ•āĻ°āĻž āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽ āĻ¯āĻžāĻšāĻžāĻ‡ āĻ•āĻ°ā§‡āĨ¤ āĻšāĻ•ā§āĻ°ā§‡āĻ° āĻ…āĻ¨ā§āĻĒāĻ¸ā§āĻĨāĻŋāĻ¤āĻŋ āĻāĻŦāĻ‚ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻāĻŦāĻ‚ āĻ¸ā§āĻŸā§āĻ¯āĻžāĻ•ā§‡āĻ° āĻ¸ā§€āĻŽāĻžāĻ¨āĻž āĻ…āĻ¤āĻŋāĻ•ā§āĻ°āĻŽ āĻ•āĻ°āĻ¤ā§‡ āĻŦā§āĻ¯āĻ°ā§āĻĨāĻ¤āĻž āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻ¯āĻĻāĻŋ āĻ¯āĻžāĻšāĻžāĻ‡āĻ•āĻžāĻ°ā§€ āĻĒā§āĻ°āĻŽāĻžāĻŖ āĻ•āĻ°āĻ¤ā§‡ āĻ¨āĻž āĻĒāĻžāĻ°ā§‡ āĻ¯ā§‡ āĻ•ā§‹āĻĄāĻŸāĻŋ āĻ¸āĻ āĻŋāĻ•, āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻŸāĻŋ āĻĒā§āĻ°āĻ¤ā§āĻ¯āĻžāĻ–ā§āĻ¯āĻžāĻ¨ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡ - āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ¤āĻžāĻ•ā§‡ āĻ–ā§āĻļāĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻ¸āĻ•ā§āĻˇāĻŽ āĻšāĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤
  4. āĻ¸āĻĢāĻ˛ āĻ¯āĻžāĻšāĻžāĻ‡āĻ•āĻ°āĻŖā§‡āĻ° āĻĒāĻ°ā§‡, āĻ•āĻžāĻ°ā§āĻ¨ā§‡āĻ˛ āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ†āĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āĻšāĻžāĻ°ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ‡āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻ†āĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āĻšāĻžāĻ° āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸ āĻ•ā§‹āĻĄāĻ•ā§‡ āĻŽā§‡āĻļāĻŋāĻ¨ āĻ•ā§‹āĻĄā§‡ āĻ•āĻŽā§āĻĒāĻžāĻ‡āĻ˛ āĻ•āĻ°ā§‡ (āĻŽāĻžāĻ¤ā§āĻ°-āĻ¸āĻŽāĻ¯āĻŧā§‡)āĨ¤
  5. āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻŸāĻŋ āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻĢā§‡āĻ¸ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻ‚āĻ¯ā§āĻ•ā§āĻ¤ āĻšāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ°āĻŖ āĻļā§āĻ°ā§ āĻ•āĻ°ā§‡āĨ¤

āĻ¯ā§‡āĻšā§‡āĻ¤ā§ XDP āĻ•āĻžāĻ°ā§āĻ¨ā§‡āĻ˛ā§‡ āĻšāĻ˛ā§‡, āĻ¤āĻžāĻ‡ āĻŸā§āĻ°ā§‡āĻ¸ āĻ˛āĻ— āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻ•ā§ƒāĻ¤āĻĒāĻ•ā§āĻˇā§‡, āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ° āĻŦāĻž āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻŸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻĄāĻŋāĻŦāĻžāĻ—āĻŋāĻ‚ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻ¯āĻžāĻ‡āĻšā§‹āĻ•, eBPF āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤ āĻ•āĻ°ā§‡ āĻ¯ā§‡ āĻĄāĻžāĻ‰āĻ¨āĻ˛ā§‹āĻĄ āĻ•āĻ°āĻž āĻ•ā§‹āĻĄāĻŸāĻŋ āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻ°āĻžāĻĒāĻĻ, āĻ¤āĻžāĻ‡ āĻ†āĻĒāĻ¨āĻŋ āĻ¸āĻ°āĻžāĻ¸āĻ°āĻŋ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¸ā§āĻĨāĻžāĻ¨ā§€āĻ¯āĻŧ āĻ˛āĻŋāĻ¨āĻžāĻ•ā§āĻ¸ā§‡ XDP āĻ¨āĻŋāĻ¯āĻŧā§‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤

āĻĒāĻ°āĻŋāĻŦā§‡āĻļ āĻĒā§āĻ°āĻ¸ā§āĻ¤ā§āĻ¤ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

āĻ¸āĻŽāĻžāĻŦā§‡āĻļ

āĻ•ā§āĻ˛ā§āĻ¯āĻžāĻ‚ āĻ¸āĻ°āĻžāĻ¸āĻ°āĻŋ āĻ‡āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻ†āĻ°ā§āĻ•āĻŋāĻŸā§‡āĻ•āĻšāĻžāĻ°ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸ āĻ•ā§‹āĻĄ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻ¨āĻž, āĻ¤āĻžāĻ‡ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻŸāĻŋ āĻĻā§āĻŸāĻŋ āĻ§āĻžāĻĒ āĻ¨āĻŋāĻ¯āĻŧā§‡ āĻ—āĻ āĻŋāĻ¤:

  1. LLVM āĻŦāĻžāĻ‡āĻŸāĻ•ā§‹āĻĄā§‡ C āĻ•ā§‹āĻĄ āĻ•āĻŽā§āĻĒāĻžāĻ‡āĻ˛ āĻ•āĻ°ā§āĻ¨ (clang -emit-llvm).
  2. āĻŦāĻžāĻ‡āĻŸāĻ•ā§‹āĻĄāĻ•ā§‡ āĻ‡āĻŦāĻŋāĻĒāĻŋāĻāĻĢ āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸ āĻ•ā§‹āĻĄā§‡ āĻ°ā§‚āĻĒāĻžāĻ¨ā§āĻ¤āĻ° āĻ•āĻ°ā§āĻ¨ (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 āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻ“ āĻŦāĻ°āĻžāĻĻā§āĻĻ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛, āĻāĻŽāĻ¨āĻ•āĻŋ āĻ¯āĻĻāĻŋ āĻāĻŸāĻŋ āĻ–āĻžāĻ˛āĻŋ āĻ›āĻŋāĻ˛, āĻāĻŦāĻ‚ āĻ¤āĻžāĻ•ā§‡ āĻ‰āĻ¤ā§āĻĨāĻžāĻĒāĻŋāĻ¤ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛āĨ¤

āĻ†āĻŽāĻŋ āĻāĻŸāĻž āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻœāĻžāĻ¨āĻ˛āĻžāĻŽ?

āĻ•āĻžāĻ°ā§āĻ¨ā§‡āĻ˛ā§‡ āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœā§‡āĻ° āĻĒāĻžāĻĨ āĻŸā§āĻ°ā§‡āĻ¸ āĻ•āĻ°ā§āĻ¨ āĻĒāĻžāĻ°āĻĢ āĻ‡āĻ­ā§‡āĻ¨ā§āĻŸ āĻŽā§‡āĻ•āĻžāĻ¨āĻŋāĻœāĻŽ āĻ…āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻā§‡āĻ¯āĻŧ, āĻ¯āĻžāĻ‡āĻšā§‹āĻ•, āĻāĻ•āĻ‡ āĻ­āĻžāĻ°ā§āĻšā§āĻ¯āĻŧāĻžāĻ˛ āĻŽā§‡āĻļāĻŋāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡, āĻ…āĻ°ā§āĻĨāĻžā§Ž, 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, āĻāĻŸāĻŋ āĻŽā§‡āĻ•āĻĢāĻžāĻ‡āĻ˛ā§‡ āĻ¯ā§‹āĻ— āĻ•āĻ°ā§āĻ¨, āĻāĻŸāĻŋāĻ•ā§‡ āĻ†āĻŦāĻĻā§āĻ§ āĻ•āĻ°ā§āĻ¨ 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 āĻŦāĻžāĻ‡āĻŸ āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤āĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ¸āĻ‚āĻ–ā§āĻ¯āĻ• āĻĒā§āĻ¨āĻ°āĻžāĻŦā§ƒāĻ¤ā§āĻ¤āĻŋ āĻ¸āĻš āĻāĻ•āĻŸāĻŋ āĻ˛ā§āĻĒ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨, āĻ¯āĻž āĻ¤āĻžāĻĄāĻŧāĻžāĻ¤āĻžāĻĄāĻŧāĻŋ āĻļā§‡āĻˇ āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤

āĻ†āĻŽāĻŋ āĻ¨ā§‹āĻŸ āĻ¯ā§‡ āĻ†āĻ›ā§‡ 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() 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 āĻ­ā§āĻ˛ āĻšā§‡āĻ•āĻ¸āĻžāĻŽāĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻ¸āĻžāĻĄāĻŧāĻž āĻĻā§‡āĻ¯āĻŧ āĻ¨āĻžāĨ¤

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 āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻŦā§‡āĻļ āĻœāĻŸāĻŋāĻ˛ āĻ¯ā§āĻ•ā§āĻ¤āĻŋ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻ— āĻ•āĻ°āĻ¤ā§‡ āĻĻā§‡āĻ¯āĻŧ, āĻ¯āĻž, āĻŸā§āĻ°āĻžāĻĢāĻŋāĻ• āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ°āĻŖā§‡ āĻŦāĻžāĻ§āĻž āĻ›āĻžāĻĄāĻŧāĻžāĻ‡ āĻ†āĻĒāĻĄā§‡āĻŸ āĻ•āĻ°āĻž āĻ¸āĻšāĻœāĨ¤ āĻ¯āĻžāĻšāĻžāĻ‡āĻ•āĻžāĻ°ā§€ āĻŦāĻĄāĻŧ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡ āĻ¨āĻž; āĻŦā§āĻ¯āĻ•ā§āĻ¤āĻŋāĻ—āĻ¤āĻ­āĻžāĻŦā§‡, āĻ†āĻŽāĻŋ āĻ‡āĻ‰āĻœāĻžāĻ°āĻ¸ā§āĻĒā§‡āĻ¸ āĻ•ā§‹āĻĄā§‡āĻ° āĻ…āĻ‚āĻļāĻ—ā§āĻ˛āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻŸāĻŋ āĻĒā§āĻ°āĻ¤ā§āĻ¯āĻžāĻ–ā§āĻ¯āĻžāĻ¨ āĻ•āĻ°āĻŦ āĻ¨āĻžāĨ¤

āĻĻā§āĻŦāĻŋāĻ¤ā§€āĻ¯āĻŧ āĻ…āĻ‚āĻļā§‡, āĻŦāĻŋāĻˇāĻ¯āĻŧāĻŸāĻŋ āĻ†āĻ•āĻ°ā§āĻˇāĻŖā§€āĻ¯āĻŧ āĻšāĻ˛ā§‡, āĻ†āĻŽāĻ°āĻž āĻ¯āĻžāĻšāĻžāĻ‡āĻ•ā§ƒāĻ¤ āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻāĻŦāĻ‚ āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻŦāĻŋāĻšā§āĻ›āĻŋāĻ¨ā§āĻ¨ āĻ•āĻ°āĻžāĻ° āĻŸā§‡āĻŦāĻŋāĻ˛āĻŸāĻŋ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ•āĻ°āĻŦ, āĻ•āĻžāĻ‰āĻ¨ā§āĻŸāĻžāĻ°āĻ—ā§āĻ˛āĻŋ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻ— āĻ•āĻ°āĻŦ āĻāĻŦāĻ‚ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ° āĻĒāĻ°āĻŋāĻšāĻžāĻ˛āĻ¨āĻž āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ‡āĻ‰āĻœāĻžāĻ°āĻ¸ā§āĻĒā§‡āĻ¸ āĻ‡āĻ‰āĻŸāĻŋāĻ˛āĻŋāĻŸāĻŋ āĻ˛āĻŋāĻ–āĻŦāĨ¤

āĻ°ā§‡āĻĢāĻžāĻ°ā§‡āĻ¨ā§āĻ¸:

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨