เช…เชฎเซ‡ XDP เชชเชฐ DDoS เชนเซเชฎเชฒเชพเช“ เชธเชพเชฎเซ‡ เชฐเช•เซเชทเชฃ เชฒเช–เซ€เช เช›เซ€เช. เชชเชฐเชฎเชพเชฃเซ เชญเชพเช—

eXpress เชกเซ‡เชŸเชพ เชชเชพเชฅ (XDP) เชŸเซ‡เช•เซเชจเซ‹เชฒเซ‹เชœเซ€ เชชเซ‡เช•เซ‡เชŸเซ‹ เช•เชฐเซเชจเชฒ เชจเซ‡เชŸเชตเชฐเซเช• เชธเซเชŸเซ‡เช•เชฎเชพเช‚ เชฆเชพเช–เชฒ เชฅเชพเชฏ เชคเซ‡ เชชเชนเซ‡เชฒเชพเช‚ Linux เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เชชเชฐ เชŸเซเชฐเชพเชซเชฟเช•เชจเซ€ เชฎเชจเชธเซเชตเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเซ‡ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡. 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 เชฎเชพเช‚ เช•เชฎเซเชชเชพเช‡เชฒ เช•เชฐเชตเชพเชจเซเช‚ เช•เซเชฒเซ‡เช‚เช— เชฆเซเชตเชพเชฐเชพ เชธเชฎเชฐเซเชฅเชฟเชค เช›เซ‡ เช…เชจเซ‡ GCC 10.1 เชฎเชพเช‚ เชตเชšเชจ เช†เชชเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เช›เซ‡.
  2. เชœเซ‹ เช† เช‘เชฌเซเชœเซ‡เช•เซเชŸ เช•เซ‹เชกเชฎเชพเช‚ เช•เชฐเซเชจเชฒ เชธเซเชŸเซเชฐเช•เซเชšเชฐเซเชธ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช•เซ‹เชทเซเชŸเช•เซ‹ เช…เชจเซ‡ เช•เชพเช‰เชจเซเชŸเชฐเซเชธ เชชเชฐ) เช•เซ‰เชฒเซเชธ เช›เซ‡, เชคเซ‹ เชคเซ‡เชฎเชจเชพ ID เชจเซ‡ เชฌเชฆเชฒเซ‡ เชถเซ‚เชจเซเชฏ เช›เซ‡, เชเชŸเชฒเซ‡ เช•เซ‡, เช†เชตเชพ เช•เซ‹เชกเชจเซ‡ เชเช•เซเชเชฟเช•เซเชฏเซเชŸ เช•เชฐเซ€ เชถเช•เชพเชคเซ‹ เชจเชฅเซ€. เช•เชฐเซเชจเชฒเชฎเชพเช‚ เชฒเซ‹เชก เช•เชฐเชคเชพ เชชเชนเซ‡เชฒเชพ, เช† เชถเซ‚เชจเซเชฏเชจเซ‡ เช•เชฐเซเชจเชฒ เช•เซ‰เชฒเซเชธ (เช•เซ‹เชกเชจเซ‡ เชฒเชฟเช‚เช• เช•เชฐเซ‹) เชฆเซเชตเชพเชฐเชพ เชฌเชจเชพเชตเซ‡เชฒ เชšเซ‹เช•เซเช•เชธ เช‘เชฌเซเชœเซ‡เช•เซเชŸเชจเชพ IDs เชธเชพเชฅเซ‡ เชฌเชฆเชฒเชตเซเช‚ เช†เชตเชถเซเชฏเช• เช›เซ‡. เชคเชฎเซ‡ เชฌเชพเชนเซเชฏ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“ เชธเชพเชฅเซ‡ เช† เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹, เช…เชฅเชตเชพ เชคเชฎเซ‡ เชเช• เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฒเช–เซ€ เชถเช•เซ‹ เช›เซ‹ เชœเซ‡ เชšเซ‹เช•เซเช•เชธ เชซเชฟเชฒเซเชŸเชฐเชจเซ‡ เชฒเชฟเช‚เช• เช•เชฐเชถเซ‡ เช…เชจเซ‡ เชฒเซ‹เชก เช•เชฐเชถเซ‡.
  3. เช•เชฐเซเชจเชฒ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฒเซ‹เชก เชฅเชˆ เชฐเชนเซเชฏเซ‹ เช›เซ‡ เชคเซ‡เชจเซ€ เชšเช•เชพเชธเชฃเซ€ เช•เชฐเซ‡ เช›เซ‡. เชคเซ‡ เชšเช•เซเชฐเชจเซ€ เช—เซ‡เชฐเชนเชพเชœเชฐเซ€ เช…เชจเซ‡ เชชเซ‡เช•เซ‡เชœ เช…เชจเซ‡ เชธเซเชŸเซ‡เช• เชฌเชพเช‰เชจเซเชกเซเชฐเซ€เชฎเชพเช‚เชฅเซ€ เชฌเชนเชพเชฐ เชจ เชจเซ€เช•เชณเชตเชพ เชฎเชพเชŸเซ‡ เชคเชชเชพเชธ เช•เชฐเซ‡ เช›เซ‡. เชœเซ‹ เชšเช•เชพเชธเชฃเซ€เช•เชฐเซเชคเชพ เชธเชพเชฌเชฟเชค เช•เชฐเซ€ เชถเช•เชคเซ‹ เชจเชฅเซ€ เช•เซ‡ เช•เซ‹เชก เชธเชพเชšเซ‹ เช›เซ‡, เชคเซ‹ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชจเช•เชพเชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ - เชตเซเชฏเช•เซเชคเชฟเช เชคเซ‡เชจเซ‡ เช–เซเชถ เช•เชฐเชตเชพ เชธเช•เซเชทเชฎ เชนเซ‹เชตเชพ เชœเซ‹เชˆเช.
  4. เชธเชซเชณ เชšเช•เชพเชธเชฃเซ€ เชชเช›เซ€, เช•เชฐเซเชจเชฒ eBPF เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐ เช‘เชฌเซเชœเซ‡เช•เซเชŸ เช•เซ‹เชกเชจเซ‡ เชธเชฟเชธเซเชŸเชฎ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐ เชฎเชถเซ€เชจ เช•เซ‹เชกเชฎเชพเช‚ เช•เชฎเซเชชเชพเช‡เชฒ เช•เชฐเซ‡ เช›เซ‡ (เชนเชฎเชฃเชพเช‚-เชธเชฎเชฏเชฎเชพเช‚).
  5. เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เชธเชพเชฅเซ‡ เชœเซ‹เชกเชพเชฏเซ‡เชฒ เช›เซ‡ เช…เชจเซ‡ เชชเซ‡เช•เซ‡เชŸเซ‹ เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซ‡ เช›เซ‡.

