เจ…เจธเฉ€เจ‚ XDP 'เจคเฉ‡ DDoS เจนเจฎเจฒเจฟเจ†เจ‚ เจคเฉ‹เจ‚ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจฒเจฟเจ–เจฆเฉ‡ เจนเจพเจ‚เฅค เจชเฉเจฐเจฎเจพเจฃเฉ‚ เจนเจฟเฉฑเจธเจพ

เจเจ•เจธเจชเฉเจฐเฉˆเจธ เจกเฉ‡เจŸเจพ เจชเจพเจฅ (XDP) เจคเจ•เจจเจพเจฒเฉ‹เจœเฉ€ เจฒเฉ€เจจเจ•เจธ เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจ‰เฉฑเจคเฉ‡ เจชเฉˆเจ•เฉ‡เจŸ เจ•เจฐเจจเจฒ เจจเฉˆเจŸเจตเจฐเจ• เจธเจŸเฉˆเจ• เจตเจฟเฉฑเจš เจฆเจพเจ–เจฒ เจนเฉ‹เจฃ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจŸเฉเจฐเฉˆเจซเจฟเจ• เจฆเฉ€ เจฎเจจเจฎเจพเจจเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเฉ€ เจนเฉˆเฅค XDP เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ - DDoS เจนเจฎเจฒเจฟเจ†เจ‚ (CloudFlare), เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจซเจฟเจฒเจŸเจฐ, เจ…เฉฐเจ•เฉœเฉ‡ เจธเฉฐเจ—เฉเจฐเจนเจฟ (Netflix) เจคเฉ‹เจ‚ เจธเฉเจฐเฉฑเจ–เจฟเจ†เฅค XDP เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจจเฉ‚เฉฐ eBPF เจตเจฐเจšเฉเจ…เจฒ เจฎเจธเจผเฉ€เจจ เจฆเฉเจ†เจฐเจพ เจšเจฒเจพเจ‡เจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจ‡เจธเจฒเจˆ เจซเจฟเจฒเจŸเจฐ เจฆเฉ€ เจ•เจฟเจธเจฎ 'เจคเฉ‡ เจจเจฟเจฐเจญเจฐ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ, เจ‰เจนเจจเจพเจ‚ เจฆเฉ‡ เจ•เฉ‹เจก เจ…เจคเฉ‡ เจ‰เจชเจฒเจฌเจง เจ•เจฐเจจเจฒ เจซเฉฐเจ•เจธเจผเจจเจพเจ‚ เจฆเฉ‹เจตเจพเจ‚ 'เจคเฉ‡ เจชเจพเจฌเฉฐเจฆเฉ€เจ†เจ‚ เจนเจจเฅค

เจฒเฉ‡เจ– เจฆเจพ เจ‰เจฆเฉ‡เจธเจผ XDP 'เจคเฉ‡ เจฌเจนเฉเจค เจธเจพเจฐเฉ€เจ†เจ‚ เจธเจฎเฉฑเจ—เจฐเฉ€เจ†เจ‚ เจฆเฉ€เจ†เจ‚ เจ•เจฎเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจชเฉ‚เจฐเจพ เจ•เจฐเจจเจพ เจนเฉˆเฅค เจชเจนเจฟเจฒเจพเจ‚, เจ‰เจน เจคเจฟเจ†เจฐ เจ•เฉ‹เจก เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเฉ‡ เจนเจจ เจœเฉ‹ เจคเฉเจฐเฉฐเจค XDP เจฆเฉ€เจ†เจ‚ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจพเจˆเจชเจพเจธ เจ•เจฐเจฆเจพ เจนเฉˆ: เจชเฉเจธเจผเจŸเฉ€เจ•เจฐเจจ เจฒเจˆ เจคเจฟเจ†เจฐ เจœเจพเจ‚ เจธเจฎเฉฑเจธเจฟเจ†เจตเจพเจ‚ เจชเฉˆเจฆเจพ เจ•เจฐเจจ เจฒเจˆ เจฌเจนเฉเจค เจธเจงเจพเจฐเจจเฅค เจœเจฆเฉ‹เจ‚ เจคเฉเจธเฉ€เจ‚ เจฌเจพเจ…เจฆ เจตเจฟเฉฑเจš เจธเจ•เฉเจฐเฉˆเจš เจคเฉ‹เจ‚ เจ†เจชเจฃเจพ เจ•เฉ‹เจก เจฒเจฟเจ–เจฃ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจ‡เจธ เจ—เฉฑเจฒ เจฆเฉ€ เจ•เฉ‹เจˆ เจธเจฎเจ เจจเจนเฉ€เจ‚ เจนเฉเฉฐเจฆเฉ€ เจ•เจฟ เจ†เจฎ เจ—เจฒเจคเฉ€เจ†เจ‚ เจจเจพเจฒ เจ•เฉ€ เจ•เจฐเจจเจพ เจนเฉˆเฅค เจฆเฉ‚เจœเจพ, เจ‡เจน VM เจ…เจคเฉ‡ เจนเจพเจฐเจกเจตเฉ‡เจ…เจฐ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ XDP เจจเฉ‚เฉฐ เจธเจฅเจพเจจเจ• เจคเฉŒเจฐ 'เจคเฉ‡ เจŸเฉˆเจธเจŸ เจ•เจฐเจจ เจฆเฉ‡ เจคเจฐเฉ€เจ•เจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจ•เจตเจฐ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเจพ, เจ‡เจธ เจคเฉฑเจฅ เจฆเฉ‡ เจฌเจพเจตเจœเฉ‚เจฆ เจ•เจฟ เจ‰เจนเจจเจพเจ‚ เจฆเฉ€เจ†เจ‚ เจ†เจชเจฃเฉ€เจ†เจ‚ เจ•เจฎเฉ€เจ†เจ‚ เจนเจจเฅค เจŸเฉˆเจ•เจธเจŸ เจ‰เจนเจจเจพเจ‚ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฐเจพเจ‚ เจฒเจˆ เจนเฉˆ เจœเฉ‹ เจจเฉˆเจŸเจตเจฐเจ• เจ…เจคเฉ‡ เจฒเฉ€เจจเจ•เจธ เจคเฉ‹เจ‚ เจœเจพเจฃเฉ‚ เจนเจจ เจœเฉ‹ XDP เจ…เจคเฉ‡ eBPF เจตเจฟเฉฑเจš เจฆเจฟเจฒเจšเจธเจชเฉ€ เจฐเฉฑเจ–เจฆเฉ‡ เจนเจจเฅค

เจ‡เจธ เจนเจฟเฉฑเจธเฉ‡ เจตเจฟเฉฑเจš, เจ…เจธเฉ€เจ‚ เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจš เจธเจฎเจเจพเจ‚เจ—เฉ‡ เจ•เจฟ XDP เจซเจฟเจฒเจŸเจฐ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจ…เจธเฉˆเจ‚เจฌเจฒ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจŸเฉˆเจธเจŸ เจ•เจฐเจจเจพ เจนเฉˆ, เจซเจฟเจฐ เจ…เจธเฉ€เจ‚ เจชเฉˆเจ•เฉ‡เจŸ เจชเฉเจฐเฉ‹เจธเฉˆเจธเจฟเฉฐเจ— เจชเฉฑเจงเจฐ 'เจคเฉ‡ เจœเจพเจฃเฉ‡-เจชเจ›เจพเจฃเฉ‡ SYN เจ•เฉ‚เจ•เฉ€เจœเจผ เจตเจฟเจงเฉ€ เจฆเจพ เจ‡เฉฑเจ• เจธเจงเจพเจฐเจจ เจธเฉฐเจธเจ•เจฐเจฃ เจฒเจฟเจ–เจพเจ‚เจ—เฉ‡เฅค เจœเจฆเฉ‹เจ‚ เจคเฉฑเจ• เจ…เจธเฉ€เจ‚ "เจตเจพเจˆเจŸ เจฒเจฟเจธเจŸ" เจจเจนเฉ€เจ‚ เจฌเจฃเจพเจ‰เจ‚เจฆเฉ‡
เจชเฉเจฐเจฎเจพเจฃเจฟเจค เจ—เจพเจนเจ•, เจ•เจพเจŠเจ‚เจŸเจฐ เจฐเฉฑเจ–เฉ‹ เจ…เจคเฉ‡ เจซเจฟเจฒเจŸเจฐ เจฆเจพ เจชเฉเจฐเจฌเฉฐเจงเจจ เจ•เจฐเฉ‹ - เจ•เจพเจซเจผเฉ€ เจฒเฉŒเจ—เฅค

เจ…เจธเฉ€เจ‚ C เจตเจฟเฉฑเจš เจฒเจฟเจ–เจพเจ‚เจ—เฉ‡ - เจ‡เจน เจซเฉˆเจธเจผเจจเฉ‡เจฌเจฒ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจชเจฐ เจตเจฟเจนเจพเจฐเจ• เจนเฉˆ. เจธเจพเจฐเฉ‡ เจ•เฉ‹เจก เจ…เฉฐเจค เจตเจฟเฉฑเจš เจฒเจฟเฉฐเจ• 'เจคเฉ‡ GitHub 'เจคเฉ‡ เจ‰เจชเจฒเจฌเจง เจนเจจ เจ…เจคเฉ‡ เจฒเฉ‡เจ– เจตเจฟเฉฑเจš เจฆเฉฑเจธเฉ‡ เจ—เจ เจ•เจฆเจฎเจพเจ‚ เจฆเฉ‡ เจ…เจจเฉเจธเจพเจฐ เจ•เจฎเจฟเจŸเจพเจ‚ เจตเจฟเฉฑเจš เจตเฉฐเจกเจฟเจ† เจ—เจฟเจ† เจนเฉˆเฅค

