eXpress Data Path (XDP) เดเตเดเตเดจเตเดณเดเดฟ, เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เดเตเตผเดฃเตฝ เดจเตเดฑเตเดฑเตโเดตเตผเดเตเดเต เดธเตเดฑเตเดฑเดพเดเตเดเดฟเตฝ เดชเตเดฐเดตเตเดถเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต เดฎเตเดฎเตเดชเต เดฒเดฟเดจเดเตเดธเต เดเตปเตเดฑเตผเดซเตเดธเตเดเดณเดฟเตฝ เดฑเดพเตปเดกเด เดเตเดฐเดพเดซเดฟเดเต เดชเตเดฐเตเดธเดธเตเดธเดฟเดเดเต เดจเดเดคเตเดคเดพเตป เด เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจเต. XDP-เดฏเตเดเต เดชเตเดฐเดฏเตเดเด - DDoS เดเดเตเดฐเดฎเดฃเดเตเดเดณเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดธเดเดฐเดเตเดทเดฃเด (CloudFlare), เดธเดเตเดเตเตผเดฃเตเดฃเดฎเดพเดฏ เดซเดฟเตฝเดเตเดเดฑเตเดเตพ, เดธเตเดฅเดฟเดคเดฟเดตเดฟเดตเดฐเดเตเดเดฃเดเตเดเต เดถเตเดเดฐเดฃเด (Netflix). XDP เดชเตเดฐเตเดเตเดฐเดพเดฎเตเดเตพ eBPF เดตเตเตผเดเตเดตเตฝ เดฎเตเดทเตเดจเดพเดฃเต เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตเดจเตเดจเดคเต, เด เดคเดฟเดจเดพเตฝ เด เดตเดฏเตเดเตเดเต เด เดตเดฏเตเดเต เดเตเดกเดฟเดฒเตเด เดฒเดญเตเดฏเดฎเดพเดฏ เดเตเตผเดฃเตฝ เดซเดเดเตเดทเดจเตเดเดณเดฟเดฒเตเด เดซเดฟเตฝเดเตเดเตผ เดคเดฐเด เด เดจเตเดธเดฐเดฟเดเตเดเต เดจเดฟเดฏเดจเตเดคเตเดฐเดฃเดเตเดเดณเตเดฃเตเดเต.
XDP-เดฏเดฟเดฒเต เดจเดฟเดฐเดตเดงเดฟ เดฎเตเดฑเตเดฑเตเดฐเดฟเดฏเดฒเตเดเดณเตเดเต เดชเตเดฐเดพเดฏเตเดฎเดเตพ เดจเดฟเดเดคเตเดคเดพเตป เดเดฆเตเดฆเตเดถเดฟเดเตเดเตเดณเตเดณเดคเดพเดฃเต เดฒเตเดเดจเด. เดเดจเตเดจเดพเดฎเดคเดพเดฏเดฟ, เด เดตเตผ XDP-เดฏเตเดเต เดธเดตเดฟเดถเตเดทเดคเดเดณเต เดเดเดจเดเดฟ เดฎเดฑเดฟเดเดเดเตเดเตเดจเตเดจ เดฑเตเดกเดฟเดฎเตเดฏเตเดกเต เดเตเดกเต เดจเตฝเดเตเดจเตเดจเต: เดเดคเต เดธเตเดฅเดฟเดฐเตเดเดฐเดฃเดคเตเดคเดฟเดจเดพเดฏเดฟ เดคเดฏเตเดฏเดพเดฑเดพเดเตเดเดฟเดฏเดคเดพเดฃเต เด เดฒเตเดฒเตเดเตเดเดฟเตฝ เดชเตเดฐเดถเตเดจเดเตเดเตพ เดเดฃเตเดเดพเดเตเดเดพเตป เดตเดณเดฐเต เดฒเดณเดฟเดคเดฎเดพเดฃเต. เดจเดฟเดเตเดเตพ เดเดฆเตเดฏเด เดฎเตเดคเตฝ เดจเดฟเดเตเดเดณเตเดเต เดเตเดกเต เดเดดเตเดคเดพเตป เดถเตเดฐเดฎเดฟเดเตเดเตเดฎเตเดชเตเตพ, เดธเดพเดงเดพเดฐเดฃ เดชเดฟเดถเดเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเต เดเดจเตเดคเตเดเตเดฏเตเดฏเดฃเดฎเตเดจเตเดจเต เดจเดฟเดเตเดเตพเดเตเดเดฑเดฟเดฏเดฟเดฒเตเดฒ. เดฐเดฃเตเดเดพเดฎเดคเดพเดฏเดฟ, เดตเดฟเดเดฎเตเดฎเตเด เดนเดพเตผเดกเตโเดตเตเดฏเดฑเตเด เดเดฒเตเดฒเดพเดคเต เดเดเตโเดธเตโเดกเดฟเดชเดฟ เดชเตเดฐเดพเดฆเตเดถเดฟเดเดฎเดพเดฏเดฟ เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดตเดดเดฟเดเตพ เด เดตเดฏเตโเดเตเดเต เด เดตเดฐเตเดเตเดคเดพเดฏ เดชเตเดฐเดพเดฏเตเดฎเดเดณเตเดฃเตเดเตเดเตเดเดฟเดฒเตเด เดชเดฐเดฟเดฐเดเตเดทเดฟเดเตเดเดชเตเดชเตเดเตเดจเตเดจเดฟเดฒเตเดฒ. XDP, eBPF เดเดจเตเดจเดฟเดตเดฏเดฟเตฝ เดคเดพเตฝเดชเตเดชเดฐเตเดฏเดฎเตเดณเตเดณ เดจเตเดฑเตเดฑเตโเดตเตผเดเตเดเดฟเดเดเตเด เดฒเดฟเดจเดเตเดธเตเด เดชเดฐเดฟเดเดฏเดฎเตเดณเตเดณ เดชเตเดฐเตเดเตเดฐเดพเดฎเตผเดฎเดพเตผเดเตเดเต เดตเตเดฃเตเดเดฟเดฏเตเดณเตเดณเดคเดพเดฃเต เดเตเดเตเดธเตเดฑเตเดฑเต.
เด เดญเดพเดเดคเตเดคเต, XDP เดซเดฟเตฝเดเตเดเตผ เดเดเตเดเดจเต เดเตเดเตเดเดฟเดเตเดเตเตผเดเตเดเดชเตเดชเตเดเตเดจเตเดจเตเดตเตเดจเตเดจเตเด เด
เดคเต เดเดเตเดเดจเต เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเดพเดฎเตเดจเตเดจเตเด เดเดเตเดเตพ เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เดฎเดจเดธเตเดธเดฟเดฒเดพเดเตเดเตเด, เดคเตเดเตผเดจเตเดจเต เดชเดพเดเตเดเดฑเตเดฑเต เดชเตเดฐเตเดธเดธเตเดธเดฟเดเดเต เดคเดฒเดคเตเดคเดฟเตฝ เด
เดฑเดฟเดฏเดชเตเดชเตเดเตเดจเตเดจ SYN เดเตเดเตเดเตเดธเต โโเดฎเตเดเตเดเดพเดจเดฟเดธเดคเตเดคเดฟเตปเตเดฑเต เดเดฐเต เดฒเดณเดฟเดคเดฎเดพเดฏ เดชเดคเดฟเดชเตเดชเต เดเดเตเดเตพ เดเดดเตเดคเตเด. เดเดเตเดเตพ เดเดคเตเดตเดฐเต เดเดฐเต "เดตเตเดฑเตเดฑเต เดฒเดฟเดธเตเดฑเตเดฑเต" เดธเตเดทเตเดเดฟเดเตเดเดฟเดฒเตเดฒ
เดชเดฐเดฟเดถเตเดงเดฟเดเตเด เดเตเดฒเดฏเตปเตเดฑเตเดเตพ, เดเตเดฃเตเดเดฑเตเดเตพ เดธเตเดเตเดทเดฟเดเตเดเตเด, เดซเดฟเตฝเดเตเดเตผ เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเดเตเดเตเด - เดฎเดคเดฟเดฏเดพเดฏ เดฒเตเดเตเดเตพ.
เดเดเตเดเตพ เดธเดฟเดฏเดฟเตฝ เดเดดเตเดคเตเด - เดเดคเต เดซเดพเดทเดจเดฒเตเดฒ, เดชเดเตเดทเต เดเดคเต เดชเตเดฐเดพเดฏเตเดเดฟเดเดฎเดพเดฃเต. เดเดฒเตเดฒเดพ เดเตเดกเตเดเดณเตเด เด เดตเดธเดพเดจเดคเตเดคเต เดฒเดฟเดเตเดเต เดตเดดเดฟ GitHub-เตฝ เดฒเดญเตเดฏเดฎเดพเดฃเต, เดฒเตเดเดจเดคเตเดคเดฟเตฝ เดตเดฟเดตเดฐเดฟเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจ เดเดเตเดเดเตเดเตพเดเตเดเดจเตเดธเดฐเดฟเดเตเดเต เดเดฎเตเดฎเดฟเดฑเตเดฑเตเดเดณเดพเดฏเดฟ เดคเดฟเดฐเดฟเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต.
เดจเดฟเดฐเดพเดเดฐเดฃเด. เด เดฒเตเดเดจเดคเตเดคเดฟเดจเดฟเดเดฏเดฟเตฝ, DDoS เดเดเตเดฐเดฎเดฃเดเตเดเดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดฐเดเตเดทเดจเตเดเดพเตป เดเดพเตป เดเดฐเต เดฎเดฟเดจเดฟ-เดธเตเดฒเตเดฏเตเดทเตป เดตเดฟเดเดธเดฟเดชเตเดชเดฟเดเตเดเตเด, เดเดพเดฐเดฃเด เดเดคเต XDP-เดฏเตเดเตเดเตเด เดเตปเตเดฑเต เดตเตเดฆเดเตเดงเตเดฏเดคเตเดคเดฟเตปเตเดฑเต เดฎเตเดเดฒเดฏเตเดเตเดเตเด เดเดฐเต เดฏเดฅเดพเตผเดคเตเดฅ เดเตเดฎเดคเดฒเดฏเดพเดฃเต. เดเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด, เดธเดพเดเตเดเตเดคเดฟเดเดตเดฟเดฆเตเดฏ เดฎเดจเดธเตเดธเดฟเดฒเดพเดเตเดเตเด เดเดจเตเดจเดคเดพเดฃเต เดชเตเดฐเดงเดพเดจ เดฒเดเตเดทเตเดฏเด, เดเดคเต เดฑเตเดกเดฟเดฎเตเดฏเตเดกเต เดธเดเดฐเดเตเดทเดฃเด เดธเตเดทเตเดเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดเดฐเต เดตเดดเดฟเดเดพเดเตเดเดฟเดฏเดฒเตเดฒ. เดเตเดฏเตเดเตเดเตเดฑเดฟเดฏเตฝ เดเตเดกเต เดเดชเตเดฑเตเดฑเดฟเดฎเตเดธเต เดเตเดฏเตเดคเดฟเดเตเดเดฟเดฒเตเดฒ เดเตเดเดพเดคเต เดเดฟเดฒ เดธเตเดเตเดทเตเดฎเดคเดเตพ เดเดดเดฟเดตเดพเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจเต.
XDP เดธเดเดเตเดทเดฟเดชเตเดค เด เดตเดฒเตเดเดจเด
เดกเตเดเตเดฏเตเดฎเตเตปเตเดฑเตเดทเดจเตเด เดจเดฟเดฒเดตเดฟเดฒเตเดณเตเดณ เดฒเตเดเดจเดเตเดเดณเตเด เดคเดจเดฟเดชเตเดชเดเตผเดชเตเดชเดพเดเตเดเดพเดคเดฟเดฐเดฟเดเตเดเดพเตป เดเดพเตป เดชเตเดฐเดงเดพเดจ เดชเตเดฏเดฟเตปเตเดฑเตเดเตพ เดฎเดพเดคเตเดฐเด เดฐเตเดชเดชเตเดชเตเดเตเดคเตเดคเตเด.
เด
เดคเดฟเดจเดพเตฝ, เดซเดฟเตฝเดเตเดเตผ เดเตเดกเต เดเตเตผเดฃเดฒเดฟเดฒเตเดเตเดเต เดฒเตเดกเต เดเตเดฏเตเดคเต. เดเตปเดเดฎเดฟเดเดเต เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เดซเดฟเตฝเดเตเดเดฑเดฟเดฒเตเดเตเดเต เดเตเดฎเดพเดฑเตเดจเตเดจเต. เดคเตฝเดซเดฒเดฎเดพเดฏเดฟ, เดซเดฟเตฝเดเตเดเตผ เดเดฐเต เดคเตเดฐเตเดฎเดพเดจเด เดเดเตเดเตเดเดฃเด: เดชเดพเดเตเดเดฑเตเดฑเต เดเตเตผเดฃเดฒเดฟเดฒเตเดเตเดเต เดเดเดคเตเดคเดฟเดตเดฟเดเตเด (XDP_PASS
), เดกเตเดฐเตเดชเตเดชเต เดชเดพเดเตเดเดฑเตเดฑเต (XDP_DROP
) เด
เดฒเตเดฒเตเดเตเดเดฟเตฝ เดคเดฟเดฐเดฟเดเต เด
เดฏเดฏเตเดเตเดเตเด (XDP_TX
). เดซเดฟเตฝเดเตเดเดฑเดฟเดจเต เดชเดพเดเตเดเตเดเต เดฎเดพเดฑเตเดฑเดพเตป เดเดดเดฟเดฏเตเด, เดเดคเต เดชเตเดฐเดคเตเดฏเตเดเดฟเดเตเดเตเด เดธเดคเตเดฏเดฎเดพเดฃเต XDP_TX
. เดจเดฟเดเตเดเตพเดเตเดเต เดชเตเดฐเตเดเตเดฐเดพเด เดจเดฟเตผเดคเตเดคเดฒเดพเดเตเดเดพเดจเตเด เดเดดเดฟเดฏเตเด (XDP_ABORTED
) เดเตเดเดพเดคเต เดชเดพเดเตเดเตเดเต เดชเตเดจเดเดธเดเตเดเดฎเดพเดเตเดเตเด, เดเดจเตเดจเดพเตฝ เดเดคเต เดธเดฎเดพเดจเดฎเดพเดฃเต assert(0)
- เดกเตเดฌเดเตเดเดฟเดเดเดฟเดจเต.
eBPF (เดเดเตโเดธเตเดฑเตเดฑเตเตปเดกเดกเต เดฌเตเตผเดเตเดเตโเดฒเดฟ เดชเดพเดเตเดเดฑเตเดฑเต เดซเดฟเตฝเดเตเดเตผ) เดตเตเตผเดเตเดตเตฝ เดฎเตเดทเตเตป เดฌเตเดงเดชเตเตผเดตเด เดฒเดณเดฟเดคเดฎเดพเดเตเดเดฟเดฏเดคเดฟเดจเดพเตฝ เดเตเดกเต เดฒเตเดชเตเดชเต เดเตเดฏเตเดฏเตเดจเตเดจเดฟเดฒเตเดฒเตเดจเตเดจเตเด เดฎเดฑเตเดฑเตเดณเตเดณเดตเดฐเตเดเต เดฎเตเดฎเตเดฎเดฑเดฟ เดเตเดเตเดตเดฐเตเดคเตเดคเตเดจเตเดจเดฟเดฒเตเดฒเตเดจเตเดจเตเด เดเตเตผเดฃเดฒเดฟเดจเต เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเดพเตป เดเดดเดฟเดฏเตเด. เดเตเดฏเตเดฎเตเดฒเตเดฑเตเดฑเตเดตเต เดจเดฟเดฏเดจเตเดคเตเดฐเดฃเดเตเดเดณเตเด เดชเดฐเดฟเดถเตเดงเดจเดเดณเตเด:
- เดฒเตเดชเตเดชเตเดเตพ (เดชเดฟเดจเตเดจเดฟเดฒเตเดเตเดเต) เดจเดฟเดฐเตเดงเดฟเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต.
- เดกเดพเดฑเตเดฑเดฏเตเดเตเดเดพเดฏเดฟ เดเดฐเต เดธเตเดฑเตเดฑเดพเดเตเดเต เดเดฃเตเดเต, เดเดจเตเดจเดพเตฝ เดซเดเดเตเดทเดจเตเดเดณเตเดจเตเดจเตเดฎเดฟเดฒเตเดฒ (เดเดฒเตเดฒเดพ เดธเดฟ เดซเดเดเตเดทเดจเตเดเดณเตเด เดเตปเดฒเตเตป เดเตเดฏเตเดคเดฟเดฐเดฟเดเตเดเดฃเด).
- เดธเตเดฑเตเดฑเดพเดเตเดเดฟเดจเตเด เดชเดพเดเตเดเดฑเตเดฑเต เดฌเดซเดฑเดฟเดจเตเด เดชเตเดฑเดคเตเดคเตเดณเตเดณ เดฎเตเดฎเตเดฎเดฑเดฟ เดเดเตโเดธเดธเตเดธเต เดจเดฟเดฐเตเดงเดฟเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต.
- เดเตเดกเต เดตเดฒเตเดชเตเดชเด เดชเดฐเดฟเดฎเดฟเดคเดฎเดพเดฃเต, เดเดจเตเดจเดพเตฝ เดชเตเดฐเดพเดฏเตเดเดฟเดเดฎเดพเดฏเดฟ เดเดคเต เดตเดณเดฐเต เดชเตเดฐเดงเดพเดจเดฎเดฒเตเดฒ.
- เดชเตเดฐเดคเตเดฏเตเด เดเตเตผเดฃเตฝ เดซเดเดเตโเดทเดจเตเดเดณเดฟเดฒเตเดเตเดเตเดณเตเดณ (eBPF เดธเดนเดพเดฏเดฟเดเตพ) เดเตเดณเตเดเตพ เดฎเดพเดคเตเดฐเดฎเต เด เดจเตเดตเดฆเดฟเดเตเดเต.
เดเดฐเต เดซเดฟเตฝเดเตเดเตผ เดฐเตเดชเดเตฝเดชเตเดชเดจ เดเตเดฏเตเดฏเตเดจเตเดจเดคเตเด เดเตปเดธเตเดฑเตเดฑเดพเตพ เดเตเดฏเตเดฏเตเดจเตเดจเดคเตเด เดเดคเตเดชเตเดฒเต เดเดพเดฃเดชเตเดชเตเดเตเดจเตเดจเต:
- เดเดฑเดตเดฟเด เดเตเดกเต (เดเดฆเดพ
kernel.c
) เดเดฌเตเดเดเตเดฑเตเดฑเดฟเดฒเตเดเตเดเต เดธเดฎเดพเดนเดฐเดฟเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต (kernel.o
) eBPF เดตเตเตผเดเตเดตเตฝ เดฎเตเดทเตเตป เดเตผเดเตเดเดฟเดเตเดเตเดเดฑเดฟเดจเดพเดฏเดฟ. 2019 เดเดเตโเดเตเดฌเตผ เดฎเตเดคเตฝ, eBPF-เดฒเตเดเตเดเตเดณเตเดณ เดธเดฎเดพเดนเดพเดฐเด Clang เดชเดฟเดจเตเดคเตเดฃเดฏเตโเดเตเดเตเดเดฏเตเด GCC 10.1-เตฝ เดตเดพเดเตเดฆเดพเดจเด เดเตเดฏเตเดฏเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจเต. - เด เดเดฌเตโเดเดเตเดฑเตเดฑเต เดเตเดกเดฟเตฝ เดเตเตผเดฃเตฝ เดเดเดจเดเดณเดฟเดฒเตเดเตเดเตเดณเตเดณ เดเตเดณเตเดเตพ เด เดเดเตเดเดฟเดฏเดฟเดเตเดเตเดฃเตเดเตเดเตเดเดฟเตฝ (เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดชเดเตเดเดฟเดเดเดณเตเด เดเตเดฃเตเดเดฑเตเดเดณเตเด), เด เดตเดฏเตเดเต เดเดกเดฟเดเตพ เดชเตเดเตเดฏเดเตเดเดณเดพเตฝ เดฎเดพเดฑเตเดฑเดฟเดธเตเดฅเดพเดชเดฟเดเตเดเดชเตเดชเตเดเตเดจเตเดจเต, เด เดคเดพเดฏเดคเต เด เดคเตเดคเดฐเด เดเตเดกเต เดเดเตโเดธเดฟเดเตเดฏเตเดเตเดเต เดเตเดฏเตเดฏเดพเตป เดเดดเดฟเดฏเดฟเดฒเตเดฒ. เดเตเตผเดฃเดฒเดฟเดฒเตเดเตเดเต เดฒเตเดกเตเดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต เดฎเตเดฎเตเดชเต, เดเตเตผเดฃเตฝ เดเตเดณเตเดเตพ เดตเดดเดฟ เดธเตเดทเตเดเดฟเดเตเด เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเด เดเดฌเตโเดเดเตเดฑเตเดฑเตเดเดณเตเดเต เดเดกเดฟเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเต เด เดชเตเดเตเดฏเดเตเดเตพ เดฎเดพเดฑเตเดฑเดฟเดธเตเดฅเดพเดชเดฟเดเตเดเตเดฃเตเดเดคเตเดฃเตเดเต (เดเตเดกเต เดฒเดฟเดเตเดเต เดเตเดฏเตเดฏเตเด). เดฌเดพเดนเตเดฏ เดฏเตเดเตเดเดฟเดฒเดฟเดฑเตเดฑเดฟเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเต เดจเดฟเดเตเดเตพเดเตเดเต เดเดคเต เดเตเดฏเตเดฏเดพเตป เดเดดเดฟเดฏเตเด, เด เดฒเตเดฒเตเดเตเดเดฟเตฝ เดเดฐเต เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเด เดซเดฟเตฝเดเตเดเตผ เดฒเดฟเดเตเดเต เดเตเดฏเตเดคเต เดฒเตเดกเต เดเตเดฏเตเดฏเตเดจเตเดจ เดเดฐเต เดชเตเดฐเตเดเตเดฐเดพเด เดจเดฟเดเตเดเตพเดเตเดเต เดเดดเตเดคเดพเด.
- เดเตเตผเดฃเตฝ เดฒเตเดกเต เดเตเดฏเตเดค เดชเตเดฐเตเดเตเดฐเดพเด เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเตเดจเตเดจเต. เดธเตเดเตเดเดฟเดณเตเดเดณเตเดเต เด เดญเดพเดตเดตเตเด เดชเดพเดเตเดเดฑเตเดฑเต, เดธเตเดฑเตเดฑเดพเดเตเดเต เดฌเตเดฃเตเดเดฑเดฟเดเตพ เดเดตเดฟเดฏเดพเดจเตเดณเตเดณ เดชเดฐเดพเดเดฏเดตเตเด เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเตเดจเตเดจเต. เดเตเดกเต เดถเดฐเดฟเดฏเดพเดฃเตเดจเตเดจเต เดตเตเดฐเดฟเดซเดฏเตผ เดคเตเดณเดฟเดฏเดฟเดเตเดเตเดจเตเดจเดฟเดฒเตเดฒเตเดเตเดเดฟเตฝ, เดชเตเดฐเตเดเตเดฐเดพเด เดจเดฟเดฐเดธเดฟเดเตเดเดชเตเดชเตเดเตเดเต - เดจเดฟเดเตเดเตพเดเตเดเต เด เดตเดจเต เดชเตเดฐเดธเดพเดฆเดฟเดชเตเดชเดฟเดเตเดเดพเตป เดเดดเดฟเดฏเดฃเด.
- เดตเดฟเดเดฏเดเดฐเดฎเดพเดฏ เดธเตเดฅเดฟเดฐเตเดเดฐเดฃเดคเตเดคเดฟเดจเต เดถเตเดทเด, เดเตเตผเดฃเตฝ eBPF เดเตผเดเตเดเดฟเดเตเดเตเดเตผ เดเดฌเตโเดเดเตเดฑเตเดฑเต เดเตเดกเต เดธเดฟเดธเตเดฑเตเดฑเด เดเตผเดเตเดเดฟเดเตเดเตเดเดฑเดฟเดจเดพเดฏเตเดณเตเดณ เดฎเตเดทเตเตป เดเตเดกเดฟเดฒเตเดเตเดเต เดธเดฎเดพเดนเดฐเดฟเดเตเดเตเดจเตเดจเต (เดเดคเต เดธเดฎเดฏเดคเตเดคเตเดคเดจเตเดจเต).
- เดชเตเดฐเตเดเตเดฐเดพเด เดเตปเตเดฑเตผเดซเตเดธเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดฟเดชเตเดชเดฟเดเตเดเต เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เดชเตเดฐเตเดธเดธเตเดธเต เดเตเดฏเตเดฏเดพเตป เดคเตเดเดเตเดเตเดจเตเดจเต.
เดเดเตเดธเตเดกเดฟเดชเดฟ เดเตเตผเดฃเดฒเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเดพเตฝ, เดเตเดฐเตเดฏเตเดธเต เดฒเตเดเตเดเดณเตเด เดตเดพเดธเตเดคเดตเดคเตเดคเดฟเตฝ, เดชเตเดฐเตเดเตเดฐเดพเด เดซเดฟเตฝเดเตเดเตผ เดเตเดฏเตเดฏเตเดจเตเดจเดคเต เดธเตเดทเตเดเดฟเดเตเดเตเดจเตเดจเดคเต เดเดฏ เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเดพเดฃเต เดกเตเดฌเดเตเดเดฟเดเดเต เดจเดเดคเตเดคเตเดจเตเดจเดคเต. เดเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด, เดกเตเตบเดฒเตเดกเต เดเตเดฏเตเดค เดเตเดกเต เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดจเต เดธเตเดฐเดเตเดทเดฟเดคเดฎเดพเดฃเตเดจเตเดจเต eBPF เดเดฑเดชเตเดชเดพเดเตเดเตเดจเตเดจเต, เด เดคเดฟเดจเดพเตฝ เดจเดฟเดเตเดเตพเดเตเดเต เดจเดฟเดเตเดเดณเตเดเต เดชเตเดฐเดพเดฆเตเดถเดฟเด เดฒเดฟเดจเดเตเดธเดฟเตฝ เดจเตเดฐเดฟเดเตเดเต XDP เดเดชเดฏเตเดเดฟเดเตเดเต เดชเดฐเตเดเตเดทเดฟเดเตเดเดพเตป เดเดดเดฟเดฏเตเด.
เดชเดฐเดฟเดธเตเดฅเดฟเดคเดฟ เดเดฐเตเดเตเดเตเดจเตเดจเต
เดจเดฟเดฏเดฎเดธเดญ
eBPF เดเตผเดเตเดเดฟเดเตเดเตเดเดฑเดฟเดจเดพเดฏเดฟ Clang-เดจเต เดจเตเดฐเดฟเดเตเดเต เดเดฌเตโเดเดเตเดฑเตเดฑเต เดเตเดกเต เดจเดฟเตผเดฎเตเดฎเดฟเดเตเดเดพเตป เดเดดเดฟเดฏเดฟเดฒเตเดฒ, เด เดคเดฟเดจเดพเตฝ เดชเตเดฐเดเตเดฐเดฟเดฏ เดฐเดฃเตเดเต เดเดเตเดเดเตเดเตพ เดเตพเดเตเดเตเดณเตเดณเตเดจเตเดจเต:
- LLVM เดฌเตเดฑเตเดฑเตเดเตเดกเดฟเดฒเตเดเตเดเต C เดเตเดกเต เดเดเดชเตเตฝ เดเตเดฏเตเดฏเตเด (
clang -emit-llvm
). - เดฌเตเดฑเตเดฑเตเดเตเดกเต 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__
เดเตเตผเดฃเดฒเดฟเตฝ เดซเดฟเตฝเดเตเดเตผ เดเดเตเดธเดฟเดเตเดฏเตเดเตเดเต เดเตเดฏเตเดคเดฟเดฐเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเดพเตฝ เดฏเตเดเดชเดฟเด (เดฏเตเดธเตโเดชเตเดธเต เดเดชเดฟเด) เดนเตเดกเดฑเตเดเตพ เดเตเตผเดฃเตฝ เดเตเดกเดฟเดจเดพเดฏเดฟ เดจเดฟเตผเดตเดเดฟเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต เดเดจเตเดจเดพเดฃเต เด
เตผเดคเตเดฅเดฎเดพเดเตเดเตเดจเตเดจเดคเต.
เดธเตเดฑเตเดฑเดพเดเตเดเต เดธเดเดฐเดเตเดทเดฃเด เดชเตเดฐเดตเตผเดคเตเดคเดจเดฐเดนเดฟเดคเดฎเดพเดเตเดเดพเด (-fno-stack-protector
), เดเดพเดฐเดฃเด eBPF เดเตเดกเต เดตเตเดฐเดฟเดซเดฏเตผ เดเดชเตเดชเตเดดเตเด เดชเดฐเดฟเดงเดฟเดเตเดเต เดชเตเดฑเดคเตเดคเตเดณเตเดณ เดฒเดเดเดจเดเตเดเตพ เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเตเดจเตเดจเต. เดเดเตป เดคเดจเตเดจเต เดเดชเตเดฑเตเดฑเดฟเดฎเตเดธเตเดทเดจเตเดเตพ เดเดฃเดพเดเตเดเตเดจเตเดจเดคเต เดฎเตเดฒเตเดฏเดตเดคเตเดคเดพเดฃเต, เดเดพเดฐเดฃเด eBPF เดฌเตเดฑเตเดฑเตเดเตเดกเดฟเตปเตเดฑเต เดตเดฒเตเดชเตเดชเด เดชเดฐเดฟเดฎเดฟเดคเดฎเดพเดฃเต.
เดเดฒเตเดฒเดพ เดชเดพเดเตเดเดฑเตเดฑเตเดเดณเตเด เดเดเดจเตเดจเตเดชเตเดเตเดเดฏเตเด เดเดจเตเดจเตเด เดเตเดฏเตเดฏเดพเดคเดฟเดฐเดฟเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจ เดเดฐเต เดซเดฟเตฝเดเตเดเดฑเดฟเตฝ เดจเดฎเตเดเตเดเต เดเดฐเดเดญเดฟเดเตเดเดพเด:
#include <uapi/linux/bpf.h>
#include <bpf_helpers.h>
SEC("prog")
int xdp_main(struct xdp_md* ctx) {
return XDP_PASS;
}
char _license[] SEC("license") = "GPL";
เดเตเด make
เดถเตเดเดฐเดฟเดเตเดเตเดจเตเดจเต xdp_filter.o
. เดเดชเตเดชเตเตพ เดเดตเดฟเดเต เดถเตเดฐเดฎเดฟเดเตเดเดฃเด?
เดเตเดธเตเดฑเตเดฑเต เดธเตเดฑเตเดฑเดพเตปเดกเต
เดธเตเดฑเตเดฑเดพเตปเดกเดฟเตฝ เดฐเดฃเตเดเต เดเตปเตเดฑเตผเดซเตเดธเตเดเตพ เดเดฃเตเดเดพเดฏเดฟเดฐเดฟเดเตเดเดฃเด: เด เดคเดฟเตฝ เดเดฐเต เดซเดฟเตฝเดเตเดเตผ เดเดฃเตเดเดพเดฏเดฟเดฐเดฟเดเตเดเตเด, เด เดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เด เดฏเดฏเตเดเตเดเตเด. เดเดเตเดเดณเตเดเต เดซเดฟเตฝเดเตเดเดฑเดฟเดจเตเดชเตเดชเด เดธเดพเดงเดพเดฐเดฃ เดเดชเตเดฒเดฟเดเตเดเตเดทเดจเตเดเตพ เดเดเตเดเดจเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเตเดตเตเดจเตเดจเต เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต, เดเดต เดธเตเดตเดจเตเดคเด เดเดชเดฟเดเดณเตเดณเตเดณ เดชเตเตผเดฃเตเดฃเดฎเดพเดฏ เดฒเดฟเดจเดเตเดธเต เดเดชเดเดฐเดฃเดเตเดเดณเดพเดฏเดฟเดฐเดฟเดเตเดเดฃเด.
เดตเตเดคเตเดคเต (เดตเตเตผเดเตเดตเตฝ เดเดฅเตผเดจเตเดฑเตเดฑเต) เดคเดฐเดคเตเดคเดฟเดฒเตเดณเตเดณ เดเดชเดเดฐเดฃเดเตเดเตพ เดเดเตเดเตพเดเตเดเต เด
เดจเตเดฏเตเดเตเดฏเดฎเดพเดฃเต: เดเดต เดชเดฐเดธเตเดชเดฐเด เดจเตเดฐเดฟเดเตเดเต "เดเดฃเดเตโเดฑเตเดฑเตเดเตเดฏเตโเดค" เดเดฐเต เดเตเดเดฟ เดตเตเตผเดเตเดตเตฝ เดจเตเดฑเตเดฑเตโเดตเตผเดเตเดเต เดเตปเตเดฑเตผเดซเตเดธเตเดเดณเดพเดฃเต. เดจเดฟเดเตเดเตพเดเตเดเต เด
เดต เดเดคเตเดชเตเดฒเต เดธเตเดทเตเดเดฟเดเตเดเดพเตป เดเดดเดฟเดฏเตเด (เด เดตเดฟเดญเดพเดเดคเตเดคเดฟเตฝ เดเดฒเตเดฒเดพ เดเดฎเดพเตปเดกเตเดเดณเตเด ip
เดฎเตเดคเตฝ เดจเดเดคเตเดคเดชเตเดชเตเดเตเดจเตเดจเต root
):
ip link add xdp-remote type veth peer name xdp-local
เดเดคเต xdp-remote
ะธ xdp-local
- เดเดชเดเดฐเดฃเดคเตเดคเดฟเตปเตเดฑเต เดชเตเดฐเตเดเตพ. เดเตบ xdp-local
(192.0.2.1/24) เดเดฐเต เดซเดฟเตฝเดเตเดเตผ เด
เดฑเตเดฑเดพเดเตเดเตเดเตเดฏเตเดฏเตเด xdp-remote
(192.0.2.2/24) เดเตปเดเดฎเดฟเดเดเต เดเตเดฐเดพเดซเดฟเดเต เด
เดฏเดฏเตโเดเตเดเตเด. เดเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด, เดเดฐเต เดชเตเดฐเดถเตโเดจเดฎเตเดฃเตเดเต: เดเตปเตเดฑเตผเดซเตเดธเตเดเตพ เดเดฐเต เดฎเตเดทเตเดจเดฟเดฒเดพเดฃเต, เดเตเดเดพเดคเต เดฒเดฟเดจเดเตเดธเต เด
เดตเดฏเดฟเดฒเตเดจเตเดจเดฟเดฒเตเดเตเดเต เดฎเดฑเตเดฑเตเดจเตเดจเดฟเดฒเตเดเตเดเต เดเตเดฐเดพเดซเดฟเดเต เด
เดฏเดฏเตโเดเตเดเดฟเดฒเตเดฒ. เดคเดจเตเดคเตเดฐเดชเดฐเดฎเดพเดฏ เดจเดฟเดฏเดฎเดเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเต เดจเดฟเดเตเดเตพเดเตเดเต เดเดคเต เดชเดฐเดฟเดนเดฐเดฟเดเตเดเดพเดจเดพเดเตเด iptables
, เดเดจเตเดจเดพเตฝ เด
เดตเตผ เดชเดพเดเตเดเตเดเตเดเตพ เดฎเดพเดฑเตเดฑเตเดฃเตเดเดฟเดตเดฐเตเด, เดเดคเต เดกเตเดฌเดเตเดเดฟเดเดเดฟเดจเต เด
เดธเตเดเดฐเตเดฏเดฎเดพเดฃเต. เดจเตเดฑเตเดฑเตโเดตเตผเดเตเดเต เดจเตเดฏเดฟเดเดธเตโเดชเตเดฏเตโเดธเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเตเดจเตเดจเดคเดพเดฃเต เดจเดฒเตเดฒเดคเต (เดเดจเดฟ เดฎเตเดคเตฝ เดจเตเดฑเตเดฑเตโเดจเตเดเตพ).
เดเดฐเต เดจเตเดฑเตเดฑเตโเดตเตผเดเตเดเต เดจเตเดฏเดฟเดเดธเตโเดชเตเดฏเตโเดธเดฟเตฝ เดเดฐเต เดเตเดเตเดเด เดเตปเตเดฑเตผเดซเตเดธเตเดเตพ, เดฑเตเดเตเดเดฟเดเดเต เดเตเดฌเดฟเดณเตเดเตพ, เดฎเดฑเตเดฑเต เดจเตเดฑเตเดฑเตโเดจเตเดเดณเดฟเดฒเต เดธเดฎเดพเดจ เดเดฌเตโเดเดเตเดฑเตเดฑเตเดเดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเตเตผเดคเดฟเดฐเดฟเดเตเดเตเดเตเดคเตเดค เดจเตเดฑเตเดฑเตโเดซเดฟเตฝเดฑเตเดฑเตผ เดจเดฟเดฏเดฎเดเตเดเตพ เดเดจเตเดจเดฟเดต เด เดเดเตเดเดฟเดฏเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต. เดเดฐเต เดชเตเดฐเดเตเดฐเดฟเดฏเดฏเตเด เดเดฐเต เดจเตเดฏเดฟเดเดธเตโเดชเตเดฏเตโเดธเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเต, เดเตเดเดพเดคเต เด เดจเตเดฑเตเดฑเตโเดจเตเดเดณเตเดเต เดเดฌเตโเดเดเตเดฑเตเดฑเตเดเดณเดฟเดฒเตเดเตเดเต เดฎเดพเดคเตเดฐเดฎเต เดชเตเดฐเดตเตเดถเดจเดฎเตเดณเตเดณเต. เดธเตเดฅเดฟเดฐเดธเตเดฅเดฟเดคเดฟเดฏเดพเดฏเดฟ, เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดจเต เดเดฒเตเดฒเดพ เดเดฌเตโเดเดเตโเดฑเตเดฑเตเดเตพเดเตเดเตเดฎเดพเดฏเดฟ เดเดฐเตเดฑเตเดฑ เดจเตเดฑเตเดฑเตโเดตเตผเดเตเดเต เดจเตเดฏเดฟเดเดธเตโเดชเตเดฏเตโเดธเต เดเดฃเตเดเต, เด เดคเดฟเดจเดพเตฝ เดจเดฟเดเตเดเตพเดเตเดเต เดฒเดฟเดจเดเตโเดธเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเดพเดจเตเด เดจเตเดฑเตเดฑเตโเดจเตเดเดณเต เดเตเดฑเดฟเดเตเดเต เด เดฑเดฟเดฏเดฟเดฒเตเดฒ.
เดจเดฎเตเดเตเดเต เดเดฐเต เดชเตเดคเดฟเดฏ เดจเตเดฏเดฟเดเดธเตเดชเตเดธเต เดเดฃเตเดเดพเดเตเดเดพเด xdp-test
เด
เดเตเดเตเดเตเดเต เดฎเดพเดฑเตเดฑเตเด xdp-remote
.
ip netns add xdp-test
ip link set dev xdp-remote netns xdp-test
เดคเตเดเตผเดจเตเดจเต เดชเตเดฐเดเตเดฐเดฟเดฏ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเต xdp-test
, "เดเดพเดฃเดฟเดฒเตเดฒ" xdp-local
(เด
เดคเต เดธเตเดฅเดฟเดฐเดธเตเดฅเดฟเดคเดฟเดฏเดพเดฏเดฟ เดจเตเดฑเตเดฑเตโเดจเตเดเดณเดฟเตฝ เดจเดฟเดฒเดจเดฟเตฝเดเตเดเตเด) เดเดฐเต เดชเดพเดเตเดเดฑเตเดฑเต 192.0.2.1 เดฒเตเดเตเดเต เด
เดฏเดฏเตโเดเตเดเตเดฎเตเดชเตเตพ เด
เดคเต เด
เดคเดฟเดฒเตเดเต เดเดเดจเตเดจเตเดชเตเดเตเด. xdp-remote
เดเดพเดฐเดฃเด 192.0.2.0/24-เดฒเต เด เดชเตเดฐเดเตเดฐเดฟเดฏเดฏเตเดเตเดเต เดเดเตเดธเดธเต เดเตเดฏเตเดฏเดพเดตเตเดจเตเดจ เดเด เดเตปเตเดฑเตผเดซเตเดธเต เดเดคเดพเดฃเต. เดเดคเตเด เดตเดฟเดชเดฐเตเดค เดฆเดฟเดถเดฏเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเต.
เดจเตเดฑเตเดฑเตเดจเตเดเตพเดเตเดเดฟเดเดฏเดฟเตฝ เดจเตเดเตเดเตเดฎเตเดชเตเตพ, เดเตปเตเดฑเตผเดซเตเดธเต เดคเดพเดดเตเดเตเดเต เดชเตเดเตเดเดฏเตเด เดตเดฟเดฒเดพเดธเด เดจเดทเตเดเดชเตเดชเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจเต. เดจเตเดฑเตเดฑเตโเดจเตเดเดณเดฟเตฝ เดเตปเตเดฑเตผเดซเตเดธเต เดเตเดฐเดฎเตเดเดฐเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต, เดจเดฟเดเตเดเตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเดเตเดเตเดฃเตเดเดคเตเดฃเตเดเต ip ...
เด เดเดฎเดพเตปเดกเต เดจเตเดฏเดฟเดเดธเตเดชเตเดธเดฟเตฝ ip netns exec
:
ip netns exec xdp-test
ip address add 192.0.2.2/24 dev xdp-remote
ip netns exec xdp-test
ip link set xdp-remote up
เดจเดฟเดเตเดเตพเดเตเดเต เดเดพเดฃเดพเดจเดพเดเตเดจเตเดจเดคเตเดชเตเดฒเต, เดเดคเต เดเตเดฐเดฎเตเดเดฐเดฃเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเตเดฏเดคเตเดฏเดธเตเดคเดฎเดฒเตเดฒ xdp-local
เดกเดฟเดซเตเตพเดเตเดเต เดจเตเดฏเดฟเดเดธเตเดชเตเดธเดฟเตฝ:
ip address add 192.0.2.1/24 dev xdp-local
ip link set xdp-local up
เดจเดฟเดเตเดเตพ เดเดเตเดเดฏเดพเดฃเตเดเตเดเดฟเตฝ tcpdump -tnevi xdp-local
, เดจเดฟเดจเตเดจเต เด
เดฏเดเตเด เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เดจเดฟเดเตเดเตพเดเตเดเต เดเดพเดฃเดพเด xdp-test
, เด เดเตปเตเดฑเตผเดซเตเดธเดฟเดฒเตเดเตเดเต เดกเตเดฒเดฟเดตเตผ เดเตเดฏเตเดฏเตเดจเตเดจเต:
ip netns exec xdp-test ping 192.0.2.1
เดเดฐเต เดทเตเตฝ เดธเดฎเดพเดฐเดเดญเดฟเดเตเดเตเดจเตเดจเดคเต เดธเตเดเดฐเตเดฏเดชเตเดฐเดฆเดฎเดพเดฃเต xdp-test
. เดธเตเดฑเตเดฑเดพเตปเดกเดฟเดจเตเดชเตเดชเด เดชเตเดฐเดตเตผเดคเตเดคเดฟเดเตเดเตเดจเตเดจเดคเต เดเดเตเดเตเดฎเตเดฑเตเดฑเต เดเตเดฏเตเดฏเตเดจเตเดจ เดเดฐเต เดธเตเดเตเดฐเดฟเดชเตเดฑเตเดฑเต เดฑเดฟเดชเตเดชเตเดธเดฟเดฑเตเดฑเดฑเดฟเดเตเดเต เดเดฃเตเดเต, เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดจเดฟเดเตเดเตพเดเตเดเต เดเดฎเดพเตปเดกเต เดเดชเดฏเตเดเดฟเดเตเดเต เดธเตเดฑเตเดฑเดพเตปเดกเต เดเตเดฐเดฎเตเดเดฐเดฟเดเตเดเดพเตป เดเดดเดฟเดฏเตเด sudo ./stand up
เด
เดคเต เดเดฒเตเดฒเดพเดคเดพเดเตเดเตเด sudo ./stand down
.
เดเตเดฐเดพเดเตเดเดฟเดเดเต
เดซเดฟเตฝเดเตเดเตผ เดเดคเตเดชเตเดฒเตเดฏเตเดณเตเดณ เดเดชเดเดฐเดฃเดตเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดชเตเดชเตเดเตเดเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต:
ip -force link set dev xdp-local xdp object xdp_filter.o verbose
เดเต -force
เดฎเดฑเตเดฑเตเดจเตเดจเต เดเดคเดฟเดจเดเด เดฒเดฟเดเตเดเต เดเตเดฏเตเดคเดฟเดเตเดเตเดฃเตเดเตเดเตเดเดฟเตฝ เดเดฐเต เดชเตเดคเดฟเดฏ เดชเตเดฐเตเดเตเดฐเดพเด เดฒเดฟเดเตเดเต เดเตเดฏเตเดฏเตเดฃเตเดเดคเต เดเดตเดถเตเดฏเดฎเดพเดฃเต. โเดเดฐเต เดตเดพเตผเดคเตเดคเดฏเตเด เดจเดฒเตเดฒ เดตเดพเตผเดคเตเดคเดฏเดฒเตเดฒโ เดเดจเตเดจเดคเต เด เดเดฎเดพเตปเดกเดฟเดจเตเดเตเดเตเดฑเดฟเดเตเดเดฒเตเดฒ, เดเดคเต เดธเดพเดนเดเดฐเตเดฏเดคเตเดคเดฟเดฒเตเด เดจเดฟเดเดฎเดจเด เดตเดณเดฐเต เดตเดฒเตเดคเดพเดฃเต. เดธเตเดเดฟเดชเตเดชเดฟเดเตเดเตเด 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
เดเดฐเต เดชเตเดฐเตเดเตเดฐเดพเดฎเตเด เด
เดธเตเตป เดเตเดฏเตเดคเต, เด
เดคเต เดถเตเดจเตเดฏเดฎเดพเดฃเตเดเตเดเดฟเดฒเตเด, เด
เดตเดจเต เดตเดณเตผเดคเตเดคเดฟ.
เดเดพเตป เดเดคเตเดเตเดเดจเต เด เดฑเดฟเดเตเดเต?
เดคเดฟเดจเตเดฎเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เดจเดฟเดเตเดเตพ เดจเดจเตเดฎ เดเดฃเตเดเดพเดเตเดเดฃเด, เดเดพเดฐเดฃเด เด เดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดฎเดฑเตเดฑเตเดจเตเดจเตเด เดเดฃเตเดเดพเดเดฟเดฒเตเดฒ.
$ sudo perf trace --call-graph dwarf -e 'xdp:*'
0.000 ping/123455 xdp:xdp_bulk_tx:ifindex=19 action=TX sent=0 drops=1 err=-6
veth_xdp_flush_bq ([veth])
veth_xdp_flush_bq ([veth])
veth_poll ([veth])
<...>
เดเดจเตเดคเดพเดฃเต เดเตเดกเต 6?
$ errno 6
ENXIO 6 No such device or address
เดซเดเดเตเดทเตป veth_xdp_flush_bq()
เดเดจเตเดจเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดเดฐเต เดชเดฟเดถเดเต เดเตเดกเต เดธเตเดตเตเดเดฐเดฟเดเตเดเตเดจเตเดจเต veth_xdp_xmit()
, เดเดตเดฟเดเต เดตเดดเดฟ เดคเดฟเดฐเดฏเตเด ENXIO
เด
เดญเดฟเดชเตเดฐเดพเดฏเด เดเดฃเตเดเตเดคเตเดคเตเดเดฏเตเด เดเตเดฏเตเดฏเตเด.
เดจเดฎเตเดเตเดเต เดเดฑเตเดฑเดตเตเด เดเตเดฑเดเตเด เดซเดฟเตฝเดเตเดเตผ เดชเตเดจเดเดธเตเดฅเดพเดชเดฟเดเตเดเดพเด (XDP_PASS
) เดซเดฏเดฒเดฟเตฝ xdp_dummy.c
, เดเดคเต Makefile-เดฒเตเดเตเดเต เดเตเตผเดเตเดเตเด, เดฌเตเตปเดกเต เดเตเดฏเตเดฏเตเด xdp-remote
:
ip netns exec remote
ip link set dev int xdp object dummy.o
เดเดชเตเดชเตเตพ tcpdump
เดเดจเตเดคเดพเดฃเต เดชเตเดฐเดคเตเดเตเดทเดฟเดเตเดเตเดจเตเดจเดคเตเดจเตเดจเต เดเดพเดฃเดฟเดเตเดเตเดจเตเดจเต:
62:57:8e:70:44:64 > 26:0e:25:37:8f:96, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 13762, offset 0, flags [DF], proto ICMP (1), length 84)
192.0.2.2 > 192.0.2.1: ICMP echo request, id 46966, seq 1, length 64
62:57:8e:70:44:64 > 26:0e:25:37:8f:96, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 13762, offset 0, flags [DF], proto ICMP (1), length 84)
192.0.2.2 > 192.0.2.1: ICMP echo request, id 46966, seq 1, length 64
เดชเดเดฐเด ARP-เดเตพ เดฎเดพเดคเตเดฐเด เดเดพเดฃเดฟเดเตเดเตเดเดฏเดพเดฃเตเดเตเดเดฟเตฝ, เดจเดฟเดเตเดเตพ เดซเดฟเตฝเดเตเดเดฑเตเดเตพ เดจเตเดเตเดเด เดเตเดฏเตเดฏเตเดฃเตเดเดคเตเดฃเตเดเต (เดเดคเต เดเตเดฏเตเดฏเตเดจเตเดจเต sudo ./stand detach
), เด
เดคเต เดชเตเดพเดเดเตเดเต ping
, เดคเตเดเตผเดจเตเดจเต เดซเดฟเตฝเดเตเดเดฑเตเดเตพ เดธเดเตเดเตเดเดฐเดฟเดเตเดเต เดตเตเดฃเตเดเตเด เดถเตเดฐเดฎเดฟเดเตเดเตเด. เดซเดฟเตฝเดเตเดเดฑเดพเดฃเต เดชเตเดฐเดถเตเดจเด XDP_TX
ARP เดฏเดฟเดฒเตเด เดธเตเดฑเตเดฑเดพเดเตเดเดฟเดฒเตเด เดธเดพเดงเตเดคเดฏเตเดณเตเดณเดคเดพเดฃเต
เดจเดพเดฎเดฎเตเดเดฒเดเตพ xdp-test
MAC เดตเดฟเดฒเดพเดธเด 192.0.2.1 "เดฎเดฑเดเตเดเดพเตป" เดเดดเดฟเดเตเดเต, เด
เดคเดฟเดจเต เด IP เดชเดฐเดฟเดนเดฐเดฟเดเตเดเดพเตป เดเดดเดฟเดฏเดฟเดฒเตเดฒ.
เดชเตเดฐเดถเตเดจ เดชเตเดฐเดธเตเดคเดพเดตเดจ
เดจเดฎเตเดเตเดเต เดชเตเดฐเดธเตเดคเดพเดตเดฟเดเตเด เดเดพเดธเตเดเตเดเดฟเดฒเตเดเตเดเต เดชเตเดเดพเด: XDP-เดฏเดฟเตฝ เดเดฐเต SYN เดเตเดเตเดเดฟเดเตพ เดฎเตเดเตเดเดพเดจเดฟเดธเด เดเดดเตเดคเตเด.
SYN เดตเตเดณเตเดณเดชเตเดชเตเดเตเดเด เดเดฐเต เดเดจเดชเตเดฐเดฟเดฏ DDoS เดเดเตเดฐเดฎเดฃเดฎเดพเดฏเดฟ เดคเตเดเดฐเตเดจเตเดจเต, เด เดคเดฟเตปเตเดฑเต เดธเดพเดฐเดพเดเดถเด เดเดชเตเดฐเดเดพเดฐเดฎเดพเดฃเต. เดเดฐเต เดเดฃเดเตเดทเตป เดธเตเดฅเดพเดชเดฟเดเตเดเตเดฎเตเดชเตเตพ (TCP เดนเดพเตปเดกเตโเดทเตเดเตเดเต), เดธเตเตผเดตเดฑเดฟเดจเต เดเดฐเต SYN เดฒเดญเดฟเดเตเดเตเดจเตเดจเต, เดญเดพเดตเดฟ เดเดฃเดเตเดทเดจเตเดณเตเดณ เดเดฑเดตเดฟเดเดเตเดเตพ เด เดจเตเดตเดฆเดฟเดเตเดเตเดเดฏเตเด เดเดฐเต SYNACK เดชเดพเดเตเดเดฑเตเดฑเต เดเดชเดฏเตเดเดฟเดเตเดเต เดชเตเดฐเดคเดฟเดเดฐเดฟเดเตเดเตเดเดฏเตเด เดเดฐเต ACK-เดจเดพเดฏเดฟ เดเดพเดคเตเดคเดฟเดฐเดฟเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจเต. เดเดฐเต เดฎเตพเดเตเดเดฟ-เดเดฏเดฟเดฐเด-เดถเดเตเดคเดฎเดพเดฏ เดฌเตเดเตเดเตโเดจเตเดฑเตเดฑเดฟเตฝ เดเดฐเต เดนเตเดธเตเดฑเตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเตเด เดเดฌเดณเดฟเดชเตเดชเดฟเดเตเด เดตเดฟเดฒเดพเดธเดเตเดเดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดเดเตเดฐเดฎเดฃเดเดพเดฐเดฟ เดธเตเดเตเดเตปเดกเดฟเตฝ เดเดฏเดฟเดฐเดเตเดเดฃเดเตเดเดฟเดจเต SYN เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เด เดฏเดฏเตเดเตเดเตเดจเตเดจเต. เดชเดพเดเตเดเดฑเตเดฑเดฟเตปเตเดฑเต เดตเดฐเดตเดฟเตฝ เดเดเตป เดคเดจเตเดจเต เดตเดฟเดญเดตเดเตเดเตพ เด เดจเตเดตเดฆเดฟเดเตเดเดพเตป เดธเตเตผเดตเตผ เดจเดฟเตผเดฌเดจเตเดงเดฟเดคเดฐเดพเดเตเดจเตเดจเต, เดเดจเตเดจเดพเตฝ เดเดฐเต เดตเดฒเดฟเดฏ เดธเดฎเดฏเดชเดฐเดฟเดงเดฟเดเตเดเต เดถเตเดทเด เด เดต เดฑเดฟเดฒเตเดธเต เดเตเดฏเตเดฏเตเดจเตเดจเต, เด เดคเดฟเตปเตเดฑเต เดซเดฒเดฎเดพเดฏเดฟ เดฎเตเดฎเตเดฎเดฑเดฟ เด เดฒเตเดฒเตเดเตเดเดฟเตฝ เดชเดฐเดฟเดงเดฟเดเตพ เดคเตเตผเดจเตเดจเต, เดชเตเดคเดฟเดฏ เดเดฃเดเตเดทเดจเตเดเตพ เดธเตเดตเตเดเดฐเดฟเดเตเดเดชเตเดชเตเดเตเดจเตเดจเดฟเดฒเตเดฒ, เดธเตเดตเดจเด เดฒเดญเตเดฏเดฎเดฒเตเดฒ.
เดจเดฟเดเตเดเตพ SYN เดชเดพเดเตเดเดฑเตเดฑเดฟเดจเต เด
เดเดฟเดธเตเดฅเดพเดจเดฎเดพเดเตเดเดฟ เดฑเดฟเดธเตเดดเตโเดธเตเดเตพ เด
เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจเดฟเดฒเตเดฒเตเดเตเดเดฟเตฝ, เดเดฐเต SYNACK เดชเดพเดเตเดเดฑเตเดฑเต เดเดชเดฏเตเดเดฟเดเตเดเต เดฎเดพเดคเตเดฐเด เดชเตเดฐเดคเดฟเดเดฐเดฟเดเตเดเตเดเดฏเดพเดฃเตเดเตเดเดฟเตฝ, เดชเดฟเดจเตเดจเตเดเต เดตเดจเตเดจ ACK เดชเดพเดเตเดเดฑเตเดฑเต เดธเตเดตเต เดเตเดฏเตเดฏเดพเดคเตเดค SYN เดชเดพเดเตเดเดฑเตเดฑเดฟเดจเตเดฏเดพเดฃเต เดธเตเดเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเดคเตเดจเตเดจเต เดธเตเตผเดตเดฑเดฟเดจเต เดเดเตเดเดจเต เดฎเดจเดธเตเดธเดฟเดฒเดพเดเตเดเดพเดจเดพเดเตเด? เดเดฒเตเดฒเดพเดคเตเดคเดฟเดจเตเดฎเตเดชเดฐเดฟ, เดเดฐเต เดเดเตเดฐเดฎเดฃเดเดพเดฐเดฟเดเตเดเต เดตเตเดฏเดพเด ACK-เดเตพ เดธเตเดทเตเดเดฟเดเตเดเดพเดจเตเด เดเดดเดฟเดฏเตเด. SYN เดเตเดเตเดเดฟเดฏเตเดเต เดเดพเดฐเตเดฏเด เด
เดคเต เดเตปเดเตเดกเต เดเตเดฏเตเดฏเตเด เดเดจเตเดจเดคเดพเดฃเต seqnum
เดตเดฟเดฒเดพเดธเดเตเดเตพ, เดชเตเตผเดเตเดเตเดเตพ, เดเดชเตเดชเต เดฎเดพเดฑเตฝ เดเดจเตเดจเดฟเดตเดฏเตเดเต เดเดฐเต เดนเดพเดทเต เดเดฏเดฟ เดเดฃเดเตเดทเตป เดชเดพเดฐเดพเดฎเตเดฑเตเดฑเดฑเตเดเตพ. เดเดชเตเดชเต เดฎเดพเดฑเตเดฑเตเดจเตเดจเดคเดฟเดจเต เดฎเตเดฎเตเดชเต ACK เดเดคเตเดคเดพเตป เดเดดเดฟเดเตเดเตเดเตเดเดฟเตฝ, เดจเดฟเดเตเดเตพเดเตเดเต เดตเตเดฃเตเดเตเด เดนเดพเดทเต เดเดฃเดเตเดเดพเดเตเดเตเดเดฏเตเด เด
เดคเตเดฎเดพเดฏเดฟ เดคเดพเดฐเดคเดฎเตเดฏเด เดเตเดฏเตเดฏเตเดเดฏเตเด เดเตเดฏเตเดฏเดพเด acknum
. เดซเตเตผเดเต acknum
เดเดเตเดฐเดฎเดฃเดเดพเดฐเดฟเดเตเดเต เดเดดเดฟเดฏเดฟเดฒเตเดฒ, เดเดพเดฐเดฃเด เดเดชเตเดชเดฟเตฝ เดฐเดนเดธเตเดฏเด เดเตพเดชเตเดชเตเดเตเดจเตเดจเต, เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ เดเดพเดจเดฒเดฟเตปเตเดฑเต เดชเดฐเดฟเดฎเดฟเดคเดฎเดพเดฏเดคเดฟเดจเดพเตฝ เด
เดคเต เด
เดเตเดเตเดเดพเตป เดธเดฎเดฏเดฎเดฟเดฒเตเดฒ.
SYN เดเตเดเตเดเดฟ เดฒเดฟเดจเดเตเดธเต เดเตเตผเดฃเดฒเดฟเตฝ เดตเดณเดฐเตเดเตเดเดพเดฒเดฎเดพเดฏเดฟ เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเดฟเดฏเดฟเดเตเดเตเดฃเตเดเต, เดเตเดเดพเดคเต SYN-เดเตพ เดตเดณเดฐเต เดตเตเดเดคเตเดคเดฟเดฒเตเด เดเตเดเตเดเดฎเดพเดฏเตเด เดเดคเตเดคเดฟเดฏเดพเตฝ เดชเตเดฒเตเด เดธเตเดตเดฏเดฎเตเดต เดชเตเดฐเดตเตผเดคเตเดคเดจเดเตเดทเดฎเดฎเดพเดเตเดเดพเด.
TCP เดนเดพเตปเดกเตโเดทเตเดเตเดเดฟเดจเตเดเตเดเตเดฑเดฟเดเตเดเตเดณเตเดณ เดตเดฟเดฆเตเดฏเดพเดญเตเดฏเดพเดธ เดชเดฐเดฟเดชเดพเดเดฟ
เดฌเตเดฑเตเดฑเตเดเดณเตเดเต เดเดฐเต เดธเตเดเตเดฐเตเด เดเดฏเดฟ TCP เดกเดพเดฑเตเดฑเดพ เดเตเดฐเดพเตปเดธเตเดฎเดฟเดทเตป เดจเตฝเดเตเดจเตเดจเต, เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, HTTP เด เดญเตเดฏเตผเดคเตเดฅเดจเดเตพ TCP เดตเดดเดฟ เดเตเดฎเดพเดฑเตเดจเตเดจเต. เดธเตเดเตเดฐเตเด เดชเดพเดเตเดเดฑเตเดฑเตเดเดณเดฟเตฝ เดเดทเดฃเดเตเดเดณเดพเดฏเดฟ เดเตเดฎเดพเดฑเตเดฑเด เดเตเดฏเตเดฏเดชเตเดชเตเดเตเดจเตเดจเต. เดเดฒเตเดฒเดพ TCP เดชเดพเดเตเดเดฑเตเดฑเตเดเตพเดเตเดเตเด เดฒเตเดเดฟเดเตเดเตฝ เดซเตเดฒเดพเดเตเดเดณเตเด 32-เดฌเดฟเดฑเตเดฑเต เดธเตเดเตเดตเตปเดธเต เดจเดฎเตเดชเดฑเตเดเดณเตเด เดเดฃเตเดเต:
-
เดซเตเดฒเดพเดเตเดเดณเตเดเต เดธเดเดฏเตเดเดจเด เดเดฐเต เดชเตเดฐเดคเตเดฏเตเด เดชเดพเดเตเดเตเดเดฟเตปเตเดฑเต เดชเดเตเดเต เดจเดฟเตผเดฃเตเดฃเดฏเดฟเดเตเดเตเดจเตเดจเต. เดเดฃเดเตเดทเดจเดฟเดฒเต เด เดฏเดเตเดเดฏเดพเดณเตเดเต เดเดฆเตเดฏ เดชเดพเดเตเดเดฑเตเดฑเดพเดฃเดฟเดคเตเดจเตเดจเต SYN เดซเตเดฒเดพเดเต เดธเตเดเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเต. ACK เดซเตเดฒเดพเดเต เด เตผเดคเตเดฅเดฎเดพเดเตเดเตเดจเตเดจเดคเต เด เดฏเดเตเดเดฏเดพเตพเดเตเดเต เดฌเตเดฑเตเดฑเต เดตเดฐเตเดฏเตเดณเตเดณ เดเดฒเตเดฒเดพ เดเดฃเดเตเดทเตป เดกเดพเดฑเตเดฑเดฏเตเด เดฒเดญเดฟเดเตเดเต เดเดจเตเดจเดพเดฃเต
acknum
. เดเดฐเต เดชเดพเดเตเดเดฑเตเดฑเดฟเดจเต เดจเดฟเดฐเดตเดงเดฟ เดซเตเดฒเดพเดเตเดเตพ เดเดฃเตเดเดพเดฏเดฟเดฐเดฟเดเตเดเดพเด, เด เดตเดฏเตเดเต เดธเดเดฏเตเดเดจเดคเตเดคเดพเตฝ เดตเดฟเดณเดฟเดเตเดเดชเตเดชเตเดเตเดจเตเดจเต, เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดเดฐเต เดธเดฟเดจเดพเดเตเดเต เดชเดพเดเตเดเดฑเตเดฑเต. -
เดธเตเดเตเดตเตปเดธเต เดจเดฎเตเดชเตผ (seqnum) เด เดชเดพเดเตเดเดฑเตเดฑเดฟเตฝ เดเตเดฎเดพเดฑเตเดฑเด เดเตเดฏเตเดฏเดชเตเดชเตเดเตเดจเตเดจ เดเดฆเตเดฏ เดฌเตเดฑเตเดฑเดฟเดจเตเดณเตเดณ เดกเดพเดฑเตเดฑ เดธเตเดเตเดฐเตเดฎเดฟเดฒเต เดเดซเตเดธเตเดฑเตเดฑเต เดตเตเดฏเดเตเดคเดฎเดพเดเตเดเตเดจเตเดจเต. เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, X เดฌเตเดฑเตเดฑเต เดกเดพเดฑเตเดฑเดฏเตเดณเตเดณ เดเดฆเตเดฏ เดชเดพเดเตเดเดฑเตเดฑเดฟเตฝ เด เดจเดฎเตเดชเตผ N เดเดฏเดฟเดฐเตเดจเตเดจเตเดตเตเดเตเดเดฟเตฝ, เดชเตเดคเดฟเดฏ เดกเดพเดฑเตเดฑเดฏเตเดณเตเดณ เด เดเตเดคเตเดค เดชเดพเดเตเดเดฑเตเดฑเดฟเตฝ เดเดคเต N+X เดเดฏเดฟเดฐเดฟเดเตเดเตเด. เดเดฃเดเตเดทเตปเตเดฑเต เดคเตเดเดเตเดเดคเตเดคเดฟเตฝ, เดเดฐเต เดตเดถเดตเตเด เด เดจเดฎเตเดชเตผ เดเตเดฐเดฎเดฐเดนเดฟเดคเดฎเดพเดฏเดฟ เดคเดฟเดฐเดเตเดเตเดเตเดเตเดเตเดจเตเดจเต.
-
เด เดเดเตเดเดพเดฐ เดจเดฎเตเดชเตผ (เด เดเตโเดจเด) - seqnum-เตปเตเดฑเต เด เดคเต เดเดซเตโเดธเตเดฑเตเดฑเต, เดเดจเตเดจเดพเตฝ เดเดคเต เดเตเดฎเดพเดฑเตเดฑเด เดเตเดฏเตเดฏเดชเตเดชเตเดเตเดจเตเดจ เดฌเตเดฑเตเดฑเดฟเตปเตเดฑเต เดเดฃเตเดฃเด เดจเดฟเตผเดฃเตเดฃเดฏเดฟเดเตเดเตเดจเตเดจเดฟเดฒเตเดฒ, เดเดจเตเดจเดพเตฝ เดธเตเดตเตเดเตผเดคเตเดคเดพเดตเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดเดฆเตเดฏ เดฌเตเดฑเตเดฑเดฟเตปเตเดฑเต เดเดฃเตเดฃเด, เด เดคเต เด เดฏเดเตเดเดฏเดพเตพ เดเดฃเตเดเดฟเดฒเตเดฒ.
เดเดฃเดเตเดทเตปเตเดฑเต เดคเตเดเดเตเดเดคเตเดคเดฟเตฝ, เดเดเตเดทเดฟเดเตพ เดธเดฎเตเดฎเดคเดฟเดเตเดเดฃเด 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-เดฒเตเดเตเดเต เดชเตเดฐเดคเดฟเดเดฐเดฟเดเตเดเตเด;
- RST เดเดชเดฏเตเดเดฟเดเตเดเต ACK เดฏเตเดเต เดชเตเดฐเดคเดฟเดเดฐเดฟเดเตเดเตเด (เดตเดฟเดเตเดเตเดฆเดฟเดเตเดเตเด);
- เดฌเดพเดเตเดเดฟเดฏเตเดณเตเดณ เดชเดพเดเตเดเดฑเตเดฑเตเดเตพ เดเดชเตเดเตเดทเดฟเดเตเดเตเด.
เดชเดพเดเตเดเตเดเต เดชเดพเดดเตโเดธเดฟเดเดเต เดธเดนเดฟเดคเด เด เตฝเดเตเดฐเดฟเดคเดคเตเดคเดฟเตปเตเดฑเต เดธเตเดฏเตเดกเตเดเตเดกเต:
ะัะปะธ ััะพ ะฝะต Ethernet,
ะฟัะพะฟัััะธัั ะฟะฐะบะตั.
ะัะปะธ ััะพ ะฝะต IPv4,
ะฟัะพะฟัััะธัั ะฟะฐะบะตั.
ะัะปะธ ะฐะดัะตั ะฒ ัะฐะฑะปะธัะต ะฟัะพะฒะตัะตะฝะฝัั
, (*)
ัะผะตะฝััะธัั ััะตััะธะบ ะพััะฐะฒัะธั
ัั ะฟัะพะฒะตัะพะบ,
ะฟัะพะฟัััะธัั ะฟะฐะบะตั.
ะัะปะธ ััะพ ะฝะต TCP,
ัะฑัะพัะธัั ะฟะฐะบะตั. (**)
ะัะปะธ ััะพ SYN,
ะพัะฒะตัะธัั SYN-ACK ั cookie.
ะัะปะธ ััะพ ACK,
ะตัะปะธ ะฒ acknum ะปะตะถะธั ะฝะต cookie,
ัะฑัะพัะธัั ะฟะฐะบะตั.
ะะฐะฝะตััะธ ะฒ ัะฐะฑะปะธัั ะฐะดัะตั ั N ะพััะฐะฒัะธั
ัั ะฟัะพะฒะตัะพะบ. (*)
ะัะฒะตัะธัั RST. (**)
ะ ะพััะฐะปัะฝัั
ัะปััะฐัั
ัะฑัะพัะธัั ะฟะฐะบะตั.
เดเดจเตเดจเต (*)
เดจเดฟเดเตเดเตพ เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเตปเตเดฑเต เด
เดตเดธเตเดฅ เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเดเตเดเตเดฃเตเด เดชเตเดฏเดฟเตปเตเดฑเตเดเตพ เด
เดเดฏเดพเดณเดชเตเดชเตเดเตเดคเตเดคเดฟเดฏเดฟเดฐเดฟเดเตเดเตเดจเตเดจเต - เดเดฆเตเดฏ เดเดเตเดเดคเตเดคเดฟเตฝ, เดเดฐเต SYN เดเตเดเตเดเดฟเดฏเตเดเต เดเดฐเต เดธเตเดเตโเดจเด เดเดจเตเดจ เดจเดฟเดฒเดฏเดฟเตฝ เดเดฐเต TCP เดนเดพเตปเดกเตโเดทเตเดเตเดเต เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตเดจเตเดจเดคเดฟเดฒเตเดเต เดจเดฟเดเตเดเตพเดเตเดเต เด
เดต เดเตเดเดพเดคเต เดคเดจเตเดจเต เดเตเดฏเตเดฏเดพเตป เดเดดเดฟเดฏเตเด.
เดธเตเดฅเดฒเดคเตเดคเตเดคเดจเตเดจเต (**)
, เดเดเตเดเตพเดเตเดเต เดเดฐเต เดฎเตเดถ เดเดฒเตเดฒเตเดเตเดเดฟเดฒเตเด, เดเดเตเดเตพ เดชเดพเดเตเดเดฑเตเดฑเต เดเดดเดฟเดตเดพเดเตเดเตเด.
TCP เดนเดพเตปเดกเตโเดทเตเดเตเดเต เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตเดจเตเดจเต
เดชเดพเดเตเดเตเดเต เดชเดพเดดเตโเดธเต เดเตเดฏเตเดฏเตเดเดฏเตเด เดเตเดกเต เดธเตเดฅเดฟเดฐเตเดเดฐเดฟเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดฏเตเดจเตเดจเต
เดเดเตเดเตพเดเตเดเต เดจเตเดฑเตเดฑเตโเดตเตผเดเตเดเต เดนเตเดกเตผ เดเดเดจเดเตพ เดเดตเดถเตเดฏเดฎเดพเดฃเต: เดเดฅเตผเดจเตเดฑเตเดฑเต (uapi/linux/if_ether.h
), IPv4 (uapi/linux/ip.h
) เดเตเดเดพเดคเต TCP (uapi/linux/tcp.h
). เดเดคเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดชเตเดชเตเดเตเด เดชเดฟเดถเดเตเดเตพ เดเดพเดฐเดฃเด เดเดจเดฟเดเตเดเต เดฐเดฃเตเดเดพเดฎเดคเตเดคเตเดคเต เดฌเดจเตเดงเดฟเดชเตเดชเดฟเดเตเดเดพเตป เดเดดเดฟเดเตเดเดฟเดฒเตเดฒ atomic64_t
, เดเดจเดฟเดเตเดเต เดเดตเดถเตเดฏเดฎเดพเดฏ เดจเดฟเตผเดตเดเดจเดเตเดเตพ เดเตเดกเดฟเดฒเตเดเตเดเต เดชเดเตผเดคเตเดคเตเดฃเตเดเดฟ เดตเดจเตเดจเต.
เดเตเตผเดฃเดฒเดฟเดฒเต eBPF เดตเตเดฐเดฟเดซเดฏเตผ เดฌเดพเดเตเดเตโเดเตเดฐเดพเดเตเดเดฟเดเดเต เดจเดฟเดฐเตเดงเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเดพเตฝ, เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ, เดฒเตเดชเตเดชเตเดเดณเตเด เดซเดเดเตโเดทเตป เดเตเดณเตเดเดณเตเด, เดฑเตเดกเดฌเดฟเดฒเดฟเดฑเตเดฑเดฟเดเตเดเดพเดฏเดฟ C-เดฏเดฟเตฝ เดนเตเดฒเตเดฑเตเดฑเต เดเตเดฏเตโเดคเดฟเดฐเดฟเดเตเดเตเดจเตเดจ เดเดฒเตเดฒเดพ เดซเดเดเตโเดทเดจเตเดเดณเตเด เดเตเตพ เดชเตเดฏเดฟเตปเตเดฑเดฟเตฝ เดเตปเดฒเตเตป เดเตเดฏเตเดคเดฟเดฐเดฟเดเตเดเดฃเด.
#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-เดจเตเดณเตเดณ เดฎเดฑเตเดชเดเดฟ
เด เดเดเตเดเดคเตเดคเดฟเดฒเต เดฒเดเตเดทเตเดฏเด เดซเดฟเดเตเดธเดกเต เดเดชเดฏเตเดเดฟเดเตเดเต เดถเดฐเดฟเดฏเดพเดฏ เดธเดฟเดจเดพเดเตเดเต เดชเดพเดเตเดเดฑเตเดฑเต เดธเตเดทเตเดเดฟเดเตเดเตเด เดเดจเตเดจเดคเดพเดฃเต 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 เดฌเตเดฑเตเดฑเตเดเตพ เดตเดฐเต. เดจเดฟเดเตเดเตพเดเตเดเต เดเดฐเต เดจเดฟเดถเตเดเดฟเดค เดเดฃเตเดฃเด เดเดตเตผเดคเตเดคเดจเดเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเต เดเดฐเต เดฒเตเดชเตเดชเต เดเดฃเตเดเดพเดเตเดเดพเด, เด เดคเต เดจเตเดฐเดคเตเดคเต เด เดตเดธเดพเดจเดฟเดเตเดเตเด.
เดเดฃเตเดเตเดจเตเดจเต เดเดพเตป เดถเตเดฐเดฆเตเดงเดฟเดเตเดเตเดจเตเดจเต
เดเตเดเตเดเตเดธเด เดเดฃเดเตเดเตเดเตเดเตเดเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดจเด:
#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
เดจเตเดฑเตเดฑเตโเดตเตผเดเตเดเต เดธเตเดฑเตเดฑเดพเดเตเดเดฟเดจเต SYN เดฒเดญเดฟเดเตเดเดพเดคเตเดคเดคเดฟเดจเดพเตฝ เด
เดตเดธเดพเดจ ACK เดจเดทเตโเดเดฎเดพเดฏเดฟ, เดฒเดฟเดจเดเตเดธเต เดเดฐเต RST เดชเดพเดเตเดเดฑเตเดฑเต เดเดชเดฏเตเดเดฟเดเตเดเต เดชเตเดฐเดคเดฟเดเดฐเดฟเดเตเดเต - เด
เดคเต SYNACK-เดฒเตเดเตเดเต เดชเดฐเดฟเดตเตผเดคเตเดคเดจเด เดเตเดฏเตโเดคเต เดคเดฟเดฐเดฟเดเต เด
เดฏเดเตเดเต - เดเตเดเดพเดคเต OS เดตเตเดเตเดทเดฃเดเตเดฃเดฟเตฝ เดจเดฟเดจเตเดจเต, เดคเตเดฑเดเตเดเตเดจเตเดจเดคเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดฎเดฟเดฒเตเดฒเดพเดคเตเดค เดเดฐเต เดชเดพเดเตเดเดฑเตเดฑเต เดเดคเตเดคเดฟ. เดเดฃเดเตเดทเดจเตเดเตพ.
$ sudo ip netns exec xdp-test nc -nv 192.0.2.1 6666
192.0.2.1 6666: Connection reset by peer
เดชเตเตผเดฃเตเดฃเดฎเดพเดฏ เดเดชเตเดฒเดฟเดเตเดเตเดทเดจเตเดเตพ เดชเดฐเดฟเดถเตเดงเดฟเดเตเดเต เดจเดฟเดฐเตเดเตเดทเดฟเดเตเดเตเดฃเตเดเดคเต เดชเตเดฐเดงเดพเดจเดฎเดพเดฃเต tcpdump
เดเตบ xdp-remote
เดเดพเดฐเดฃเด, เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, hping3
เดคเตเดฑเตเดฑเดพเดฏ เดเตเดเตเดเตเดธเดเตเดเดณเตเดเต เดชเตเดฐเดคเดฟเดเดฐเดฟเดเตเดเตเดจเตเดจเดฟเดฒเตเดฒ.
SYN เดเตเดเตเดเดฟ
เดเดฐเต XDP เดตเตเดเตเดทเดฃเดเตเดฃเดฟเตฝ เดจเดฟเดจเตเดจเต, เดธเตเดฅเดฟเดฐเตเดเดฐเดฃเด เดคเดจเตเดจเต เดจเดฟเดธเตเดธเดพเดฐเดฎเดพเดฃเต. เดเดฃเดเตเดเตเดเตเดเตเดเตฝ เด เตฝเดเตเดฐเดฟเดคเด เดชเตเดฐเดพเดเตเดคเดตเตเด เดธเดเตเดเตเตผเดฃเตเดฃเดฎเดพเดฏ เดเดเตเดฐเดฎเดฃเดเดพเดฐเดฟเดเตเดเต เดธเดพเดงเตเดฏเดคเดฏเตเดณเตเดณเดคเตเดฎเดพเดฃเต. เดเดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, 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 เดจเดฟเดเตเดเดณเต เด เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจเต, เดเตเดเดพเดคเต, เดเตเดฐเดพเดซเดฟเดเต เดชเตเดฐเตเดธเดธเตเดธเดฟเดเดเดฟเตฝ เดคเดเดธเตเดธเดฎเดฟเดฒเตเดฒเดพเดคเต เด เดชเตเดกเตเดฑเตเดฑเต เดเตเดฏเตเดฏเดพเตป เดเดณเตเดชเตเดชเดฎเดพเดฃเต. เดตเตเดฐเดฟเดซเดฏเตผ เดตเตเดฏเดเตเดคเดฟเดชเดฐเดฎเดพเดฏเดฟ เดตเดฒเดฟเดฏ เดชเตเดฐเดถเตโเดจเดเตเดเตพ เดธเตเดทเตเดเดฟเดเตเดเตเดจเตเดจเดฟเดฒเตเดฒ, เดฏเตเดธเตผเดธเตโเดชเตเดธเต เดเตเดกเดฟเตปเตเดฑเต เดญเดพเดเดเตเดเตพเดเตเดเดพเดฏเดฟ เดเดพเตป เดเดคเต เดจเดฟเดฐเดธเดฟเดเตเดเดฟเดฒเตเดฒ.
เดฐเดฃเตเดเดพเด เดญเดพเดเดคเตเดคเต, เดตเดฟเดทเดฏเด เดฐเดธเดเดฐเดฎเดพเดฃเตเดเตเดเดฟเตฝ, เดเดเตเดเตพ เดชเดฐเดฟเดถเตเดงเดฟเดเตเด เดเตเดฒเดฏเตปเตเดฑเตเดเดณเตเดเตเดฏเตเด เดกเดฟเดธเตเดเดฃเดเตเดทเดจเตเดเดณเตเดเตเดฏเตเด เดชเดเตเดเดฟเด เดชเตเตผเดคเตเดคเดฟเดฏเดพเดเตเดเตเดเดฏเตเด เดเตเดฃเตเดเดฑเตเดเตพ เดจเดเดชเตเดชเดฟเดฒเดพเดเตเดเตเดเดฏเตเด เดซเดฟเตฝเดเตเดเตผ เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต เดเดฐเต เดฏเตเดธเตผเดธเตเดชเตเดธเต เดฏเตเดเตเดเดฟเดฒเดฟเดฑเตเดฑเดฟ เดเดดเตเดคเตเดเดฏเตเด เดเตเดฏเตเดฏเตเด.
เดฑเตเดซเดฑเตปเดธเตเดเตพ:
GitHub-เดฒเต เดชเตเตผเดฃเตเดฃ เดเตเดกเต bpftrace เดเตเดฑเตเดฑเต เดทเตเดฑเตเดฑเต BPF, XDP เดฑเดซเดฑเตปเดธเต เดเตเดกเต XDP เดเตเดฏเตเดเตเดเตเดฑเดฟเดฏเตฝ PoC: เดฑเดธเตเดฑเตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต eBPF-เดฒเตเดเตเดเต เดเดเดชเตเตฝ เดเตเดฏเตเดฏเตเดจเตเดจเต
เด เดตเดฒเดเดฌเด: www.habr.com