XDP เช•เชฐเซเชจเชฒเชฎเชพเช‚ เชšเชพเชฒเชคเซเช‚ เชนเซ‹เชตเชพเชฅเซ€, เชกเชฟเชฌเช—เซ€เช‚เช— เชŸเซเชฐเซ‡เชธ เชฒเซ‹เช— เชชเชฐ เช†เชงเชพเชฐเชฟเชค เช›เซ‡ เช…เชจเซ‡ เชนเช•เซ€เช•เชคเชฎเชพเช‚, เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชซเชฟเชฒเซเชŸเชฐ เช•เชฐเซ‡ เช›เซ‡ เช…เชฅเชตเชพ เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡ เชชเซ‡เช•เซ‡เชŸเซ‹ เชชเชฐ. เชœเซ‹ เช•เซ‡, eBPF เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเซ‡เชฒ เช•เซ‹เชกเชจเซ‡ เชธเชฟเชธเซเชŸเชฎ เชฎเชพเชŸเซ‡ เชธเซเชฐเช•เซเชทเชฟเชค เชฐเชพเช–เซ‡ เช›เซ‡, เชœเซ‡เชฅเซ€ เชคเชฎเซ‡ เชคเชฎเชพเชฐเชพ เชธเซเชฅเชพเชจเชฟเช• Linux เชชเชฐ เชœ XDP เชธเชพเชฅเซ‡ เชชเซเชฐเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‹.

เชชเชฐเซเชฏเชพเชตเชฐเชฃเชจเซ€ เชคเซˆเชฏเชพเชฐเซ€

เชตเชฟเชงเชพเชจเชธเชญเชพ

เชฐเชฃเช•เชพเชฐ 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 เชธเชพเชฅเซ‡ เชธเช‚เชชเซ‚เชฐเซเชฃ Linux เช‰เชชเช•เชฐเชฃเซ‹ เชนเซ‹เชตเชพ เชœเซ‹เชˆเช.