เจฌเฉ‡เจฆเจพเจ…เจตเจพ เจฒเฉ‡เจ– เจฆเฉ‡ เจ•เฉ‹เจฐเจธ เจตเจฟเฉฑเจš, DDoS เจนเจฎเจฒเจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจฆเฉ‚เจฐ เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจฎเจฟเฉฐเจจเฉ€-เจนเฉฑเจฒ เจตเจฟเจ•เจธเจฟเจค เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‡เจน XDP เจ…เจคเฉ‡ เจฎเฉ‡เจฐเฉ‡ เจ–เฉ‡เจคเจฐ เจฒเจˆ เจ‡เฉฑเจ• เจฏเจฅเจพเจฐเจฅเจตเจพเจฆเฉ€ เจ•เฉฐเจฎ เจนเฉˆเฅค เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจฎเฉเฉฑเจ– เจŸเฉ€เจšเจพ เจคเจ•เจจเจพเจฒเฉ‹เจœเฉ€ เจจเฉ‚เฉฐ เจธเจฎเจเจฃเจพ เจนเฉˆ, เจ‡เจน เจฐเฉˆเจกเฉ€เจฎเฉ‡เจก เจธเฉเจฐเฉฑเจ–เจฟเจ† เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจ‡เฉฑเจ• เจ—เจพเจˆเจก เจจเจนเฉ€เจ‚ เจนเฉˆ. เจŸเจฟเจŠเจŸเฉ‹เจฐเจฟเจ…เจฒ เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจ…เจจเฉเจ•เฉ‚เจฒเจฟเจค เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ เจ…เจคเฉ‡ เจ•เฉเจ เจธเฉ‚เจ–เจฎเจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจ›เฉฑเจก เจฆเจฟเฉฑเจคเจพ เจ—เจฟเจ† เจนเฉˆเฅค

XDP เจฆเฉ€ เจ‡เฉฑเจ• เจธเฉฐเจ–เฉ‡เจช เจœเจพเจฃเจ•เจพเจฐเฉ€

เจฎเฉˆเจ‚ เจธเจฟเจฐเจซเจผ เจฎเฉเฉฑเจ– เจจเฉเจ•เจคเฉ‡ เจฆเฉฑเจธเจพเจ‚เจ—เจพ เจคเจพเจ‚ เจ•เจฟ เจฆเจธเจคเจพเจตเฉ‡เจœเจผเจพเจ‚ เจ…เจคเฉ‡ เจฎเฉŒเจœเฉ‚เจฆเจพ เจฒเฉ‡เจ–เจพเจ‚ เจฆเฉ€ เจจเจ•เจฒ เจจเจพ เจ•เฉ€เจคเฉ€ เจœเจพ เจธเจ•เฉ‡เฅค

เจ‡เจธ เจฒเจˆ, เจซเจฟเจฒเจŸเจฐ เจ•เฉ‹เจก เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจฒเฉ‹เจก เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจซเจฟเจฒเจŸเจฐ เจ†เจ‰เจฃ เจตเจพเจฒเฉ‡ เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจจเฉ‚เฉฐ เจชเจพเจธ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจจเจคเฉ€เจœเฉ‡ เจตเจœเฉ‹เจ‚, เจซเจฟเจฒเจŸเจฐ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจซเฉˆเจธเจฒเจพ เจฒเฉˆเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ: เจชเฉˆเจ•เฉ‡เจŸ เจจเฉ‚เฉฐ เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจญเฉ‡เจœเจฃ เจฒเจˆ (XDP_PASS), เจกเจฐเจพเจช เจชเฉˆเจ•เฉ‡เจŸ (XDP_DROP) เจœเจพเจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจตเจพเจชเจธ เจญเฉ‡เจœเฉ‹ (XDP_TX). เจซเจฟเจฒเจŸเจฐ เจชเฉˆเจ•เฉ‡เจœ เจจเฉ‚เฉฐ เจฌเจฆเจฒ เจธเจ•เจฆเจพ เจนเฉˆ, เจ‡เจน เจ‡เจธ เจฒเจˆ เจ–เจพเจธ เจคเฉŒเจฐ 'เจคเฉ‡ เจธเฉฑเจš เจนเฉˆ XDP_TX. เจคเฉเจธเฉ€เจ‚ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจตเฉ€ เจ•เจฐเฉˆเจธเจผ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ (XDP_ABORTED) เจ…เจคเฉ‡ เจชเฉˆเจ•เฉ‡เจœ เจ›เฉฑเจกเฉ‹, เจชเจฐ เจ‡เจน เจธเจฎเจพเจจ เจนเฉˆ assert(0) - เจกเฉ€เจฌเฉฑเจ—เจฟเฉฐเจ— เจฒเจˆเฅค

eBPF (เจเจ•เจธเจŸเฉˆเจ‚เจกเจก เจฌเจฐเจ•เจฒเฉ‡ เจชเฉˆเจ•เฉ‡เจŸ เจซเจฟเจฒเจŸเจฐ) เจตเจฐเจšเฉเจ…เจฒ เจฎเจธเจผเฉ€เจจ เจจเฉ‚เฉฐ เจœเจพเจฃเจฌเฉเฉฑเจ เจ•เฉ‡ เจธเจฐเจฒ เจฌเจฃเจพเจ‡เจ† เจ—เจฟเจ† เจนเฉˆ เจคเจพเจ‚ เจ•เจฟ เจ•เจฐเจจเจฒ เจ‡เจน เจœเจพเจ‚เจš เจ•เจฐ เจธเจ•เฉ‡ เจ•เจฟ เจ•เฉ‹เจก เจฒเฉ‚เจช เจจเจนเฉ€เจ‚ เจนเฉˆ เจ…เจคเฉ‡ เจฆเฉ‚เจœเฉ‡ เจฒเฉ‹เจ•เจพเจ‚ เจฆเฉ€ เจฏเจพเจฆเจฆเจพเจธเจผเจค เจจเฉ‚เฉฐ เจจเฉเจ•เจธเจพเจจ เจจเจนเฉ€เจ‚ เจชเจนเฉเฉฐเจšเจพเจ‰เจ‚เจฆเจพ เจนเฉˆเฅค เจธเฉฐเจšเจค เจชเจพเจฌเฉฐเจฆเฉ€เจ†เจ‚ เจ…เจคเฉ‡ เจœเจพเจ‚เจšเจพเจ‚:

  • เจฒเฉ‚เจชเจธ (เจตเจพเจชเจธ เจ›เจพเจฒ) เจฆเฉ€ เจฎเจจเจพเจนเฉ€ เจนเฉˆเฅค
  • เจกเฉ‡เจŸเจพ เจฒเจˆ เจ‡เฉฑเจ• เจธเจŸเฉˆเจ• เจนเฉˆ, เจชเจฐ เจ•เฉ‹เจˆ เจซเฉฐเจ•เจธเจผเจจ เจจเจนเฉ€เจ‚ (เจธเจพเจฐเฉ‡ C เจซเฉฐเจ•เจธเจผเจจ เจ‡เจจเจฒเจพเจˆเจจ เจนเฉ‹เจฃเฉ‡ เจšเจพเจนเฉ€เจฆเฉ‡ เจนเจจ)เฅค
  • เจธเจŸเฉˆเจ• เจ…เจคเฉ‡ เจชเฉˆเจ•เฉ‡เจŸ เจฌเจซเจฐ เจคเฉ‹เจ‚ เจฌเจพเจนเจฐ เจฎเฉˆเจฎเฉ‹เจฐเฉ€ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจฆเฉ€ เจฎเจจเจพเจนเฉ€ เจนเฉˆเฅค
  • เจ•เฉ‹เจก เจฆเจพ เจ†เจ•เจพเจฐ เจธเฉ€เจฎเจค เจนเฉˆ, เจชเจฐ เจ…เจญเจฟเจ†เจธ เจตเจฟเฉฑเจš เจ‡เจน เจฌเจนเฉเจค เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจจเจนเฉ€เจ‚ เจนเฉˆ.
  • เจธเจฟเจฐเจซเจผ เจตเจฟเจธเจผเฉ‡เจธเจผ เจ•เจฐเจจเจฒ เจซเฉฐเจ•เจธเจผเจจเจพเจ‚ (eBPF เจธเจนเจพเจ‡เจ•) เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจนเฉˆเฅค

เจ‡เฉฑเจ• เจซเจฟเจฒเจŸเจฐ เจฆเจพ เจตเจฟเจ•เจพเจธ เจ…เจคเฉ‡ เจธเจฅเจพเจชเจจเจพ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเจฟเจ–เจพเจˆ เจฆเจฟเฉฐเจฆเฉ€ เจนเฉˆ:

  1. เจธเจฐเฉ‹เจค เจ•เฉ‹เจก (เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ. kernel.c) เจตเจธเจคเฉ‚ เจจเฉ‚เฉฐ เจ•เฉฐเจชเจพเจ‡เจฒ เจ•เจฐเจฆเจพ เจนเฉˆ (kernel.o) eBPF เจตเจฐเจšเฉเจ…เจฒ เจฎเจธเจผเฉ€เจจ เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ เจฒเจˆเฅค เจ…เจ•เจคเฉ‚เจฌเจฐ 2019 เจคเฉฑเจ•, eBPF เจจเฉ‚เฉฐ เจ•เฉฐเจชเจพเจ‡เจฒ เจ•เจฐเจจเจพ Clang เจฆเฉเจ†เจฐเจพ เจธเจฎเจฐเจฅเจฟเจค เจนเฉˆ เจ…เจคเฉ‡ GCC 10.1 เจตเจฟเฉฑเจš เจตเจพเจ…เจฆเจพ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆเฅค
  2. เจœเฉ‡เจ•เจฐ เจ‡เจธ เจ†เจฌเจœเฉˆเจ•เจŸ เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจ•เจฐเจจเจฒ เจขเจพเจ‚เจšเฉ‡ (เจ‰เจฆเจพเจนเจฐเจฃ เจตเจœเฉ‹เจ‚, เจŸเฉ‡เจฌเจฒ เจ…เจคเฉ‡ เจ•เจพเจŠเจ‚เจŸเจฐเจพเจ‚ เจฒเจˆ) เจ•เจพเจฒเจพเจ‚ เจนเจจ, เจคเจพเจ‚ เจ‰เจนเจจเจพเจ‚ เจฆเฉ€ ID เจฆเฉ€ เจฌเจœเจพเจ เจœเจผเฉ€เจฐเฉ‹ เจนเจจ, เจฏเจพเจจเฉ€, เจ…เจœเจฟเจนเฉ‡ เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจšเจฒเจพเจ‡เจ† เจจเจนเฉ€เจ‚ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจฒเฉ‹เจก เจ•เจฐเจจ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚, เจ‡เจนเจจเจพเจ‚ เจœเจผเฉ€เจฐเฉ‹ เจจเฉ‚เฉฐ เจ•เจฐเจจเจฒ เจ•เจพเจฒเจพเจ‚ (เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจฒเจฟเฉฐเจ• เจ•เจฐเฉ‹) เจฆเฉเจ†เจฐเจพ เจฌเจฃเจพเจ เจ—เจ เจ–เจพเจธ เจ†เจฌเจœเฉˆเจ•เจŸ เจฆเฉ‡ ID เจจเจพเจฒ เจฌเจฆเจฒเจฟเจ† เจœเจพเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค เจคเฉเจธเฉ€เจ‚ เจ‡เจน เจฌเจพเจนเจฐเฉ€ เจ‰เจชเจฏเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจจเจพเจฒ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจœเจพเจ‚ เจคเฉเจธเฉ€เจ‚ เจ‡เฉฑเจ• เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฒเจฟเจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจœเฉ‹ เจ‡เฉฑเจ• เจ–เจพเจธ เจซเจฟเจฒเจŸเจฐ เจจเฉ‚เฉฐ เจฒเจฟเฉฐเจ• เจ…เจคเฉ‡ เจฒเฉ‹เจก เจ•เจฐเฉ‡เจ—เจพเฅค
  3. เจ•เจฐเจจเจฒ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฒเฉ‹เจก เจนเฉ‹เจฃ เจฆเฉ€ เจชเฉเจธเจผเจŸเฉ€ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจ‡เจน เจšเฉฑเจ•เจฐเจพเจ‚ เจฆเฉ€ เจ…เจฃเจนเฉ‹เจ‚เจฆ เจ…เจคเฉ‡ เจชเฉˆเจ•เฉ‡เจœ เจ…เจคเฉ‡ เจธเจŸเฉˆเจ• เจธเฉ€เจฎเจพเจตเจพเจ‚ เจคเฉ‹เจ‚ เจฌเจพเจนเจฐ เจจเจพ เจจเจฟเจ•เจฒเจฃ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจœเฉ‡เจ•เจฐ เจคเจธเจฆเฉ€เจ•เจ•เจฐเจคเจพ เจ‡เจน เจธเจพเจฌเจค เจจเจนเฉ€เจ‚ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆ เจ•เจฟ เจ•เฉ‹เจก เจธเจนเฉ€ เจนเฉˆ, เจคเจพเจ‚ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจ…เจธเจตเฉ€เจ•เจพเจฐ เจ•เจฐ เจฆเจฟเฉฑเจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ - เจ‡เฉฑเจ• เจจเฉ‚เฉฐ เจ‰เจธเจจเฉ‚เฉฐ เจ–เฉเจธเจผ เจ•เจฐเจจ เจฆเฉ‡ เจฏเฉ‹เจ— เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค
  4. เจธเจซเจฒ เจคเจธเจฆเฉ€เจ• เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจ•เจฐเจจเจฒ eBPF เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ เจ†เจฌเจœเฉˆเจ•เจŸ เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจธเจฟเจธเจŸเจฎ เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ เจฎเจธเจผเฉ€เจจ เจ•เฉ‹เจก (เจธเจฟเจฐเจซเจผ เจธเจฎเฉ‡เจ‚ เจตเจฟเฉฑเจš) เจตเจฟเฉฑเจš เจ•เฉฐเจชเจพเจ‡เจฒ เจ•เจฐเจฆเจพ เจนเฉˆเฅค
  5. เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจจเจพเจฒ เจœเฉเฉœเจฟเจ† เจนเฉ‹เจ‡เจ† เจนเฉˆ เจ…เจคเฉ‡ เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจ•เจฟเจ‰เจ‚เจ•เจฟ XDP เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจšเฉฑเจฒเจฆเจพ เจนเฉˆ, เจกเฉ€เจฌเฉฑเจ—เจฟเฉฐเจ— เจŸเจฐเฉ‡เจธ เจฒเฉŒเจ—เจธ เจฆเฉเจ†เจฐเจพ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ เจ…เจคเฉ‡, เจ…เจธเจฒ เจตเจฟเฉฑเจš, เจ‰เจนเจจเจพเจ‚ เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจฆเฉเจ†เจฐเจพ เจœเฉ‹ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจซเจฟเจฒเจŸเจฐ เจ•เจฐเจฆเจพ เจนเฉˆ เจœเจพเจ‚ เจคเจฟเจ†เจฐ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจนเจพเจฒเจพเจ‚เจ•เจฟ, eBPF เจกเจพเจ‰เจจเจฒเฉ‹เจก เจ•เฉ€เจคเฉ‡ เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจธเจฟเจธเจŸเจฎ เจฒเจˆ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจฐเฉฑเจ–เจฆเจพ เจนเฉˆ, เจคเจพเจ‚ เจœเฉ‹ เจคเฉเจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ เจธเจฅเจพเจจเจ• เจฒเฉ€เจจเจ•เจธ 'เจคเฉ‡ XDP เจจเจพเจฒ เจชเฉเจฐเจฏเฉ‹เจ— เจ•เจฐ เจธเจ•เฉ‹เฅค

เจตเจพเจคเจพเจตเจฐเจฃ เจฆเฉ€ เจคเจฟเจ†เจฐเฉ€

เจ…เจธเฉˆเจ‚เจฌเจฒเฉ€

Clang eBPF เจ†เจฐเจ•เฉ€เจŸเฉˆเจ•เจšเจฐ เจฒเจˆ เจธเจฟเฉฑเจงเฉ‡ เจคเฉŒเจฐ 'เจคเฉ‡ เจ†เจฌเจœเฉˆเจ•เจŸ เจ•เฉ‹เจก เจœเจพเจฐเฉ€ เจจเจนเฉ€เจ‚ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆ, เจ‡เจธเจฒเจˆ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจตเจฟเฉฑเจš เจฆเฉ‹ เจ•เจฆเจฎ เจนเจจ:

  1. เจธเฉ€ เจ•เฉ‹เจก เจจเฉ‚เฉฐ LLVM เจฌเจพเจˆเจŸเจ•เฉ‹เจก เจตเจฟเฉฑเจš เจ•เฉฐเจชเจพเจ‡เจฒ เจ•เจฐเฉ‹ (clang -emit-llvm).
  2. เจฌเจพเจˆเจŸเจ•เฉ‹เจก เจจเฉ‚เฉฐ eBPF เจ†เจฌเจœเฉˆเจ•เจŸ เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจฌเจฆเจฒเฉ‹ (llc -march=bpf -filetype=obj).

เจซเจฟเจฒเจŸเจฐ เจฒเจฟเจ–เจฃ เจตเฉ‡เจฒเฉ‡, เจธเจนเจพเจ‡เจ• เจซเฉฐเจ•เจธเจผเจจเจพเจ‚ เจ…เจคเฉ‡ เจฎเฉˆเจ•เจฐเฉ‹ เจตเจพเจฒเฉ€เจ†เจ‚ เจ•เฉเจ เจซเจพเจˆเจฒเจพเจ‚ เจ•เฉฐเจฎ เจ†เจ‰เจฃเจ—เฉ€เจ†เจ‚ เจ•เจฐเจจเจฒ เจŸเฉˆเจธเจŸเจพเจ‚ เจคเฉ‹เจ‚. เจ‡เจน เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจนเฉˆ เจ•เจฟ เจ‰เจน เจ•เจฐเจจเจฒ เจธเฉฐเจธเจ•เจฐเจฃ (KVER). เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจกเจพเจ‰เจจเจฒเฉ‹เจก เจ•เจฐเฉ‹ helpers/:

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

