XDP-เดฏเดฟเตฝ DDoS เด†เด•เตเดฐเดฎเดฃเด™เตเด™เตพเด•เตเด•เต†เดคเดฟเดฐเต† เดžเด™เตเด™เตพ เดชเดฐเดฟเดฐเด•เตเดท เดŽเดดเตเดคเตเดจเตเดจเต. เดจเตเดฏเต‚เด•เตเดฒเดฟเดฏเตผ เดญเดพเด—เด‚

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 เดธเดนเดพเดฏเดฟเด•เตพ) เด•เต‹เดณเตเด•เตพ เดฎเดพเดคเตเดฐเดฎเต‡ เด…เดจเตเดตเดฆเดฟเด•เตเด•เต‚.

เด’เดฐเต เดซเดฟเตฝเดŸเตเดŸเตผ เดฐเต‚เดชเด•เตฝเดชเตเดชเดจ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเตเด‚ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเตเด‚ เด‡เดคเตเดชเต‹เดฒเต† เด•เดพเดฃเดชเตเดชเต†เดŸเตเดจเตเดจเต:

  1. เด‰เดฑเดตเดฟเดŸ เด•เต‹เดกเต (เด‰เดฆเดพ kernel.c) เด’เดฌเตเดœเด•เตเดฑเตเดฑเดฟเดฒเต‡เด•เตเด•เต เดธเดฎเดพเดนเดฐเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต (kernel.o) eBPF เดตเต†เตผเดšเตเดตเตฝ เดฎเต†เดทเต€เตป เด†เตผเด•เตเด•เดฟเดŸเต†เด•เตเดšเดฑเดฟเดจเดพเดฏเดฟ. 2019 เด’เด•เตโ€ŒเดŸเต‹เดฌเตผ เดฎเตเดคเตฝ, eBPF-เดฒเต‡เด•เตเด•เตเดณเตเดณ เดธเดฎเดพเดนเดพเดฐเด‚ Clang เดชเดฟเดจเตเดคเตเดฃเดฏเตโ€Œเด•เตเด•เตเด•เดฏเตเด‚ GCC 10.1-เตฝ เดตเดพเด—เตเดฆเดพเดจเด‚ เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.
  2. เดˆ เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเต เด•เต‹เดกเดฟเตฝ เด•เต‡เตผเดฃเตฝ เด˜เดŸเดจเด•เดณเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เด•เต‹เดณเตเด•เตพ เด…เดŸเด™เตเด™เดฟเดฏเดฟเดŸเตเดŸเตเดฃเตเดŸเต†เด™เตเด•เดฟเตฝ (เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดชเดŸเตเดŸเดฟเด•เด•เดณเตเด‚ เด•เต—เดฃเตเดŸเดฑเตเด•เดณเตเด‚), เด…เดตเดฏเตเดŸเต† เดเดกเดฟเด•เตพ เดชเต‚เดœเตเดฏเด™เตเด™เดณเดพเตฝ เดฎเดพเดฑเตเดฑเดฟเดธเตเดฅเดพเดชเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดจเตเดจเต, เด…เดคเดพเดฏเดคเต เด…เดคเตเดคเดฐเด‚ เด•เต‹เดกเต เดŽเด•เตโ€Œเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ. เด•เต‡เตผเดฃเดฒเดฟเดฒเต‡เด•เตเด•เต เดฒเต‹เดกเตเดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต เดฎเตเดฎเตเดชเต, เด•เต‡เตผเดฃเตฝ เด•เต‹เดณเตเด•เตพ เดตเดดเดฟ เดธเตƒเดทเตเดŸเดฟเดšเตเดš เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเตเด•เดณเตเดŸเต† เดเดกเดฟเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดˆ เดชเต‚เดœเตเดฏเด™เตเด™เตพ เดฎเดพเดฑเตเดฑเดฟเดธเตเดฅเดพเดชเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต (เด•เต‹เดกเต เดฒเดฟเด™เตเด•เต เดšเต†เดฏเตเดฏเตเด•). เดฌเดพเดนเตเดฏ เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‡เดคเต เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚, เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด’เดฐเต เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ เดซเดฟเตฝเดŸเตเดŸเตผ เดฒเดฟเด™เตเด•เต เดšเต†เดฏเตเดคเต เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจ เด’เดฐเต เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดŽเดดเตเดคเดพเด‚.
  3. เด•เต‡เตผเดฃเตฝ เดฒเต‹เดกเต เดšเต†เดฏเตเดค เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเต. เดธเตˆเด•เตเด•เดฟเดณเตเด•เดณเตเดŸเต† เด…เดญเดพเดตเดตเตเด‚ เดชเดพเด•เตเด•เดฑเตเดฑเต, เดธเตเดฑเตเดฑเดพเด•เตเด•เต เดฌเต—เดฃเตเดŸเดฑเดฟเด•เตพ เด•เดตเดฟเดฏเดพเดจเตเดณเตเดณ เดชเดฐเดพเดœเดฏเดตเตเด‚ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเต. เด•เต‹เดกเต เดถเดฐเดฟเดฏเดพเดฃเต†เดจเตเดจเต เดตเต†เดฐเดฟเดซเดฏเตผ เดคเต†เดณเดฟเดฏเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดจเดฟเดฐเดธเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดŸเต - เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด…เดตเดจเต† เดชเตเดฐเดธเดพเดฆเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเดฃเด‚.
  4. เดตเดฟเดœเดฏเด•เดฐเดฎเดพเดฏ เดธเตเดฅเดฟเดฐเต€เด•เดฐเดฃเดคเตเดคเดฟเดจเต เดถเต‡เดทเด‚, เด•เต‡เตผเดฃเตฝ eBPF เด†เตผเด•เตเด•เดฟเดŸเต†เด•เตเดšเตผ เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเต เด•เต‹เดกเต เดธเดฟเดธเตเดฑเตเดฑเด‚ เด†เตผเด•เตเด•เดฟเดŸเต†เด•เตเดšเดฑเดฟเดจเดพเดฏเตเดณเตเดณ เดฎเต†เดทเต€เตป เด•เต‹เดกเดฟเดฒเต‡เด•เตเด•เต เดธเดฎเดพเดนเดฐเดฟเด•เตเด•เตเดจเตเดจเต (เด‡เดคเต เดธเดฎเดฏเดคเตเดคเตเดคเดจเตเดจเต†).
  5. เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เด‡เตปเตเดฑเตผเดซเต‡เดธเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดฟเดชเตเดชเดฟเดšเตเดšเต เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เตพ เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดฏเดพเตป เดคเตเดŸเด™เตเด™เตเดจเตเดจเต.