เชตเซ‡เชฅ (เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชˆเชฅเชฐเชจเซ‡เชŸ) เชœเซ‡เชตเชพ เช‰เชชเช•เชฐเชฃเซ‹ เช†เชชเชฃเชพ เชฎเชพเชŸเซ‡ เชฏเซ‹เช—เซเชฏ เช›เซ‡: เชคเซ‡ เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชจเซ‡เชŸเชตเชฐเซเช• เชˆเชจเซเชŸเชฐเชซเซ‡เชธเชจเซ€ เชœเซ‹เชกเซ€ เช›เซ‡ เชœเซ‡ เชเช•เชฌเซ€เชœเชพ เชธเชพเชฅเซ‡ เชธเซ€เชงเชพ เชœ "เชœเซ‹เชกเชพเชฏเซ‡เชฒ" เช›เซ‡. เชคเชฎเซ‡ เชคเซ‡เชฎเชจเซ‡ เช† เชฐเซ€เชคเซ‡ เชฌเชจเชพเชตเซ€ เชถเช•เซ‹ เช›เซ‹ (เช† เชตเชฟเชญเชพเช—เชฎเชพเช‚, เชฌเชงเชพ เช†เชฆเซ‡เชถเซ‹ ip เชฅเซ€ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ root):

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

เชคเซ‡ xdp-remote ะธ xdp-local - เช‰เชชเช•เชฐเชฃ เชจเชพเชฎเซ‹. เชšเชพเชฒเซ xdp-local (192.0.2.1/24) เชธเชพเชฅเซ‡ เชซเชฟเชฒเซเชŸเชฐ เชœเซ‹เชกเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ xdp-remote (192.0.2.2/24) เช‡เชจเช•เชฎเชฟเช‚เช— เชŸเซเชฐเชพเชซเชฟเช• เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡. เชœเซ‹ เช•เซ‡, เชคเซเชฏเชพเช‚ เชเช• เชธเชฎเชธเซเชฏเชพ เช›เซ‡: เช‡เชจเซเชŸเชฐเชซเซ‡เชธเซ‹ เชเช• เชœ เชฎเชถเซ€เชจ เชชเชฐ เช›เซ‡, เช…เชจเซ‡ Linux เชคเซ‡เชฎเชพเช‚เชฅเซ€ เชเช•เชจเซ‡ เชฌเซ€เชœเชพ เชฆเซเชตเชพเชฐเชพ เชŸเซเชฐเชพเชซเชฟเช• เชฎเซ‹เช•เชฒเชถเซ‡ เชจเชนเซ€เช‚. เชคเชฎเซ‡ เชคเซ‡เชจเซ‡ เชฎเซเชถเซเช•เซ‡เชฒ เชจเชฟเชฏเชฎเซ‹ เชฆเซเชตเชพเชฐเชพ เชนเชฒ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ iptables, เชชเชฐเช‚เชคเซ เชคเซ‡เช“เช เชชเซ‡เช•เซ‡เชœเซ‹ เชฌเชฆเชฒเชตเชพ เชชเชกเชถเซ‡, เชœเซ‡ เชกเชฟเชฌเช—เซ€เช‚เช— เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เช…เชธเซเชตเชฟเชงเชพเชœเชจเช• เช›เซ‡. เชจเซ‡เชŸเชตเชฐเซเช• เชจเซ‡เชฎเชธเซเชชเซ‡เชธ (เชจเซ‡เชŸเชตเชฐเซเช• เชจเซ‡เชฎเชธเซเชชเซ‡เชธ, เช†เช—เชณ เชจเซ‡เชŸเชจเซเชธ) เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹ เชตเชงเซ เชธเชพเชฐเซเช‚ เช›เซ‡.