เจ†เจฐเจ• เจฒเฉ€เจจเจ•เจธ เจฒเจˆ เจฎเฉ‡เจ•เจซเจพเจˆเจฒ (เจ•เจฐเจจเจฒ 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 เจฆเฉ‡ เจจเจพเจฒ เจชเฉ‚เจฐเฉ€ เจฒเฉ€เจจเจ•เจธ เจกเจฟเจตเจพเจˆเจธเจพเจ‚ เจนเฉ‹เจฃเฉ€เจ†เจ‚ เจšเจพเจนเฉ€เจฆเฉ€เจ†เจ‚ เจนเจจเฅค

เจตเฉˆเจฅ (เจตเจฐเจšเฉเจ…เจฒ เจˆเจฅเจฐเจจเฉˆเฉฑเจŸ) เจตเจฐเจ—เฉ‡ เจฏเฉฐเจคเจฐ เจธเจพเจกเฉ‡ เจฒเจˆ เจขเฉเจ•เจตเฉ‡เจ‚ เจนเจจ: เจ‡เจน เจตเจฐเจšเฉเจ…เจฒ เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธเจพเจ‚ เจฆเจพ เจ‡เฉฑเจ• เจœเฉ‹เฉœเจพ เจนเจจ เจœเฉ‹ เจธเจฟเฉฑเจงเฉ‡ เจ‡เฉฑเจ• เจฆเฉ‚เจœเฉ‡ เจจเจพเจฒ "เจ•เจจเฉˆเจ•เจŸ" เจนเฉเฉฐเจฆเฉ‡ เจนเจจเฅค เจคเฉเจธเฉ€เจ‚ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฌเจฃเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹ (เจ‡เจธ เจญเจพเจ— เจตเจฟเฉฑเจš, เจธเจพเจฐเฉ€เจ†เจ‚ เจ•เจฎเจพเจ‚เจกเจพเจ‚ 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.

เจชเจฟเฉฐเจ— เจจเฉ‚เฉฐ เจนเฉเจฃ เจ‡เจธ เจตเจฟเฉฑเจš เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเฉ‡ เจธเฉฐเจฆเฉ‡เจธเจผ เจชเฉˆเจฆเจพ เจ•เจฐเจจเฉ‡ เจšเจพเจนเฉ€เจฆเฉ‡ เจนเจจ:

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

เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจตเฉˆเจฐเฉ€เจซเจพเจ‡เจฐ เจฆเฉ‡ เจ†เจ‰เจŸเจชเฉเฉฑเจŸ เจจเฉ‚เฉฐ เจจเฉ‡เฉœเจฟเจ“เจ‚ เจฆเฉ‡เจ–เจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจคเฉเจธเฉ€เจ‚ เจ…เจœเฉ€เจฌ เจ—เจฃเจจเจพเจตเจพเจ‚ เจฆเฉ‡เจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹:

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

เจคเฉฑเจฅ เจ‡เจน เจนเฉˆ เจ•เจฟ eBPF เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจพเจ‚ เจตเจฟเฉฑเจš เจกเฉ‡เจŸเจพ เจธเฉˆเจ•เจธเจผเจจ เจจเจนเฉ€เจ‚ เจนเฉเฉฐเจฆเจพ เจนเฉˆ, เจ‡เจธเจฒเจˆ เจซเจพเจฐเจฎเฉˆเจŸ เจธเจคเจฐ เจจเฉ‚เฉฐ เจเจจเจ•เฉ‹เจก เจ•เจฐเจจ เจฆเจพ เจ‡เฉฑเจ•เฉ‹ เจ‡เฉฑเจ• เจคเจฐเฉ€เจ•เจพ เจนเฉˆ VM เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจฆเฉ‡ เจคเฉเจฐเฉฐเจค เจ†เจฐเจ—เฉ‚เจฎเฉˆเจ‚เจŸเจธ:

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

เจ‡เจธ เจ•เจพเจฐเจจ เจ•เจฐเจ•เฉ‡, เจกเฉ€เจฌเฉฑเจ— เจ†เจ‰เจŸเจชเฉเฉฑเจŸ เจจเจคเฉ€เจœเฉ‡ เจตเจพเจฒเฉ‡ เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจฌเจนเฉเจค เจœเจผเจฟเจ†เจฆเจพ เจซเฉเฉฑเจฒ เจฆเจฟเฉฐเจฆเฉ€ เจนเฉˆเฅค

XDP เจชเฉˆเจ•เฉ‡เจŸ เจญเฉ‡เจœเฉ‡ เจœเจพ เจฐเจนเฉ‡ เจนเจจ

เจšเจฒเฉ‹ เจซเจฟเจฒเจŸเจฐ เจจเฉ‚เฉฐ เจฌเจฆเจฒเฉ€เจ: เจ‡เจธเจจเฉ‚เฉฐ เจธเจพเจฐเฉ‡ เจ†เจ‰เจฃ เจตเจพเจฒเฉ‡ เจชเฉˆเจ•เฉ‡เจŸ เจตเจพเจชเจธ เจญเฉ‡เจœเจฃ เจฆเจฟเจ“เฅค เจ‡เจน เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจฆเฉเจฐเจฟเจธเจผเจŸเฉ€เจ•เฉ‹เจฃ เจคเฉ‹เจ‚ เจ—เจฒเจค เจนเฉˆ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจธเจฟเจฐเจฒเฉ‡เจ–เจพเจ‚ เจตเจฟเฉฑเจš เจชเจคเจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจฌเจฆเจฒเจฃเจพ เจœเจผเจฐเฉ‚เจฐเฉ€ เจนเฉ‹เจตเฉ‡เจ—เจพ, เจชเจฐ เจนเฉเจฃ เจธเจฟเจงเจพเจ‚เจค เจตเจฟเฉฑเจš เจ•เฉฐเจฎ เจ•เจฐเจจเจพ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจนเฉˆเฅค

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

เจฒเจพเจ‚เจš เจ•เจฐเฉ‹ tcpdump 'เจคเฉ‡ 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 เจชเฉˆเจ•เฉ‡เจŸ เจจเจพเจฒ เจธเจฌเฉฐเจงเจค เจนเฉˆ เจœเฉ‹ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€? เจ†เจ–เจฐเจ•เจพเจฐ, เจ‡เฉฑเจ• เจนเจฎเจฒเจพเจตเจฐ เจœเจพเจ…เจฒเฉ€ ACKs เจตเฉ€ เจคเจฟเจ†เจฐ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆเฅค SYN เจ•เฉ‚เจ•เฉ€ เจฆเจพ เจธเจพเจฐ เจ‡เจจเจ•เฉ‹เจก เจ•เจฐเจจเจพ เจนเฉˆ seqnum เจ•เจจเฉˆเจ•เจธเจผเจจ เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐ เจชเจคเจฟเจ†เจ‚, เจชเฉ‹เจฐเจŸเจพเจ‚ เจ…เจคเฉ‡ เจฌเจฆเจฒเจฆเฉ‡ เจจเจฎเจ• เจฆเฉ‡ เจนเฉˆเจธเจผ เจตเจœเฉ‹เจ‚เฅค เจœเฉ‡เจ•เจฐ ACK เจฒเฉ‚เจฃ เจฌเจฆเจฒเจฃ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจชเจนเฉเฉฐเจšเจฃ เจตเจฟเฉฑเจš เจ•เจพเจฎเจฏเจพเจฌ เจนเฉ‹ เจ—เจฟเจ†, เจคเจพเจ‚ เจคเฉเจธเฉ€เจ‚ เจฆเฉเจฌเจพเจฐเจพ เจนเฉˆเจธเจผ เจฆเฉ€ เจ—เจฃเจจเจพ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ…เจคเฉ‡ เจ‡เจธ เจจเจพเจฒ เจคเฉเจฒเจจเจพ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ acknum. เจจเจ•เจฒเฉ€ acknum เจนเจฎเจฒเจพเจตเจฐ เจจเจนเฉ€เจ‚ เจ•เจฐ เจธเจ•เจฆเจพ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจฒเฉ‚เจฃ เจตเจฟเฉฑเจš เจฐเจพเจœเจผ เจธเจผเจพเจฎเจฒ เจนเฉเฉฐเจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจธเฉ€เจฎเจค เจšเฉˆเจจเจฒ เจฆเฉ‡ เจ•เจพเจฐเจจ เจ‡เจธ เจจเฉ‚เฉฐ เจ›เจพเจ‚เจŸเจฃ เจฒเจˆ เจธเจฎเจพเจ‚ เจจเจนเฉ€เจ‚ เจนเฉเฉฐเจฆเจพเฅค

SYN เจ•เฉ‚เจ•เฉ€เจœเจผ เจจเฉ‚เฉฐ เจฒเฉ€เจจเจ•เจธ เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจฒเฉฐเจฌเฉ‡ เจธเจฎเฉ‡เจ‚ เจคเฉ‹เจ‚ เจฒเจพเจ—เฉ‚ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ เจ…เจคเฉ‡ เจœเฉ‡เจ•เจฐ SYN เจฌเจนเฉเจค เจคเฉ‡เจœเจผเฉ€ เจจเจพเจฒ เจ…เจคเฉ‡ เจฌเจฒเจ• เจตเจฟเฉฑเจš เจ†เจ‰เจ‚เจฆเฉ‡ เจนเจจ เจคเจพเจ‚ เจ†เจชเจฃเฉ‡ เจ†เจช เจนเฉ€ เจธเจฎเจฐเฉฑเจฅ เจนเฉ‹ เจธเจ•เจฆเฉ‡ เจนเจจเฅค

TCP เจนเฉˆเจ‚เจกเจธเจผเฉ‡เจ• 'เจคเฉ‡ เจตเจฟเจฆเจฟเจ…เจ• เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ

TCP เจฌเจพเจˆเจŸเจพเจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจธเจŸเฉเจฐเฉ€เจฎ เจฆเฉ‡ เจคเฉŒเจฐ เจคเฉ‡ เจกเฉ‡เจŸเจพ เจฆเจพ เจคเจฌเจพเจฆเจฒเจพ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, HTTP เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ TCP เจฆเฉเจ†เจฐเจพ เจชเฉเจฐเจธเจพเจฐเจฟเจค เจ•เฉ€เจคเฉ€เจ†เจ‚ เจœเจพเจ‚เจฆเฉ€เจ†เจ‚ เจนเจจเฅค เจธเจŸเจฐเฉ€เจฎ เจจเฉ‚เฉฐ เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจตเจฟเฉฑเจš เจŸเฉเจ•เฉœเฉ‡-เจŸเฉเจ•เฉœเฉ‡ เจตเจฟเฉฑเจš เจชเฉเจฐเจธเจพเจฐเจฟเจค เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจธเจพเจฐเฉ‡ TCP เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจตเจฟเฉฑเจš เจฒเจพเจœเจผเฉ€เจ•เจฒ เจซเจฒเฉˆเจ— เจ…เจคเฉ‡ 32-เจฌเจฟเฉฑเจŸ เจ•เฉเจฐเจฎ เจจเฉฐเจฌเจฐ เจนเฉเฉฐเจฆเฉ‡ เจนเจจ:

  • เจเฉฐเจกเฉ‡ เจฆเจพ เจธเฉเจฎเฉ‡เจฒ เจ‡เฉฑเจ• เจ–เจพเจธ เจชเฉˆเจ•เฉ‡เจœ เจฆเฉ€ เจญเฉ‚เจฎเจฟเจ•เจพ เจจเฉ‚เฉฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เจฐเจฆเจพ เจนเฉˆเฅค SYN เจซเจฒเฉˆเจ— เจฆเจพ เจฎเจคเจฒเจฌ เจนเฉˆ เจ•เจฟ เจ‡เจน เจ•เจจเฉˆเจ•เจธเจผเจจ 'เจคเฉ‡ เจญเฉ‡เจœเจฃ เจตเจพเจฒเฉ‡ เจฆเจพ เจชเจนเจฟเจฒเจพ เจชเฉˆเจ•เฉ‡เจŸ เจนเฉˆเฅค ACK เจซเจฒเฉˆเจ— เจฆเจพ เจฎเจคเจฒเจฌ เจนเฉˆ เจ•เจฟ เจญเฉ‡เจœเจฃ เจตเจพเจฒเฉ‡ เจจเฉ‡ เจ‡เฉฑเจ• เจฌเจพเจˆเจŸ เจคเฉฑเจ• เจธเจพเจฐเจพ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจกเจพเจŸเจพ เจชเฉเจฐเจพเจชเจค เจ•เจฐ เจฒเจฟเจ† เจนเฉˆเฅค acknum. เจ‡เฉฑเจ• เจชเฉˆเจ•เฉ‡เจŸ เจตเจฟเฉฑเจš เจ•เจˆ เจเฉฐเจกเฉ‡ เจนเฉ‹ เจธเจ•เจฆเฉ‡ เจนเจจ เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจฆเฉ‡ เจธเฉเจฎเฉ‡เจฒ เจฆเฉ‡ เจฌเจพเจ…เจฆ เจจเจพเจฎ เจฆเจฟเฉฑเจคเจพ เจ—เจฟเจ† เจนเฉˆ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจ‡เฉฑเจ• SYNACK เจชเฉˆเจ•เฉ‡เจŸเฅค

  • เจ•เฉเจฐเจฎ เจจเฉฐเจฌเจฐ (เจธเฉ€เจ•เจจเฉเจฎ) เจ‡เจธ เจชเฉˆเจ•เฉ‡เจŸ เจตเจฟเฉฑเจš เจญเฉ‡เจœเฉ‡ เจ—เจ เจชเจนเจฟเจฒเฉ‡ เจฌเจพเจˆเจŸ เจฒเจˆ เจกเฉ‡เจŸเจพ เจธเจŸเฉเจฐเฉ€เจฎ เจตเจฟเฉฑเจš เจ†เจซเจธเฉˆเฉฑเจŸ เจจเฉ‚เฉฐ เจจเจฟเจธเจผเจšเจฟเจค เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจœเฉ‡เจ•เจฐ เจกเฉ‡เจŸเจพ เจฆเฉ‡ 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 เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจจเฉ‚เฉฐ เจฏเจพเจฆ เจจเจพ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ, เจธเจฐเจตเจฐ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจ‡เจนเจจเจพเจ‚ เจตเจฟเจ•เจฒเจชเจพเจ‚ เจจเฉ‚เฉฐ เจจเจœเจผเจฐเจ…เฉฐเจฆเจพเจœเจผ เจ•เจฐเจฆเจพ เจนเฉˆ, เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเฉ‡ เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจตเจฟเฉฑเจš เจ•เจฒเจพเจ‡เฉฐเจŸ เจนเฉเจฃ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจจเจนเฉ€เจ‚ เจญเฉ‡เจœเฉ‡เจ—เจพเฅค TCP เจ‡เจธ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš เจ•เฉฐเจฎ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆ, เจชเจฐ เจ˜เฉฑเจŸเฉ‹ เจ˜เฉฑเจŸ เจธเจผเฉเจฐเฉ‚เจ†เจคเฉ€ เจชเฉœเจพเจ… 'เจคเฉ‡, เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจฆเฉ€ เจ—เฉเจฃเจตเฉฑเจคเจพ เจ˜เฉฑเจŸ เจœเจพเจตเฉ‡เจ—เฉ€.

เจชเฉˆเจ•เฉ‡เจœเจพเจ‚ เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš, เจ‡เฉฑเจ• XDP เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจ‡เจน เจ•เจฐเจจเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ:

  • เจ•เฉ‚เจ•เฉ€ เจฆเฉ‡ เจจเจพเจฒ SYNACK เจจเจพเจฒ SYN เจฆเจพ เจœเจตเจพเจฌ;
  • ACK เจฆเจพ RST เจจเจพเจฒ เจœเจตเจพเจฌ เจฆเจฟเจ“ (เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจคเฉ‹เฉœเฉ‹);
  • เจนเฉ‹เจฐ เจชเฉˆเจ•เฉ‡เจŸ เจธเฉเฉฑเจŸเฉ‹.

เจชเฉˆเจ•เฉ‡เจŸ เจชเจพเจฐเจธเจฟเฉฐเจ— เจฆเฉ‡ เจจเจพเจฒ เจเจฒเจ—เฉ‹เจฐเจฟเจฆเจฎ เจฆเจพ เจธเฉ‚เจกเฉ‹-เจ•เฉ‹เจก:

ะ•ัะปะธ ัั‚ะพ ะฝะต 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, เจฎเฉˆเจจเฉ‚เฉฐ เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ€เจ†เจ‚ เจชเจฐเจฟเจญเจพเจธเจผเจพเจตเจพเจ‚ เจฆเฉ€ เจจเจ•เจฒ เจ•เจฐเจจเฉ€ เจชเจˆเฅค

เจธเจพเจฐเฉ‡ เจซเฉฐเจ•เจธเจผเจจ เจœเฉ‹ เจชเฉœเฉเจนเจจเจฏเฉ‹เจ—เจคเจพ เจฒเจˆ C เจตเจฟเฉฑเจš เจตเฉฑเจ–เจฐเฉ‡ เจนเจจ, เจ•เจพเจฒ เจธเจพเจˆเจŸ 'เจคเฉ‡ เจ‡เจจเจฒเจพเจˆเจจ เจนเฉ‹เจฃเฉ‡ เจšเจพเจนเฉ€เจฆเฉ‡ เจนเจจ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš eBPF เจตเฉˆเจฐเฉ€เจซเจพเจ‡เจฐ เจฌเฉˆเจ• เจœเฉฐเจช, เจฏเจพเจจเฉ€ เจ…เจธเจฒ เจตเจฟเฉฑเจš, เจฒเฉ‚เจชเจธ เจ…เจคเฉ‡ เจซเฉฐเจ•เจธเจผเจจ เจ•เจพเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจฎเจจเฉเจนเจพ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

#define INTERNAL static __attribute__((always_inline))

เจฎเฉˆเจ•เจฐเฉ‹ LOG() เจฐเฉ€เจฒเฉ€เจœเจผ เจฌเจฟเจฒเจก เจตเจฟเฉฑเจš เจชเฉเจฐเจฟเฉฐเจŸเจฟเฉฐเจ— เจจเฉ‚เฉฐ เจ…เจฏเฉ‹เจ— เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจซเฉฐเจ•เจธเจผเจจเจพเจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจนเฉˆเฅค เจนเจฐเฉ‡เจ• เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจชเฉˆเจ•เฉ‡เจŸ เจชเฉเจฐเจพเจชเจค เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจœเจฟเจธ เจตเจฟเฉฑเจš เจธเฉฐเจฌเฉฐเจงเจฟเจค เจชเฉฑเจงเจฐ เจฆเจพ เจธเจฟเจฐเจฒเฉ‡เจ– เจ‰เจœเจพเจ—เจฐ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, process_ether() เจญเจฐเจจ เจฆเฉ€ เจ‰เจกเฉ€เจ• เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆ ether. เจซเฉ€เจฒเจก เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจฆเฉ‡ เจจเจคเฉ€เจœเจฟเจ†เจ‚ เจฆเฉ‡ เจ†เจงเจพเจฐ 'เจคเฉ‡, เจซเฉฐเจ•เจธเจผเจจ เจชเฉˆเจ•เฉ‡เจŸ เจจเฉ‚เฉฐ เจ‰เฉฑเจš เจชเฉฑเจงเจฐ 'เจคเฉ‡ เจŸเฉเจฐเจพเจ‚เจธเจซเจฐ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจซเฉฐเจ•เจธเจผเจจ เจฆเจพ เจจเจคเฉ€เจœเจพ เจ‡เฉฑเจ• XDP เจเจ•เจธเจผเจจ เจนเฉˆเฅค เจœเจฆเฉ‹เจ‚ เจ•เจฟ SYN เจ…เจคเฉ‡ ACK เจนเฉˆเจ‚เจกเจฒเจฐ เจธเจพเจฐเฉ‡ เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจจเฉ‚เฉฐ เจฒเฉฐเจ˜เจฃ เจฆเจฟเฉฐเจฆเฉ‡ เจนเจจเฅค

struct Packet {
    struct xdp_md* ctx;

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

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

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

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

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

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

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

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

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

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

เจฎเฉˆเจ‚ A เจ…เจคเฉ‡ B เจฎเจพเจฐเจ• เจ•เฉ€เจคเฉ‡ เจšเฉˆเจ•เจพเจ‚ เจตเฉฑเจฒ เจงเจฟเจ†เจจ เจ–เจฟเฉฑเจšเจฆเจพ เจนเจพเจ‚เฅค เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ A เจฆเฉ€ เจŸเจฟเฉฑเจชเจฃเฉ€ เจ•เจฐเจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจฌเจฃ เจœเจพเจตเฉ‡เจ—เจพ, เจชเจฐ เจฒเฉ‹เจก เจ•เจฐเจจ เจตเฉ‡เจฒเฉ‡ เจ‡เฉฑเจ• เจชเฉเจธเจผเจŸเฉ€เจ•เจฐเจจ เจ—เจฒเจคเฉ€ เจนเฉ‹เจตเฉ‡เจ—เฉ€:

Verifier analysis:

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

Error fetching program/map!

เจ•เฉเฉฐเจœเฉ€ เจธเจคเจฐ invalid access to packet, off=13 size=1, R7(id=0,off=0,r=0): เจ‡เฉฑเจฅเฉ‡ เจเจ—เจœเจผเฉ€เจ•เจฟเจŠเจธเจผเจจ เจฎเจพเจฐเจ— เจนเฉเฉฐเจฆเฉ‡ เจนเจจ เจœเจฆเฉ‹เจ‚ เจฌเจซเจฐ เจฆเฉ€ เจธเจผเฉเจฐเฉ‚เจ†เจค เจคเฉ‹เจ‚ เจคเฉ‡เจฐเฉเจนเจตเจพเจ‚ เจฌเจพเจˆเจŸ เจชเฉˆเจ•เฉ‡เจŸ เจฆเฉ‡ เจฌเจพเจนเจฐ เจนเฉเฉฐเจฆเจพ เจนเฉˆเฅค เจธเฉ‚เจšเฉ€ เจคเฉ‹เจ‚ เจ‡เจน เจฆเฉฑเจธเจฃเจพ เจ”เจ–เจพ เจนเฉˆ เจ•เจฟ เจ…เจธเฉ€เจ‚ เจ•เจฟเจธ เจฒเจพเจˆเจจ เจฌเจพเจฐเฉ‡ เจ—เฉฑเจฒ เจ•เจฐ เจฐเจนเฉ‡ เจนเจพเจ‚, เจชเจฐ เจ‡เฉฑเจฅเฉ‡ เจ‡เฉฑเจ• เจนเจฆเจพเจ‡เจค เจจเฉฐเจฌเจฐ (12) เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจกเจฟเจธเจธเฉˆเจ‚เจฌเจฒเจฐ เจนเฉˆ เจœเฉ‹ เจธเจฐเฉ‹เจค เจ•เฉ‹เจก เจฆเฉ€เจ†เจ‚ เจฒเจพเจˆเจจเจพเจ‚ เจจเฉ‚เฉฐ เจฆเจฐเจธเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ:

llvm-objdump -S xdp_filter.o | less

เจ‡เจธ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš, เจ‡เจน เจฒเจพเจˆเจจ เจตเฉฑเจฒ เจ‡เจธเจผเจพเจฐเจพ เจ•เจฐเจฆเจพ เจนเฉˆ

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

เจœเฉ‹ เจ‡เจน เจธเจชเฉฑเจธเจผเจŸ เจ•เจฐเจฆเจพ เจนเฉˆ เจ•เจฟ เจธเจฎเฉฑเจธเจฟเจ† เจนเฉˆ ether. เจ‡เจน เจนเจฎเฉ‡เจธเจผเจพ เจ…เจœเจฟเจนเจพ เจนเฉ€ เจนเฉ‹เจตเฉ‡เจ—เจพเฅค

SYN เจจเฉ‚เฉฐ เจœเจตเจพเจฌ เจฆเจฟเจ“

เจ‡เจธ เจชเฉœเจพเจ… 'เจคเฉ‡ เจŸเฉ€เจšเจพ เจ‡เฉฑเจ• เจธเจฅเจฟเจฐ เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจธเจนเฉ€ SYNACK เจชเฉˆเจ•เฉ‡เจŸ เจคเจฟเจ†เจฐ เจ•เจฐเจจเจพ เจนเฉˆ seqnum, เจœเฉ‹ เจญเจตเจฟเฉฑเจ– เจตเจฟเฉฑเจš SYN เจ•เฉ‚เจ•เฉ€ เจฆเฉเจ†เจฐเจพ เจฌเจฆเจฒเจฟเจ† เจœเจพเจตเฉ‡เจ—เจพเฅค เจตเจฟเฉฑเจš เจธเจพเจฐเฉ€เจ†เจ‚ เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจนเฉเฉฐเจฆเฉ€เจ†เจ‚ เจนเจจ process_tcp_syn() เจ…เจคเฉ‡ เจ†เจฒเฉ‡ เจฆเฉเจ†เจฒเฉ‡.

เจชเฉˆเจ•เฉ‡เจœ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เฉ€เจคเฉ€ เจœเจพ เจฐเจนเฉ€ เจนเฉˆ

เจ…เจœเฉ€เจฌ เจคเฉŒเจฐ 'เจคเฉ‡, เจ‡เฉฑเจฅเฉ‡ เจธเจญ เจคเฉ‹เจ‚ เจ•เจฎเจพเจฒ เจฆเฉ€ เจฒเจพเจˆเจจ เจนเฉˆ, เจœเจพเจ‚ เจ‡เจธ เจฆเฉ€ เจฌเจœเจพเจ, เจ‡เจธ เจฒเจˆ เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€:

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

เจ•เฉ‹เจก เจฆเฉ‡ เจชเจนเจฟเจฒเฉ‡ เจธเฉฐเจธเจ•เจฐเจฃ เจจเฉ‚เฉฐ เจฒเจฟเจ–เจฃ เจตเฉ‡เจฒเฉ‡, 5.1 เจ•เจฐเจจเจฒ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เฉ€เจคเฉ€ เจ—เจˆ เจธเฉ€, เจœเจฟเจธ เจฆเฉ‡ เจคเจธเจฆเฉ€เจ• เจ•เจฐเจจ เจตเจพเจฒเฉ‡ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจ…เฉฐเจคเจฐ เจธเฉ€ data_end ะธ (const void*)ctx->data_end. เจฒเจฟเจ–เจฃ เจฆเฉ‡ เจธเจฎเฉ‡เจ‚, 5.3.1 เจ•เจฐเจจเจฒ เจตเจฟเฉฑเจš เจ‡เจน เจธเจฎเฉฑเจธเจฟเจ† เจจเจนเฉ€เจ‚ เจธเฉ€เฅค เจธเจผเจพเจ‡เจฆ เจ•เฉฐเจชเจพเจˆเจฒเจฐ เจ‡เฉฑเจ• เจ–เฉ‡เจคเจฐ เจจเจพเจฒเฉ‹เจ‚ เจตเฉฑเจ–เจฐเฉ‡ เจคเฉŒเจฐ 'เจคเฉ‡ เจ‡เฉฑเจ• เจธเจฅเจพเจจเจ• เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจ•เจฐ เจฐเจฟเจนเจพ เจธเฉ€เฅค เจจเฉˆเจคเจฟเจ• - เจ‡เฉฑเจ• เจตเฉฑเจกเฉ‡ เจ†เจฒเฉเจนเจฃเฉ‡ 'เจคเฉ‡, เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจธเจฐเจฒ เจฌเจฃเจพเจ‰เจฃเจพ เจฎเจฆเจฆ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆ.

เจคเจธเจฆเฉ€เจ• เจ•เจฐเจจ เจตเจพเจฒเฉ‡ เจฆเฉ€ เจฎเจนเจฟเจฎเจพ เจฒเจˆ เจฒเฉฐเจฌเจพเจˆ เจฆเฉ€ เจนเฉ‹เจฐ เจฐเฉเจŸเฉ€เจจ เจœเจพเจ‚เจš; เจ“ MAX_CSUM_BYTES เจนเฉ‡เจ เจพเจ‚.

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

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

เจชเฉˆเจ•เฉ‡เจœ เจซเฉˆเจฒเจพเจ“

เจ…เจธเฉ€เจ‚ เจญเจฐเจฆเฉ‡ เจนเจพเจ‚ seqnum ะธ acknum, ACK เจธเฉˆเฉฑเจŸ เจ•เจฐเฉ‹ (SYN เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจธเฉˆเฉฑเจŸ เจนเฉˆ):

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

TCP เจชเฉ‹เจฐเจŸเจพเจ‚, IP เจ…เจคเฉ‡ MAC เจเจกเจฐเฉˆเฉฑเจธ เจจเฉ‚เฉฐ เจธเจตเฉˆเจช เจ•เจฐเฉ‹เฅค เจธเจŸเฉˆเจ‚เจกเจฐเจก เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ XDP เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจคเฉ‹เจ‚ เจ‰เจชเจฒเจฌเจง เจจเจนเฉ€เจ‚ เจนเฉˆ, เจ‡เจธ เจฒเจˆ memcpy() - เจ‡เฉฑเจ• เจฎเฉˆเจ•เจฐเฉ‹ เจœเฉ‹ เจ•เจฒเฉˆเจ‚เจ— เจ…เฉฐเจฆเจฐเฉ‚เจจเฉ€ เจจเฉ‚เฉฐ เจฒเฉเจ•เจพเจ‰เจ‚เจฆเจพ เจนเฉˆเฅค

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

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

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

เจšเฉˆเจ•เจธเจฎ เจฎเฉเฉœ เจ—เจฃเจจเจพ

IPv4 เจ…เจคเฉ‡ TCP เจšเฉˆเจ•เจธเจฎ เจฒเจˆ เจธเจฟเจฐเจฒเฉ‡เจ–เจพเจ‚ เจตเจฟเฉฑเจš เจธเจพเจฐเฉ‡ 16-เจฌเจฟเฉฑเจŸ เจธเจผเจฌเจฆเจพเจ‚ เจจเฉ‚เฉฐ เจœเฉ‹เฉœเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ, เจ…เจคเฉ‡ เจธเจฟเจฐเจฒเฉ‡เจ–เจพเจ‚ เจฆเจพ เจ†เจ•เจพเจฐ เจ‰เจนเจจเจพเจ‚ เจตเจฟเฉฑเจš เจฒเจฟเจ–เจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจฏเจพเจจเฉ€ เจธเฉฐเจ•เจฒเจจ เจฆเฉ‡ เจธเจฎเฉ‡เจ‚ เจ…เจฃเจœเจพเจฃ เจนเฉเฉฐเจฆเจพ เจนเฉˆเฅค เจ‡เจน เจ‡เฉฑเจ• เจธเจฎเฉฑเจธเจฟเจ† เจนเฉˆ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจคเจธเจฆเฉ€เจ• เจ•เจฐเจจ เจตเจพเจฒเจพ เจธเฉ€เจฎเจพ เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจคเฉฑเจ• เจธเจงเจพเจฐเจจ เจฒเฉ‚เจช เจจเฉ‚เฉฐ เจจเจนเฉ€เจ‚ เจ›เฉฑเจกเฉ‡เจ—เจพเฅค เจชเจฐ เจธเจฟเจฐเจฒเฉ‡เจ–เจพเจ‚ เจฆเจพ เจ†เจ•เจพเจฐ เจธเฉ€เจฎเจค เจนเฉˆ: เจนเจฐเฉ‡เจ• 64 เจฌเจพเจˆเจŸ เจคเฉฑเจ•เฅค เจคเฉเจธเฉ€เจ‚ เจ‡เฉฑเจ• เจจเจฟเจธเจผเจšเจฟเจค เจธเฉฐเจ–เจฟเจ† เจฆเฉ‡ เจฆเฉเจนเจฐเจพเจ“ เจจเจพเจฒ เจ‡เฉฑเจ• เจฒเฉ‚เจช เจฌเจฃเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจœเฉ‹ เจœเจฒเจฆเฉ€ เจ–เจคเจฎ เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆเฅค

เจฎเฉˆเจ‚ เจจเฉ‹เจŸ เจ•เจฐเจฆเจพ เจนเจพเจ‚ เจ•เจฟ เจ‰เฉฑเจฅเฉ‡ เจนเฉˆ RFC 1624 เจœเฉ‡เจ•เจฐ เจธเจฟเจฐเจซเจผ เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจฆเฉ‡ เจจเจฟเจธเจผเจšเจฟเจค เจธเจผเจฌเจฆ เจฌเจฆเจฒเฉ‡ เจœเจพเจฃ เจคเจพเจ‚ เจ…เฉฐเจธเจผเจ• เจคเฉŒเจฐ 'เจคเฉ‡ เจšเฉˆเฉฑเจ•เจธเจฎ เจฆเฉ€ เจฎเฉเฉœ เจ—เจฃเจจเจพ เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉ€เจคเฉ€ เจœเจพเจตเฉ‡เฅค เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจตเจฟเจงเฉ€ เจธเจฐเจต เจตเจฟเจ†เจชเจ• เจจเจนเฉ€เจ‚ เจนเฉˆ, เจ…เจคเฉ‡ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ เจฌเจฐเจ•เจฐเจพเจฐ เจฐเฉฑเจ–เจฃเจพ เจตเจงเฉ‡เจฐเฉ‡ เจฎเฉเจธเจผเจ•เจฒ เจนเฉ‹เจตเฉ‡เจ—เจพเฅค

เจšเฉˆเฉฑเจ•เจธเจฎ เจ—เจฃเจจเจพ เจซเฉฐเจ•เจธเจผเจจ:

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

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

เจนเจพเจฒเจพเจ‚เจ•เจฟ size เจ•เจพเจฒเจฟเฉฐเจ— เจ•เฉ‹เจก เจฆเฉเจ†เจฐเจพ เจœเจพเจ‚เจš เจ•เฉ€เจคเฉ€ เจ—เจˆ, เจฆเฉ‚เจœเฉ€ เจเจ—เจœเจผเจฟเจŸ เจธเจผเจฐเจค เจœเจผเจฐเฉ‚เจฐเฉ€ เจนเฉˆ เจคเจพเจ‚ เจœเฉ‹ เจตเฉˆเจฐเฉ€เจซเจพเจ‡เจฐ เจฒเฉ‚เจช เจฆเฉ‡ เจ…เฉฐเจค เจจเฉ‚เฉฐ เจธเจพเจฌเจค เจ•เจฐ เจธเจ•เฉ‡เฅค

32-เจฌเจฟเฉฑเจŸ เจธเจผเจฌเจฆเจพเจ‚ เจฒเจˆ, เจ‡เฉฑเจ• เจธเจฐเจฒ เจธเฉฐเจธเจ•เจฐเจฃ เจฒเจพเจ—เฉ‚ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ:

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

เจ…เจธเจฒ เจตเจฟเฉฑเจš เจšเฉˆเฉฑเจ•เจธเจฎเจพเจ‚ เจฆเฉ€ เจฎเฉเฉœ เจ—เจฃเจจเจพ เจ•เจฐเจจเจพ เจ…เจคเฉ‡ เจชเฉˆเจ•เฉ‡เจŸ เจจเฉ‚เฉฐ เจตเจพเจชเจธ เจญเฉ‡เจœเจฃเจพ:

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

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

return XDP_TX;

เจซเฉฐเจ•เจธเจผเจจ carry() 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 เจฆเฉ‡ เจฆเฉเจฐเจฟเจธเจผเจŸเฉ€เจ•เฉ‹เจฃ เจคเฉ‹เจ‚, เจšเฉˆเฉฑเจ• เจ†เจชเจฃเฉ‡ เจ†เจช เจตเจฟเฉฑเจš เจฎเจพเจฎเฉ‚เจฒเฉ€ เจนเฉˆ. เจ—เจฃเจจเจพ เจเจฒเจ—เฉ‹เจฐเจฟเจฆเจฎ เจฎเฉเฉฑเจขเจฒเจพ เจนเฉˆ เจ…เจคเฉ‡ เจธเฉฐเจญเจพเจตเจค เจคเฉŒเจฐ 'เจคเฉ‡ เจ‡เฉฑเจ• เจธเฉ‚เจเจตเจพเจจ เจนเจฎเจฒเจพเจตเจฐ เจฒเจˆ เจ•เจฎเจœเจผเฉ‹เจฐ เจนเฉˆเฅค เจฒเฉ€เจจเจ•เจธ เจ•เจฐเจจเจฒ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจ•เฉเจฐเจฟเจชเจŸเฉ‹เจ—เฉเจฐเจพเจซเจฟเจ• SipHash เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเจพ เจนเฉˆ, เจชเจฐ XDP เจฒเจˆ เจ‡เจธเจฆเจพ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ เจธเจชเจธเจผเจŸ เจคเฉŒเจฐ 'เจคเฉ‡ เจ‡เจธ เจฒเฉ‡เจ– เจฆเฉ‡ เจฆเจพเจ‡เจฐเฉ‡ เจคเฉ‹เจ‚ เจฌเจพเจนเจฐ เจนเฉˆเฅค

เจฌเจพเจนเจฐเฉ€ เจชเจฐเจธเจชเจฐ เจชเฉเจฐเจญเจพเจต เจจเจพเจฒ เจธเจฌเฉฐเจงเจค เจจเจตเฉ‡เจ‚ TODOs เจฒเจˆ เจชเฉเจฐเจ—เจŸ เจนเฉ‹เจ‡เจ†:

  • XDP เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจธเจŸเฉ‹เจฐ เจจเจนเฉ€เจ‚ เจ•เจฐ เจธเจ•เจฆเจพ cookie_seed (เจฒเฉ‚เจฃ เจฆเจพ เจ—เฉเจชเจค เจนเจฟเฉฑเจธเจพ) เจ‡เฉฑเจ• เจ—เจฒเฉ‹เจฌเจฒ เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจตเจฟเฉฑเจš, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจ•เจฐเจจเจฒ เจธเจŸเฉ‹เจฐ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ เจœเจฟเจธเจฆเจพ เจฎเฉเฉฑเจฒ เจธเจฎเฉ‡เจ‚-เจธเจฎเฉ‡เจ‚ เจคเฉ‡ เจ‡เฉฑเจ• เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— เจœเจจเจฐเฉ‡เจŸเจฐ เจคเฉ‹เจ‚ เจ…เจชเจกเฉ‡เจŸ เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพเฅค

  • เจœเฉ‡เจ•เจฐ ACK เจชเฉˆเจ•เฉ‡เจŸ เจตเจฟเฉฑเจš SYN เจ•เฉ‚เจ•เฉ€ เจฎเฉ‡เจฒ เจ–เจพเจ‚เจฆเฉ€ เจนเฉˆ, เจคเจพเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจธเฉเจจเฉ‡เจนเจพ เจชเฉเจฐเจฟเฉฐเจŸ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจชเจฐ เจ‡เจธ เจคเฉ‹เจ‚ เจชเฉˆเจ•เฉ‡เจŸ เจจเฉ‚เฉฐ เจ›เฉฑเจกเจฃ เจฒเจˆ เจชเฉเจฐเจฎเจพเจฃเจฟเจค เจ•เจฒเจพเจ‡เฉฐเจŸ เจฆเจพ IP เจฏเจพเจฆ เจฐเฉฑเจ–เฉ‹เฅค

เจ‡เฉฑเจ• เจœเจพเจ‡เจœเจผ เจ—เจพเจนเจ• เจฆเฉเจ†เจฐเจพ เจชเฉเจฐเจฎเจพเจฃเจฟเจ•เจคเจพ:

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

เจฒเจพเจ—เจพเจ‚ เจจเฉ‡ เจšเฉˆเฉฑเจ• เจฆเฉ‡ เจฌเฉ€เจคเจฃ เจจเฉ‚เฉฐ เจฐเจฟเจ•เจพเจฐเจก เจ•เฉ€เจคเจพ (flags=0x2 SYN เจนเฉˆ flags=0x10 ACK เจนเฉˆ):

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

เจœเจฆเฉ‹เจ‚ เจคเฉฑเจ• เจชเฉเจฐเจฎเจพเจฃเจฟเจค IP เจฆเฉ€ เจ•เฉ‹เจˆ เจธเฉ‚เจšเฉ€ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจ‰เจฆเฉ‹เจ‚ เจคเฉฑเจ• SYN เจนเฉœเฉเจน เจฆเฉ‡ เจตเจฟเจฐเฉเฉฑเจง เจ•เฉ‹เจˆ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจจเจนเฉ€เจ‚ เจนเฉ‹เจตเฉ‡เจ—เฉ€, เจชเจฐ เจ‡เฉฑเจฅเฉ‡ เจ‡เจธ เจ•เจฎเจพเจ‚เจก เจฆเฉเจ†เจฐเจพ เจฒเจพเจ‚เจš เจ•เฉ€เจคเฉ‡ เจ—เจ ACK เจนเฉœเฉเจน เจฆเฉ€ เจชเฉเจฐเจคเฉ€เจ•เฉเจฐเจฟเจ† เจนเฉˆ:

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

เจฒเฉŒเจ— เจเจ‚เจŸเจฐเฉ€เจ†เจ‚:

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

เจธเจฟเฉฑเจŸเจพ

เจ•เจˆ เจตเจพเจฐ เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡ eBPF เจ…เจคเฉ‡ เจ–เจพเจธ เจคเฉŒเจฐ 'เจคเฉ‡ XDP เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจตเจฟเจ•เจพเจธ เจชเจฒเฉ‡เจŸเจซเจพเจฐเจฎ เจฆเฉ€ เจฌเจœเจพเจ เจ‡เฉฑเจ• เจ‰เฉฑเจจเจค เจชเฉเจฐเจธเจผเจพเจธเจ• เจฆเฉ‡ เจธเจพเจงเจจ เจตเจœเฉ‹เจ‚ เจชเฉ‡เจธเจผ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจฆเจฐเจ…เจธเจฒ, XDP เจ•เจฐเจจเจฒ เจชเฉˆเจ•เฉ‡เจŸ เจชเฉเจฐเฉ‹เจธเฉˆเจธเจฟเฉฐเจ— เจตเจฟเฉฑเจš เจฆเจ–เจฒ เจฆเฉ‡เจฃ เจฒเจˆ เจ‡เฉฑเจ• เจŸเฉ‚เจฒ เจนเฉˆ, เจจเจพ เจ•เจฟ เจ•เจฐเจจเจฒ เจธเจŸเฉˆเจ• เจฆเจพ เจตเจฟเจ•เจฒเจช, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ DPDK เจ…เจคเฉ‡ เจนเฉ‹เจฐ เจ•เจฐเจจเจฒ เจฌเจพเจˆเจชเจพเจธ เจตเจฟเจ•เจฒเจชเฅค เจฆเฉ‚เจœเฉ‡ เจชเจพเจธเฉ‡, XDP เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจคเจฐเจ• เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ, เจœเฉ‹ เจ•เจฟ, เจ‡เจธ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจŸเฉเจฐเฉˆเจซเจฟเจ• เจชเฉเจฐเฉ‹เจธเฉˆเจธเจฟเฉฐเจ— เจตเจฟเฉฑเจš เจตเจฟเจฐเจพเจฎ เจฆเฉ‡ เจฌเจฟเจจเจพเจ‚ เจ…เจชเจกเฉ‡เจŸ เจ•เจฐเจจเจพ เจ†เจธเจพเจจ เจนเฉˆ. เจตเฉˆเจฐเฉ€เจซเจพเจ‡เจฐ เจตเฉฑเจกเฉ€เจ†เจ‚ เจธเจฎเฉฑเจธเจฟเจ†เจตเจพเจ‚ เจชเฉˆเจฆเจพ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเจพ เจนเฉˆ, เจจเจฟเฉฑเจœเฉ€ เจคเฉŒเจฐ 'เจคเฉ‡ เจฎเฉˆเจ‚ เจฏเฉ‚เจœเจผเจฐเจธเจชเฉ‡เจธ เจ•เฉ‹เจก เจฆเฉ‡ เจ•เฉเจ เจนเจฟเฉฑเจธเจฟเจ†เจ‚ เจฒเจˆ เจ‡เจธ เจคเฉ‹เจ‚ เจ‡เจจเจ•เจพเจฐ เจจเจนเฉ€เจ‚ เจ•เจฐเจพเจ‚เจ—เจพเฅค

เจฆเฉ‚เจœเฉ‡ เจญเจพเจ— เจตเจฟเฉฑเจš, เจœเฉ‡เจ•เจฐ เจตเจฟเจธเจผเจพ เจฆเจฟเจฒเจšเจธเจช เจนเฉˆ, เจคเจพเจ‚ เจ…เจธเฉ€เจ‚ เจชเฉเจฐเจฎเจพเจฃเจฟเจค เจ—เจพเจนเจ•เจพเจ‚ เจฆเฉ€ เจธเจพเจฐเจฃเฉ€ เจจเฉ‚เฉฐ เจชเฉ‚เจฐเจพ เจ•เจฐเจพเจ‚เจ—เฉ‡ เจ…เจคเฉ‡ เจ•เจจเฉˆเจ•เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจคเฉ‹เฉœเจพเจ‚เจ—เฉ‡, เจ•เจพเจŠเจ‚เจŸเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจพเจ‚เจ—เฉ‡ เจ…เจคเฉ‡ เจซเจฟเจฒเจŸเจฐ เจฆเจพ เจชเฉเจฐเจฌเฉฐเจงเจจ เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจฏเฉ‚เจœเจผเจฐเจธเจชเฉ‡เจธ เจ‰เจชเจฏเฉ‹เจ—เจคเจพ เจฒเจฟเจ–เจพเจ‚เจ—เฉ‡เฅค

เจฒเจฟเฉฐเจ•:

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