เดŽเด•เตเดธเตเดกเดฟเดชเดฟ เด•เต‡เตผเดฃเดฒเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเตฝ, เดŸเตเดฐเต†เดฏเตเดธเต เดฒเต‹เด—เตเด•เดณเตเด‚ เดตเดพเดธเตเดคเดตเดคเตเดคเดฟเตฝ, เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดซเดฟเตฝเดŸเตเดŸเตผ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต‹ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเต‹ เด†เดฏ เดชเดพเด•เตเด•เดฑเตเดฑเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเดพเดฃเต เดกเต€เดฌเด—เตเด—เดฟเด‚เด—เต เดจเดŸเดคเตเดคเตเดจเตเดจเดคเต. เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เดกเต—เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดค เด•เต‹เดกเต เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดจเต เดธเตเดฐเด•เตเดทเดฟเดคเดฎเดพเดฃเต†เดจเตเดจเต eBPF เด‰เดฑเดชเตเดชเดพเด•เตเด•เตเดจเตเดจเต, เด…เดคเดฟเดจเดพเตฝ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดจเดฟเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเดพเดฆเต‡เดถเดฟเด• เดฒเดฟเดจเด•เตเดธเดฟเตฝ เดจเต‡เดฐเดฟเดŸเตเดŸเต XDP เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚.

เดชเดฐเดฟเดธเตเดฅเดฟเดคเดฟ เด’เดฐเตเด•เตเด•เตเดจเตเดจเต

เดจเดฟเดฏเดฎเดธเดญ

