eXpress เชกเซเชเชพ เชชเชพเชฅ (XDP) เชเซเชเซเชจเซเชฒเซเชเซ เชชเซเชเซเชเซ เชเชฐเซเชจเชฒ เชจเซเชเชตเชฐเซเช เชธเซเชเซเชเชฎเชพเช เชฆเชพเชเชฒ เชฅเชพเชฏ เชคเซ เชชเชนเซเชฒเชพเช Linux เชเชจเซเชเชฐเชซเซเชธ เชชเชฐ เชเซเชฐเชพเชซเชฟเชเชจเซ เชฎเชจเชธเซเชตเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ เชเซ. XDP เชจเซ เชเชชเซเชฒเชฟเชเซเชถเชจ - DDoS เชนเซเชฎเชฒเชพเช (CloudFlare), เชเชเชฟเชฒ เชซเชฟเชฒเซเชเชฐเซเชธ, เชเชเชเชกเชพ เชธเชเชเซเชฐเชน (Netflix) เชธเชพเชฎเซ เชฐเชเซเชทเชฃ. XDP เชชเซเชฐเซเชเซเชฐเชพเชฎเซเชธ eBPF เชตเชฐเซเชเซเชฏเซเช เชฒ เชฎเชถเซเชจ เชฆเซเชตเชพเชฐเชพ เชเชเซเชเชฟเชเซเชฏเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เช เชจเซ เชคเซเชฅเซ เชซเชฟเชฒเซเชเชฐเชจเชพ เชชเซเชฐเชเชพเชฐเชจเซ เชเชงเชพเชฐเซ เชคเซเชฎเชจเชพ เชเซเชก เช เชจเซ เชเชชเชฒเชฌเซเชง เชเชฐเซเชจเชฒ เชซเชเชเซเชถเชจ เชฌเชเชจเซ เชชเชฐ เชจเชฟเชฏเชเชคเซเชฐเชฃเซ เชนเซเชฏ เชเซ.
เชฒเซเช XDP เชชเชฐเชจเซ เช เชธเชเชเซเชฏ เชธเชพเชฎเชเซเชฐเซเชจเซ เชเชพเชฎเซเชเชจเซ เชฆเซเชฐ เชเชฐเชตเชพเชจเซ เชเซ. เชชเซเชฐเชฅเชฎ, เชคเซเช เชคเซเชฏเชพเชฐ เชเซเชก เชชเซเชฐเชฆเชพเชจ เชเชฐเซ เชเซ เชเซ เชคเชฐเชค เช XDP เชจเซ เชธเซเชตเชฟเชงเชพเชเชจเซ เชฌเชพเชฏเชชเชพเชธ เชเชฐเซ เชเซ: เชเชเชพเชธเชฃเซ เชฎเชพเชเซ เชคเซเชฏเชพเชฐ เช เชฅเชตเชพ เชธเชฎเชธเซเชฏเชพเช เชเชญเซ เชเชฐเชตเชพ เชฎเชพเชเซ เชเซเชฌ เชธเชฐเชณ. เชเซเชฏเชพเชฐเซ เชคเชฎเซ เชชเชเซเชฅเซ เชถเชฐเซเชเชคเชฅเซ เชคเชฎเชพเชฐเซ เชชเซเชคเชพเชจเซ เชเซเชก เชฒเชเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเซ เชเซ, เชคเซเชฏเชพเชฐเซ เชฒเชพเชเซเชทเชฃเชฟเช เชญเซเชฒเซ เชธเชพเชฅเซ เชถเซเช เชเชฐเชตเซเช เชคเซเชจเซ เชเซเช เชธเชฎเชเชฃ เชจเชฅเซ. เชฌเซเชเซเช, เชคเซ VM เช เชจเซ เชนเชพเชฐเซเชกเชตเซเชฐ เชตเชฟเชจเชพ XDP เชจเซ เชธเซเชฅเชพเชจเชฟเช เชฐเซเชคเซ เชเชเชพเชธเชตเชพเชจเซ เชฐเซเชคเซเชจเซ เชเชตเชฐเซ เชฒเซเชคเซเช เชจเชฅเซ, เชคเซ เชนเชเซเชเชค เชนเซเชตเชพ เชเชคเชพเช เชเซ เชคเซเชฎเชจเซ เชชเซเชคเชพเชจเซ เชฎเซเชถเซเชเซเชฒเซเช เชเซ. เชเซเชเซเชธเซเชเชจเซ เชนเซเชคเซ เชจเซเชเชตเชฐเซเชเซเชธ เช เชจเซ เชฒเชฟเชจเชเซเชธเชฅเซ เชชเชฐเชฟเชเชฟเชค เชเชตเชพ เชชเซเชฐเซเชเซเชฐเชพเชฎเชฐเซ เชฎเชพเชเซ เชเซ เชเซเช XDP เช เชจเซ eBPF เชฎเชพเช เชฐเชธ เชงเชฐเชพเชตเซ เชเซ.
เช เชญเชพเชเชฎเชพเช, เช
เชฎเซ XDP เชซเชฟเชฒเซเชเชฐเชจเซ เชเซเชตเซ เชฐเซเชคเซ เชเชธเซเชฎเซเชฌเชฒ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ เช
เชจเซ เชคเซเชจเซเช เชชเชฐเซเชเซเชทเชฃ เชเซเชตเซ เชฐเซเชคเซ เชเชฐเชตเซเช เชคเซ เชตเชฟเชเชคเชตเชพเชฐ เชธเชฎเชเซเชถเซเช, เชชเชเซ เช
เชฎเซ เชชเซเชเซเช เชชเซเชฐเซเชธเซเชธเชฟเชเช เชธเซเชคเชฐ เชชเชฐ เชเชพเชฃเซเชคเชพ SYN เชเซเชเซเช เชฎเชฟเชเซเชจเชฟเชเชฎเชจเซเช เชเช เชธเชฐเชณ เชธเชเชธเซเชเชฐเชฃ เชฒเชเซเชถเซเช. เชเซเชฏเชพเช เชธเซเชงเซ เชเชชเชฃเซ "เชตเซเชนเชพเชเช เชฒเชฟเชธเซเช" เชจ เชฌเชจเชพเชตเซเช
เชเชเชพเชธเชพเชฏเซเชฒ เชเซเชฐเชพเชนเชเซ, เชเชพเชเชจเซเชเชฐเซเชธ เชฐเชพเชเซ เช
เชจเซ เชซเชฟเชฒเซเชเชฐเชจเซเช เชธเชเชเชพเชฒเชจ เชเชฐเซ - เชชเชฐเซเชฏเชพเชชเซเชค เชฒเซเช.
เช เชฎเซ C เชฎเชพเช เชฒเชเซเชถเซเช - เช เชซเซเชถเชจเซเชฌเชฒ เชจเชฅเซ, เชชเชฐเชเชคเซ เชตเซเชฏเชตเชนเชพเชฐเซ เชเซ. เชฌเชงเชพ เชเซเชก GitHub เชชเชฐ เช เชเชคเชฎเชพเช เชฒเชฟเชเช เชชเชฐ เชเชชเชฒเชฌเซเชง เชเซ เช เชจเซ เชฒเซเชเชฎเชพเช เชตเชฐเซเชฃเชตเซเชฒ เชชเชเชฒเชพเช เช เชจเซเชธเชพเชฐ เชเชฎเชฟเชเซเชธเชฎเชพเช เชตเชฟเชญเชพเชเชฟเชค เชเซ.
เชกเชฟเชธเชเซเชฒเซเชฎเชฐ เชฒเซเช เชฆเชฐเชฎเชฟเชฏเชพเชจ, DDoS เชนเซเชฎเชฒเชพเชเชจเซ เชจเชฟเชตเชพเชฐเชตเชพ เชฎเชพเชเซ เชเช เชฎเชฟเชจเซ-เชธเซเชฒเซเชฏเซเชถเชจ เชตเชฟเชเชธเชพเชตเชตเชพเชฎเชพเช เชเชตเชถเซ, เชเชพเชฐเชฃ เชเซ เช XDP เช เชจเซ เชฎเชพเชฐเชพ เชตเชฟเชธเซเชคเชพเชฐ เชฎเชพเชเซ เชเช เชตเชพเชธเซเชคเชตเชฟเช เชเชพเชฐเซเชฏ เชเซ. เชเซ เชเซ, เชฎเซเชเซเชฏ เชงเซเชฏเซเชฏ เชเซเชเซเชจเซเชฒเซเชเซเชจเซ เชธเชฎเชเชตเชพเชจเซ เชเซ, เช เชคเซเชฏเชพเชฐ เชธเซเชฐเชเซเชทเชพ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชเซ เชฎเชพเชฐเซเชเชฆเชฐเซเชถเชฟเชเชพ เชจเชฅเซ. เชเซเชฏเซเชเซเชฐเซเชฏเชฒ เชเซเชก เชเชชเซเชเชฟเชฎเชพเชเช เชจเชฅเซ เช เชจเซ เชเซเชเชฒเซเช เชเซเชเชเชพเชเชจเซ เชเซเชกเซ เชฆเซ เชเซ.
XDP เชจเซ เชธเชเชเซเชทเชฟเชชเซเชค เชเชพเชเชเซ
เชนเซเช เชซเชเซเชค เชฎเซเชเซเชฏ เชฎเซเชฆเซเชฆเชพเช เช เชเชฃเชพเชตเซเชถ เชเซเชฅเซ เชฆเชธเซเชคเชพเชตเซเชเซ เช เชจเซ เชนเชพเชฒเชจเชพ เชฒเซเชเซเชจเซ เชจเชเชฒ เชจ เชฅเชพเชฏ.
เชคเซเชฅเซ, เชซเชฟเชฒเซเชเชฐ เชเซเชก เชเชฐเซเชจเชฒเชฎเชพเช เชฒเซเชก เชฅเชพเชฏ เชเซ. เชซเชฟเชฒเซเชเชฐ เชเชจเชเชฎเชฟเชเช เชชเซเชเซเชเซ เชชเชธเชพเชฐ เชฅเชพเชฏ เชเซ. เชชเชฐเชฟเชฃเชพเชฎเซ, เชซเชฟเชฒเซเชเชฐเซ เชจเชฟเชฐเซเชฃเชฏ เชฒเซเชตเซ เช เชเซเชเช: เชชเซเชเซเชเชจเซ เชเชฐเซเชจเชฒ เชชเชฐ เชฎเซเชเชฒเชตเชพ เชฎเชพเชเซ (XDP_PASS
), เชกเซเชฐเซเชช เชชเซเชเซเช (XDP_DROP
) เช
เชฅเชตเชพ เชคเซเชจเซ เชชเชพเชเซเช เชฎเซเชเชฒเซ (XDP_TX
). เชซเชฟเชฒเซเชเชฐ เชชเซเชเซเชเชจเซ เชฌเชฆเชฒเซ เชถเชเซ เชเซ, เช เชเชพเชธ เชเชฐเซเชจเซ เชคเซเชจเชพ เชฎเชพเชเซ เชธเชพเชเซเช เชเซ XDP_TX
. เชคเชฎเซ เชชเซเชฐเซเชเซเชฐเชพเชฎ เชเซเชฐเซเชถ เชชเชฃ เชเชฐเซ เชถเชเซ เชเซ (XDP_ABORTED
) เช
เชจเซ เชชเซเชเซเช เชเซเชกเซ, เชชเชฐเชเชคเซ เช เชธเชฎเชพเชจ เชเซ assert(0)
- เชกเชฟเชฌเชเซเชเช เชฎเชพเชเซ.
eBPF (เชเชเซเชธเซเชเซเชจเซเชกเซเชก เชฌเชฐเซเชเชฒเซ เชชเซเชเซเช เชซเชฟเชฒเซเชเชฐ) เชตเชฐเซเชเซเชฏเซเช เชฒ เชฎเชถเซเชจ เชเชฐเชพเชฆเชพเชชเซเชฐเซเชตเช เชธเชฐเชณ เชฌเชจเชพเชตเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช เชเซ เชเซเชฅเซ เชเชฐเซเชจเชฒ เชเซเช เชเชฐเซ เชถเชเซ เชเซ เชเซเชก เชฒเซเชช เชจเชฅเซ เชฅเชคเซ เช เชจเซ เช เชจเซเชฏ เชฒเซเชเซเชจเซ เชฎเซเชฎเชฐเซเชจเซ เชจเซเชเชธเชพเชจ เชจเชฅเซ เชเชฐเชคเซเช. เชธเชเชเชฟเชค เชชเซเชฐเชคเชฟเชฌเชเชงเซ เช เชจเซ เชคเชชเชพเชธเซ:
- เชฒเซเชชเซเชธ (เชชเชพเชเชพ เชเซเชฆเชเชพ) เชชเซเชฐเชคเชฟเชฌเชเชงเชฟเชค เชเซ.
- เชกเซเชเชพ เชฎเชพเชเซ เชธเซเชเซเช เชเซ, เชชเชฐเชเชคเซ เชเซเช เชซเชเชเซเชถเชจ เชจเชฅเซ (เชคเชฎเชพเชฎ C เชซเชเชเซเชถเชจเซเชธ เชเชจเชฒเชพเชเชจ เชนเซเชตเชพ เชเซเชเช).
- เชธเซเชเซเช เช เชจเซ เชชเซเชเซเช เชฌเชซเชฐเชจเซ เชฌเชนเชพเชฐ เชฎเซเชฎเชฐเซเชจเซ เชเชเซเชธเซเชธ เชชเซเชฐเชคเชฟเชฌเชเชงเชฟเชค เชเซ.
- เชเซเชกเชจเซเช เชเชฆ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชเซ, เชชเชฐเชเชคเซ เชตเซเชฏเชตเชนเชพเชฐเชฎเชพเช เช เชเซเชฌ เชจเซเชเชงเชชเชพเชคเซเชฐ เชจเชฅเซ.
- เชฎเชพเชคเซเชฐ เชเชพเชธ เชเชฐเซเชจเชฒ เชซเชเชเซเชถเชจเซเชธ (eBPF เชนเซเชฒเซเชชเชฐเซเชธ) เชจเซ เชฎเชเชเซเชฐเซ เชเซ.
เชซเชฟเชฒเซเชเชฐ เชตเชฟเชเชธเชพเชตเชตเซเช เช เชจเซ เชเชจเซเชธเซเชเซเชฒ เชเชฐเชตเซเช เชเชจเชพ เชเซเชตเซเช เชฒเชพเชเซ เชเซ:
- เชธเซเชคเซเชฐเซเชค เชเซเชก (เชฆเชพ.เชค.
kernel.c
เชเชฌเซเชเซเชเซเช เชชเชฐ เชเชฎเซเชชเชพเชเชฒ เชเชฐเซ เชเซ (kernel.o
) eBPF เชตเชฐเซเชเซเชฏเซเช เชฒ เชฎเชถเซเชจ เชเชฐเซเชเชฟเชเซเชเซเชเชฐ เชฎเชพเชเซ. เชเชเซเชเซเชฌเชฐ 2019 เชธเซเชงเซเชฎเชพเช, eBPF เชฎเชพเช เชเชฎเซเชชเชพเชเชฒ เชเชฐเชตเชพเชจเซเช เชเซเชฒเซเชเช เชฆเซเชตเชพเชฐเชพ เชธเชฎเชฐเซเชฅเชฟเชค เชเซ เช เชจเซ GCC 10.1 เชฎเชพเช เชตเชเชจ เชเชชเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช เชเซ. - เชเซ เช เชเชฌเซเชเซเชเซเช เชเซเชกเชฎเชพเช เชเชฐเซเชจเชฒ เชธเซเชเซเชฐเชเซเชเชฐเซเชธ (เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชเซเชทเซเชเชเซ เช เชจเซ เชเชพเชเชจเซเชเชฐเซเชธ เชชเชฐ) เชเซเชฒเซเชธ เชเซ, เชคเซ เชคเซเชฎเชจเชพ ID เชจเซ เชฌเชฆเชฒเซ เชถเซเชจเซเชฏ เชเซ, เชเชเชฒเซ เชเซ, เชเชตเชพ เชเซเชกเชจเซ เชเชเซเชเชฟเชเซเชฏเซเช เชเชฐเซ เชถเชเชพเชคเซ เชจเชฅเซ. เชเชฐเซเชจเชฒเชฎเชพเช เชฒเซเชก เชเชฐเชคเชพ เชชเชนเซเชฒเชพ, เช เชถเซเชจเซเชฏเชจเซ เชเชฐเซเชจเชฒ เชเซเชฒเซเชธ (เชเซเชกเชจเซ เชฒเชฟเชเช เชเชฐเซ) เชฆเซเชตเชพเชฐเชพ เชฌเชจเชพเชตเซเชฒ เชเซเชเซเชเชธ เชเชฌเซเชเซเชเซเชเชจเชพ IDs เชธเชพเชฅเซ เชฌเชฆเชฒเชตเซเช เชเชตเชถเซเชฏเช เชเซ. เชคเชฎเซ เชฌเชพเชนเซเชฏ เชเชชเชฏเซเชเชฟเชคเชพเช เชธเชพเชฅเซ เช เชเชฐเซ เชถเชเซ เชเซ, เช เชฅเชตเชพ เชคเชฎเซ เชเช เชชเซเชฐเซเชเซเชฐเชพเชฎ เชฒเชเซ เชถเชเซ เชเซ เชเซ เชเซเชเซเชเชธ เชซเชฟเชฒเซเชเชฐเชจเซ เชฒเชฟเชเช เชเชฐเชถเซ เช เชจเซ เชฒเซเชก เชเชฐเชถเซ.
- เชเชฐเซเชจเชฒ เชชเซเชฐเซเชเซเชฐเชพเชฎ เชฒเซเชก เชฅเช เชฐเชนเซเชฏเซ เชเซ เชคเซเชจเซ เชเชเชพเชธเชฃเซ เชเชฐเซ เชเซ. เชคเซ เชเชเซเชฐเชจเซ เชเซเชฐเชนเชพเชเชฐเซ เช เชจเซ เชชเซเชเซเช เช เชจเซ เชธเซเชเซเช เชฌเชพเชเชจเซเชกเซเชฐเซเชฎเชพเชเชฅเซ เชฌเชนเชพเชฐ เชจ เชจเซเชเชณเชตเชพ เชฎเชพเชเซ เชคเชชเชพเชธ เชเชฐเซ เชเซ. เชเซ เชเชเชพเชธเชฃเซเชเชฐเซเชคเชพ เชธเชพเชฌเชฟเชค เชเชฐเซ เชถเชเชคเซ เชจเชฅเซ เชเซ เชเซเชก เชธเชพเชเซ เชเซ, เชคเซ เชชเซเชฐเซเชเซเชฐเชพเชฎ เชจเชเชพเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ - เชตเซเชฏเชเซเชคเชฟเช เชคเซเชจเซ เชเซเชถ เชเชฐเชตเชพ เชธเชเซเชทเชฎ เชนเซเชตเชพ เชเซเชเช.
- เชธเชซเชณ เชเชเชพเชธเชฃเซ เชชเชเซ, เชเชฐเซเชจเชฒ eBPF เชเชฐเซเชเชฟเชเซเชเซเชเชฐ เชเชฌเซเชเซเชเซเช เชเซเชกเชจเซ เชธเชฟเชธเซเชเชฎ เชเชฐเซเชเชฟเชเซเชเซเชเชฐ เชฎเชถเซเชจ เชเซเชกเชฎเชพเช เชเชฎเซเชชเชพเชเชฒ เชเชฐเซ เชเซ (เชนเชฎเชฃเชพเช-เชธเชฎเชฏเชฎเชพเช).
- เชชเซเชฐเซเชเซเชฐเชพเชฎ เชเชจเซเชเชฐเชซเซเชธ เชธเชพเชฅเซ เชเซเชกเชพเชฏเซเชฒ เชเซ เช เชจเซ เชชเซเชเซเชเซ เชชเชฐ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชฐเชตเชพเชจเซเช เชถเชฐเซ เชเชฐเซ เชเซ.
XDP เชเชฐเซเชจเชฒเชฎเชพเช เชเชพเชฒเชคเซเช เชนเซเชตเชพเชฅเซ, เชกเชฟเชฌเชเซเชเช เชเซเชฐเซเชธ เชฒเซเช เชชเชฐ เชเชงเชพเชฐเชฟเชค เชเซ เช เชจเซ เชนเชเซเชเชคเชฎเชพเช, เชชเซเชฐเซเชเซเชฐเชพเชฎ เชซเชฟเชฒเซเชเชฐ เชเชฐเซ เชเซ เช เชฅเชตเชพ เชเชจเชฐเซเช เชเชฐเซ เชเซ เชคเซ เชชเซเชเซเชเซ เชชเชฐ. เชเซ เชเซ, eBPF เชกเชพเชเชจเชฒเซเชก เชเชฐเซเชฒ เชเซเชกเชจเซ เชธเชฟเชธเซเชเชฎ เชฎเชพเชเซ เชธเซเชฐเชเซเชทเชฟเชค เชฐเชพเชเซ เชเซ, เชเซเชฅเซ เชคเชฎเซ เชคเชฎเชพเชฐเชพ เชธเซเชฅเชพเชจเชฟเช Linux เชชเชฐ เช XDP เชธเชพเชฅเซ เชชเซเชฐเชฏเซเช เชเชฐเซ เชถเชเซ.
เชชเชฐเซเชฏเชพเชตเชฐเชฃเชจเซ เชคเซเชฏเชพเชฐเซ
เชตเชฟเชงเชพเชจเชธเชญเชพ
เชฐเชฃเชเชพเชฐ eBPF เชเชฐเซเชเชฟเชเซเชเซเชเชฐ เชฎเชพเชเซ เชเชฌเซเชเซเชเซเช เชเซเชก เชธเซเชงเซ เชเชพเชฐเซ เชเชฐเซ เชถเชเชคเซ เชจเชฅเซ, เชคเซเชฅเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชฎเชพเช เชฌเซ เชชเชเชฒเชพเช เชถเชพเชฎเซเชฒ เชเซ:
- เชธเซ เชเซเชกเชจเซ LLVM เชฌเชพเชเชเชเซเชกเชฎเชพเช เชเชฎเซเชชเชพเชเชฒ เชเชฐเซ (
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__
เชฎเชคเชฒเชฌ เชเซ UAPI (userspace API) เชนเซเชกเชฐเซ เชเชฐเซเชจเชฒ เชเซเชก เชฎเชพเชเซ เชตเซเชฏเชพเชเซเชฏเชพเชฏเชฟเชค เชฅเชฏเซเชฒ เชเซ, เชเชพเชฐเชฃ เชเซ เชซเชฟเชฒเซเชเชฐ เชเชฐเซเชจเชฒเชฎเชพเช เชเชฒเชพเชตเชตเชพเชฎเชพเช เชเชตเซ เชเซ.
เชธเซเชเซเช เชธเชเชฐเชเซเชทเชฃ เช
เชเซเชทเชฎ เชเชฐเซ เชถเชเชพเชฏ เชเซ (-fno-stack-protector
) เชเชพเชฐเชฃ เชเซ eBPF เชเซเชก เชตเซเชฐเชฟเชซเชพเชฏเชฐ เชเซเชเชชเชฃ เชฐเซเชคเซ เชธเซเชเซเช เชฌเชพเชเชจเซเชกเซเชฐเซเชจเซ เชฌเชนเชพเชฐ เชจ เชนเซเชตเชพ เชฎเชพเชเซ เชคเชชเชพเชธ เชเชฐเซ เชเซ. เชคเชฎเชพเชฐเซ เชคเชฐเชค เช เชเชชเซเชเชฟเชฎเชพเชเชเซเชถเชจเชจเซ เชธเชเซเชทเชฎ เชเชฐเชตเซเช เชเซเชเช, เชเชพเชฐเชฃ เชเซ eBPF เชฌเชพเชเชเชเซเชกเชจเซเช เชเชฆ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชเซ.
เชเชพเชฒเซ เชเช เชซเชฟเชฒเซเชเชฐ เชธเชพเชฅเซ เชชเซเชฐเชพเชฐเชเชญ เชเชฐเซเช เชเซ เชฌเชงเชพ เชชเซเชเซเชเซ เชชเชธเชพเชฐ เชเชฐเซ เชเซ เช เชจเซ เชเชเช เชเชฐเชคเซเช เชจเชฅเซ:
#include <uapi/linux/bpf.h>
#include <bpf_helpers.h>
SEC("prog")
int xdp_main(struct xdp_md* ctx) {
return XDP_PASS;
}
char _license[] SEC("license") = "GPL";
เชเซเชฎ make
เชเชเชคเซเชฐเชฟเชค เชเชฐเซ เชเซ xdp_filter.o
. เชนเชตเซ เชคเชฎเซ เชคเซเชจเซ เชเซเชฏเชพเช เชเชเชพเชธเซ เชถเชเซ เชเซ?
เชเซเชธเซเช เชฌเซเชจเซเช
เชธเซเชเซเชจเซเชกเชฎเชพเช เชฌเซ เชเชจเซเชเชฐเชซเซเชธ เชถเชพเชฎเซเชฒ เชนเซเชตเชพ เชเซเชเช: เชเซเชจเชพ เชชเชฐ เชซเชฟเชฒเซเชเชฐ เชนเชถเซ เช เชจเซ เชเซเชฎเชพเชเชฅเซ เชชเซเชเซเชเซ เชฎเซเชเชฒเชตเชพเชฎเชพเช เชเชตเชถเซ. เช เชฎเชพเชฐเชพ เชซเชฟเชฒเซเชเชฐ เชธเชพเชฅเซ เชจเชฟเชฏเชฎเชฟเชค เชเชชเซเชฒเชฟเชเซเชถเชจเซ เชเซเชตเซ เชฐเซเชคเซ เชเชพเชฐเซเชฏ เชเชฐเซ เชเซ เชคเซ เชคเชชเชพเชธเชตเชพ เชฎเชพเชเซ เช เชคเซเชฎเชจเชพ เชชเซเชคเชพเชจเชพ IP เชธเชพเชฅเซ เชธเชเชชเซเชฐเซเชฃ Linux เชเชชเชเชฐเชฃเซ เชนเซเชตเชพ เชเซเชเช.
เชตเซเชฅ (เชตเชฐเซเชเซเชฏเซเช
เชฒ เชเชฅเชฐเชจเซเช) เชเซเชตเชพ เชเชชเชเชฐเชฃเซ เชเชชเชฃเชพ เชฎเชพเชเซ เชฏเซเชเซเชฏ เชเซ: เชคเซ เชตเชฐเซเชเซเชฏเซเช
เชฒ เชจเซเชเชตเชฐเซเช เชเชจเซเชเชฐเชซเซเชธเชจเซ เชเซเชกเซ เชเซ เชเซ เชเชเชฌเซเชเชพ เชธเชพเชฅเซ เชธเซเชงเชพ เช "เชเซเชกเชพเชฏเซเชฒ" เชเซ. เชคเชฎเซ เชคเซเชฎเชจเซ เช เชฐเซเชคเซ เชฌเชจเชพเชตเซ เชถเชเซ เชเซ (เช เชตเชฟเชญเชพเชเชฎเชพเช, เชฌเชงเชพ เชเชฆเซเชถเซ ip
เชฅเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ root
):
ip link add xdp-remote type veth peer name xdp-local
เชคเซ xdp-remote
ะธ xdp-local
- เชเชชเชเชฐเชฃ เชจเชพเชฎเซ. เชเชพเชฒเซ xdp-local
(192.0.2.1/24) เชธเชพเชฅเซ เชซเชฟเชฒเซเชเชฐ เชเซเชกเชตเชพเชฎเชพเช เชเชตเชถเซ xdp-remote
(192.0.2.2/24) เชเชจเชเชฎเชฟเชเช เชเซเชฐเชพเชซเชฟเช เชฎเซเชเชฒเชตเชพเชฎเชพเช เชเชตเชถเซ. เชเซ เชเซ, เชคเซเชฏเชพเช เชเช เชธเชฎเชธเซเชฏเชพ เชเซ: เชเชจเซเชเชฐเชซเซเชธเซ เชเช เช เชฎเชถเซเชจ เชชเชฐ เชเซ, เช
เชจเซ Linux เชคเซเชฎเชพเชเชฅเซ เชเชเชจเซ เชฌเซเชเชพ เชฆเซเชตเชพเชฐเชพ เชเซเชฐเชพเชซเชฟเช เชฎเซเชเชฒเชถเซ เชจเชนเซเช. เชคเชฎเซ เชคเซเชจเซ เชฎเซเชถเซเชเซเชฒ เชจเชฟเชฏเชฎเซ เชฆเซเชตเชพเชฐเชพ เชนเชฒ เชเชฐเซ เชถเชเซ เชเซ iptables
, เชชเชฐเชเชคเซ เชคเซเชเช เชชเซเชเซเชเซ เชฌเชฆเชฒเชตเชพ เชชเชกเชถเซ, เชเซ เชกเชฟเชฌเชเซเชเช เชเชฐเชคเซ เชตเชเชคเซ เช
เชธเซเชตเชฟเชงเชพเชเชจเช เชเซ. เชจเซเชเชตเชฐเซเช เชจเซเชฎเชธเซเชชเซเชธ (เชจเซเชเชตเชฐเซเช เชจเซเชฎเชธเซเชชเซเชธ, เชเชเชณ เชจเซเชเชจเซเชธ) เชจเซ เชเชชเชฏเซเช เชเชฐเชตเซ เชตเชงเซ เชธเชพเชฐเซเช เชเซ.
เชจเซเชเชตเชฐเซเช เชจเซเชฎเชธเซเชชเซเชธเชฎเชพเช เชเชจเซเชเชฐเชซเซเชธ, เชฐเซเชเซเชเช เชเซเชทเซเชเชเซ เช เชจเซ เชจเซเชเชซเชฟเชฒเซเชเชฐ เชจเชฟเชฏเชฎเซเชจเซ เชธเชฎเซเชน เชนเซเชฏ เชเซ เชเซ เช เชจเซเชฏ เชจเซเชเชจเซเชธเชฎเชพเช เชธเชฎเชพเชจ เชเชฌเซเชเซเชเซเชเชฅเซ เช เชฒเช เชนเซเชฏ เชเซ. เชฆเชฐเซเช เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เช เชฎเซเช เชจเซเชฎเชธเซเชชเซเชธเชฎเชพเช เชเชพเชฒเซ เชเซ, เช เชจเซ เชฎเชพเชคเซเชฐ เช เชจเซเชเชจเซเชธเชจเชพ เชเชฌเซเชเซเชเซเชเซเชธ เช เชคเซเชจเซ เชเชชเชฒเชฌเซเชง เชเซ. เชกเชฟเชซเซเชฒเซเช เชฐเซเชชเซ, เชธเชฟเชธเซเชเชฎเชฎเชพเช เชคเชฎเชพเชฎ เชเชฌเซเชเซเชเซเชเซเชธ เชฎเชพเชเซ เชเช เช เชจเซเชเชตเชฐเซเช เชจเซเชฎเชธเซเชชเซเชธ เชเซ, เชเซเชฅเซ เชคเชฎเซ Linux เชชเชฐ เชเชพเชฎ เชเชฐเซ เชถเชเซ เช เชจเซ netns เชตเชฟเชถเซ เชเชพเชฃเชคเชพ เชจเชฅเซ.
เชเชพเชฒเซ เชเช เชจเชตเซเช เชจเซเชฎเชธเซเชชเซเชธ เชฌเชจเชพเชตเซเช xdp-test
เช
เชจเซ เชคเซเชฏเชพเช เชเชธเซเชกเซ xdp-remote
.
ip netns add xdp-test
ip link set dev xdp-remote netns xdp-test
เชชเชเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชพเชฒเซ เชฐเชนเซ เชเซ xdp-test
, "เชเซเชถเซ เชจเชนเซเช" xdp-local
(เชคเซ เชกเชฟเชซเซเชฒเซเช เชฐเซเชชเซ เชจเซเชเชจเซเชธเชฎเชพเช เชฐเชนเซเชถเซ) เช
เชจเซ เชเซเชฏเชพเชฐเซ 192.0.2.1 เชชเชฐ เชชเซเชเซเช เชฎเซเชเชฒเซ เชคเซเชฏเชพเชฐเซ เชคเซ เชชเชธเชพเชฐ เชฅเชถเซ xdp-remote
, เชเชพเชฐเชฃ เชเซ เชคเซ เช เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชฎเชพเชเซ เชเชชเชฒเชฌเซเชง 192.0.2.0/24 เชชเชฐ เชเชเชฎเชพเชคเซเชฐ เชเชจเซเชเชฐเชซเซเชธ เชเซ. เช เชตเชฟเชชเชฐเซเชค เชฐเซเชคเซ เชชเชฃ เชเชพเชฎ เชเชฐเซ เชเซ.
เชเซเชฏเชพเชฐเซ เชจเซเชเชจเซเชธ เชตเชเซเชเซ เชซเชฐเซ เชเซ, เชคเซเชฏเชพเชฐเซ เชเชจเซเชเชฐเชซเซเชธ เชจเซเชเซ เชเชพเชฏ เชเซ เช
เชจเซ เชธเชฐเชจเชพเชฎเซเช เชเซเชฎเชพเชตเซ เชเซ. netns เชฎเชพเช เชเชจเซเชเชฐเชซเซเชธ เชธเซเช เชเชฐเชตเชพ เชฎเชพเชเซ, เชคเชฎเชพเชฐเซ เชเชฒเชพเชตเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ ip ...
เช เชเชฆเซเชถ เชจเซเชฎเชธเซเชชเซเชธเชฎเชพเช ip netns exec
:
ip netns exec xdp-test
ip address add 192.0.2.2/24 dev xdp-remote
ip netns exec xdp-test
ip link set xdp-remote up
เชเซเชฎ เชคเชฎเซ เชเซเช เชถเชเซ เชเซ, เช เชธเซเชเชฟเชเชเชฅเซ เช
เชฒเช เชจเชฅเซ xdp-local
เชกเชฟเชซเซเชฒเซเช เชจเซเชฎเชธเซเชชเซเชธเชฎเชพเช:
ip address add 192.0.2.1/24 dev xdp-local
ip link set xdp-local up
เชเซ เชเชฒเชพเชตเซ tcpdump -tnevi xdp-local
, เชคเชฎเซ เชเซเช เชถเชเซ เชเซ เชเซ เชเซ เชชเซเชเซเชเซ เชฎเซเชเชฒเชตเชพเชฎเชพเช เชเชตเซเชฏเชพ เชเซ xdp-test
, เช เชเชจเซเชเชฐเชซเซเชธ เชชเชฐ เชตเชฟเชคเชฐเชฟเชค เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ:
ip netns exec xdp-test ping 192.0.2.1
เช
เชเชฆเชฐ เชถเซเชฒ เชเชฒเชพเชตเชตเชพ เชฎเชพเชเซ เชคเซ เช
เชจเซเชเซเชณ เชเซ xdp-test
. เชฐเชฟเชชเซเชเซเชเชฐเซเชฎเชพเช เชเช เชธเซเชเซเชฐเชฟเชชเซเช เชเซ เชเซ เชธเซเชเซเชจเซเชก เชธเชพเชฅเซ เชเชพเชฎเชจเซ เชธเซเชตเชเชพเชฒเชฟเชค เชเชฐเซ เชเซ, เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชคเชฎเซ เชเชฆเซเชถ เชธเชพเชฅเซ เชธเซเชเซเชจเซเชก เชธเซเช เชเชฐเซ เชถเชเซ เชเซ sudo ./stand up
เช
เชจเซ เชคเซเชจเซ เชฆเซเชฐ เชเชฐเซ sudo ./stand down
.
เชเซเชฐเซเชธเซเชเช
เชซเชฟเชฒเซเชเชฐ เช เชฐเซเชคเซ เชเชชเชเชฐเชฃ เชธเชพเชฅเซ เชเซเชกเชพเชฏเซเชฒ เชเซ:
ip -force link set dev xdp-local xdp object xdp_filter.o verbose
เชเซ -force
เชจเชตเชพ เชชเซเชฐเซเชเซเชฐเชพเชฎเชจเซ เชฒเชฟเชเช เชเชฐเชตเชพ เชฎเชพเชเซ เชเชฐเซเชฐเซ เชเซ เชเซ เช
เชจเซเชฏ เชเช เชชเชนเซเชฒเชพเชฅเซ เช เชฒเชฟเชเช เชฅเชฏเซเชฒ เชนเซเชฏ. "เชเซเช เชธเชฎเชพเชเชพเชฐ เชธเชพเชฐเชพ เชธเชฎเชพเชเชพเชฐ เชจเชฅเซ" เช เชเชฆเซเชถ เชตเชฟเชถเซ เชจเชฅเซ, เชเชเชเชชเซเช เชเซเชเชชเชฃ เชฐเซเชคเซ เชตเชฟเชถเชพเชณ เชเซ. เชธเซเชเชตเซ เชเซ verbose
เชตเซเชเชฒเซเชชเชฟเช, เชชเชฐเชเชคเซ เชคเซเชจเซ เชธเชพเชฅเซ เชเชธเซเชฎเซเชฌเชฒเชฐ เชธเซเชเชฟ เชธเชพเชฅเซ เชเซเชก เชตเซเชฐเชฟเชซเชพเชฏเชฐเชจเชพ เชเชพเชฐเซเชฏ เชตเชฟเชถเซเชจเซ เช
เชนเซเชตเชพเชฒ เชฆเซเชเชพเชฏ เชเซ:
Verifier analysis:
0: (b7) r0 = 2
1: (95) exit
เชชเซเชฐเซเชเซเชฐเชพเชฎเชจเซ เชเชจเซเชเชฐเชซเซเชธเชฎเชพเชเชฅเซ เช เชฒเช เชเชฐเซ:
ip link set dev xdp-local xdp off
เชธเซเชเซเชฐเชฟเชชเซเชเชฎเชพเช, เช เชเชฆเซเชถเซ เชเซ sudo ./stand attach
ะธ sudo ./stand detach
.
เชซเชฟเชฒเซเชเชฐเชจเซ เชฌเชพเชเชงเซเชจเซ, เชคเชฎเซ เชคเซเชจเซ เชเชพเชคเชฐเซ เชเชฐเซ เชถเชเซ เชเซ ping
เชเชพเชฎ เชเชฐเชตเชพเชจเซเช เชเชพเชฒเซ เชฐเชพเชเซ เชเซ, เชชเชฐเชเชคเซ เชถเซเช เชชเซเชฐเซเชเซเชฐเชพเชฎ เชเชพเชฎ เชเชฐเซ เชเซ? เชเชพเชฒเซ เชฒเซเชเซ เชเชฎเซเชฐเซเช. เชเชพเชฐเซเชฏ bpf_trace_printk()
printf()
, เชชเชฐเชเชคเซ เชฎเชพเชคเซเชฐ เชชเซเชเชฐเซเชจ เชธเชฟเชตเชพเชฏเชจเซ เชคเซเชฐเชฃ เชฆเชฒเซเชฒเซ เช
เชจเซ เชธเซเชชเชทเซเชเซเชเชฐเชฃเซเชจเซ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชธเซเชเชฟเชจเซ เชธเชฎเชฐเซเชฅเชจ เชเชชเซ เชเซ. เชฎเซเชเซเชฐเซ bpf_printk()
เชเซเชฒเชจเซ เชธเชฐเชณ เชฌเชจเชพเชตเซ เชเซ.
SEC("prog")
int xdp_main(struct xdp_md* ctx) {
+ bpf_printk("got packet: %pn", ctx);
return XDP_PASS;
}
เชเชเชเชชเซเช เชเชฐเซเชจเชฒ เชเซเชฐเซเชธ เชเซเชจเชฒ เชชเชฐ เชเชพเชฏ เชเซ, เชเซเชจเซ เชธเชเซเชทเชฎ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ:
echo -n 1 | sudo tee /sys/kernel/debug/tracing/options/trace_printk
เชธเชเชฆเซเชถเชจเซ เชชเซเชฐเชตเชพเชน เชเซเช:
cat /sys/kernel/debug/tracing/trace_pipe
เช เชฌเชเชจเซ เชเซเชฎเซ เชเซเชฒ เชเชฐเซ เชเซ sudo ./stand log
.
เชชเชฟเชเชเซ เชนเชตเซ เชคเซเชฎเชพเช เชเชจเชพ เชเซเชตเชพ เชธเชเชฆเซเชถเชพเช เชเชคเซเชชเชจเซเชจ เชเชฐเชตเชพ เชเซเชเช:
<...>-110930 [004] ..s1 78803.244967: 0: got packet: 00000000ac510377
เชเซ เชคเชฎเซ เชตเซเชฐเชฟเชซเชพเชฏเชฐเชจเชพ เชเชเชเชชเซเชเชจเซ เชจเชเซเชเชฅเซ เชเซเชถเซ, เชคเซ เชคเชฎเซ เชตเชฟเชเชฟเชคเซเชฐ เชเชฃเชคเชฐเซเช เชเซเช เชถเชเซ เชเซ:
0: (bf) r3 = r1
1: (18) r1 = 0xa7025203a7465
3: (7b) *(u64 *)(r10 -8) = r1
4: (18) r1 = 0x6b63617020746f67
6: (7b) *(u64 *)(r10 -16) = r1
7: (bf) r1 = r10
8: (07) r1 += -16
9: (b7) r2 = 16
10: (85) call bpf_trace_printk#6
<...>
เชนเชเซเชเชค เช เชเซ เชเซ eBPF เชชเซเชฐเซเชเซเชฐเชพเชฎเซเชธ เชชเชพเชธเซ เชกเซเชเชพ เชตเชฟเชญเชพเช เชจเชฅเซ, เชคเซเชฅเซ เชซเซเชฐเซเชฎเซเช เชธเซเชเซเชฐเชฟเชเชเชจเซ เชเชจเซเชเซเชก เชเชฐเชตเชพเชจเซ เชเชเชฎเชพเชคเซเชฐ เชฐเชธเซเชคเซ VM เชเชฆเซเชถเซเชจเซ เชคเชพเชคเซเชเชพเชฒเชฟเช เชฆเชฒเซเชฒเซ เชเซ:
$ python -c "import binascii; print(bytes(reversed(binascii.unhexlify('0a7025203a74656b63617020746f67'))))"
b'got packet: %pn'
เช เชเชพเชฐเชฃเซเชธเชฐ, เชกเซเชฌเช เชเชเชเชชเซเช เชชเชฐเชฟเชฃเชพเชฎเซ เชเซเชกเชจเซ เชฎเซเชเชพ เชชเซเชฐเชฎเชพเชฃเชฎเชพเช เชซเซเชฒเซ เชเซ.
XDP เชชเซเชเซเช เชฎเซเชเชฒเซ เชฐเชนเซเชฏเซเช เชเซ
เชเชพเชฒเซ เชซเชฟเชฒเซเชเชฐ เชฌเชฆเชฒเซเช: เชคเซเชจเซ เชฌเชงเชพ เชเชตเชจเชพเชฐเชพ เชชเซเชเซเชเซ เชชเชพเชเชพ เชฎเซเชเชฒเชตเชพ เชฆเซ. เชจเซเชเชตเชฐเซเชเชจเชพ เชฆเซเชทเซเชเชฟเชเซเชฃเชฅเซ เช เชเซเชเซเช เชเซ, เชเชพเชฐเชฃ เชเซ เชนเซเชกเชฐเชฎเชพเช เชธเชฐเชจเชพเชฎเชพเช เชฌเชฆเชฒเชตเชพเชจเซ เชเชฐเซเชฐ เชชเชกเชถเซ, เชชเชฐเชเชคเซ เชนเชตเซ เชธเชฟเชฆเซเชงเชพเชเชคเชฎเชพเช เชเชพเชฐเซเชฏ เชฎเชนเชคเซเชตเชชเซเชฐเซเชฃ เชเซ.
bpf_printk("got packet: %pn", ctx);
- return XDP_PASS;
+ return XDP_TX;
}
เชฒเซเชเช เชเชฐเซ tcpdump
เชชเชฐ xdp-remote
. เชคเซเชฃเซ เชธเชฐเชเชพ เชเชเชเชเซเชเชเช เช
เชจเซ เชเชจเชเชฎเชฟเชเช ICMP เชเชเซ เชฐเชฟเชเซเชตเซเชธเซเช เชฌเชคเชพเชตเชตเซ เชเซเชเช เช
เชจเซ ICMP เชเชเซ เชฐเชฟเชชเซเชฒเชพเชฏ เชฌเชคเชพเชตเชตเชพเชจเซเช เชฌเชเชง เชเชฐเชตเซเช เชเซเชเช. เชชเชฐเชเชคเซ เชคเซ เชฆเซเชเชพเชคเซเช เชจเชฅเซ. เชเชพเชฎ เชฎเชพเชเซ เชฌเชนเชพเชฐ เชตเชณเซ เชเซ XDP_TX
เชฎเชพเชเซ เชเชพเชฐเซเชฏเชเซเชฐเชฎเชฎเชพเช xdp-local
xdp-remote
เชเช เชชเซเชฐเซเชเซเชฐเชพเชฎ เชชเชฃ เชธเซเชเชชเชตเชพเชฎเชพเช เชเชตเซเชฏเซ เชนเชคเซ, เชชเชเซ เชญเชฒเซ เชคเซ เชเชพเชฒเซ เชนเซเชฏ, เช
เชจเซ เชคเซเชจเซ เชเชเซเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซ.
เชฎเชจเซ เชเซเชตเซ เชฐเซเชคเซ เชเชฌเชฐ เชชเชกเซ?
เชคเชฎเชพเชฐเซ เช เชจเชฟเชทเซเชเชฎเชพเชเชฅเซ เชธเชพเชฐเซเช เชฌเชจเชพเชตเชตเซเช เชเซเชเช, เชเชพเชฐเชฃ เชเซ เชคเซเชจเซ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชเซ เชฌเซเชเซเช เชเชเช เชจเชฅเซ.
$ sudo perf trace --call-graph dwarf -e 'xdp:*'
0.000 ping/123455 xdp:xdp_bulk_tx:ifindex=19 action=TX sent=0 drops=1 err=-6
veth_xdp_flush_bq ([veth])
veth_xdp_flush_bq ([veth])
veth_poll ([veth])
<...>
เชเซเชก 6 เชถเซเช เชเซ?
$ errno 6
ENXIO 6 No such device or address
เชเชพเชฐเซเชฏ veth_xdp_flush_bq()
เชฅเซ เชเชฐเชฐ เชเซเชก เชฎเซเชณเชตเซ เชเซ veth_xdp_xmit()
, เชเซเชฏเชพเช เชฆเซเชตเชพเชฐเชพ เชถเซเชงเซ ENXIO
เช
เชจเซ เชเชฟเชชเซเชชเชฃเซ เชถเซเชงเซ.
เชจเซเชฏเซเชจเชคเชฎ เชซเชฟเชฒเซเชเชฐ เชชเซเชจเชเชธเซเชฅเชพเชชเชฟเชค เชเชฐเซ (XDP_PASS
) เชซเชพเชเชฒเชฎเชพเช xdp_dummy.c
, เชคเซเชจเซ เชฎเซเชเชซเชพเชเชฒเชฎเชพเช เชเชฎเซเชฐเซ, เชธเชพเชฅเซ เชเซเชกเซ xdp-remote
:
ip netns exec remote
ip link set dev int xdp object dummy.o
เชนเชตเซ tcpdump
เชถเซเช เช
เชชเซเชเซเชทเชฟเชค เชเซ เชคเซ เชฆเชฐเซเชถเชพเชตเซ เชเซ:
62:57:8e:70:44:64 > 26:0e:25:37:8f:96, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 13762, offset 0, flags [DF], proto ICMP (1), length 84)
192.0.2.2 > 192.0.2.1: ICMP echo request, id 46966, seq 1, length 64
62:57:8e:70:44:64 > 26:0e:25:37:8f:96, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 13762, offset 0, flags [DF], proto ICMP (1), length 84)
192.0.2.2 > 192.0.2.1: ICMP echo request, id 46966, seq 1, length 64
เชเซ เชคเซเชจเชพ เชฌเชฆเชฒเซ เชฎเชพเชคเซเชฐ ARP เชฌเชคเชพเชตเชตเชพเชฎเชพเช เชเชตเซ, เชคเซ เชคเชฎเชพเชฐเซ เชซเชฟเชฒเซเชเชฐเซเชธ เชฆเซเชฐ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ (เช เชฌเชจเชพเชตเซ เชเซ sudo ./stand detach
), เชฆเซ ping
, เชชเชเซ เชซเชฟเชฒเซเชเชฐเซเชธ เชเชจเซเชธเซเชเซเชฒ เชเชฐเซ เช
เชจเซ เชซเชฐเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเซ. เชธเชฎเชธเซเชฏเชพ เช เชเซ เชเซ เชซเชฟเชฒเซเชเชฐ XDP_TX
ARP เชจเซ เชชเชฃ เช
เชธเชฐ เชเชฐเซ เชเซ, เช
เชจเซ เชเซ เชธเซเชเซเช
เชจเซเชฎเชธเซเชชเซเชธ xdp-test
MAC เชเชกเซเชฐเซเชธ 192.0.2.1 เชจเซ "เชญเซเชฒเซ" เชเชตเชพ เชฎเชพเชเซ เชตเซเชฏเชตเชธเซเชฅเชพเชชเชฟเชค, เชคเซ เช IP เชจเซ เชเชเซเชฒเชตเชพเชฎเชพเช เชธเชฎเชฐเซเชฅ เชนเชถเซ เชจเชนเซเช.
เชธเชฎเชธเซเชฏเชพเชจเซ เชฐเชเชจเชพ
เชเชพเชฒเซ เชเชฃเชพเชตเซเชฒ เชเชพเชฐเซเชฏ เชชเชฐ เชเชเชณ เชตเชงเซเช: XDP เชชเชฐ SYN เชเซเชเซ เชฎเชฟเชเซเชจเชฟเชเชฎ เชฒเชเชตเชพ เชฎเชพเชเซ.
เช เชคเซเชฏเชพเชฐ เชธเซเชงเซ, SYN เชชเซเชฐ เช เชฒเซเชเชชเซเชฐเชฟเชฏ DDoS เชนเซเชฎเชฒเซ เชเซ, เชเซเชจเซ เชธเชพเชฐ เชจเซเชเซ เชฎเซเชเชฌ เชเซ. เชเซเชฏเชพเชฐเซ เชเชจเซเชเซเชถเชจ เชธเซเชฅเชพเชชเชฟเชค เชฅเชพเชฏ เชเซ (TCP เชนเซเชจเซเชกเชถเซเช), เชธเชฐเซเชตเชฐ เชเช SYN เชฎเซเชณเชตเซ เชเซ, เชญเชพเชตเชฟ เชเชจเซเชเซเชถเชจ เชฎเชพเชเซ เชธเชเชธเชพเชงเชจเซ เชซเชพเชณเชตเซ เชเซ, SYNACK เชชเซเชเซเช เชธเชพเชฅเซ เชชเซเชฐเชคเชฟเชธเชพเชฆ เชเชชเซ เชเซ เช เชจเซ ACK เชฎเชพเชเซ เชฐเชพเชน เชเซเช เชเซ. เชนเซเชฎเชฒเชพเชเซเชฐ เชฎเชฒเซเชเซ-เชนเชเชพเชฐ เชฌเซเชเชจเซเชเชฎเชพเช เชฆเชฐเซเช เชฏเชเชฎเชพเชจ เชชเชพเชธเซเชฅเซ เชนเชเชพเชฐเซ เชชเซเชฐเชคเชฟ เชธเซเชเชจเซเชกเชจเซ เชฐเชเชฎเชฎเชพเช เชจเชเชฒเซ เชธเชฐเชจเชพเชฎเชพเชเชเชฅเซ SYN เชชเซเชเซเชเซ เชฎเซเชเชฒเซ เชเซ. เชธเชฐเซเชตเชฐเชจเซ เชชเซเชเซเชเชจเชพ เชเชเชฎเชจ เชชเชฐ เชคเชฐเชค เช เชธเชเชธเชพเชงเชจเซเชจเซ เชซเชพเชณเชตเชฃเซ เชเชฐเชตเชพเชจเซ เชซเชฐเช เชชเชพเชกเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เชชเชฐเชเชคเซ เชฒเชพเชเชฌเชพ เชธเชฎเชฏ เชชเชเซ เชคเซเชจเซ เชฐเชฟเชฒเซเช เชเชฐเซ เชเซ, เชชเชฐเชฟเชฃเชพเชฎเซ, เชฎเซเชฎเชฐเซ เช เชฅเชตเชพ เชฎเชฐเซเชฏเชพเชฆเชพ เชเชคเชฎ เชฅเช เชเชพเชฏ เชเซ, เชจเชตเชพ เชเซเชกเชพเชฃเซ เชธเซเชตเซเชเชพเชฐเชตเชพเชฎเชพเช เชเชตเชคเชพ เชจเชฅเซ, เชธเซเชตเชพ เช เชจเซเชชเชฒเชฌเซเชง เชเซ.
เชเซ เชคเชฎเซ SYN เชชเซเชเซเช เชชเชฐ เชธเชเชธเชพเชงเชจเซ เชซเชพเชณเชตเชคเชพ เชจเชฅเซ, เชชเชฐเชเชคเซ เชฎเชพเชคเซเชฐ SYNACK เชชเซเชเซเชเชฅเซ เช เชชเซเชฐเชคเชฟเชธเชพเชฆ เชเชชเซ เชเซ, เชคเซ เชชเชเซ เชธเชฐเซเชตเชฐ เชเซเชตเซ เชฐเซเชคเซ เชธเชฎเชเซ เชถเชเซ เชเซ ACK เชชเซเชเซเช เชเซ เชชเชพเชเชณเชฅเซ เชเชตเซเชฏเซเช เชคเซ SYN เชชเซเชเซเชเชจเซเช เชเซ เชเซ เชธเชพเชเชตเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช เชจ เชนเชคเซเช? เชเซเชตเชเซ, เชนเซเชฎเชฒเชพเชเซเชฐ เชจเชเชฒเซ ACKs เชชเชฃ เชเชจเชฐเซเช เชเชฐเซ เชถเชเซ เชเซ. SYN เชเซเชเซเชจเซ เชธเชพเชฐ เช เชเชจเซเชเซเชก เชเชฐเชตเชพเชจเซ เชเซ seqnum
เชธเชฐเชจเชพเชฎเชพเช, เชฌเชเชฆเชฐเซ เช
เชจเซ เชฌเชฆเชฒเชพเชคเชพ เชฎเซเช เชพเชจเชพ เชนเซเชถ เชคเชฐเซเชเซ เชเซเชกเชพเชฃ เชชเชฐเชฟเชฎเชพเชฃเซ. เชเซ ACK เชฎเซเช เซเช เชฌเชฆเชฒเชพเชคเชพ เชชเชนเซเชฒเชพ เชชเชนเซเชเชเชตเชพเชฎเชพเช เชตเซเชฏเชตเชธเซเชฅเชพเชชเชฟเชค เชนเซเชฏ, เชคเซ เชคเชฎเซ เชซเชฐเซเชฅเซ เชนเซเชถเชจเซ เชเชฃเชคเชฐเซ เชเชฐเซ เชถเชเซ เชเซ เช
เชจเซ เชคเซเชจเซ เชธเชพเชฅเซ เชธเชฐเชเชพเชฎเชฃเซ เชเชฐเซ เชถเชเซ เชเซ acknum
. เชจเชเชฒเซ acknum
เชนเซเชฎเชฒเชพเชเซเชฐ เชเชฐเซ เชถเชเชคเซ เชจเชฅเซ, เชเชพเชฐเชฃ เชเซ เชฎเซเช เชพเชฎเชพเช เชฐเชนเชธเซเชฏเชจเซ เชธเชฎเชพเชตเซเชถ เชฅเชพเชฏ เชเซ, เช
เชจเซ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชเซเชจเชฒเชจเซ เชเชพเชฐเชฃเซ เชคเซเชจเซ เชชเชพเชธเซ เชธเซเชฐเซเช เชเชฐเชตเชพเชจเซ เชธเชฎเชฏ เชจเชฅเซ.
SYN เชเซเชเซเชเชจเซ Linux เชเชฐเซเชจเชฒเชฎเชพเช เชฒเชพเชเชฌเชพ เชธเชฎเชฏเชฅเซ เชฒเชพเชเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ เช เชจเซ เชเซ SYN เชเซเชฌ เชเชกเชชเชฅเซ เช เชจเซ เชฌเชฒเซเชเชฎเชพเช เชเชตเซ เชคเซ เชชเชฃ เชคเซ เชเชชเชฎเซเชณเซ เชธเชเซเชทเชฎ เชฅเช เชถเชเซ เชเซ.
TCP เชนเซเชจเซเชกเชถเซเช เชชเชฐ เชถเซเชเซเชทเชฃเชฟเช เชเชพเชฐเซเชฏเชเซเชฐเชฎ
TCP เชฌเชพเชเชเซเชธเชจเชพ เชธเซเชเซเชฐเซเชฎ เชคเชฐเซเชเซ เชกเซเชเชพเชจเซเช เชเซเชฐเชพเชจเซเชธเชซเชฐ เชชเซเชฐเซเช เชชเชพเชกเซ เชเซ, เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, HTTP เชตเชฟเชจเชเชคเซเช TCP เชชเชฐ เชเซเชฐเชพเชจเซเชธเชฎเชฟเช เชฅเชพเชฏ เชเซ. เชธเซเชเซเชฐเซเชฎ เชเซเชเชกเซ เชเซเชเชกเซ เชชเซเชเซเชเซเชฎเชพเช เชชเซเชฐเชธเชพเชฐเชฟเชค เชฅเชพเชฏ เชเซ. เชฌเชงเชพ TCP เชชเซเชเซเชเซเชฎเชพเช เชฒเซเชเชฟเชเชฒ เชซเซเชฒเซเชเซเชธ เช เชจเซ 32-เชฌเซเช เชธเชฟเชเซเชตเชจเซเชธ เชจเชเชฌเชฐเซ เชเซ:
-
เชซเซเชฒเซเชเซเชธเชจเซเช เชธเชเชฏเซเชเชจ เชเซเชเซเชเชธ เชชเซเชเซเชเชจเซ เชญเซเชฎเชฟเชเชพเชจเซ เชตเซเชฏเชพเชเซเชฏเชพเชฏเชฟเชค เชเชฐเซ เชเซ. SYN เชซเซเชฒเซเชเชจเซ เช เชฐเซเชฅ เชเซ เชเซ เช เชเชจเซเชเซเชถเชจ เชชเชฐ เชฎเซเชเชฒเชจเชพเชฐเชจเซเช เชชเซเชฐเชฅเชฎ เชชเซเชเซเช เชเซ. ACK เชซเซเชฒเซเชเชจเซ เช เชฐเซเชฅ เชเซ เชเซ เชชเซเชฐเซเชทเชเชจเซ เชฌเชพเชเช เชธเซเชงเซเชจเซ เชคเชฎเชพเชฎ เชเชจเซเชเซเชถเชจ เชกเซเชเชพ เชชเซเชฐเชพเชชเซเชค เชฅเชฏเซ เชเซ.
acknum
. เชเช เชชเซเชเซเชเชฎเชพเช เชเชฃเชพ เชงเซเชตเช เชนเซเช เชถเชเซ เชเซ เช เชจเซ เชคเซเชจเซเช เชจเชพเชฎ เชคเซเชฎเชจเชพ เชธเชเชฏเซเชเชจ เชชเชฐ เชฐเชพเชเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช เชเซ, เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, SYNACK เชชเซเชเซเช. -
เชธเชฟเชเซเชตเชจเซเชธ เชจเชเชฌเชฐ (เชธเซเชเซเชจเชฎ) เช เชชเซเชเซเชเชฎเชพเช เชฎเซเชเชฒเชตเชพเชฎเชพเช เชเชตเซเชฒ เชชเซเชฐเชฅเชฎ เชฌเชพเชเช เชฎเชพเชเซ เชกเซเชเชพ เชธเซเชเซเชฐเซเชฎเชฎเชพเช เชเชซเชธเซเชเชจเซ เชเชฒเซเชฒเซเช เชเชฐเซ เชเซ. เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชเซ เชกเซเชเชพเชจเชพ X เชฌเชพเชเชเซเชธ เชธเชพเชฅเซเชจเชพ เชชเซเชฐเชฅเชฎ เชชเซเชเซเชเชฎเชพเช เช เชจเชเชฌเชฐ N เชนเชคเซ, เชคเซ เชจเชตเชพ เชกเซเชเชพ เชธเชพเชฅเซเชจเชพ เชเชเชพเชฎเซ เชชเซเชเซเชเชฎเชพเช เชคเซ N+X เชนเชถเซ. เชเชจเซเชเซเชถเชจเชจเซ เชถเชฐเซเชเชคเชฎเชพเช, เชฆเชฐเซเช เชชเชเซเชท เช เชจเชเชฌเชฐ เชฐเซเชจเซเชกเชฎเชฒเซ เชชเชธเชเชฆ เชเชฐเซ เชเซ.
-
เชธเซเชตเซเชเซเชคเชฟ เชจเชเชฌเชฐ (เชเชเชจเชฎ) - เชธเซเชเชจเชฎ เชเซเชตเซ เช เชเชซเชธเซเช เชเซ, เชชเชฐเชเชคเซ เชคเซ เชเซเชฐเชพเชจเซเชธเชฎเชฟเชเซเชก เชฌเชพเชเชเชจเซ เชธเชเชเซเชฏเชพ เชจเชเซเชเซ เชเชฐเชคเซเช เชจเชฅเซ, เชชเชฐเชเชคเซ เชชเซเชฐเชพเชชเซเชคเชเชฐเซเชคเชพ เชคเชฐเชซเชฅเซ เชชเซเชฐเชฅเชฎ เชฌเชพเชเชเชจเซ เชธเชเชเซเชฏเชพ, เชเซ เชชเซเชฐเซเชทเชเซ เชเซเช เชจ เชนเชคเซ.
เชเซเชกเชพเชฃเชจเซ เชถเชฐเซเชเชคเชฎเชพเช, เชชเชเซเชทเชเชพเชฐเซเช เชธเชเชฎเชค เชฅเชตเซเช เชเชตเชถเซเชฏเช เชเซ seqnum
ะธ acknum
. เชเซเชฒเชพเชฏเชเช เชคเซเชจเซ เชธเชพเชฅเซ SYN เชชเซเชเซเช เชฎเซเชเชฒเซ เชเซ seqnum = X
. เชธเชฐเซเชตเชฐ SYNACK เชชเซเชเซเช เชธเชพเชฅเซ เชชเซเชฐเชคเชฟเชธเชพเชฆ เชเชชเซ เชเซ, เชเซเชฏเชพเช เชคเซ เชชเซเชคเชพเชจเซเช เชฒเชเซ เชเซ seqnum = Y
เช
เชจเซ เชเชคเซ เชเชฐเซ เชเซ acknum = X + 1
. เชเซเชฒเชพเชฏเชเช SYNACK เชจเซ ACK เชชเซเชเซเช เชธเชพเชฅเซ เชเชตเชพเชฌ เชเชชเซ เชเซ, เชเซเชฏเชพเช seqnum = X + 1
, acknum = Y + 1
. เชคเซ เชชเชเซ, เชตเชพเชธเซเชคเชตเชฟเช เชกเซเชเชพ เชเซเชฐเชพเชจเซเชธเชซเชฐ เชถเชฐเซ เชฅเชพเชฏ เชเซ.
เชเซ เชเชจเซเชเชฐเชฒเซเชเซเชฏเซเชเชฐ เชชเซเชเซเชเชจเซ เชฐเชธเซเชฆ เชธเซเชตเซเชเชพเชฐเชคเซ เชจเชฅเซ, เชคเซ TCP เชคเซเชจเซ เชธเชฎเชฏเชธเชฎเชพเชชเซเชคเชฟ เชฆเซเชตเชพเชฐเชพ เชซเชฐเซเชฅเซ เชฎเซเชเชฒเซ เชเซ.
SYN เชเซเชเซเช เชถเชพ เชฎเชพเชเซ เชนเชเชฎเซเชถเชพ เชเชชเชฏเซเชเชฎเชพเช เชฒเซเชตเชพเชคเซ เชจเชฅเซ?
เชชเซเชฐเชฅเชฎ, เชเซ SYNACK เช เชฅเชตเชพ ACK เชเซเชตเชพเช เชเชพเชฏ, เชคเซ เชคเชฎเชพเชฐเซ เชซเชฐเซเชฅเซ เชฎเซเชเชฒเชตเชพเชจเซ เชฐเชพเชน เชเซเชตเซ เชชเชกเชถเซ - เชเชจเซเชเซเชถเชจเชจเซ เชธเซเชฅเชพเชชเชจเชพ เชงเซเชฎเซ เชชเชกเซ เชเชพเชฏ เชเซ. เชฌเซเชเซเช, SYN เชชเซเชเซเชเชฎเชพเช - เช เชจเซ เชซเชเซเชค เชคเซเชฎเชพเช! - เชธเชเชเซเชฏเชพเชฌเชเชง เชตเชฟเชเชฒเซเชชเซ เชชเซเชฐเชธเชพเชฐเชฟเชค เชฅเชพเชฏ เชเซ เชเซ เชเชจเซเชเซเชถเชจเชจเซ เชเชเชณเชจเซ เชเชพเชฎเชเซเชฐเซเชจเซ เช เชธเชฐ เชเชฐเซ เชเซ. เชเชตเชจเชพเชฐเชพ SYN เชชเซเชเซเชเซเชจเซ เชฏเชพเชฆ เชจ เชฐเชพเชเชคเชพ, เชธเชฐเซเชตเชฐ เชเชฎ เช เชตเชฟเชเชฒเซเชชเซเชจเซ เช เชตเชเชฃเซ เชเซ, เชจเซเชเซเชจเชพ เชชเซเชเซเชเซเชฎเชพเช เชเซเชฒเชพเชฏเชจเซเช เชนเชตเซ เชคเซเชฎเชจเซ เชฎเซเชเชฒเชถเซ เชจเชนเซเช. TCP เช เชเชฟเชธเซเชธเชพเชฎเชพเช เชเชพเชฎ เชเชฐเซ เชถเชเซ เชเซ, เชชเชฐเชเชคเซ เชเชเชพเชฎเชพเช เชเชเชพ เชชเซเชฐเชพเชฐเชเชญเชฟเช เชคเชฌเชเซเชเซ, เชเชจเซเชเซเชถเชจเชจเซ เชเซเชฃเชตเชคเซเชคเชพเชฎเชพเช เชเชเชพเชกเซ เชฅเชถเซ.
เชชเซเชเซเชเซเชจเชพ เชธเชเชฆเชฐเซเชญเชฎเชพเช, XDP เชชเซเชฐเซเชเซเชฐเชพเชฎเซ เชจเซเชเซ เชฎเซเชเชฌ เชเชฐเชตเซเช เชเซเชเช:
- เชเซเชเซ เชธเชพเชฅเซ SYNACK เชธเชพเชฅเซ SYN เชจเซ เชชเซเชฐเชคเชฟเชธเชพเชฆ เชเชชเซ;
- ACK เชจเซ RST เชธเชพเชฅเซ เชเชตเชพเชฌ เชเชชเซ (เชเชจเซเชเซเชถเชจ เชคเซเชกเซ);
- เช เชจเซเชฏ เชชเซเชเซเชเซ เชเซเชกเซ.
เชชเซเชเซเช เชชเชพเชฐเซเชธเชฟเชเช เชธเชพเชฅเซ เช เชฒเซเชเซเชฐเชฟเชงเชฎเชจเซ เชธเซเชฏเซเชกเซเชเซเชก:
ะัะปะธ ััะพ ะฝะต Ethernet,
ะฟัะพะฟัััะธัั ะฟะฐะบะตั.
ะัะปะธ ััะพ ะฝะต IPv4,
ะฟัะพะฟัััะธัั ะฟะฐะบะตั.
ะัะปะธ ะฐะดัะตั ะฒ ัะฐะฑะปะธัะต ะฟัะพะฒะตัะตะฝะฝัั
, (*)
ัะผะตะฝััะธัั ััะตััะธะบ ะพััะฐะฒัะธั
ัั ะฟัะพะฒะตัะพะบ,
ะฟัะพะฟัััะธัั ะฟะฐะบะตั.
ะัะปะธ ััะพ ะฝะต TCP,
ัะฑัะพัะธัั ะฟะฐะบะตั. (**)
ะัะปะธ ััะพ SYN,
ะพัะฒะตัะธัั SYN-ACK ั cookie.
ะัะปะธ ััะพ ACK,
ะตัะปะธ ะฒ acknum ะปะตะถะธั ะฝะต cookie,
ัะฑัะพัะธัั ะฟะฐะบะตั.
ะะฐะฝะตััะธ ะฒ ัะฐะฑะปะธัั ะฐะดัะตั ั N ะพััะฐะฒัะธั
ัั ะฟัะพะฒะตัะพะบ. (*)
ะัะฒะตัะธัั RST. (**)
ะ ะพััะฐะปัะฝัั
ัะปััะฐัั
ัะฑัะพัะธัั ะฟะฐะบะตั.
เชเช (*)
เชคเชฎเชพเชฐเซ เชธเชฟเชธเซเชเชฎเชจเซ เชธเซเชฅเชฟเชคเชฟเชจเซ เชฎเซเชจเซเช เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชนเซเชฏ เชคเซ เชฌเชฟเชเชฆเซเช เชเชฟเชนเซเชจเชฟเชค เชฅเชฏเซเชฒ เชเซ - เชชเซเชฐเชฅเชฎ เชคเชฌเชเซเชเซ, เชคเชฎเซ เชธเซเชเชจเชฎ เชคเชฐเซเชเซ SYN เชเซเชเซ เชเชจเชฐเซเช เชเชฐเซเชจเซ TCP เชนเซเชจเซเชกเชถเซเชเชจเซ เช
เชฎเชฒ เชเชฐเซเชจเซ เชคเซเชฎเชจเชพ เชตเชฟเชจเชพ เชเชฐเซ เชถเชเซ เชเซ.
เชเชเซเชฏเชพ เชชเชฐ (**)
, เชเซเชฏเชพเชฐเซ เช
เชฎเชพเชฐเซ เชชเชพเชธเซ เชเซเชฌเชฒ เชจเชฅเซ, เช
เชฎเซ เชชเซเชเซเช เชเซเชกเซ เชฆเชเชถเซเช.
TCP เชนเซเชจเซเชกเชถเซเช เช เชฎเชฒเซเชเชฐเชฃ
เชชเซเชเซเช เชชเชพเชฐเซเชธเชฟเชเช เช เชจเซ เชเซเชก เชตเซเชฐเชฟเชซเชฟเชเซเชถเชจ
เช
เชฎเชจเซ เชจเซเชเชตเชฐเซเช เชนเซเชกเชฐ เชธเซเชเซเชฐเชเซเชเชฐเซเชธเชจเซ เชเชฐเซเชฐ เชเซ: เชเชฅเชฐเชจเซเช (uapi/linux/if_ether.h
), IPv4 (uapi/linux/ip.h
) เช
เชจเซ TCP (uapi/linux/tcp.h
). เชเซเชฒเซเชฒเซเช เชเซ เชนเซเช เชธเชเชฌเชเชงเชฟเชค เชญเซเชฒเซเชจเซ เชเชพเชฐเชฃเซ เชเชจเซเชเซเช เชเชฐเซ เชถเชเซเชฏเซ เชจเชฅเซ atomic64_t
, เชฎเชพเชฐเซ เชเซเชกเชฎเชพเช เชเชฐเซเชฐเซ เชตเซเชฏเชพเชเซเชฏเชพเชเชจเซ เชจเชเชฒ เชเชฐเชตเซ เชชเชกเซ.
เชตเชพเชเชเชจเชเซเชทเชฎเชคเชพ เชฎเชพเชเซ C เชฎเชพเช เช เชฒเช เชชเชพเชกเชตเชพเชฎเชพเช เชเชตเซเชฒ เชคเชฎเชพเชฎ เชซเชเชเซเชถเชจเซเชธ เชเซเชฒ เชธเชพเชเช เชชเชฐ เชเชจเชฒเชพเชเชจ เชนเซเชตเชพ เชเซเชเช, เชเชพเชฐเชฃ เชเซ เชเชฐเซเชจเชฒเชฎเชพเช eBPF เชตเซเชฐเชฟเชซเชพเชฏเชฐ เชฌเซเช เชเชฎเซเชชเซเชธ, เชเชเชฒเซ เชเซ, เชนเชเซเชเชคเชฎเชพเช, เชฒเซเชชเซเชธ เช เชจเซ เชซเชเชเซเชถเชจ เชเซเชฒเซเชธเชจเซ เชชเซเชฐเชคเชฟเชฌเชเชงเชฟเชค เชเชฐเซ เชเซ.
#define INTERNAL static __attribute__((always_inline))
เชฎเซเชเซเชฐเซ LOG()
เชฐเซเชฒเซเช เชฌเชฟเชฒเซเชกเชฎเชพเช เชชเซเชฐเชฟเชจเซเชเซเชเชเชจเซ เช
เชเซเชทเชฎ เชเชฐเซ เชเซ.
เชชเซเชฐเซเชเซเชฐเชพเชฎ เช เชเชพเชฐเซเชฏเซเชจเซ เชชเชพเชเชชเชฒเชพเชเชจ เชเซ. เชฆเชฐเซเชเชจเซ เชเช เชชเซเชเซเช เชฎเชณเซ เชเซ เชเซเชฎเชพเช เช
เชจเซเชฐเซเชช เชธเซเชคเชฐเชจเซเช เชนเซเชกเชฐ เชชเซเชฐเชเชพเชถเชฟเชค เชฅเชพเชฏ เชเซ, เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, process_ether()
เชญเชฐเชตเชพเชจเซ เชฐเชพเชน เชเซเชตเซ ether
. เชเซเชทเซเชคเซเชฐ เชตเชฟเชถเซเชฒเซเชทเชฃเชจเชพ เชชเชฐเชฟเชฃเชพเชฎเซเชจเชพ เชเชงเชพเชฐเซ, เชเชพเชฐเซเชฏ เชชเซเชเซเชเชจเซ เชเชเซเช เชธเซเชคเชฐ เชชเชฐ เชธเซเชฅเชพเชจเชพเชเชคเชฐเชฟเชค เชเชฐเซ เชถเชเซ เชเซ. เชเชพเชฐเซเชฏเชจเซเช เชชเชฐเชฟเชฃเชพเชฎ เช XDP เชเซเชฐเชฟเชฏเชพ เชเซ. เชเซเชฏเชพเชฐเซ SYN เช
เชจเซ ACK เชนเซเชจเซเชกเชฒเชฐเซเชธ เชฌเชงเชพ เชชเซเชเซเชเชจเซ เชชเชธเชพเชฐ เชฅเชตเชพ เชฆเซ เชเซ.
struct Packet {
struct xdp_md* ctx;
struct ethhdr* ether;
struct iphdr* ip;
struct tcphdr* tcp;
};
INTERNAL int process_tcp_syn(struct Packet* packet) { return XDP_PASS; }
INTERNAL int process_tcp_ack(struct Packet* packet) { return XDP_PASS; }
INTERNAL int process_tcp(struct Packet* packet) { ... }
INTERNAL int process_ip(struct Packet* packet) { ... }
INTERNAL int
process_ether(struct Packet* packet) {
struct ethhdr* ether = packet->ether;
LOG("Ether(proto=0x%x)", bpf_ntohs(ether->h_proto));
if (ether->h_proto != bpf_ntohs(ETH_P_IP)) {
return XDP_PASS;
}
// B
struct iphdr* ip = (struct iphdr*)(ether + 1);
if ((void*)(ip + 1) > (void*)packet->ctx->data_end) {
return XDP_DROP; /* malformed packet */
}
packet->ip = ip;
return process_ip(packet);
}
SEC("prog")
int xdp_main(struct xdp_md* ctx) {
struct Packet packet;
packet.ctx = ctx;
// A
struct ethhdr* ether = (struct ethhdr*)(void*)ctx->data;
if ((void*)(ether + 1) > (void*)ctx->data_end) {
return XDP_PASS;
}
packet.ether = ether;
return process_ether(&packet);
}
เชนเซเช A เช เชจเซ B เชเชฟเชนเซเชจเชฟเชค เชเซเช เชชเชฐ เชงเซเชฏเชพเชจ เชเชชเซเช เชเซเช. เชเซ เชคเชฎเซ A เชจเซ เชเชฟเชชเซเชชเชฃเซ เชเชฐเซ เชเซ, เชคเซ เชชเซเชฐเซเชเซเชฐเชพเชฎ เชฌเชฟเชฒเซเชก เชฅเชถเซ, เชชเชฐเชเชคเซ เชฒเซเชก เชเชฐเชคเซ เชตเชเชคเซ เชเชเชพเชธเชฃเซ เชญเซเชฒ เชนเชถเซ:
Verifier analysis:
<...>
11: (7b) *(u64 *)(r10 -48) = r1
12: (71) r3 = *(u8 *)(r7 +13)
invalid access to packet, off=13 size=1, R7(id=0,off=0,r=0)
R7 offset is outside of the packet
processed 11 insns (limit 1000000) max_states_per_insn 0 total_states 0 peak_states 0 mark_read 0
Error fetching program/map!
เชเซ เชธเซเชเซเชฐเชฟเชเช invalid access to packet, off=13 size=1, R7(id=0,off=0,r=0)
: เชเซเชฏเชพเชฐเซ เชฌเชซเชฐเชจเซ เชถเชฐเซเชเชคเชฅเซ เชคเซเชฐเชฎเซ เชฌเชพเชเช เชชเซเชเซเชเชจเซ เชฌเชนเชพเชฐ เชนเซเชฏ เชคเซเชฏเชพเชฐเซ เชเชเซเชเซเชเซเชฏเซเชถเชจ เชชเชพเชฅ เชนเซเชฏ เชเซ. เชธเซเชเชฟเชฎเชพเชเชฅเซ เชคเซ เชเชนเซเชตเซเช เชฎเซเชถเซเชเซเชฒ เชเซ เชเซ เช
เชฎเซ เชเช เชฒเชพเชเชจ เชตเชฟเชถเซ เชตเชพเชค เชเชฐเซ เชฐเชนเซเชฏเชพ เชเซเช, เชชเชฐเชเชคเซ เชคเซเชฏเชพเช เชเช เชธเซเชเชจเชพ เชจเชเชฌเชฐ (12) เช
เชจเซ เชกเชฟเชธเชเชธเซเชฎเซเชฌเชฒเชฐ เชเซ เชเซ เชธเซเชฐเซเชค เชเซเชกเชจเซ เชฐเซเชเชพเช เชฆเชฐเซเชถเชพเชตเซ เชเซ:
llvm-objdump -S xdp_filter.o | less
เช เชเชฟเชธเซเชธเชพเชฎเชพเช, เชคเซ เชฐเซเชเชพ เชคเชฐเชซ เชจเชฟเชฐเซเชฆเซเชถ เชเชฐเซ เชเซ
LOG("Ether(proto=0x%x)", bpf_ntohs(ether->h_proto));
เชเซ เชธเซเชชเชทเซเช เชเชฐเซ เชเซ เชเซ เชธเชฎเชธเซเชฏเชพ เชเซ ether
. เชคเซ เชนเชเชฎเซเชถเชพ เชเชตเซเช เช เชนเชถเซ.
SYN เชจเซ เชเชตเชพเชฌ เชเชชเซ
เช เชคเชฌเชเซเชเซ เชงเซเชฏเซเชฏ เชจเชฟเชถเซเชเชฟเชค เชธเชพเชฅเซ เชฏเซเชเซเชฏ SYNACK เชชเซเชเซเช เชฌเชจเชพเชตเชตเชพเชจเซเช เชเซ seqnum
, เชเซ เชญเชตเชฟเชทเซเชฏเชฎเชพเช SYN เชเซเชเซ เชฆเซเชตเชพเชฐเชพ เชฌเชฆเชฒเชตเชพเชฎเชพเช เชเชตเชถเซ. เชฌเชงเชพ เชซเซเชฐเชซเชพเชฐเซ เชฎเชพเช เชฅเชพเชฏ เชเซ process_tcp_syn()
เช
เชจเซ เชเชธเชชเชพเชธเชจเชพ.
เชชเซเชเซเช เชคเชชเชพเชธเซ เชฐเชนเซเชฏเซเช เชเซ
เชตเชฟเชเชฟเชคเซเชฐ เชฐเซเชคเซ, เช เชนเซเช เชธเซเชฅเซ เชจเซเชเชงเชชเชพเชคเซเชฐ เชฒเชพเชเชจ เชเซ, เช เชฅเชตเชพ เชคเซเชจเชพ เชฌเชฆเชฒเซ, เชคเซเชจเชพ เชชเชฐ เชเช เชเชฟเชชเซเชชเชฃเซ เชเซ:
/* Required to verify checksum calculation */
const void* data_end = (const void*)ctx->data_end;
เชเซเชกเชจเซเช เชชเซเชฐเชฅเชฎ เชธเชเชธเซเชเชฐเชฃ เชฒเชเชคเซ เชตเชเชคเซ, 5.1 เชเชฐเซเชจเชฒเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซ เชนเชคเซ, เชเซเชจเซ เชเชเชพเชธเชฃเซเชเชฐเซเชคเชพ เชฎเชพเชเซ เชตเชเซเชเซ เชคเชซเชพเชตเชค เชนเชคเซ data_end
ะธ (const void*)ctx->data_end
. เชฒเชเชตเชพเชจเชพ เชธเชฎเชฏเซ, 5.3.1 เชเชฐเซเชจเชฒ เชชเชพเชธเซ เช เชธเชฎเชธเซเชฏเชพ เชจเชฅเซ. เชเชฆเชพเช เชเชฎเซเชชเชพเชเชฒเชฐ เชเซเชทเซเชคเซเชฐ เชเชฐเชคเชพ เช
เชฒเช เชฐเซเชคเซ เชธเซเชฅเชพเชจเชฟเช เชเชฒเชจเซ เชเชเซเชธเซเชธ เชเชฐเซ เชฐเชนเซเชฏเซ เชนเชคเซ. เชจเซเชคเชฟเช - เชฎเซเชเชพ เชฎเชพเชณเชเชพ เชชเชฐ, เชเซเชกเชจเซ เชธเชฐเชณ เชฌเชจเชพเชตเชตเชพเชฅเซ เชฎเชฆเชฆ เชฎเชณเซ เชถเชเซ เชเซ.
เชตเซเชฐเชฟเชซเชพเชฏเชฐเชจเชพ เชเซเชฐเชต เชฎเชพเชเซ เชฒเชเชฌเชพเชเชจเซ เชตเชงเซ เชจเชฟเชฏเชฎเชฟเชค เชคเชชเชพเชธ; เช MAX_CSUM_BYTES
เชจเซเชเซ.
const u32 ip_len = ip->ihl * 4;
if ((void*)ip + ip_len > data_end) {
return XDP_DROP; /* malformed packet */
}
if (ip_len > MAX_CSUM_BYTES) {
return XDP_ABORTED; /* implementation limitation */
}
const u32 tcp_len = tcp->doff * 4;
if ((void*)tcp + tcp_len > (void*)ctx->data_end) {
return XDP_DROP; /* malformed packet */
}
if (tcp_len > MAX_CSUM_BYTES) {
return XDP_ABORTED; /* implementation limitation */
}
เชชเซเชเซเช เชธเซเชชเซเชฐเซเชก
เช
เชฎเซ เชญเชฐเซเช เชเซเช seqnum
ะธ acknum
, ACK เชธเซเช เชเชฐเซ (SYN เชชเชนเซเชฒเซเชฅเซ เชธเซเช เชเซ):
const u32 cookie = 42;
tcp->ack_seq = bpf_htonl(bpf_ntohl(tcp->seq) + 1);
tcp->seq = bpf_htonl(cookie);
tcp->ack = 1;
TCP เชชเซเชฐเซเช, IP เช
เชจเซ MAC เชเชกเซเชฐเซเชธ เชธเซเชตเซเชช เชเชฐเซ. XDP เชชเซเชฐเซเชเซเชฐเชพเชฎเชฎเชพเชเชฅเซ เชชเซเชฐเชฎเชพเชฃเชญเซเชค เชชเซเชธเซเชคเชเชพเชฒเชฏ เชเชชเชฒเชฌเซเชง เชจเชฅเซ, เชคเซเชฅเซ memcpy()
โ เชเช เชฎเซเชเซเชฐเซ เชเซ เชเซ เชฐเชฃเชเชพเชฐ เชเชเชคเชฐเชฟเช เชเซเชชเชพเชตเซ เชเซ.
const u16 temp_port = tcp->source;
tcp->source = tcp->dest;
tcp->dest = temp_port;
const u32 temp_ip = ip->saddr;
ip->saddr = ip->daddr;
ip->daddr = temp_ip;
struct ethhdr temp_ether = *ether;
memcpy(ether->h_dest, temp_ether.h_source, ETH_ALEN);
memcpy(ether->h_source, temp_ether.h_dest, ETH_ALEN);
เชเซเชเชธเชฎ เชชเซเชจเช เชเชฃเชคเชฐเซ
IPv4 เช เชจเซ TCP เชเซเชเชธเชฎเชจเซ เชนเซเชกเชฐเชฎเชพเช เชฌเชงเชพ 16-เชฌเซเช เชถเชฌเซเชฆเซ เชเชฎเซเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ, เช เชจเซ เชนเซเชกเชฐเซเชจเซเช เชเชฆ เชคเซเชฎเชพเช เชฒเชเชพเชฏเซเชฒเซเช เชเซ, เชเชเชฒเซ เชเซ, เชธเชเชเชฒเชจ เชธเชฎเชฏเซ เช เชเซเชเชพเชค เชเซ. เช เชเช เชธเชฎเชธเซเชฏเชพ เชเซ เชเชพเชฐเชฃ เชเซ เชฌเชพเชเชจเซเชกเซเชฐเซ เชตเซเชฐเซเชเชฌเชฒ เชธเซเชงเซ เชตเซเชฐเชฟเชซเชพเชฏเชฐ เชธเชพเชฎเชพเชจเซเชฏ เชฒเซเชชเชจเซ เชเซเชกเชถเซ เชจเชนเซเช. เชชเชฐเชเชคเซ เชนเซเชกเชฐเซเชจเซเช เชเชฆ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชเซ: เชฆเชฐเซเช 64 เชฌเชพเชเชเซเชธ เชธเซเชงเซ. เชคเชฎเซ เชจเชฟเชถเซเชเชฟเชค เชธเชเชเซเชฏเชพเชฎเชพเช เชชเซเชจเชฐเชพเชตเชฐเซเชคเชจเซ เชธเชพเชฅเซ เชฒเซเชช เชฌเชจเชพเชตเซ เชถเชเซ เชเซ, เชเซ เชตเชนเซเชฒเชพ เชธเชฎเชพเชชเซเชค เชฅเช เชถเชเซ เชเซ.
เชนเซเช เชจเซเชเชงเซเช เชเซเช เชเซ เชคเซเชฏเชพเช เชเซ
เชเซเชเชธเชฎ เชเชฃเชคเชฐเซ เชเชพเชฐเซเชฏ:
#define MAX_CSUM_WORDS 32
#define MAX_CSUM_BYTES (MAX_CSUM_WORDS * 2)
INTERNAL u32
sum16(const void* data, u32 size, const void* data_end) {
u32 s = 0;
#pragma unroll
for (u32 i = 0; i < MAX_CSUM_WORDS; i++) {
if (2*i >= size) {
return s; /* normal exit */
}
if (data + 2*i + 1 + 1 > data_end) {
return 0; /* should be unreachable */
}
s += ((const u16*)data)[i];
}
return s;
}
เชเซเชเซ size
เชเซเชฒเชฟเชเช เชเซเชก เชฆเซเชตเชพเชฐเชพ เชคเชชเชพเชธเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เชฌเซเชเซ เชเชเซเชเชฟเช เชถเชฐเชค เชเชฐเซเชฐเซ เชเซ เชเซเชฅเซ เชตเซเชฐเชฟเชซเชพเชฏเชฐ เชฒเซเชชเชจเซ เช
เชเชค เชธเชพเชฌเชฟเชค เชเชฐเซ เชถเชเซ.
32-เชฌเซเช เชถเชฌเซเชฆเซ เชฎเชพเชเซ, เชเช เชธเชฐเชณ เชธเชเชธเซเชเชฐเชฃ เชฒเชพเชเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช เชเซ:
INTERNAL u32
sum16_32(u32 v) {
return (v >> 16) + (v & 0xffff);
}
เชเชฐเซเชเชฐ เชเซเชเชธเชฎเชจเซ เชชเซเชจเชเชเชฃเชคเชฐเซ เชเชฐเชตเซ เช เชจเซ เชชเซเชเซเช เชชเชพเชเซเช เชฎเซเชเชฒเชตเซเช:
ip->check = 0;
ip->check = carry(sum16(ip, ip_len, data_end));
u32 tcp_csum = 0;
tcp_csum += sum16_32(ip->saddr);
tcp_csum += sum16_32(ip->daddr);
tcp_csum += 0x0600;
tcp_csum += tcp_len << 8;
tcp->check = 0;
tcp_csum += sum16(tcp, tcp_len, data_end);
tcp->check = carry(tcp_csum);
return XDP_TX;
เชเชพเชฐเซเชฏ carry()
RFC 32 เชฎเซเชเชฌ, 16-เชฌเซเช เชถเชฌเซเชฆเซเชจเชพ 791-เชฌเซเช เชฐเชเชฎเชฎเชพเชเชฅเซ เชเซเชเชธเชฎ เชฌเชจเชพเชตเซ เชเซ.
TCP เชนเซเชจเซเชกเชถเซเช เชเซเช
เชซเชฟเชฒเซเชเชฐ เชฏเซเชเซเชฏ เชฐเซเชคเซ เชธเชพเชฅเซ เชเซเชกเชพเชฃ เชธเซเชฅเชพเชชเชฟเชค เชเชฐเซ เชเซ netcat
, เช
เชเชคเชฟเชฎ ACK เชจเซ เชเซเชกเซเชจเซ, เชเซเชจเชพ เชฎเชพเชเซ Linux เช RST เชชเซเชเซเช เชธเชพเชฅเซ เชชเซเชฐเชคเชฟเชธเชพเชฆ เชเชชเซเชฏเซ, เชเชพเชฐเชฃ เชเซ เชจเซเชเชตเชฐเซเช เชธเซเชเซเชเชจเซ SYN เชชเซเชฐเชพเชชเซเชค เชฅเชฏเซเช เชจ เชนเชคเซเช - เชคเซเชจเซ SYNACK เชฎเชพเช เชฐเซเชชเชพเชเชคเชฐเชฟเชค เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช เชนเชคเซเช เช
เชจเซ เชชเชพเชเซเช เชฎเซเชเชฒเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช เชนเชคเซเช - เช
เชจเซ OS เชจเชพ เชฆเซเชทเซเชเชฟเชเซเชฃเชฅเซ, เชเช เชชเซเชเซเช เชเชตเซเชฏเซเช เชเซ เชจ เชนเชคเซเช. เชเซเชฒเซเชฒเชพ เชเซเชกเชพเชฃเซเชฅเซ เชธเชเชฌเชเชงเชฟเชค.
$ sudo ip netns exec xdp-test nc -nv 192.0.2.1 6666
192.0.2.1 6666: Connection reset by peer
เชธเชเชชเซเชฐเซเชฃ เชเชชเซเชฒเชฟเชเซเชถเชจ เชธเชพเชฅเซ เชคเชชเชพเชธ เชเชฐเชตเซ เช
เชจเซ เช
เชตเชฒเซเชเชจ เชเชฐเชตเซเช เชฎเชนเชคเซเชตเชชเซเชฐเซเชฃ เชเซ tcpdump
เชชเชฐ xdp-remote
เชเชพเชฐเชฃ เชเซ, เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, hping3
เชเซเชเชพ เชเซเชเชธเชฎเชจเซ เชเชตเชพเชฌ เชเชชเชคเซ เชจเชฅเซ.
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