เชจเซ‡เชŸเชตเชฐเซเช• เชจเซ‡เชฎเชธเซเชชเซ‡เชธเชฎเชพเช‚ เชˆเชจเซเชŸเชฐเชซเซ‡เชธ, เชฐเซ‚เชŸเซ€เช‚เช— เช•เซ‹เชทเซเชŸเช•เซ‹ เช…เชจเซ‡ เชจเซ‡เชŸเชซเชฟเชฒเซเชŸเชฐ เชจเชฟเชฏเชฎเซ‹เชจเซ‹ เชธเชฎเซ‚เชน เชนเซ‹เชฏ เช›เซ‡ เชœเซ‡ เช…เชจเซเชฏ เชจเซ‡เชŸเชจเซเชธเชฎเชพเช‚ เชธเชฎเชพเชจ เช“เชฌเซเชœเซ‡เช•เซเชŸเชฅเซ€ เช…เชฒเช— เชนเซ‹เชฏ เช›เซ‡. เชฆเชฐเซ‡เช• เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช…เชฎเซเช• เชจเซ‡เชฎเชธเซเชชเซ‡เชธเชฎเชพเช‚ เชšเชพเชฒเซ‡ เช›เซ‡, เช…เชจเซ‡ เชฎเชพเชคเซเชฐ เช† เชจเซ‡เชŸเชจเซเชธเชจเชพ เช‘เชฌเซเชœเซ‡เช•เซเชŸเซเชธ เชœ เชคเซ‡เชจเซ‡ เช‰เชชเชฒเชฌเซเชง เช›เซ‡. เชกเชฟเชซเซ‰เชฒเซเชŸ เชฐเซ‚เชชเซ‡, เชธเชฟเชธเซเชŸเชฎเชฎเชพเช‚ เชคเชฎเชพเชฎ เช‘เชฌเซเชœเซ‡เช•เซเชŸเซเชธ เชฎเชพเชŸเซ‡ เชเช• เชœ เชจเซ‡เชŸเชตเชฐเซเช• เชจเซ‡เชฎเชธเซเชชเซ‡เชธ เช›เซ‡, เชœเซ‡เชฅเซ€ เชคเชฎเซ‡ Linux เชชเชฐ เช•เชพเชฎ เช•เชฐเซ€ เชถเช•เซ‹ เช…เชจเซ‡ netns เชตเชฟเชถเซ‡ เชœเชพเชฃเชคเชพ เชจเชฅเซ€.

เชšเชพเชฒเซ‹ เชเช• เชจเชตเซเช‚ เชจเซ‡เชฎเชธเซเชชเซ‡เชธ เชฌเชจเชพเชตเซ€เช xdp-test เช…เชจเซ‡ เชคเซเชฏเชพเช‚ เช–เชธเซ‡เชกเซ‹ xdp-remote.

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

เชชเช›เซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชšเชพเชฒเซ€ เชฐเชนเซ€ เช›เซ‡ xdp-test, "เชœเซ‹เชถเซ‡ เชจเชนเซ€เช‚" xdp-local (เชคเซ‡ เชกเชฟเชซเซ‹เชฒเซเชŸ เชฐเซ‚เชชเซ‡ เชจเซ‡เชŸเชจเซเชธเชฎเชพเช‚ เชฐเชนเซ‡เชถเซ‡) เช…เชจเซ‡ เชœเซเชฏเชพเชฐเซ‡ 192.0.2.1 เชชเชฐ เชชเซ‡เช•เซ‡เชŸ เชฎเซ‹เช•เชฒเซ‹ เชคเซเชฏเชพเชฐเซ‡ เชคเซ‡ เชชเชธเชพเชฐ เชฅเชถเซ‡ xdp-remote, เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡ เช† เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชฎเชพเชŸเซ‡ เช‰เชชเชฒเชฌเซเชง 192.0.2.0/24 เชชเชฐ เชเช•เชฎเชพเชคเซเชฐ เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เช›เซ‡. เช† เชตเชฟเชชเชฐเซ€เชค เชฐเซ€เชคเซ‡ เชชเชฃ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡.