eBPF เด†เตผเด•เตเด•เดฟเดŸเต†เด•เตเดšเดฑเดฟเดจเดพเดฏเดฟ Clang-เดจเต เดจเต‡เดฐเดฟเดŸเตเดŸเต เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเต เด•เต‹เดกเต เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ, เด…เดคเดฟเดจเดพเตฝ เดชเตเดฐเด•เตเดฐเดฟเดฏ เดฐเดฃเตเดŸเต เด˜เดŸเตเดŸเด™เตเด™เตพ เด‰เตพเด•เตเด•เตŠเดณเตเดณเตเดจเตเดจเต:

  1. LLVM เดฌเตˆเดฑเตเดฑเตเด•เต‹เดกเดฟเดฒเต‡เด•เตเด•เต C เด•เต‹เดกเต เด•เด‚เดชเตˆเตฝ เดšเต†เดฏเตเดฏเตเด• (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__ เด•เต‡เตผเดฃเดฒเดฟเตฝ เดซเดฟเตฝเดŸเตเดŸเตผ เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเตฝ เดฏเตเดŽเดชเดฟเด (เดฏเต‚เดธเตโ€Œเดชเต‡เดธเต เดŽเดชเดฟเด) เดนเต†เดกเดฑเตเด•เตพ เด•เต‡เตผเดฃเตฝ เด•เต‹เดกเดฟเดจเดพเดฏเดฟ เดจเดฟเตผเดตเดšเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต เดŽเดจเตเดจเดพเดฃเต เด…เตผเดคเตเดฅเดฎเดพเด•เตเด•เตเดจเตเดจเดคเต.

เดธเตเดฑเตเดฑเดพเด•เตเด•เต เดธเด‚เดฐเด•เตเดทเดฃเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดจเดฐเดนเดฟเดคเดฎเดพเด•เตเด•เดพเด‚ (-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 เด’เดฐเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด‚ เด…เดธเตˆเตป เดšเต†เดฏเตเดคเต, เด…เดคเต เดถเต‚เดจเตเดฏเดฎเดพเดฃเต†เด™เตเด•เดฟเดฒเตเด‚, เด…เดตเดจเต† เดตเดณเตผเดคเตเดคเดฟ.

เดžเดพเตป เด‡เดคเต†เด™เตเด™เดจเต† เด…เดฑเดฟเดžเตเดžเต?

เด•เต†เตผเดฃเดฒเดฟเตฝ เด’เดฐเต เดชเดพเด•เตเด•เต‡เดœเดฟเตปเตเดฑเต† เดชเดพเดค เด•เดฃเตเดŸเต†เดคเตเดคเตเด• เดชเต†เตผเดซเต เด‡เดตเตปเตเดฑเต เดฎเต†เด•เตเด•เดพเดจเดฟเดธเด‚, เด…เดคเต‡ เดตเต†เตผเดšเตเดตเตฝ เดฎเต†เดทเต€เตป เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต, เด…เดคเดพเดฏเดคเต, 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, เด‡เดคเต 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 เดฌเตˆเดฑเตเดฑเตเด•เตพ เดตเดฐเต†. เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เดจเดฟเดถเตเดšเดฟเดค เดŽเดฃเตเดฃเด‚ เด†เดตเตผเดคเตเดคเดจเด™เตเด™เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดฒเต‚เดชเตเดชเต เด‰เดฃเตเดŸเดพเด•เตเด•เดพเด‚, เด…เดคเต เดจเต‡เดฐเดคเตเดคเต† เด…เดตเดธเดพเดจเดฟเด•เตเด•เตเด‚.

เด‰เดฃเตเดŸเต†เดจเตเดจเต เดžเดพเตป เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เตเดจเตเดจเต RFC 1624 เดชเดพเด•เตเด•เต‡เดœเตเด•เดณเตเดŸเต† เดจเดฟเดถเตเดšเดฟเดค เดตเดพเด•เตเด•เตเด•เตพ เดฎเดพเดคเตเดฐเด‚ เดฎเดพเดฑเตเดฑเดฟเดฏเดพเตฝ เดšเต†เด•เตเด•เตเดธเด‚ เดญเดพเด—เดฟเด•เดฎเดพเดฏเดฟ เดŽเด™เตเด™เดจเต† เดตเต€เดฃเตเดŸเตเด‚ เด•เดฃเด•เตเด•เดพเด•เตเด•เดพเด‚ เดŽเดจเตเดจเดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต. เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เดฐเต€เดคเดฟ เดธเดพเตผเดตเดคเตเดฐเดฟเด•เดฎเดฒเตเดฒ, เดจเดŸเดชเตเดชเดพเด•เตเด•เตฝ เดจเดฟเดฒเดจเดฟเตผเดคเตเดคเดพเตป เด•เต‚เดŸเตเดคเตฝ เดฌเตเดฆเตเดงเดฟเดฎเตเดŸเตเดŸเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚.

เดšเต†เด•เตเด•เตเดธเด‚ เด•เดฃเด•เตเด•เตเด•เต‚เดŸเตเดŸเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚:

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

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

เดŽเด™เตเด•เดฟเดฒเตเด‚ size เด•เต‹เดณเดฟเด‚เด—เต เด•เต‹เดกเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเดฐเดฟเดถเต‹เดงเดฟเดšเตเดšเตเดฑเดชเตเดชเดฟเดšเตเดšเดพเตฝ, เดฐเดฃเตเดŸเดพเดฎเดคเตเดคเต† เดŽเด•เตเดธเดฟเดฑเตเดฑเต เดตเตเดฏเดตเดธเตเดฅ เด†เดตเดถเตเดฏเดฎเดพเดฃเต, เด…เดคเดฟเดจเดพเตฝ เดตเต†เดฐเดฟเดซเดฏเตผเด•เตเด•เต เดฒเต‚เดชเตเดชเดฟเตปเตเดฑเต† เดชเต‚เตผเดคเตเดคเต€เด•เดฐเดฃเด‚ เดคเต†เดณเดฟเดฏเดฟเด•เตเด•เดพเดจเดพเด•เตเด‚.

32-เดฌเดฟเดฑเตเดฑเต เดตเดพเด•เตเด•เตเด•เตพเด•เตเด•เต, เด’เดฐเต เดฒเดณเดฟเดคเดฎเดพเดฏ เดชเดคเดฟเดชเตเดชเต เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต:

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

เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ เดšเต†เด•เตเด•เตเดธเด‚ เดตเต€เดฃเตเดŸเตเด‚ เด•เดฃเด•เตเด•เดพเด•เตเด•เตเด•เดฏเตเด‚ เดชเดพเด•เตเด•เดฑเตเดฑเต เดคเดฟเดฐเดฟเด•เต† เด…เดฏเดฏเตเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต:

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

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

return XDP_TX;

เดซเด‚เด—เตเดทเตป carry() RFC 32 เด…เดจเตเดธเดฐเดฟเดšเตเดšเต, 16-เดฌเดฟเดฑเตเดฑเต เดตเดพเด•เตเด•เตเด•เดณเตเดŸเต† 791-เดฌเดฟเดฑเตเดฑเต เดคเตเด•เดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เด’เดฐเต เดšเต†เด•เตเด•เตเดธเด‚ เด‰เดฃเตเดŸเดพเด•เตเด•เตเดจเตเดจเต.

TCP เดนเดพเตปเดกเตโ€Œเดทเต‡เด•เตเด•เต เดธเตเดฅเดฟเดฐเต€เด•เดฐเดฃเด‚

เดซเดฟเตฝเดŸเตเดŸเตผ เดถเดฐเดฟเดฏเดพเดฏเดฟ เด’เดฐเต เด•เดฃเด•เตเดทเตป เดธเตเดฅเดพเดชเดฟเด•เตเด•เตเดจเตเดจเต netcatเดจเต†เดฑเตเดฑเตโ€Œเดตเตผเด•เตเด•เต เดธเตเดฑเตเดฑเดพเด•เตเด•เดฟเดจเต 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 เดคเต†เดฑเตเดฑเดพเดฏ เดšเต†เด•เตเด•เตเดธเด™เตเด™เดณเต‹เดŸเต เดชเตเดฐเดคเดฟเด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ.

เด’เดฐเต 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

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•