เปเบเบเปเบเปเบฅเบเบต eXpress Data Path (XDP) เบเปเบงเบเปเบซเปเบเบฒเบเบเบฐเบกเบงเบเบเบปเบเบเบฒเบเบเบฒเบฅเบฐเบเบญเบเปเบเบเบชเบธเปเบกเบเบทเบเบเบฐเบเบดเบเบฑเบเปเบเบเบฒเบเปเบเปเบเบญเบ Linux เบเปเบญเบเบเบตเปเปเบเบฑเบเปเบเบฑเบเบเบฐเปเบเบปเปเบฒเปเบเปเบ stack เปเบเบทเบญเบเปเบฒเบ kernel. เบเปเบฒเบฎเปเบญเบเบชเบฐเบซเบกเบฑเบเบเบญเบ XDP - เบเบฒเบเบเปเบญเบเบเบฑเบเบเบฒเบเปเบเบกเบเบต DDoS (CloudFlare), เบเบฒเบเบเบฑเปเบเบเบญเบเบชเบฐเบฅเบฑเบเบชเบฑเบเบเปเบญเบ, เบเบฒเบเปเบเบฑเบเบเปเบฒเบชเบฐเบเบดเบเบด (Netflix). เปเบเบฅเปเบเบฅเบก XDP เบเบทเบเบเบฐเบเบดเบเบฑเบเปเบเบเปเบเบทเปเบญเบ virtual eBPF, เบเบฑเปเบเบเบฑเปเบเบเบงเบเบกเบฑเบเบกเบตเบเปเปเบเปเบฒเบเบฑเบเบเบฑเบเบฅเบฐเบซเบฑเบเบเบญเบเบเบงเบเปเบเบปเบฒเปเบฅเบฐเบซเบเปเบฒเบเบตเป kernel เบเบตเปเบกเบตเบขเบนเปเบเบถเปเบเบขเบนเปเบเบฑเบเบเบฐเปเบเบเบเบฒเบเบเบฑเปเบเบเบญเบ.
เบเบปเบเบเบงเบฒเบกเบกเบตเบเบธเบเบเบฐเบชเบปเบเปเบเบทเปเบญเบเบทเปเบกเบเปเปเบเบปเบเบเปเบญเบเบเบญเบเบงเบฑเบเบชเบฐเบเบธเบเปเบฒเบเบงเบเบซเบฅเบฒเบเปเบ XDP. เบเปเบญเบเบญเบทเปเบ เปเบปเบ, เบเบงเบเปเบเบปเบฒเปเบซเปเบฅเบฐเบซเบฑเบเบเบตเปเบเปเบญเบกเบเบตเปเบเบฐเปเบฎเบฑเบเปเบเบเบเบฑเบเบเบตเบเบตเปเบเปเบฒเบกเบฅเบฑเบเบชเบฐเบเบฐเบเบญเบ XDP: เบกเบฑเบเบเบทเบเบเบฐเบเบฝเบกเบชเปเบฒเบฅเบฑเบเบเบฒเบเบขเบฑเปเบเบขเบทเบเบซเบผเบทเบเปเบฒเบเบเบฒเบเปเบเบตเบเปเบเบเบตเปเบเบฐเปเบฎเบฑเบเปเบซเปเปเบเบตเบเบเบฑเบเบซเบฒ. เปเบเปเบงเบฅเบฒเบเบตเปเบเปเบฒเบเบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเบฐเบเบฒเบเบฒเบกเบเบฝเบเบฅเบฐเบซเบฑเบเบเบญเบเบเปเบฒเบเบเบฒเบ scratch, เบเปเบฒเบเบเปเปเบกเบตเบเบงเบฒเบกเบเบดเบเบเบตเปเบเบฐเปเบฎเบฑเบเปเบเบงเปเบเบเบฑเบเบเบงเบฒเบกเบเบดเบเบเบฒเบเบเบปเบเบเบฐเบเบด. เบญเบฑเบเบเบตเบชเบญเบ, เบงเบดเบเบตเบเบฒเบเบเบปเบเบชเบญเบ XDP เปเบเบเปเบญเบเบเบดเปเบเปเบเบเบเปเปเบกเบต VM เปเบฅเบฐเบฎเบฒเบเปเบงเบเปเปเปเบเปเบเบทเบเบเบธเปเบกเบเบญเบ, เปเบเบดเบเบงเปเบฒเบเบฐเบกเบตเบเบงเบฒเบกเบเบดเบเบเบตเปเบงเปเบฒเบเบงเบเปเบเบปเบฒเบกเบตเบเบธเบกเบเบญเบเบเบปเบเปเบญเบ. เบเปเปเบเบงเบฒเบกเปเบกเปเบเบกเบตเบเบธเบเบเบฐเบชเบปเบเบชเปเบฒเบฅเบฑเบเบเบฑเบเบเบฝเบเปเบเบฅเปเบเบฅเบกเบเบตเปเบเบธเปเบเปเบเบตเบเบเบฑเบเปเบเบทเบญเบเปเบฒเบเปเบฅเบฐ Linux เบเบตเปเบกเบตเบเบงเบฒเบกเบชเบปเบเปเบเปเบ XDP เปเบฅเบฐ eBPF.
เปเบเบชเปเบงเบเบเบตเป, เบเบงเบเปเบฎเบปเบฒเบเบฐเปเบเบปเปเบฒเปเบเบขเปเบฒเบเบฅเบฐเบญเบฝเบเบงเปเบฒเบเบฒเบเบเบฑเปเบเบเบญเบ XDP เบเบทเบเบเบฐเบเบญเบเปเบฅเบฐเบงเบดเบเบตเบเบฒเบเบเบปเบเบชเบญเบเบกเบฑเบ, เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเบเบงเบเปเบฎเบปเบฒเบเบฐเบเบฝเบเปเบเบเบเปเบฒเบเปเบเบญเบเบเบปเบเปเบเบเบฒเบเบเบธเบเบเบต SYN เบเบตเปเบกเบตเบเบทเปเบชเบฝเบเปเบเบฅเบฐเบเบฑเบเบเบฒเบเบเบธเบเปเบเปเบเปเบเบฑเบเปเบเบฑเบ. เบเบงเบเปเบฎเบปเบฒเบเบฐเบเปเปเบชเปเบฒเบ "เบเบฑเบเบเบตเบฅเบฒเบเบเบทเปเบชเบตเบเบฒเบง" เปเบเบทเปเบญ
เบฅเบนเบเบเปเบฒเบเบตเปเบเบทเบเบขเบทเบเบขเบฑเบ, เบฎเบฑเบเบชเบฒเปเบเบทเปเบญเบเบเบฑเบเปเบฅเบฐเบเบฑเบเบเบฒเบเบเบฒเบเบเบฑเปเบเบเบญเบ - เบเบฑเบเบเบถเบเบเบฝเบเบเป.
เบเบงเบเปเบฎเบปเบฒเบเบฐเบเบฝเบเปเบ C - เบกเบฑเบเบเปเปเปเบกเปเบเบเบปเบเบญเบฑเบเปเบเบ:, เปเบเปเบกเบฑเบเบเบฐเบเบดเบเบฑเบเปเบเป. เบฅเบฐเบซเบฑเบเบเบฑเบเบซเบกเบปเบเปเบกเปเบเบกเบตเบขเบนเปเปเบ GitHub เบเปเบฒเบเบเบฒเบเปเบเบทเปเบญเบกเบเปเปเปเบเบเบญเบเบเปเบฒเบเปเบฅเบฐเปเบเปเบเบญเบญเบเปเบเบฑเบเบเปเบฒเบซเบกเบฑเปเบเบชเบฑเบเบเบฒเบเบฒเบกเบเบฑเปเบเบเบญเบเบเบตเปเปเบเปเบญเบฐเบเบดเบเบฒเบเปเบงเปเปเบเบเบปเบเบเบงเบฒเบก.
เบเบฒเบเบเบฐเบเบดเปเบชเบ. เปเบเปเบฅเบเบฐเบเบญเบเบเบปเบเบเบงเบฒเบกเบเบตเป, เบเปเบฒเบเบฐเปเบเบปเปเบฒเบเบฐเบเบฑเบเบเบฐเบเบฒเบเบฒเบเปเบเปเปเบ mini เปเบเบทเปเบญเบเปเบญเบเบเบฑเบเบเบฒเบเปเบเบกเบเบต DDoS, เปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒเบเบตเปเปเบกเปเบเบงเบฝเบเบเบฒเบเบเบตเปเปเบเปเบเบดเบเบชเปเบฒเบฅเบฑเบ XDP เปเบฅเบฐเบเบทเปเบเบเบตเปเบเบงเบฒเบกเบเปเบฝเบงเบเบฒเบเบเบญเบเบเปเบฒเบเบฐเปเบเบปเปเบฒ. เบขเปเบฒเบเปเบเบเปเปเบเบฒเบก, เปเบเบปเปเบฒเบซเบกเบฒเบเบเบปเปเบเบเปเปเบกเปเบเปเบเบทเปเบญเปเบเบปเปเบฒเปเบเปเบเบฑเบเปเบเปเบฅเบขเบต; เบฅเบฐเบซเบฑเบเบเบฒเบเบชเบญเบเบเปเปเปเบเปเบเบทเบเบเบฑเบเปเบซเปเปเปเบฒเบฐเบชเบปเบก เปเบฅเบฐเบเปเปเบกเบตเบเบฒเบเบญเบฑเบ.
เบเบฒเบเบฅเบงเบกเบเบญเบ XDP
เบเปเบฒเบเบฐเปเบเบปเปเบฒเบเบฐเบญเบฐเบเบดเบเบฒเบเบเบฝเบเปเบเปเบเบธเบเบชเปเบฒเบเบฑเบเปเบเบทเปเบญเบเปเปเปเบซเปเบเปเปเบฒเบเบฑเบเปเบญเบเบฐเบชเบฒเบเปเบฅเบฐเบเบปเบเบเบงเบฒเบกเบเบตเปเบกเบตเบขเบนเปเปเบฅเปเบง.
เบเบฑเปเบเบเบฑเปเบ, เบฅเบฐเบซเบฑเบเบเบฒเบเบเบฑเปเบเบเบญเบเบเบทเบเปเบซเบฅเบเปเบเบปเปเบฒเปเบเปเบเปเบเปเบ. เปเบเบฑเบเปเบเบฑเบเบเบตเปเปเบเบปเปเบฒเบกเบฒเปเบกเปเบเบเบทเบเบชเบปเปเบเปเบเบซเบฒเบเบปเบงเบเบญเบ. เบเบฑเปเบเบเบฑเปเบ, เบเบฒเบเบเบฑเปเบเบเบญเบเบเปเบญเบเปเบเปเบเบฑเบเบชเบดเบเปเบ: เบเปเบฒเบเปเบเบฑเบเปเบเบฑเบเปเบเบปเปเบฒเปเบเปเบเปเบเปเบ (.XDP_PASS
) เบงเบฒเบโเบเบญเบ (XDP_DROP
) เบซเบผเบทโเบชเบปเปเบโเบเบทเบ (XDP_TX
). เบเบฒเบเบเบฑเปเบเบเบญเบเบชเบฒเบกเบฒเบเบเปเบฝเบเบเบธเบ, เบเบตเปเปเบกเปเบเบเบงเบฒเบกเบเบดเบเปเบเบเบชเบฐเปเบเบฒเบฐเบชเปเบฒเบฅเบฑเบ XDP_TX
. เบเบญเบเบเบฑเปเบเบเปเบฒเบเบเบฑเบเบชเบฒเบกเบฒเบเบเบปเบเปเบฅเบตเบเปเบเบเบเบฒเบ (XDP_ABORTED
) เปเบฅเบฐเบเบฑเปเบเบเปเบฒเบเบธเบเปเบซเบกเป, เปเบเปเบเบตเปเปเบกเปเบเบเปเบฒเบเบเบทเบเบฑเบ assert(0)
- เบชเปเบฒเบฅเบฑเบเบเบฒเบ debugging.
เปเบเบทเปเบญเบ virtual eBPF (extended Berkley Packet Filter) เปเบกเปเบเบเบทเบเบชเปเบฒเบเปเบเบเบเปเบฒเบเบเบฒเบเปเบเบเปเบเบเบเบฐเบเบฒเปเบเบทเปเบญเปเบซเป kernel เบชเบฒเบกเบฒเบเบเบงเบเปเบเบดเปเบเบงเปเบฒเบฅเบฐเบซเบฑเบเบเปเป loop เปเบฅเบฐเบเปเปเบเปเบฒเบฅเบฒเบเบเบงเบฒเบกเบเบปเบเบเปเบฒเบเบญเบเบเบปเบเบญเบทเปเบ. เบเปเปโเบเปเบฒโเบเบฑเบโเบชเบฐโเบชเบปเบกโเปเบฅเบฐโเบเบฒเบโเบเบงเบโเบชเบญเบโ:
- Loops (เบเบฑเบโเบเบทเบโเปเบโเบเปเบญเบโ) เปเบกเปเบโเบซเปเบฒเบกโ.
- เบกเบต stack เบชเปเบฒเบฅเบฑเบเบเปเปเบกเบนเบ, เปเบเปเบเปเปเบกเบตเบเบฑเบเบเบฑเบ (เบเบฑเบเบเบฑเบ C เบเบฑเบเบซเบกเบปเบเบเปเบญเบเบขเบนเปเปเบเปเบเบง).
- เบเบฒเบเปเบเบปเปเบฒเปเบเบดเบเบเบงเบฒเบกเบเบปเบเบเปเบฒเบขเบนเปเบเบญเบ stack เปเบฅเบฐ packet buffer เปเบกเปเบเบเบทเบเบซเปเบฒเบก.
- เบเบฐเบซเบเบฒเบเบฅเบฐเบซเบฑเบเปเบกเปเบเบเปเบฒเบเบฑเบ, เปเบเปเปเบเบเบฒเบเบเบฐเบเบดเบเบฑเบ, เบเบตเปเบเปเปเปเบกเปเบเบเบงเบฒเบกเบชเปเบฒเบเบฑเบเบซเบผเบฒเบ.
- เบญเบฐเบเบธเบเบฒเบเปเบซเปเปเบเบซเบฒเบเบฑเบเบเบฑเบ kernel เบเบดเปเบชเบ (เบเบปเบงเบเปเบงเบ eBPF) เปเบเบปเปเบฒเบเบฑเปเบ.
เบเบฒเบเบญเบญเบเปเบเบเปเบฅเบฐเบเบดเบเบเบฑเปเบเบเบปเบงเบเบญเบเปเบเบดเปเบเบเบทเบงเปเบฒเบเบตเป:
- เบฅเบฐเบซเบฑเบเปเบซเบผเปเบ (เบเบปเบงเบขเปเบฒเบ
kernel.c
) เบเบทเบเบฅเบงเบเบฅเบงเบกเปเบเบฑเบเบงเบฑเบเบเบธ (kernel.o
) เบชเปเบฒเบฅเบฑเบเบชเบฐเบเบฒเบเบฑเบเบเบฐเบเบฐเบเปเบฒเปเบเบทเปเบญเบ virtual eBPF. เปเบเปเบเบทเบญเบเบเบธเบฅเบฒ 2019, เบเบฒเบเบฅเบงเบเบฅเบงเบกเบเปเปเบกเบนเบเปเบชเป eBPF เปเบเปเบฎเบฑเบเบเบฒเบเบชเบฐเบซเบเบฑเบเบชเบฐเบซเบเบนเบเปเบเบ Clang เปเบฅเบฐเบชเบฑเบเบเบฒเปเบงเปเปเบ GCC 10.1. - เบเปเบฒเบฅเบฐเบซเบฑเบเบงเบฑเบเบเบธเบเบตเปเบกเบตเบเบฒเบเปเบเบซเบฒเปเบเบเบชเปเบฒเบเบเบญเบเปเบเปเบ (เบเบปเบงเบขเปเบฒเบ, เบเบฒเบเบฐเบฅเบฒเบเปเบฅเบฐเบเบปเบงเบเบฑเบ), ID เบเบญเบเบเบงเบเบกเบฑเบเบเบทเบเปเบเบเบเบตเปเบเปเบงเบเบชเบนเบ, เบเบถเปเบเบซเบกเบฒเบเบเบงเบฒเบกเบงเปเบฒเบฅเบฐเบซเบฑเบเบเบฑเปเบเบเปเบฒเบงเบเปเปเบชเบฒเบกเบฒเบเบเบฐเบเบดเบเบฑเบเปเบเป. เบเปเบญเบเบเบตเปเบเบฐเปเบซเบฅเบเปเบเบปเปเบฒเปเบเปเบ kernel, เบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเปเบเบปเบเปเบเบเบชเบนเบเปเบซเบผเบปเปเบฒเบเบตเปเบเปเบงเบ IDs เบเบญเบเบงเบฑเบเบเบธเบชเบฐเปเบเบฒเบฐเบเบตเปเบชเปเบฒเบเบเบถเปเบเปเบเบเบเปเบฒเบเบเบฒเบเปเบ kernel (เปเบเบทเปเบญเบกเบเปเปเบฅเบฐเบซเบฑเบ). เบเปเบฒเบเบชเบฒเบกเบฒเบเปเบฎเบฑเบเบชเบดเปเบเบเบตเปเบเบฑเบเบญเบธเบเบฐเบเบญเบเบเบฒเบเบเบญเบ, เบซเบผเบทเบเปเบฒเบเบชเบฒเบกเบฒเบเบเบฝเบเปเบเบผเปเบเบผเบกเบเบตเปเบเบฐเปเบเบทเปเบญเบกเบเปเปเปเบฅเบฐเปเบซเบฅเบเบเบปเบงเบเบญเบเบชเบฐเปเบเบฒเบฐ.
- kernel เบเบงเบเบชเบญเบเปเบเบเบเบฒเบเบเบตเปเปเบซเบฅเบ. เบเบฒเบเบเบฒเบเบฎเบญเบเบงเบฝเบเปเบฅเบฐเบเบงเบฒเบกเบฅเบปเปเบกเปเบซเบผเบงเบเบตเปเบเบฐเปเบเบตเบ packet เปเบฅเบฐ stack boundaries เปเบกเปเบเบเบฒเบเบเบงเบเบชเบญเบ. เบเปเบฒเบเบนเปเบเบงเบเบชเบญเบเบเปเปเบชเบฒเบกเบฒเบเบเบดเบชเบนเบเปเบเปเบงเปเบฒเบฅเบฐเบซเบฑเบเบเบทเบเบเปเบญเบ, เปเบเบเบเบฒเบเบเบทเบเบเบฐเบเบดเปเบชเบ - เบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเบชเบฒเบกเบฒเบเปเบฎเบฑเบเปเบซเปเบฅเบฒเบงเบเปเปเบ.
- เบซเบผเบฑเบเบเบฒเบเบเบฒเบเบเบงเบเบชเบญเบเบชเบปเบเบเบปเบเบชเปเบฒเปเบฅเบฑเบ, kernel เบฅเบงเบเบฅเบงเบกเบฅเบฐเบซเบฑเบเบงเบฑเบเบเบธเบชเบฐเบเบฒเบเบฑเบเบเบฐเบเบฐเบเปเบฒ eBPF เปเบเบปเปเบฒเปเบเปเบเบฅเบฐเบซเบฑเบเปเบเบทเปเบญเบเบเบฑเบเบชเปเบฒเบฅเบฑเบเบชเบฐเบเบฒเบเบฑเบเบเบฐเบเบฐเบเปเบฒเบฅเบฐเบเบปเบ (เบเบฝเบเปเบเปเปเบเบเบตเปเปเบเปเปเบงเบฅเบฒ).
- เปเบเบโเบเบฒเบโเบเบดเบโเบเบฑเบโเบเบฒเบโเปเบเปโเบเบญเบโเปเบฅเบฐโเปเบฅเบตเปเบกโเบเบปเปเบโเบเบฒเบโเบเบธเบโเปเบเปเบโเบเบญเบโ.
เบเบฑเบเบเบฑเปเบเปเบเป XDP เปเบฅเปเบเบขเบนเปเปเบเปเบเปเบ, เบเบฒเบเบเบตเบเบฑเบเปเบกเปเบเบเปเบฒเปเบเบตเบเบเบฒเบเปเบเบเปเบเปเบเบฑเบเบเบถเบเบเบฒเบเบเบดเบเบเบฒเบกเปเบฅเบฐ, เปเบเบเบงเบฒเบกเปเบเบฑเบเบเบดเบ, เบเบธเบเบเบตเปเปเบเบเบเบฒเบเบเบฒเบเบเบฑเปเบเบเบญเบเบซเบผเบทเบชเปเบฒเบ. เบขเปเบฒเบเปเบเบเปเปเบเบฒเบก, eBPF เบฎเบฑเบเบเบฐเบเบฑเบเบงเปเบฒเบฅเบฐเบซเบฑเบเบเบตเปเบเบฒเบงเปเบซเบฅเบเปเบกเปเบเบเบญเบเปเบเบชเปเบฒเบฅเบฑเบเบฅเบฐเบเบปเบ, เบเบฑเปเบเบเบฑเปเบเบเปเบฒเบเบชเบฒเบกเบฒเบเบเบปเบเบฅเบญเบเบเบฑเบ XDP เปเบเบเบเบปเบเปเบ Linux เบเปเบญเบเบเบดเปเบเบเบญเบเบเปเบฒเบ.
เบเบฒเบเบเบฐเบเบฝเบกเบชเบฐเบเบฒเบเปเบงเบเบฅเปเบญเบก
Assembly
Clang เบเปเปเบชเบฒเบกเบฒเบเบเบฐเบฅเบดเบเบฅเบฐเบซเบฑเบเบงเบฑเบเบเบธเปเบเบเบเบปเบเบชเปเบฒเบฅเบฑเบเบชเบฐเบเบฒเบเบฑเบเบเบฐเบเบฐเบเปเบฒ eBPF, เบเบฑเปเบเบเบฑเปเบเบเบฐเบเบงเบเบเบฒเบเบเบฐเบเบญเบเบเปเบงเบเบชเบญเบเบเบฑเปเบเบเบญเบ:
- เบฅเบงเบเบฅเบงเบกเบฅเบฐเบซเบฑเบ C เปเบเบฑเบ LLVM bytecode (
clang -emit-llvm
). - เบเปเบฝเบ bytecode เปเบเบฑเบเบฅเบฐเบซเบฑเบเบงเบฑเบเบเบธ eBPF (
llc -march=bpf -filetype=obj
).
เปเบกเบทเปเบญเบเบฝเบเบเบปเบงเบเบญเบ, เบชเบญเบเปเบเบฅเปเบเบตเปเบกเบตเบซเบเปเบฒเบเบตเปเบเปเบงเบเปเบฅเบฐ macros เบเบฐเปเบเบฑเบเบเบฐเปเบซเบเบ 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
Makefile เบชเปเบฒเบฅเบฑเบ Arch Linux (kernel 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
เบเบฐเบเบญเบเบกเบตเปเบชเบฑเปเบเบเบฒเบเปเบเบซเบฒเบซเบปเบง kernel, ARCH
- เบเบฒเบเบฑเบเบเบฐเบเบฐเบฅเบฐเบเบปเบ. เปเบชเบฑเปเบเบเบฒเบเปเบฅเบฐเปเบเบทเปเบญเบเบกเบทเบญเบฒเบเบเบฐเปเบเบเบเปเบฒเบเบเบฑเบเปเบฅเบฑเบเบเปเบญเบเบฅเบฐเบซเบงเปเบฒเบเบเบฒเบเปเบเบเบขเบฒเบ.
เบเบปเบงเบขเปเบฒเบเบเบงเบฒเบกเปเบเบเบเปเบฒเบเบเบญเบ Debian 10 (kernel 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) headers เบเบทเบเบเปเบฒเบเบปเบเบชเปเบฒเบฅเบฑเบเบฅเบฐเบซเบฑเบ kernel, เบเบฑเบเบเบฑเปเบเปเบเปเบเบฒเบเบเบฑเปเบเบเบญเบเปเบเปเบเบทเบเบเบฐเบเบดเบเบฑเบเปเบ kernel.
เบเบฒเบเบเปเบญเบเบเบฑเบ stack เบชเบฒเบกเบฒเบเบเบทเบเบเบดเบเปเบเปเบเบฒเบ (-fno-stack-protector
), เปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒเบเบปเบงเบเบงเบเบชเบญเบเบฅเบฐเบซเบฑเบ eBPF เบเบฑเบเบเบงเบเบชเบญเบเบเบฒเบเบฅเปเบงเบเบฅเบฐเปเบกเบตเบ stack out-of-bounds. เบกเบฑเบเบเบธเปเบกเบเปเบฒเบเบตเปเบเบฐเปเบเบตเบเบเบฒเบเปเบเบตเปเบกเบเบฐเบชเบดเบเบเบดเบเบฒเบเบเบฑเบเบเบต, เปเบเบฒเบฐเบงเปเบฒเบเบฐเบซเบเบฒเบเบเบญเบ bytecode 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
. เบเปเบญเบเปเบเบเบตเปเบเบฐเบเบฐเบเบฒเบเบฒเบกเบกเบฑเบเปเบเบเบฑเบเบเบธเบเบฑเบ?
เบขเบทเบเบเบปเบเบชเบญเบ
เบเบธเบเบขเบทเบเบเปเบญเบเบเบฐเบเบญเบเบกเบตเบชเบญเบเบเบฒเบเปเบเปเบเบญเบ: เปเบเบดเปเบเบเบฐเบกเบตเบเบปเบงเบเบญเบเปเบฅเบฐเบเบฒเบเบเบธเบเปเบเบเบฐเบเบทเบเบชเบปเปเบ. เปเบซเบผเบปเปเบฒเบเบตเปเบเปเบญเบเปเบเบฑเบเบญเบธเบเบฐเบเบญเบ Linux เปเบเบฑเบกเบฎเบนเบเปเบเบเบเบตเปเบกเบต IP เบเบญเบเบเบปเบเปเบญเบเปเบเบทเปเบญเบเบงเบเปเบเบดเปเบเบงเปเบฒเปเบญเบฑเบเบเบฅเบดเปเบเบเบฑเบเบเบปเบเบเบฐเบเบดเปเบฎเบฑเบเบงเบฝเบเปเบเบงเปเบเบเบฑเบเบเบปเบงเบเบญเบเบเบญเบเบเบงเบเปเบฎเบปเบฒ.
เบญเบธเบเบฐเบเบญเบเบเบญเบเบเบฐเปเบเบ veth (virtual Ethernet) เปเบกเปเบเปเบซเบกเบฒเบฐเบชเบปเบกเบชเปเบฒเบฅเบฑเบเบเบงเบเปเบฎเบปเบฒ: เปเบซเบผเบปเปเบฒเบเบตเปเปเบกเปเบเบเบนเปเบเบญเบเบเบฒเบเปเบเปเบเบญเบเปเบเบทเบญเบเปเบฒเบ virtual "เปเบเบทเปเบญเบกเบเปเป" เปเบเบเบเบปเบเบเบฑเบเบเบฑเบเปเบฅเบฐเบเบฑเบ. เบเปเบฒเบเบชเบฒเบกเบฒเบเบชเปเบฒเบเบเบงเบเบกเบฑเบเปเบเปเปเบเบเบเบตเป (เปเบเบเบฒเบเบเบตเปเบเปเบฒเบชเบฑเปเบเบเบฑเบเบซเบกเบปเบ 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 เบเบฐเบเปเปเบชเบปเปเบเบเบฒเบเบเบฐเบฅเบฒเบเบญเบเปเบเบซเบฒเบซเบเบถเปเบเปเบเบเบฑเปเบเปเบเบเบเปเบฒเบเปเบเบทเปเบญเบเบญเบทเปเบ. เบเปเบฒเบเบชเบฒเบกเบฒเบเปเบเปเปเบเบเบตเปเบเปเบงเบเบเบปเบเบฅเบฐเบเบฝเบ tricky iptables
, เปเบเปเบเบงเบเปเบเบปเบฒเปเบเบปเปเบฒเบเบฐเบเปเบญเบเบกเบตเบเบฒเบเบเปเบฝเบเปเบเบเบเบฒเบเบซเบธเปเบกเบซเปเป, เบเบถเปเบเบเปเปเบชเบฐเบเบงเบเบชเปเบฒเบฅเบฑเบเบเบฒเบ debugging. เบกเบฑเบเบเบตเบเบงเปเบฒเบเบตเปเบเบฐเปเบเป namespaces เปเบเบทเบญเบเปเบฒเบ (เบเปเปเปเบเบเบตเปเปเบกเปเบ netns).
namespace เปเบเบทเบญเบเปเบฒเบเบเบฐเบเบญเบเบเปเบงเบเบเบธเบเบเบญเบเบชเปเบงเบเบเบดเบเบเปเป, เบเบฒเบเบฐเบฅเบฒเบเบเบฒเบเบเปเบฒเบเบปเบเปเบชเบฑเปเบเบเบฒเบ, เปเบฅเบฐเบเบปเบเบฅเบฐเบเบฝเบ NetFilter เบเบตเปเปเบเบเบเปเบฝเบงเบเบฒเบเบงเบฑเบเบเบธเบเบตเปเบเปเบฒเบเบเบทเบเบฑเบเปเบ netns เบญเบทเปเบเป. เปเบเปเบฅเบฐเบเบฐเบเบงเบเบเบฒเบเบเปเบฒเปเบเบตเบเบเบฒเบเบขเบนเปเปเบ namespace เปเบฅเบฐเบกเบตเบเบฝเบเปเบเปเปเบเบปเปเบฒเปเบเบดเบเบงเบฑเบเบเบธเบเบญเบ netns เบเบฑเปเบ. เปเบเบเบเปเบฒเปเบฅเบตเปเบกเบเบปเปเบ, เบฅเบฐเบเบปเบเบกเบต namespace เปเบเบทเบญเบเปเบฒเบเบเบฝเบงเบชเปเบฒเบฅเบฑเบเบงเบฑเบเบเบธเบเบฑเบเบซเบกเบปเบ, เบเบฑเปเบเบเบฑเปเบเบเปเบฒเบเบชเบฒเบกเบฒเบเปเบฎเบฑเบเบงเบฝเบเบขเบนเปเปเบ Linux เปเบฅเบฐเบเปเปเบฎเบนเปเบเปเบฝเบงเบเบฑเบ netns.
เบกเบฒเบชเปเบฒเบ namespace เปเปเป xdp-test
เปเบฅเบฐเบเปเบฒเบเบกเบฑเบเปเบเบเบตเปเบเบฑเปเบ xdp-remote
.
ip netns add xdp-test
ip link set dev xdp-remote netns xdp-test
เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบ, เบเบฐเบเบงเบเบเบฒเบเปเบฅเปเบเปเบ xdp-test
เบเบฐเบเปเป "เปเบเบดเปเบ" xdp-local
(เบกเบฑเบเบเบฐเบเบฑเบเบเบปเบเบขเบนเปเปเบ netns เปเบเบเบเปเบฒเปเบฅเบตเปเบกเบเบปเปเบ) เปเบฅเบฐเปเบกเบทเปเบญเบชเบปเปเบเปเบเบฑเบเปเบเบฑเบเปเบเบซเบฒ 192.0.2.1 เบกเบฑเบเบเบฐเบเปเบฒเบเบกเบฑเบ. xdp-remote
เปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒเบกเบฑเบเปเบเบฑเบเบเบฒเบเปเบเปเบเบญเบเบเบฝเบงเปเบ 192.0.2.0/24 เบชเบฒเบกเบฒเบเปเบเบปเปเบฒเปเบเบดเบเบเบฐเบเบงเบเบเบฒเบเบเบตเป. เบเบตเปเบเบฑเบเปเบฎเบฑเบเบงเบฝเบเปเบเบเบดเบเบเบฒเบเบเบปเบเบเบฑเบเบเปเบฒเบก.
เปเบกเบทเปเบญเบเบฒเบเปเบเบทเปเบญเบเบเปเบฒเบเบฅเบฐเบซเบงเปเบฒเบ netns, เบเบฒเบเปเบเปเบเบญเบเบซเบผเบธเบเบฅเบปเบเปเบฅเบฐเบชเบนเบเปเบชเบเบเบตเปเบขเบนเปเบเบญเบเบกเบฑเบ. เปเบเบทเปเบญเบเบฑเปเบเบเปเบฒเบเบฒเบเปเบเปเบเบญเบเปเบ netns, เบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเบเปเบฒเปเบเบตเบเบเบฒเบ ip ...
เปเบ namespace เบเปเบฒเบชเบฑเปเบเบเบตเป 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
เปเบ namespace เปเบฅเบตเปเบกเบเบปเปเบ:
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
. repository เบกเบต script เบเบตเป automates เปเบฎเบฑเบเบงเบฝเบเบเบฑเบ stand เปเบเป, เบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบปเบเบเบปเบงเบขเปเบฒเบ, เบเปเบฒเบเบชเบฒเบกเบฒเบ configure stand เบเปเบงเบเบเปเบฒเบชเบฑเปเบ sudo ./stand up
เปเบฅเบฐเบฅเบถเบเบกเบฑเบ sudo ./stand down
.
เบเบฒเบเบเบดเบเบเบฒเบก
เบเบฒเบเบเบฑเปเบเบเบญเบเปเบกเปเบเบเปเบฝเบงเบเปเบญเบเบเบฑเบเบญเบธเบเบฐเบเบญเบเปเบเบฑเปเบเบเบตเป:
ip -force link set dev xdp-local xdp object xdp_filter.o verbose
Key -force
เบเปเบญเบเบเบฒเบเปเบเบทเปเบญเปเบเบทเปเบญเบกเบเปเปเปเบเบเบเบฒเบเปเบซเบกเปเบเปเบฒเบญเบฑเบเบญเบทเปเบเบเบทเบเปเบเบทเปเบญเบกเบเปเปเปเบฅเปเบง. "เบเปเปเบกเบตเบเปเบฒเบงเปเบเบฑเบเบเปเบฒเบงเบเบต" เบเปเปเปเบกเปเบเบเปเบฝเบงเบเบฑเบเบเปเบฒเบชเบฑเปเบเบเบตเป, เบเบฒเบเบชเบฐเบซเบฅเบธเบเปเบกเปเบ voluminous เปเบเบเปเบฅเบฐเบเบตเปเบเบเปเปเบเบฒเบก. เบเบตเปเบเบญเบ 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()
, เปเบเปเบเบฝเบเปเบเปเบชเบฐเบซเบเบฑเบเบชเบฐเบซเบเบนเบเปเบเบดเบเบชเบฒเบก arguments เบเบญเบเปเบซเบเบทเบญเบเบฒเบเบฎเบนเบเปเบเบ, เปเบฅเบฐเบเบฑเบเบเบตเบฅเบฒเบเบเบทเปเบเปเบฒเบเบฑเบเบเบญเบ specifiers. เบกเบฐเบซเบฒเบเบฒเบ bpf_printk()
เปเบฎเบฑเบเปเบซเปเบเบฒเบเปเบเบเปเบฒเบเบเบถเปเบ.
SEC("prog")
int xdp_main(struct xdp_md* ctx) {
+ bpf_printk("got packet: %pn", ctx);
return XDP_PASS;
}
เบเบปเบโเปเบเปโเบฎเบฑเบโเปเบโเบซเบฒโเบเปเบญเบโเบเบฒเบโเบเบฒเบโเบเบดเบโเบเบฒเบก kernelโ, เปเบเบดเปเบโเบเปเบฒโเปเบเบฑเบโเบเปเบญเบโเปเบเปโเบฎเบฑเบโเบเบฒเบโเปเบเบตเบโเปเบเปโเบเบฒเบโ:
echo -n 1 | sudo tee /sys/kernel/debug/tracing/options/trace_printk
เปเบเบดเปเบเบซเบปเบงเบเปเปเบเปเปเบเบงเบฒเบก:
cat /sys/kernel/debug/tracing/trace_pipe
เบเบฑเบเบชเบญเบเบเปเบฒเบชเบฑเปเบเบเบตเปเปเบฎเบฑเบเปเบซเปเปเบเบซเบฒ sudo ./stand log
.
เบเบฝเบงเบเบตเป Ping เบเบงเบเบเบฐเบเบธเปเบเบเปเปเบเบงเบฒเบกเปเบเบเบเบตเป:
<...>-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'
เบชเปเบฒเบฅเบฑเบเปเบซเบเบเบปเบเบเบตเป, debug output เบขเปเบฒเบเบซเบผเบงเบเบซเบผเบฒเบ bloats เบฅเบฐเบซเบฑเบเบเบปเบเปเบเปเบฎเบฑเบ.
เบเบณเบฅเบฑเบเบชเบปเปเบเปเบเบฑเบเปเบเบฑเบ XDP
เบกเบฒเบเปเบฝเบเบเบปเบงเบเบญเบเบเบฑเบ: เปเบซเปเบกเบฑเบเบชเบปเปเบเปเบเบฑเบเปเบเบฑเบเบเบตเปเปเบเบปเปเบฒเบกเบฒเบเบฑเบเปเบปเบเบเบทเบ. เบเบตเปเปเบกเปเบเบเปเปเบเบทเบเบเปเบญเบเบเบฒเบเบเบฑเบเบชเบฐเบเบฐเบเบญเบเปเบเบทเบญเบเปเบฒเบ, เปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒเบกเบฑเบเปเบเบฑเบเบชเบดเปเบเบเปเบฒเปเบเบฑเบเบเบตเปเบเบฐเบเปเบฝเบเบเบตเปเบขเบนเปเปเบเบชเปเบงเบเบซเบปเบง, เปเบเปเปเบเบเบฑเบเบเบธเบเบฑเบเบเบฒเบเปเบฎเบฑเบเบงเบฝเบเปเบเบซเบผเบฑเบเบเบฒเบเปเบกเปเบเบชเปเบฒเบเบฑเบ.
bpf_printk("got packet: %pn", ctx);
- return XDP_PASS;
+ return XDP_TX;
}
เปเบเบตเบเบเบปเบง tcpdump
เบชเบธเบ xdp-remote
. เบกเบฑเบเบเบงเบเบเบฐเบชเบฐเปเบเบเปเบซเปเปเบซเบฑเบเบเบฒเบเบฎเปเบญเบเบเป ICMP Echo เบเบฒเบญเบญเบเปเบฅเบฐเบเบฒเปเบเบปเปเบฒเบเบฝเบงเบเบฑเบเปเบฅเบฐเบขเบธเบเบเบฒเบเบชเบฐเปเบเบ ICMP Echo Reply. เปเบเปเบกเบฑเบเบเปเปเปเบเปเบชเบฐเปเบเบเปเบซเปเปเบซเบฑเบ. เบกเบฑเบ turns เปเบซเปโเปเบซเบฑเบโเบงเปเบฒโเบชเปเบฒโเบฅเบฑเบโเบเบฒเบโเปเบฎเบฑเบโเบงเบฝเบโ XDP_TX
เปเบโเปเบเบโเบเบฒเบโเบเปเบฝเบงโเบเบฑเบโเบเบฒเบโ xdp-local
xdp-remote
เปเบเบเบเบฒเบเปเบเปเบเบทเบเบกเบญเบเบซเบกเบฒเบ, เปเบเบดเบเปเบกเปเบเบงเปเบฒเบกเบฑเบเบซเบงเปเบฒเบเปเบเบปเปเบฒ, เปเบฅเบฐเบฅเบฒเบงเปเบเปเบเบทเบเบเบปเบเบเบถเปเบเบกเบฒ.
เบเปเบญเบเบฎเบนเปเปเบฅเบทเปเบญเบเบเบตเปเปเบเปเปเบเบงเปเบ?
เปเบเบปเปเบฒโเบเปเบญเบโเปเบฎเบฑเบโเบเบงเบฒเบกโเบเบตโเปเบซเปโเบเบปเปเบโเบเบฒเบโเบเบงเบฒเบกโเบเบปเปเบง เปเบเบฒเบฐโเบเปเปโเบกเบตโเบซเบเบฑเบโเบญเบตเบโเบเบตเปโเบเบฐโเปเบฎเบฑเบโเปเบซเปโเบกเบฑเบโเบญเบญเบโเปเบเป.
$ sudo perf trace --call-graph dwarf -e 'xdp:*'
0.000 ping/123455 xdp:xdp_bulk_tx:ifindex=19 action=TX sent=0 drops=1 err=-6
veth_xdp_flush_bq ([veth])
veth_xdp_flush_bq ([veth])
veth_poll ([veth])
<...>
เบฅเบฐเบซเบฑเบ 6 เปเบกเปเบเบซเบเบฑเบ?
$ errno 6
ENXIO 6 No such device or address
เบเบฒเบเบเปเบฒเบเบฒเบเบเบญเบ veth_xdp_flush_bq()
เปเบเปโเบฎเบฑเบโเบฅเบฐโเบซเบฑเบโเบเบงเบฒเบกโเบเบดเบโเบเบฒเบโเบเบฒเบ veth_xdp_xmit()
, เบเปเบญเบเบเบตเปเบเบปเปเบเบซเบฒเปเบเบ ENXIO
เปเบฅเบฐเบเบญเบเบซเบฒเบเปเบฒเปเบซเบฑเบ.
เปเบซเปเบเบงเบเปเบฎเบปเบฒเบเบทเปเบเบเบนเบเบฒเบเบเบฑเปเบเบเบญเบเบเบฑเปเบเบเปเปเบฒ (XDP_PASS
) เปเบโเปเบเบฅโเปโ xdp_dummy.c
, เปเบเบตเปเบกเบกเบฑเบเปเบชเป Makefile, เบเบนเบเบกเบฑเบเบกเบฑเบเปเบชเป xdp-remote
:
ip netns exec remote
ip link set dev int xdp object dummy.o
เปเบเบเบฑเบเบเบธเบเบฑเบ tcpdump
เบชเบฐเปเบเบเปเบซเปเปเบซเบฑเบเบชเบดเปเบเบเบตเปเบเบฒเบเบซเบงเบฑเบ:
62:57:8e:70:44:64 > 26:0e:25:37:8f:96, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 13762, offset 0, flags [DF], proto ICMP (1), length 84)
192.0.2.2 > 192.0.2.1: ICMP echo request, id 46966, seq 1, length 64
62:57:8e:70:44:64 > 26:0e:25:37:8f:96, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 13762, offset 0, flags [DF], proto ICMP (1), length 84)
192.0.2.2 > 192.0.2.1: ICMP echo request, id 46966, seq 1, length 64
เบเปเบฒเบเบฝเบเปเบเป ARPs เบเบทเบเบชเบฐเปเบเบเปเบเบ, เบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบญเบปเบฒเบเบปเบงเบเบญเบเบญเบญเบ (เบญเบฑเบเบเบตเป sudo ./stand detach
), เปเบซเปเปเบ ping
, เบเบฒเบเบเบฑเปเบเบเบฑเปเบเบเบปเบงเบเบญเบเปเบฅเปเบงเบฅเบญเบเปเปเปเบญเบตเบเบเบฑเปเบ. เบเบฑเบเบซเบฒเปเบกเปเบเบงเปเบฒเบเบฒเบเบเบฑเปเบเบเบญเบ XDP_TX
เบเบทเบเบเปเบญเบเบเบฑเบเปเบ ARP เปเบฅเบฐเบเปเบฒ stack
namespaces xdp-test
เบเบฑเบเบเบฒเบ "เบฅเบทเบก" เบเบตเปเบขเบนเป MAC 192.0.2.1, เบกเบฑเบเบเบฐเบเปเปเบชเบฒเบกเบฒเบเปเบเปเปเบ IP เบเบตเป.
เบเบฒเบเบชเปเบฒเบเบเบฑเบเบซเบฒ
เปเบซเปเบเปเบฒเบงเปเบเบชเบนเปเบงเบฝเบเบเบฒเบเบเบตเปเบฅเบฐเบเบธเปเบงเป: เบเบฝเบเบเบปเบเปเบเบเบฒเบเบเบธเบเบเบต SYN เปเบ XDP.
เบเปเปเบฒเบเปเบงเบก SYN เบเบฑเบเบเบปเบเปเบเบฑเบเบเบฒเบเปเบเบกเบเบต DDoS เบเบตเปเบเบดเบเบปเบก, เปเบเบเปเบเบทเปเบญเปเบเปเปเบฅเปเบงเบเบญเบเบกเบฑเบเปเบกเปเบเบเบฑเปเบเบเปเปเปเบเบเบตเป. เปเบกเบทเปเบญเบเบฒเบเปเบเบทเปเบญเบกเบเปเปเบเบทเบเบชเปเบฒเบเบเบฑเปเบเบเบถเปเบ (เบเบฒเบเบเบฑเบเบกเบท TCP), เปเบเบทเปเบญเบเปเบกเปเบเปเบฒเบเปเบเปเบฎเบฑเบ SYN, เบเบฑเบเบชเบฑเบเบเบฑเบเบเบฐเบเบฒเบเบญเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบเบทเปเบญเบกเบเปเปเปเบเบญเบฐเบเบฒเบเบปเบ, เบเบญเบเบชเบฐเบซเบเบญเบเบเบฑเบเบเบธเบ SYNACK เปเบฅเบฐเบฅเปเบเปเบฒ ACK. เบเบนเปเปเบเบกเบเบตเบเบฝเบเปเบเปเบชเบปเปเบเปเบเบฑเบเปเบเบฑเบ SYN เบซเบผเบฒเบเบเบฑเบเบเบธเบเบเปเปเบงเบดเบเบฒเบเบตเบเบฒเบเบเบตเปเบขเบนเปเบเบญเบกเบเบฒเบเปเบเปเบฅเบฐเปเบฎเบเปเบ botnet เบซเบผเบฒเบเบเบฑเบเบญเบฑเบ. เปเบเบตเบเปเบงเบตเบเบทเบเบเบฑเบเบเบฑเบเปเบซเปเบเบฑเบเบชเบฑเบเบเบฑเบเบเบฐเบเบฒเบเบญเบเบเบฑเบเบเบตเปเบกเบทเปเบญเบกเบฒเบฎเบญเบเบเบญเบเปเบเบฑเบเปเบเบฑเบ, เปเบเปเบเปเบญเบเบเบงเบเบกเบฑเบเบญเบญเบเบซเบผเบฑเบเบเบฒเบเปเบงเบฅเบฒเบญเบฑเบเปเบซเบเปเบซเบผเบงเบ, เบเบฑเปเบเบเบฑเปเบ, เบซเบเปเบงเบเบเบงเบฒเบกเบเปเบฒเบซเบผเบทเบเปเปเบเปเบฒเบเบฑเบเบเบฐเบซเบกเบปเบเปเบ, เบเบฒเบเปเบเบทเปเบญเบกเบเปเปเปเบซเบกเปเบเปเปเปเบเปเบฎเบฑเบเบเบฒเบเบเบญเบกเบฎเบฑเบ, เปเบฅเบฐเบเบฒเบเบเปเบฅเบดเบเบฒเบเบเปเปเบชเบฒเบกเบฒเบเปเบเปเปเบเป.
เบเปเบฒเบเปเบฒเบเบเปเปเบเบฑเบเบชเบฑเบเบเบฑเบเบเบฐเบเบฒเบเบญเบเปเบเบเบญเบตเบเปเบชเปเปเบเบฑเบเปเบเบฑเบ SYN, เปเบเปเบงเปเบฒเบเบฝเบเปเบเปเบเบญเบเบชเบฐเบซเบเบญเบเบเบฑเบเปเบเบฑเบเปเบเบฑเบ SYNACK, เปเบเบทเปเบญเบเปเบกเปเบเปเบฒเบเบเบฐเปเบเบปเปเบฒเปเบเปเบเปเปเบเบงเปเบเบงเปเบฒเปเบเบฑเบเปเบเบฑเบ ACK เบเบตเปเบกเบฒเบฎเบญเบเบเปเปเบกเบฒเบซเบกเบฒเบเปเบเบดเบเปเบเบฑเบเปเบเบฑเบ SYN เบเบตเปเบเปเปเบเบทเบเบเบฑเบเบเบถเบเปเบงเป? เบซเบผเบฑเบเบเบฒเบเบเบตเปเบเบฑเบเบซเบกเบปเบ, เบเบนเปเปเบเบกเบเบตเบเบฑเบเบชเบฒเบกเบฒเบเบชเปเบฒเบ ACKs เบเบญเบก. เบเบธเบเบเบญเบเบเบธเบเบเบต SYN เปเบกเปเบเปเบเบทเปเบญเปเบเบปเปเบฒเบฅเบฐเบซเบฑเบเบกเบฑเบ seqnum
เบเบปเบงเบเปเบฒเบเบปเบเบเบฒเบเบเบฒเบเปเบเบทเปเบญเบกเบเปเปเปเบเบฑเบ hash เบเบญเบเบเบตเปเบขเบนเป, เบเบญเบเปเบฅเบฐเบเบฒเบเบเปเบฝเบเปเบเบเปเบเบทเบญ. เบเปเบฒ ACK เบชเบฒเบกเบฒเบเบกเบฒเบฎเบญเบเบเปเบญเบเบเบตเปเปเบเบทเบญเบเบฐเบกเบตเบเบฒเบเบเปเบฝเบเปเบเบ, เบเปเบฒเบเบชเบฒเบกเบฒเบเบเบดเบเปเบฅเป hash เบญเบตเบเปเบเบทเปเบญเบซเบเบถเปเบเปเบฅเบฐเบเบฝเบเบเบฝเบเบเบฑเบ acknum
. เบเบญเบ acknum
เบเบนเปเปเบเบกเบเบตเบเปเปเบชเบฒเบกเบฒเบ, เปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒเปเบเบทเบญเบเบฐเบเบญเบเบกเบตเบเบงเบฒเบกเบฅเบฑเบ, เปเบฅเบฐเบเบฐเบเปเปเบกเบตเปเบงเบฅเบฒเบเบตเปเบเบฐเบเบฑเบเบฅเบฝเบเบกเบฑเบเปเบเบทเปเบญเบเบเบฒเบเบเปเบญเบเบเบฒเบเบเปเบฒเบเบฑเบ.
เบเบธเบเบเบต SYN เปเบเปเบเบทเบเบเบฐเบเบดเบเบฑเบเบกเบฒเบเบปเบเปเบฅเปเบงเปเบ Linux kernel เปเบฅเบฐเปเบเบดเบเปเบกเปเบเบงเปเบฒเบชเบฒเบกเบฒเบเบเบทเบเปเบเบตเบเปเบเปเปเบเบเบญเบฑเบเบเบฐเปเบเบกเบฑเบเบเปเบฒ SYNs เบกเบฒเบฎเบญเบเปเบงเปเบเบตเบเปเบเปเบฅเบฐเบกเบตเบเปเบฒเบเบงเบเบซเบผเบงเบเบซเบผเบฒเบ.
เปเบเบเบเบฒเบเบเบฒเบเบชเบถเบเบชเบฒเบเปเบฝเบงเบเบฑเบเบเบฒเบเบเบฑเบเบกเบท TCP
TCP เบชเบฐเบซเบเบญเบเบเบฒเบเบชเบปเปเบเบเปเปเบกเบนเบเปเบเบฑเบเบเบฐเปเบชเบเบญเบ bytes, เบเบปเบงเบขเปเบฒเบ, เบเบฒเบเบฎเปเบญเบเบเป HTTP เบเบทเบเบชเบปเปเบเบเปเบฒเบ TCP. เบเบฐเปเบชเบเบทเบเบเปเบฒเบเบเบญเบเปเบเบฑเบเบเปเบญเบเปเปเบเปเบเบฑเบเปเบเบฑเบ. เปเบเบฑเบเปเบเบฑเบ TCP เบเบฑเบเปเบปเบเบกเบตเบเบธเบเบเบฒเบกเปเบซเบเบเบปเบ เปเบฅเบฐเบเบปเบงเปเบฅเบเบฅเบณเบเบฑเบ 32-เบเบดเบ:
-
เบเบฒเบเบเบฐเบชเบปเบกเบเบฐเบชเบฒเบเบเบญเบเบเบธเบเบเปเบฒเบเบปเบเบเบปเบเบเบฒเบเบเบญเบเบเบธเบเบชเบฐเปเบเบฒเบฐ. เบเบธเบ SYN เบเบตเปเปเบซเปเปเบซเบฑเบเบงเปเบฒเบเบตเปเปเบกเปเบเปเบเบฑเบเปเบเบฑเบเบเปเบฒเบญเบดเบเบเบญเบเบเบนเปเบชเบปเปเบเปเบเบเบฒเบเปเบเบทเปเบญเบกเบเปเป. เบเบธเบ ACK เบซเบกเบฒเบเบเบงเบฒเบกเบงเปเบฒเบเบนเปเบชเบปเปเบเปเบเปเบฎเบฑเบเบเปเปเบกเบนเบเบเบฒเบเปเบเบทเปเบญเบกเบเปเปเบเบฑเบเบซเบกเบปเบเปเบเบดเบเปเบเบเป
acknum
. เปเบเบฑเบเปเบเบฑเบเบชเบฒเบกเบฒเบเบกเบตเบซเบผเบฒเบเบเบธเบ เปเบฅเบฐเบเบทเบเปเบญเบตเปเบเปเบเบเบเบฒเบเบฅเบงเบกเบเบฑเบเบเบญเบเบเบงเบเบกเบฑเบ, เบเบปเบงเบขเปเบฒเบ, เบเบธเบ SYNACK. -
เปเบฒเบเปเบฅเบเบฅเบณเบเบฑเบ (seqnum) เบฅเบฐเบเบธเบเปเบฒเบเบปเบเปเบเบตเบเปเบเบเบฐเปเบชเบเปเปเบกเบนเบเบชเบณเบฅเบฑเบเปเบเบเปเบเบณเบญเบดเบเบเบตเปเบเบทเบเบชเบปเปเบเปเบเปเบเบฑเบเปเบเบฑเบเบเบตเป. เบเบปเบงเบขเปเบฒเบ, เบเปเบฒเบขเบนเปเปเบเปเบเบฑเบเปเบเบฑเบเบเปเบฒเบญเบดเบเบเบตเปเบกเบต X bytes เบเบญเบเบเปเปเบกเบนเบเบเบปเบงเปเบฅเบเบเบตเปเปเบกเปเบ N, เปเบเบเบธเบเบเปเปเปเบเบเบตเปเบกเบตเบเปเปเบกเบนเบเปเบซเบกเปเบกเบฑเบเบเบฐเปเบเบฑเบ N + X. เปเบเบเบญเบเปเบฅเบตเปเบกเบเบปเปเบเบเบญเบเบเบฒเบเปเบเบทเปเบญเบกเบเปเป, เปเบเปเบฅเบฐเบเปเบฒเบเปเบฅเบทเบญเบเบเบปเบงเปเบฅเบเบเบตเปเปเบเบเบชเบธเปเบก.
-
เบเปเบฒเบเบงเบเบเบฒเบเบฎเบฑเบเบฎเบนเป (acknum) - เบเบปเบเปเบเบตเบเบเบฝเบงเบเบฑเบเบเบฑเบ seqnum, เปเบเปเบกเบฑเบเบเปเปเปเบเปเบเปเบฒเบเบปเบเบเปเบฒเบเบงเบ byte เบเบตเปเบเบทเบเบชเบปเปเบ, เปเบเปเบเปเบฒเบเบงเบ byte เบเปเบฒเบญเบดเบเบเบฒเบเบเบนเปเบฎเบฑเบ, เบเบตเปเบเบนเปเบชเบปเปเบเบเปเปเปเบซเบฑเบ.
เปเบเบเบญเบเปเบฅเบตเปเบกเบเบปเปเบเบเบญเบเบเบฒเบเปเบเบทเปเบญเบกเบเปเป, เบเปเบฒเบเบเปเบฒเบเปเบเปเบญเบเบเบปเบเบฅเบปเบ 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 เบเปเบญเบเปเบฎเบฑเบเบเบฑเปเบเบเปเปเปเบเบเบตเป:
- เบเบญเบเบชเบฐเบซเบเบญเบเบเบฑเบ SYN เบเบฑเบ SYNACK เบเบฑเบเบเบธเบเบเบต;
- เบเบญเบเบชเบฐเบซเบเบญเบเบเปเป ACK เบเปเบงเบ RST (เบเบฑเบเบเบฒเบเปเบเบทเปเบญเบกเบเปเป);
- เบเบดเปเบกเปเบเบฑเบเปเบเบฑเบเบเบตเปเบเบฑเบเปเบซเบผเบทเบญ.
Pseudocode เบเบญเบ algorithm เบเปเบญเบกเบเบฑเบเบเบฒเบเปเบเบเปเบเบฑเบเปเบเบฑเบ:
ะัะปะธ ััะพ ะฝะต Ethernet,
ะฟัะพะฟัััะธัั ะฟะฐะบะตั.
ะัะปะธ ััะพ ะฝะต IPv4,
ะฟัะพะฟัััะธัั ะฟะฐะบะตั.
ะัะปะธ ะฐะดัะตั ะฒ ัะฐะฑะปะธัะต ะฟัะพะฒะตัะตะฝะฝัั
, (*)
ัะผะตะฝััะธัั ััะตััะธะบ ะพััะฐะฒัะธั
ัั ะฟัะพะฒะตัะพะบ,
ะฟัะพะฟัััะธัั ะฟะฐะบะตั.
ะัะปะธ ััะพ ะฝะต TCP,
ัะฑัะพัะธัั ะฟะฐะบะตั. (**)
ะัะปะธ ััะพ SYN,
ะพัะฒะตัะธัั SYN-ACK ั cookie.
ะัะปะธ ััะพ ACK,
ะตัะปะธ ะฒ acknum ะปะตะถะธั ะฝะต cookie,
ัะฑัะพัะธัั ะฟะฐะบะตั.
ะะฐะฝะตััะธ ะฒ ัะฐะฑะปะธัั ะฐะดัะตั ั N ะพััะฐะฒัะธั
ัั ะฟัะพะฒะตัะพะบ. (*)
ะัะฒะตัะธัั RST. (**)
ะ ะพััะฐะปัะฝัั
ัะปััะฐัั
ัะฑัะพัะธัั ะฟะฐะบะตั.
เบซเบเบถเปเบ (*)
เบเบธเบเบเบตเปเบเปเบฒเบเบเปเบญเบเบเบฒเบเบเบฑเบเบเบฒเบเบชเบฐเบเบฒเบเบฐเบเบญเบเบฅเบฐเบเบปเบเปเบเปเบเบทเบเบซเบกเบฒเบ - เปเบเบเบฑเปเบเบเบญเบเบเปเบฒเบญเบดเบเบเบตเปเบเปเบฒเบเบชเบฒเบกเบฒเบเปเบฎเบฑเบเปเบเปเปเบเบเบเปเปเบกเบตเบเบงเบเบกเบฑเบเปเบเบเบเบฝเบเปเบเปเบเบฐเบเบดเบเบฑเบเบเบฒเบเบเบฑเบเบกเบท TCP เบเบฑเบเบเบฒเบเบเบฐเบฅเบดเบเบเบธเบเบเบต SYN เปเบเบฑเบ seqnum.
เบขเบนเปเบเบธเบ (**)
, เปเบเบเบฐเบเบฐเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเปเปเบกเบตเบเบฒเบเบฐเบฅเบฒเบ, เบเบงเบเปเบฎเบปเบฒเบเบฐเบเปเบฒเบกเบเบญเบ.
เบเบฒเบเบเบฐเบเบดเบเบฑเบเบเบฒเบเบเบฑเบเบกเบท TCP
เบเบฒเบเปเบเบเปเบเบฑเบเปเบเบฑเบ เปเบฅเบฐเบเบงเบเบชเบญเบเบฅเบฐเบซเบฑเบ
เบเบงเบเปเบฎเบปเบฒเบเบฐเบเปเบญเบเบเบฒเบเปเบเบเบชเปเบฒเบเบซเบปเบงเปเบเบทเบญเบเปเบฒเบ: Ethernet (uapi/linux/if_ether.h
), IPv4 (uapi/linux/ip.h
) เปเบฅเบฐ TCP (uapi/linux/tcp.h
). เบเปเบญเบเบเปเปเบชเบฒเบกเบฒเบเปเบเบทเปเบญเบกเบเปเปเบญเบฑเบเบชเบธเบเบเปเบฒเบเปเบเปเปเบเบทเปเบญเบเบเบฒเบเบเบงเบฒเบกเบเบดเบเบเบฒเบเบเบตเปเบเปเบฝเบงเบเปเบญเบเบเบฑเบ atomic64_t
, เบเปเบญเบเบเปเบญเบเบเบฑเบเบฅเบญเบเบเปเบฒเบเบดเบเบฒเบกเบเบตเปเบเปเบฒเปเบเบฑเบเปเบเบปเปเบฒเปเบเปเบเบฅเบฐเบซเบฑเบ.
เบเบฑเบเบเบฑเบเบเบฑเบเบซเบกเบปเบเบเบตเปเปเบเบฑเปเบเปเบชเปเปเบ C เบชเปเบฒเบฅเบฑเบเบเบฒเบเบญเปเบฒเบเบเปเบญเบเบเบทเบ inlined เบขเบนเปเบเบธเบเบเบญเบเบเบฒเบเปเบ, เปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒ eBPF verifier เปเบ kernel เบซเปเบฒเบก backtracking, เบเบฑเปเบเปเบกเปเบ, เปเบเบเบงเบฒเบกเปเบเบฑเบเบเบดเบ, loops เปเบฅเบฐ function calls.
#define INTERNAL static __attribute__((always_inline))
Macro LOG()
เบเบดเบเปเบเปเบเบฒเบเบเบฒเบเบเบดเบกเปเบเบเบฒเบเบเปเบญเบเบเบปเบง.
เปเบเบเบเบฒเบเปเบกเปเบ conveyor เบเบญเบเบซเบเปเบฒเบเบตเป. เปเบเปเบฅเบฐเบเบปเบเปเบเปเบฎเบฑเบเบเบธเบเบเบตเปเบชเปเบงเบเบซเบปเบงเบฅเบฐเบเบฑเบเบเบตเปเบชเบญเบเบเปเบญเบเบเบฑเบเบเบทเบเปเบเบฑเปเบเปเบชเป, เบเบปเบงเบขเปเบฒเบ, 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)
: เบกเบตเปเบชเบฑเปเบเบเบฒเบเบเบฐเบเบดเบเบฑเบเปเบเปเบงเบฅเบฒเบเบตเปเบชเบดเบเบชเบฒเบก byte เบเบฒเบเบเบธเบเปเบฅเบตเปเบกเบเบปเปเบเบเบญเบ buffer เบขเบนเปเบเบญเบเปเบเบฑเบเปเบเบฑเบ. เบกเบฑเบเปเบเบฑเบเบเบฒเบเบเบฒเบเบเบตเปเบเบฐเปเบเบปเปเบฒเปเบเบเบฒเบเบฅเบฒเบเบเบฒเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเปเบฒเบฅเบฑเบเปเบงเบปเปเบฒเปเบเบดเบ, เปเบเปเบกเบตเบเปเบฒเปเบเบฐเบเปเบฒ (12) เปเบฅเบฐ disassembler เบชเบฐเปเบเบเปเบชเบฑเปเบเบเบญเบเบฅเบฐเบซเบฑเบเปเบซเบผเปเบ:
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()
เปเบฅเบฐเปเบเบเบญเปเบญเบกเบเปเบฒเบ.
เบเบฒเบเบขเบฑเปเบเบขเบทเบเบเบธเบ
Oddly เบเบฝเบเบเป, เบเบตเปเปเบกเปเบเปเบชเบฑเปเบเบเบตเปเปเบเบเปเบเบฑเปเบเบเบตเปเบชเบธเบ, เบซเบผเบทเปเบเบเบเบตเปเบเบฐ, เบเปเบฒเปเบซเบฑเบเบเปเบฝเบงเบเบฑเบเบกเบฑเบ:
/* Required to verify checksum calculation */
const void* data_end = (const void*)ctx->data_end;
เปเบเปเบงเบฅเบฒเบเบตเปเบเบฝเบเบฅเบฐเบซเบฑเบเบชเบฐเบเบฑเบเบเปเบฒเบญเบดเบเบเบญเบ, kernel 5.1 เปเบเปเบเบทเบเบเปเบฒเปเบเป, เบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบงเบเบชเบญเบเบงเปเบฒเบกเบตเบเบงเบฒเบกเปเบเบเบเปเบฒเบเบเบฑเบเบฅเบฐเบซเบงเปเบฒเบ. data_end
ะธ (const void*)ctx->data_end
. เปเบเปเบงเบฅเบฒเบเบฝเบ, kernel 5.3.1 เบเปเปเบกเบตเบเบฑเบเบซเบฒเบเบตเป. เบกเบฑเบเปเบเบฑเบเปเบเปเบเปเบงเปเบฒ compiler เปเบเปเปเบเบปเปเบฒเปเบเบดเบเบเบปเบงเปเบเบเปเบญเบเบเบดเปเบเบเบตเปเปเบเบเบเปเบฒเบเบเบฒเบเบเบฒเบเบชเบฐเบซเบเบฒเบก. เบเบฑเบเบเบฒเบเบฑเบเบเบญเบเปเบฅเบทเปเบญเบ: เบเบงเบฒเบกเบเปเบฒเบเบเบฒเบเบเบญเบเบฅเบฐเบซเบฑเบเบชเบฒเบกเบฒเบเบเปเบงเบเปเบเปเปเบเปเบงเบฅเบฒเบเบตเปเบกเบตเบฎเบฑเบเบซเบผเบฒเบ.
เบเปเปเปเบเปเบกเปเบเบเบฒเบเบเบงเบเบชเบญเบเบเบงเบฒเบกเบเบฒเบงเบเบปเบเบเบฐเบเบดเบชเปเบฒเบฅเบฑเบเบฅเบฑเบเบชเบฐเบซเบกเบตเบเบฒเบเบเบญเบเบเบปเบงเบเบงเบเบชเบญเบ; เบญ 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()
โ เบกเบฐเบซเบฒเบเบฒเบเบเบตเปเปเบเบทเปเบญเบเบเบฒเบเปเบเบเบญเบ Clang.
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);
เบเบฒเบเบเบดเบเปเบฅเปเบเบทเบเบเบญเบ checksums
IPv4 เปเบฅเบฐ TCP checksums เบฎเบฝเบเบฎเปเบญเบเปเบซเปเบกเบตเบเบฒเบเปเบเบตเปเบกเบเปเบฒเบชเบฑเบ 16-bit เบเบฑเบเบซเบกเบปเบเปเบ headers, เปเบฅเบฐเบเบฐเบซเบเบฒเบเบเบญเบ headers เปเบเปเบเบทเบเบเบฝเบเปเบเบปเปเบฒเปเบเปเบเบเบงเบเบกเบฑเบ, เบเบฑเปเบเปเบกเปเบ, เบเปเปเบฎเบนเปเปเบเปเบงเบฅเบฒเบฅเบงเบเบฅเบงเบก. เบเบตเปเปเบกเปเบเบเบฑเบเบซเบฒเปเบเบฒเบฐเบงเปเบฒเบเบปเบงเบเบงเบเบชเบญเบเบเบฐเบเปเปเบเปเบฒเบก loop เบเบปเบเบเบฐเบเบดเปเบเบซเบฒเบเบปเบงเปเบเบเบญเบเปเบเบ. เปเบเปเบเบฐเบซเบเบฒเบเบเบญเบเบซเบปเบงเปเบกเปเบเบเปเบฒเบเบฑเบ: เบชเบนเบเปเบเบดเบ 64 bytes เปเบเปเบฅเบฐเบเบปเบ. เบเปเบฒเบเบชเบฒเบกเบฒเบเปเบฎเบฑเบ loop เบเบตเปเบกเบตเบเปเบฒเบเบงเบเบเบปเบเบเบตเปเบเบญเบ iterations, เปเบเบดเปเบเบชเบฒเบกเบฒเบเบชเบดเปเบเบชเบธเบเปเบง.
เบเปเบฒเบเบฐเปเบเบปเปเบฒเบชเบฑเบเปเบเบเบงเปเบฒเบกเบต
เบเบฑเบเบเบฑเบเบเบฒเบเบเบดเบเปเบฅเป Checksum:
#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
เบเบฒเบเบเบงเบเบชเบญเบเปเบเบเบฅเบฐเบซเบฑเบเบเบฒเบเปเบ, เปเบเบทเปเบญเบเปเบเบเบฒเบเบญเบญเบเบเบตเบชเบญเบเปเบกเปเบเบกเบตเบเบงเบฒเบกเบเปเบฒเปเบเบฑเบเปเบเบทเปเบญเปเบซเปเบเบนเปเบเบงเบเบชเบญเบเบชเบฒเบกเบฒเบเบเบดเบชเบนเบเบเบฒเบเบชเปเบฒเปเบฅเบฑเบเบเบญเบ loop เปเบเป.
เบชเปเบฒเบฅเบฑเบเบเปเบฒเบชเบฑเบ 32-bit, เบชเบฐเบเบฑเบเบเบตเปเบเปเบฒเบเบเบฒเบเปเบกเปเบเบเบฐเบเบดเบเบฑเบ:
INTERNAL u32
sum16_32(u32 v) {
return (v >> 16) + (v & 0xffff);
}
เบเบปเบงเบเบดเบเปเบฅเปเบงเบเบฒเบเบเบดเบเปเบฅเป checksums เปเบฅเบฐเบเบฒเบเบชเบปเปเบเบเบญเบเบเบทเบ:
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()
เปเบฎเบฑเบเปเบซเป checksum เบเบฒเบเบเบปเบเบฅเบงเบก 32-bit เบเบญเบเบเปเบฒเบชเบฑเบ 16-bit, เบญเบตเบเบเบฒเบก RFC 791.
เบเบฒเบเบขเบฑเปเบเบขเบทเบเบเบฒเบเบเบฑเบเบกเบท TCP
เบเบฒเบเบเบฑเปเบเบเบญเบเบขเปเบฒเบเบเบทเบเบเปเบญเบเบชเปเบฒเบเบเบฑเปเบเบเบฒเบเปเบเบทเปเบญเบกเบเปเปเบเบฑเบ netcat
, เบเบฒเบ ACK เบชเบธเบเบเปเบฒเบ, เบเบตเป Linux เบเบญเบเบชเบฐเบซเบเบญเบเบเบฑเบเปเบเบฑเบเปเบเบฑเบ RST, เบเบฑเบเบเบฑเปเบเปเบเป stack เปเบเบทเบญเบเปเบฒเบเบเปเปเปเบเปเบฎเบฑเบ SYN - เบกเบฑเบเบเบทเบเบเปเบฝเบเปเบเบฑเบ SYNACK เปเบฅเบฐเบชเบปเปเบเบเบทเบ - เปเบฅเบฐเบเบฒเบเบเบธเบเบเบญเบ OS, packet เบกเบฒเบฎเบญเบเบเบตเปเบเปเปเบเปเบฝเบงเบเปเบญเบเบเบฑเบเบเบฒเบเปเบเบตเบ. เบเบฒเบเปเบเบทเปเบญเบกเบเปเป.
$ 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
เบเปเปเบเบญเบเบชเบฐเบซเบเบญเบเบเบฑเบ checksums เบเบตเปเบเปเปเบเบทเบเบเปเบญเบ.
SYN cookie
เบเบฒเบเบเบฑเบเบชเบฐเบเบฐเบเบญเบ XDP, เบเบฒเบเบเบงเบเบชเบญเบเบเบปเบงเบกเบฑเบเปเบญเบเปเบกเปเบเปเบเบฑเบเปเบฅเบทเปเบญเบเปเบฅเบฑเบเปเบเปเบญเบเป. เบชเบนเบเบเบฒเบเบเบดเบเปเบฅเปเปเบกเปเบเปเบเบทเปเบญเบเบเบปเปเบ เปเบฅเบฐเบญเบฒเบเบเบฐเบกเบตเบเบงเบฒเบกเบชเปเบฝเบเบเปเปเบเบฑเบเบเบนเปเปเบเบกเบเบตเบเบตเปเบเบฑเบเบเปเบญเบ. เบเบปเบงเบขเปเบฒเบเปเบเบฑเปเบ Linux kernel เปเบเป SipHash cryptographic, เปเบเปเบเบฒเบเบเบฐเบเบดเบเบฑเบเบเบญเบเบกเบฑเบเบชเปเบฒเบฅเบฑเบ XDP เปเบกเปเบเปเบซเบฑเบเปเบเปเบเบฑเบเปเบเบเปเบเบตเบเบเบญเบเปเบเบเบเบญเบเบเบปเบเบเบงเบฒเบกเบเบตเป.
เปเบเบฐเบเปเบฒเบชเปเบฒเบฅเบฑเบ TODOs เปเบซเบกเปเบเบตเปเบเปเบฝเบงเบเปเบญเบเบเบฑเบเบเบฒเบเบชเบทเปเบชเบฒเบเบเบฒเบเบเบญเบ:
-
เปเบเบเบเบฒเบ XDP เบเปเปเบชเบฒเบกเบฒเบเปเบเบฑเบเบฎเบฑเบเบชเบฒเปเบเป
cookie_seed
(เบชเปเบงเบเบฅเบฑเบเบเบญเบเปเบเบทเบญ) เบขเบนเปเปเบเบเบปเบงเปเบเบเบปเปเบงเปเบฅเบ, เบเปเบฒเบเบเปเบญเบเบเบฒเบเปเบเบฑเบเบฎเบฑเบเบชเบฒเปเบเปเบเปเบ, เบกเบนเบเบเปเบฒเบเบตเปเบเบฐเปเบเปเบฎเบฑเบเบเบฒเบเบเบฑเบเบเบธเบเปเบเปเบฅเบฐเปเบฅเบเบฐเบเบฒเบเปเบเบทเปเบญเบเบเปเบฒเปเบเบตเบเบเบตเปเปเบเบทเปเบญเบเบทเปเบเป. -
เบเปเบฒเบเบธเบเบเบต SYN เบเบปเบเบเบฑเบเบขเบนเปเปเบเปเบเบฑเบเปเบเบฑเบ ACK, เบเปเบฒเบเบเปเปเบเปเบฒเปเบเบฑเบเบเปเบญเบเบเบดเบกเบเปเปเบเบงเบฒเบก, เปเบเปเบเบทเปเบเปเบฒ 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
เปเบเบเบฐเบเบฐเบเบตเปเบเปเปเบกเบตเบเบฑเบเบเบตเบฅเบฒเบเบเบทเปเบเบญเบ IPs เบเบตเปเบเบทเบเบขเบทเบเบขเบฑเบ, เบกเบฑเบเบเบฐเบเปเปเบกเบตเบเบฒเบเบเปเบญเบเบเบฑเบเบเบฒเบเบเปเปเบฒเบเปเบงเบก 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 เปเบกเปเบเปเบเบทเปเบญเบเบกเบทเบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบเบเปเบเบเบเบฒเบเบเบธเบเปเบเปเบเบเบญเบเปเบเบฑเบเปเบเบฑเบเปเบเบเปเบเปเบ, เปเบฅเบฐเบเปเปเปเบกเปเบเบเบฒเบเปเบฅเบทเบญเบเบชเปเบฒเบฅเบฑเบ stack kernel, เปเบเบฑเปเบ DPDK เปเบฅเบฐเบเบฒเบเปเบฅเบทเบญเบ bypass kernel เบญเบทเปเบเป. เปเบเบเบฒเบเบเบปเบเบเบฑเบเบเปเบฒเบก, XDP เบเปเบงเบเปเบซเปเบเปเบฒเบเบชเบฒเบกเบฒเบเบเบฐเบเบดเบเบฑเบเปเบซเบเบเบปเบเบเบตเปเบเปเบญเบเบเปเบฒเบเบชเบฑเบเบชเบปเบ, เปเบเบดเปเบ, เบเบญเบเบเบฒเบเบเบฑเปเบ, เบเปเบฒเบเบเปเปเบเบฒเบเบเบฑเบเบเบธเบเปเบเบเบเปเปเบกเบตเบเบฒเบเบเบฑเบเบเบงเบฒเบเบเบฒเบเบเบธเบเปเบเปเบเบเบฒเบเบเบฐเบฅเบฒเบเบญเบ. เบเบปเบงเบเบงเบเบชเบญเบเบเปเปเปเบเปเบชเปเบฒเบเบเบฑเบเบซเบฒเปเบซเบเปเปเบเบเบชเปเบงเบเบเบปเบง, เบเปเบญเบเบเบฐเบเปเปเบเบฐเบเบดเปเบชเบเบเบตเปเบชเปเบฒเบฅเบฑเบเบชเปเบงเบเบเบญเบเบฅเบฐเบซเบฑเบ userspace.
เปเบเบชเปเบงเบเบเบตเบชเบญเบ, เบเปเบฒเบซเบปเบงเบเปเปเปเบกเปเบเบซเบเปเบฒเบชเบปเบเปเบ, เบเบงเบเปเบฎเบปเบฒเบเบฐเปเบฎเบฑเบเบชเปเบฒเปเบฅเบฑเบเบเบฒเบเบฐเบฅเบฒเบเบเบญเบเบฅเบนเบเบเปเบฒเบเบตเปเบเบทเบเบขเบทเบเบขเบฑเบเปเบฅเบฐเบเบฒเบเบเบฑเบเบเบงเบฒเบ, เบเบฐเบเบดเบเบฑเบเบเบปเบงเบเบฑเบเปเบฅเบฐเบเบฝเบ userspace utility เปเบเบทเปเบญเบเบฑเบเบเบฒเบเบเบฒเบเบเบฑเปเบเบเบญเบ.
เปเบญเบเบฐเบชเบฒเบเบญเปเบฒเบเบญเบตเบ:
เบฅเบฐเบซเบฑเบเปเบเบฑเบกเปเบ GitHub bpftrace Cheat Sheet เบเบนเปเบกเบทเบญเปเบฒเบเบญเบตเบ BPF เปเบฅเบฐ XDP เบเบฒเบเบชเบญเบ XDP PoC: เบเบฒเบเบฅเบงเบเบฅเบงเบกเบเบฑเบ eBPF เบเบฒเบ Rust
เปเบซเบผเปเบเบเปเปเบกเบนเบ: www.habr.com