เชœเซเชฏเชพเชฐเซ‡ เชจเซ‡เชŸเชจเซเชธ เชตเชšเซเชšเซ‡ เชซเชฐเซ‡ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เชˆเชจเซเชŸเชฐเชซเซ‡เชธ เชจเซ€เชšเซ‡ เชœเชพเชฏ เช›เซ‡ เช…เชจเซ‡ เชธเชฐเชจเชพเชฎเซเช‚ เช—เซเชฎเชพเชตเซ‡ เช›เซ‡. 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 เช•เซ‚เช•เซ€เชเชจเซ‡ Linux เช•เชฐเซเชจเชฒเชฎเชพเช‚ เชฒเชพเช‚เชฌเชพ เชธเชฎเชฏเชฅเซ€ เชฒเชพเช—เซ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡ เช…เชจเซ‡ เชœเซ‹ 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. เช•เซเชฒเชพเชฏเช‚เชŸ SYNACK เชจเซ‡ ACK เชชเซ‡เช•เซ‡เชŸ เชธเชพเชฅเซ‡ เชœเชตเชพเชฌ เช†เชชเซ‡ เช›เซ‡, เชœเซเชฏเชพเช‚ 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 เชฌเชพเช‡เชŸเซเชธ เชธเซเชงเซ€. เชคเชฎเซ‡ เชจเชฟเชถเซเชšเชฟเชค เชธเช‚เช–เซเชฏเชพเชฎเชพเช‚ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชจเซ‹ เชธเชพเชฅเซ‡ เชฒเซ‚เชช เชฌเชจเชพเชตเซ€ เชถเช•เซ‹ เช›เซ‹, เชœเซ‡ เชตเชนเซ‡เชฒเชพ เชธเชฎเชพเชชเซเชค เชฅเชˆ เชถเช•เซ‡ เช›เซ‡.

เชนเซเช‚ เชจเซ‹เช‚เชงเซเช‚ เช›เซเช‚ เช•เซ‡ เชคเซเชฏเชพเช‚ เช›เซ‡ เช†เชฐเชเชซเชธเซ€ 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 เชจเซ‡ เช›เซ‹เชกเซ€เชจเซ‡, เชœเซ‡เชจเชพ เชฎเชพเชŸเซ‡ Linux เช RST เชชเซ‡เช•เซ‡เชŸ เชธเชพเชฅเซ‡ เชชเซเชฐเชคเชฟเชธเชพเชฆ เช†เชชเซเชฏเซ‹, เช•เชพเชฐเชฃ เช•เซ‡ เชจเซ‡เชŸเชตเชฐเซเช• เชธเซเชŸเซ‡เช•เชจเซ‡ SYN เชชเซเชฐเชพเชชเซเชค เชฅเชฏเซเช‚ เชจ เชนเชคเซเช‚ - เชคเซ‡เชจเซ‡ SYNACK เชฎเชพเช‚ เชฐเซ‚เชชเชพเช‚เชคเชฐเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชนเชคเซเช‚ เช…เชจเซ‡ เชชเชพเช›เซเช‚ เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชนเชคเซเช‚ - เช…เชจเซ‡ OS เชจเชพ เชฆเซƒเชทเซเชŸเชฟเช•เซ‹เชฃเชฅเซ€, เชเช• เชชเซ‡เช•เซ‡เชŸ เช†เชตเซเชฏเซเช‚ เชœเซ‡ เชจ เชนเชคเซเช‚. เช–เซเชฒเซเชฒเชพ เชœเซ‹เชกเชพเชฃเซ‹เชฅเซ€ เชธเช‚เชฌเช‚เชงเชฟเชค.

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

เชธเช‚เชชเซ‚เชฐเซเชฃ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชธเชพเชฅเซ‡ เชคเชชเชพเชธ เช•เชฐเชตเซ€ เช…เชจเซ‡ เช…เชตเชฒเซ‹เช•เชจ เช•เชฐเชตเซเช‚ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เช›เซ‡ tcpdump เชชเชฐ xdp-remote เช•เชพเชฐเชฃ เช•เซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, hping3 เช–เซ‹เชŸเชพ เชšเซ‡เช•เชธเชฎเชจเซ‹ เชœเชตเชพเชฌ เช†เชชเชคเซ‹ เชจเชฅเซ€.

XDP เชจเชพ เชฆเซƒเชทเซเชŸเชฟเช•เซ‹เชฃเชฅเซ€, เชšเซ‡เช• เชชเซ‹เชคเซ‡ เชœ เชคเซเชšเซเช› เช›เซ‡. เช—เชฃเชคเชฐเซ€ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎ เช†เชฆเชฟเชฎ เช›เซ‡ เช…เชจเซ‡ เชธเช‚เชญเชตเชคเชƒ เช…เชคเซเชฏเชพเชงเซเชจเชฟเช• เชนเซเชฎเชฒเชพเช–เซ‹เชฐ เชฎเชพเชŸเซ‡ เชธเช‚เชตเซ‡เชฆเชจเชถเซ€เชฒ เช›เซ‡. Linux เช•เชฐเซเชจเชฒ, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช•เซเชฐเชฟเชชเซเชŸเซ‹เช—เซเชฐเชพเชซเชฟเช• SipHash เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ XDP เชฎเชพเชŸเซ‡ เชคเซ‡เชจเซ‹ เช…เชฎเชฒ เชธเซเชชเชทเซเชŸเชชเชฃเซ‡ เช† เชฒเซ‡เช–เชจเชพ เช…เชตเช•เชพเชถเชจเซ€ เชฌเชนเชพเชฐ เช›เซ‡.

เชฌเชพเชนเซเชฏ เช•เซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพเชฅเซ€ เชธเช‚เชฌเช‚เชงเชฟเชค เชจเชตเชพ TODO เชฎเชพเชŸเซ‡ เชฆเซ‡เช–เชพเชฏเชพ:

  • XDP เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชธเซเชŸเซ‹เชฐ เช•เชฐเซ€ เชถเช•เชพเชคเซ‹ เชจเชฅเซ€ cookie_seed (เชฎเซ€เช เชพเชจเซ‹ เช—เซเชชเซเชค เชญเชพเช—) เชตเซˆเชถเซเชตเชฟเช• เชšเชฒเชฎเชพเช‚, เชคเชฎเชพเชฐเซ‡ เช•เชฐเซเชจเชฒ เชธเซเชŸเซ‹เชฐเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เชœเซ‡เชจเซเช‚ เชฎเซ‚เชฒเซเชฏ เชธเชฎเชฏเชพเช‚เชคเชฐเซ‡ เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ เชœเชจเชฐเซ‡เชŸเชฐเชฅเซ€ เช…เชชเชกเซ‡เชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡.

  • เชœเซ‹ ACK เชชเซ‡เช•เซ‡เชŸเชฎเชพเช‚เชจเซ€ SYN เช•เซ‚เช•เซ€ เชฎเซ‡เชณ เช–เชพเชคเซ€ เชนเซ‹เชฏ, เชคเซ‹ เชคเชฎเชพเชฐเซ‡ เชธเช‚เชฆเซ‡เชถ เช›เชพเชชเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เชคเซ‡เชฎเชพเช‚เชฅเซ€ เชชเซ‡เช•เซ‡เชŸเซ‹เชจเซ‡ เชตเชงเซ เช›เซ‹เชกเชตเชพ เชฎเชพเชŸเซ‡ เชšเช•เชพเชธเชพเชฏเซ‡เชฒ เช•เซเชฒเชพเชฏเชจเซเชŸเชจเซ‹ IP เชฏเชพเชฆ เชฐเชพเช–เซ‹.

เช•เชพเชฏเชฆเซ‡เชธเชฐ เช—เซเชฐเชพเชนเช• เชฆเซเชตเชพเชฐเชพ เชฎเชพเชจเซเชฏเชคเชพ:

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

เชฒเซ‹เช—เชฎเชพเช‚ เชšเซ‡เช• เชชเชธเชพเชฐ เชฅเชฏเชพเชจเซ€ เชจเซ‹เช‚เชง เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€ (flags=0x2 SYN เช›เซ‡, flags=0x10 ACK เช›เซ‡):

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

เชœเซเชฏเชพเช‚ เชธเซเชงเซ€ เชšเช•เชพเชธเชพเชฏเซ‡เชฒ IP เชจเซ€ เช•เซ‹เชˆ เชธเซ‚เชšเชฟ เชจเชฅเซ€, เชคเซเชฏเชพเช‚ เชธเซเชงเซ€ SYN เชชเซ‚เชฐ เชธเชพเชฎเซ‡ เช•เซ‹เชˆ เชฐเช•เซเชทเชฃ เชจเชนเซ€เช‚ เชนเซ‹เชฏ, เชชเชฐเช‚เชคเซ เช† เช†เชฆเซ‡เชถ เชฆเซเชตเชพเชฐเชพ เชถเชฐเซ‚ เช•เชฐเชพเชฏเซ‡เชฒ ACK เชชเซ‚เชฐเชจเซ€ เชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เช…เชนเซ€เช‚ เช›เซ‡:

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

เชฒเซ‹เช— เชเชจเซเชŸเซเชฐเซ€เช“:

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

เชจเชฟเชทเซเช•เชฐเซเชท

เช•เซ‡เชŸเชฒเซ€เช•เชตเชพเชฐ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ eBPF เช…เชจเซ‡ เช–เชพเชธ เช•เชฐเซ€เชจเซ‡ XDP เชจเซ‡ เชกเซ‡เชตเชฒเชชเชฎเซ‡เชจเซเชŸ เชชเซเชฒเซ‡เชŸเชซเซ‹เชฐเซเชฎ เช•เชฐเชคเชพเช‚ เช…เชฆเซเชฏเชคเชจ เชเชกเชฎเชฟเชจเชฟเชธเซเชŸเซเชฐเซ‡เชŸเชฐเชจเชพ เชธเชพเชงเชจ เชคเชฐเซ€เช•เซ‡ เชฐเชœเซ‚ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เช–เชฐเซ‡เช–เชฐ, XDP เช เช•เชฐเซเชจเชฒ เชชเซ‡เช•เซ‡เชŸ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชฎเชพเช‚ เชฆเช–เชฒ เช•เชฐเชตเชพเชจเซเช‚ เชธเชพเชงเชจ เช›เซ‡, เช…เชจเซ‡ เช•เชฐเซเชจเชฒ เชธเซเชŸเซ‡เช•เชจเซ‹ เชตเชฟเช•เชฒเซเชช เชจเชฅเซ€, เชœเซ‡เชฎ เช•เซ‡ DPDK เช…เชจเซ‡ เช…เชจเซเชฏ เช•เชฐเซเชจเชฒ เชฌเชพเชฏเชชเชพเชธ เชตเชฟเช•เชฒเซเชชเซ‹. เชฌเซ€เชœเซ€ เชฌเชพเชœเซ, XDP เชคเชฎเชจเซ‡ เชœเชŸเชฟเชฒ เชคเชฐเซเช•เชจเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡, เชœเซ‡ เชตเชงเซเชฎเชพเช‚, เชŸเซเชฐเชพเชซเชฟเช• เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชฎเชพเช‚ เชตเชฟเชฐเชพเชฎ เชตเชฟเชจเชพ เช…เชชเชกเซ‡เชŸ เช•เชฐเชตเชพเชจเซเช‚ เชธเชฐเชณ เช›เซ‡. เชตเซ‡เชฐเชฟเชซเชพเชฏเชฐ เชฎเซ‹เชŸเซ€ เชธเชฎเชธเซเชฏเชพเช“ เช‰เชญเซ€ เช•เชฐเชคเซเช‚ เชจเชฅเซ€, เชตเซเชฏเช•เซเชคเชฟเช—เชค เชฐเซ€เชคเซ‡ เชนเซเช‚ เชฏเซเชเชฐเชธเซเชชเซ‡เชธ เช•เซ‹เชกเชจเชพ เชญเชพเช—เซ‹ เชฎเชพเชŸเซ‡ เช†เชจเซ‹ เช‡เชจเช•เชพเชฐ เช•เชฐเซ€เชถ เชจเชนเซ€เช‚.

เชฌเซ€เชœเชพ เชญเชพเช—เชฎเชพเช‚, เชœเซ‹ เชตเชฟเชทเชฏ เชฐเชธเชชเซเชฐเชฆ เช›เซ‡, เชคเซ‹ เช…เชฎเซ‡ เชšเช•เชพเชธเชพเชฏเซ‡เชฒ เช•เซเชฒเชพเชฏเชจเซเชŸเซเชธเชจเซเช‚ เช•เซ‹เชทเซเชŸเช• เชชเซ‚เชฐเซเชฃ เช•เชฐเซ€เชถเซเช‚ เช…เชจเซ‡ เชœเซ‹เชกเชพเชฃเซ‹ เชคเซ‹เชกเซ€เชถเซเช‚, เช•เชพเช‰เชจเซเชŸเชฐเซเชธ เชฒเชพเช—เซ เช•เชฐเซ€เชถเซเช‚ เช…เชจเซ‡ เชซเชฟเชฒเซเชŸเชฐเชจเซ‡ เชธเช‚เชšเชพเชฒเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฏเซเชเชฐเชธเซเชชเซ‡เชธ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพ เชฒเช–เซ€เชถเซเช‚.

เชธเช‚เชฆเชฐเซเชญเซ‹:

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