á¨á˘ááľáá¨áľ áłáł áá (á¤ááľá˛á) á´áááá ááŹááš áá° á¨á¨ááá ááľááá ááá á¨áááŁáłá¸á á ááľ á¨áááá° áľáŤáá áá°áľá á ááááľ áááááá˝ áá ááá áłáᢠᨠ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)
- ááá¨á.
á¨á˘á˘áá¤á (á¨á°áŤáá á¨á áááá ááŹáľ ááŁáŞáŤ) á¨áášáá áá˝á áá á°áĽá ááá á°á°áá á¨á°á°áŤ á˛áá áá á á¨ááá áŽáą áĽáá°áááá áĽá á¨ááá˝ á°áá˝á áá á°á¨ áľááľáł áĽáá°ááááł áá¨ááἠáá˝ááᢠáľáá áá°áŚá˝ áĽá áźáŽá˝áĄ-
- ááá áśá˝ (áá° áá) á¨á°á¨áá¨á áá¸á.
- ááá¨á ááá á áᣠááá áá ááá á°ááŁáŤáľ á¨áá (ááá á¨C á°ááŁáŤáľ áá° ááľáĽ áááŁáľ á ááŁá¸á)á˘
- á¨ááá áĽá á¨ááŹáľ ááľ áá á¨áá á°á¨ áľááľáł ááłá¨áť á¨á°á¨áá¨á ááá˘
- á¨áŽáą áá á á¨á°áá°á áá, á á°ááŁá áá áá á áŁá á áľááá á áá°áá.
- áá° áአá¨á¨ááá á°ááŁáŤáľ (eBPF á ááĽáá˝) áĽáŞáá˝ áĽáť ááááłáá˘
ááŁáŞáŤ ááá°á áĽá ááŤá áá á áááľááá˘
- á¨ááá áŽáľ (áááłá
kernel.c
) áá° áá á°á°áĽáľá§á (kernel.o
) á eBPF áááŁá áá˝á á ááá´áá¸áᢠá¨áŚááśá á 2019 áááŽáŁ áá° eBPF áá ááá á áááá á¨á°á°áá áĽá á áá˛á˛ 10.1 áá ááĽáˇáᢠ- áá á¨ááá áŽáľ áá° á¨ááá á ááááŽá˝ (áááłá á á¨á´ááá˝ áĽá ááŁáŞáá˝) áĽáŞáá˝á á¨áŤá ááłáááŤá¸á á ááŽáá˝ á°á°ááˇáᣠáá áááľ áĽáá°áá á áááľ áŽáľ áá°áá á á áá˝áá áááľ ááᢠáá° á¨ááá á¨ááŤáá á ááľ áĽááá á ááŽáá˝ á á¨ááá áĽáŞáá˝ (áŽáąá áŤááá) á á°áá አáአáááŽá˝ ááłáá፠áá°áŤáľ áŤáľáááááłáᢠáá áá á ááŤá áááááŤáá˝ ááľá¨á áá˝áá, ááá á ááľ á¨á°áá°á ááŁáŞáŤ á¨ááŤááá áĽá á¨ááá ááŽááŤá ááťá áá˝áá.
- áŽááá á¨á°áŤááá ááŽááŤá áŤá¨áááŁá. á¨áá°áśá˝ á áááá áĽá á¨áĽá á áĽá á¨á°á°áŤáŤá˘ áľáá áŽá˝ ááá á áááťá á°á¨ááá§áᢠá á¨ááአáŽáą áľááá áááá áá¨ááἠáŤááťá ááŽááŤá ááľá á°á°ááá - áĽáąá ááľá°á°áľ ááťá á ááĽááľá˘
- á¨á°áłáŤ áá¨áá፠á ááᣠá¨ááá á¨á˘á˘áá¤á á ááá´áá¸á ááá áŽáľá ááľáááą á ááá´áá¸á (áá á áᣠáá) áá° áá˝á áŽáľ áŤá áá áŤáá˘
- ááŽááŤá á¨ááááá áá á°áŤááá áĽá ááŹáśá˝á ááŤááľ ááááŤá.
XDP á á¨ááá ááľáĽ áľááá°áŤáŁ áá¨á á¨áá¨áááá á¨áá¨áłá°áŤ áááἠááľáłááťáá˝á áĽá áĽáá˛áŤáá ááŽááŤá á¨ááŤáŁáŤá¸á ááá á¨ááŤáááŤá¸á áĽá˝áá˝ á áá áá ááᢠááá eBPF á¨áá¨á°á áŽáľ ááľáááą á°á áááą á¨á°á á á áááá áŤá¨áááŁáᣠáľááá á XDP á ááĽáł á á áŤáŁá˘á ááááľ áá ááá¨á áá˝ááá˘
á áŤáŁá˘á áááááľ
áá°áĽá°áĽ
áááá á eBPF á ááá´áá¸á á¨ááá áŽáľ á ááĽáł áááááľ á áá˝ááᣠáľááá áá°áą áááľ á°á¨ááá˝á áŤáá ááá˘
- C áŽáľ áá° 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 (á¨á°á áá áŚáł á¤áá á) áŤáľááá˝ áá¨ááá áŽáľ á°ááá¸ááá˘
á¨ááá áĽá á áá°áá¨á áá˝áá (-fno-stack-protector
ᨠeBPF áŽáľ á á¨ááá á ááá á¨áľáá á á᪠á¨á°á°á¨á°áŠ áĽá°áśá˝á áľáááŤáŁáŤá˘ ᨠeBPF áŁááľáŽáľ áá á á¨á°áá°á áľááá áááťá¸áľá áá˛áŤáá ááĽáŤáľ á°áᢠááá˘
áááá áĽá˝áá˝ á ááŤáá áĽá ááá ááá á ááá°áŤ ááŁáŞáŤ áĽáááááĄ-
#include <uapi/linux/bpf.h>
#include <bpf_helpers.h>
SEC("prog")
int xdp_main(struct xdp_md* ctx) {
return XDP_PASS;
}
char _license[] SEC("license") = "GPL";
áĄáľá make
áá°á áľáŁá xdp_filter.o
. á áá á¨áľ áááá?
á¨áá¨áŤ ááááŤ
ááááŤá áááľ áááááá˝á ááŤá°áľ á áá áľ: á áĽáą áá ááŁáŞáŤ áááŤá áĽá á¨á¨áľááš áĽá˝áá˝ áááŤá. áá°á á á áááŹá˝áá˝ á¨áĽá ááŁáŞáŤ áá áĽáá´áľ áĽáá°áá አáááá°á˝ áĽááá á¨áŤáłá¸á á áááá˝ áŤáá¸á áá á¨ááááľ ááŁáŞáŤáá˝ ááá á ááŁá¸áá˘
á¨áŹáľ (áááŁá á¤á°áááľ) á áááľ ááłáŞáŤáá˝ ááĽá á°áľáá áá¸á áĽááá
áĽááľ áááŁá á ááłá¨ áá¨áĽ á áááážá˝ á ááĽáł áĽááľ á ááľ "á¨á°ááá" áá¸á. áĽááąá áĽáá°áá
ááá á áá˝áá (á áá
ááá ááľáĽ ááá áľáááá˝ ip
á¨áá¨áááᾠᨠroot
):
ip link add xdp-remote type veth peer name xdp-local
áá
áá xdp-remote
и xdp-local
- á¨ááłáŞáŤ áľáá˝. á ááˇá xdp-local
(192.0.2.1/24) ááŁáŞáŤ á°áŤááá, áá xdp-remote
(192.0.2.2/24) áᢠáľáŤáá áááŤá. ááá áá, á ááľ á˝áá á á: á áááážáš á á°ááłáłá áá˝á áá áá¸á, áĽá ááááľ áľáŤáá áá° á ááłá¸á á áááá á áááá. áá
áá á áľá¸á᪠á áá á°ááŚá˝ áááłáľ áá˝áá iptables
, ááá áá ááŹáá˝á ááá¨á á ááŁá¸á, áá
á ááá¨á á¨áááá˝ áá. á¨á ááłá¨ áá¨áĽ áľá áŚáłáá˝á (á¨áá
á áá netns) áá áá á¨á°áťá áá.
á¨á ááłá¨ áá¨áĽ áľá áŚáł á¨ááá˝ ááľáá˝ ááľáĽ áŤá á°ááłáłá áááŽá˝ á¨á°ááá á¨á áááá˝áŁ á¨ááá á°áá á¨áŚá˝ áĽá NetFilter á°ááŚá˝á áááᢠáĽáŤááłááą áá°áľ á áľá áŚáł ááľáĽ áá á¨áá°áŤá áĽá á¨ááľááąá áĽááá˝ áĽáť áá á¨áá°áá°áᢠá ááŁáŞ, áľáááą áááá áĽááá˝ á ááľ áá á á¨á ááłá¨ áá¨áĽ áľá áŚáł á áá, áľááá á ááááľ ááľáĽ ááľáŤáľ áĽá áľá ááľááľ ááá á áá˝áá.
á á˛áľ á¨áľá áŚáł áĽááá á 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 ááľáĽ áŤááá á áááá˝ ááááá, áááľ áŤáľáááááłá 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 Echo áĽáŤáá ááłá¨áľ áĽá á¨ICMP Echo ááá˝á ááłá¨áľ ááá á áá áľá˘ áá á ááłááᢠááľáŤ á¨ááá áá 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
á ááľáŠ á¤á áááá˝ áĽáť á¨áłáŠáŁ ááŁáŞáŤáášá ááľáááľ áŤáľáááááłá (áá
áŤá°ááá sudo ./stand detach
), áĽáááľ ping
á¨á፠ááŁáŞáŤáá˝á áŤááá áĽá áĽáá°áá ááááŠá˘ á˝áአááŁáŞáŤá áá XDP_TX
á ARP áá áĽá ááá á¨áá áááąá á¨áá°áŤ
á¨áľá áŚáłáá˝ xdp-test
ᨠMAC á áľáŤáťá 192.0.2.1 "ááááłáľ" á˝áá, áá
á á áá áááłáľ á áá˝áá.
á¨á˝áአááá
áá°á°á áá°á á°ááŁá áĽáááľáĄ á¨SYN áŠáŞáá˝á á XDP áá áááá˘
á¨SYN ááá á ááá áłáá á¨á˛áśá¤áľ áĽááľ ááᣠááá ááá á¨áá¨á°áá ááᢠáááááľ á˛áá á (TCP handshake)ᣠá áááአSYN ááá ááᣠááá°ááľ áááááľ ááĽááśá˝á áááľáŁáᣠá SYNACK ááŹáľ ááá˝ áá°áŁá áĽá ACK áá áĽááᢠá áĽáá á ááá á áşáá˝ á¨ááá አá¨SYN ááŹáśá˝á á á´áŽááľ á¨á ááľ á áľá°ááá á¨á°áŁáŠ á áľáŤáťáá˝ á áĽá áşá -á ááŤáŤ áŚáľááľ áááŤáᢠá áááአááŹá áĽáá°á°á¨á° áá˛áŤáá ááĽáśá˝á áááá°áĽ ááá°áłáᣠááá áá áĽá áá áŤáá á áá áááá¸ááᤠá áá ááááŤáľ áá á°á¨ áľááľáł ááá áá°áŚá˝ á°áá ááᣠá áłá˛áľ áááááśá˝ á°ááŁáááľ á áŤááá áĽá á áááááą á ááááá˘
á SYN ááŹáľ áá á°ááľáá°á
ááĽáľ áŤááá°áĽá ááá áá á SYNACK ááŹáľ áĽáť ááá˝ áŤáá°á á
ᣠá áááአáĽáá´áľ á áá á¨á°á¨á°á ACK ááŹáľ áŤáá°ááá á¨SYN ááŹáľá áĽáá°ááŤááááľ áá¨áł áá˝áá? á°ááá á áĽá á¨áá¸áľ á¤á˛áŹáá˝á ááá á áá˝ááᢠá¨SYN áŠáŞ ááĽáĄ áá° ááľáĽ ááá°áľ ááᢠseqnum
á¨áááááľ áááŞáŤáá˝ áĽáá° á áľáŤáťáὠᣠáá°áŚá˝ áĽá á°áááá á¨áᢠá¨á á¨ááá¨áŠ á ááľ á¤á˛áŹá ááľá¨áľ á¨áťá áášá áĽáá°áá ááľááľ áĽá á¨áĽáą áá áááłá°á áá˝ááᢠacknum
. ááá
acknum
á áĽáá á áá˝áá ᣠááááŤáąá á¨á ááľá˘áŠá áľááá¨áá áĽá á á°áá°á áťáá ááááŤáľ áĽáąá ááá°áá°á áá á ááá¨ááá˘
á¨SYN áŠáŞ á ááááľ á¨ááá ááľáĽ áá¨á á áá á˛á°áá á áááˇá áĽá SYNs á ááĽááľ áĽá á á áá á¨á°á¨áą á áŤáľ-á°á ááá áá˝ááá˘
á TCP áĽá áá¨áŁá ἠáá á¨áľáá ááľ ááŽááŤá
TCP á¨ááἠááľá°áááá áĽáá° áŁááľ áĽá¨áľ áŤáááŁáᣠáááłáᣠHTTP áĽáŤááá˝ á TCP áá°ááááᢠáĽá¨áą á ááŹáśá˝ ááľáĽ áááĽáŤáŽá˝ á°á¨áááá. ááá á¨TCP áĽá˝áá˝ á ááááŽá á áŁáá˛áŤáá˝ áĽá áŁá 32-á˘áľ á°á¨áłáłá ááĽáŽá˝ á áá¸ááĄ-
-
á¨áŁáá˛áŤáá˝ áĽáá¨áľ á¨á ááľ á¨á°áá°á áĽá á áá áááľáá. á¨SYN áŁáá˛áŤ á¨ááŤáááá°á áá á áááááą áá á¨ááŞá á¨ááááŞáŤ ááŹáľ áááá ááᢠᨠACK áŁáá˛áŤ áááľ ááŞá áááá á¨áááááľ áá¨ááá˝ áĽáľá¨ áŁááľ á°ááĽáá áááľ ááá˘
acknum
. ááŹáľ áĽá áŁáá˛áŤáá˝ áááŠáľ áá˝áá áĽá á áĽáá¨áłá¸á áá áŤáᣠáááłá SYNACK ááŹáľá˘ -
á°á¨áłáłá ááĽá (seqnum) á áá ááŹáľ ááľáĽ ááá°áááá á¨ááááŞáŤá áŁááľ á áá¨á áĽá¨áą ááľáĽ áŤááá ááŤáŤáť ááááťáᢠáááłáᣠá ááááŞáŤá ááŹáľ ᨠ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 ááŽááŤá á¨áá¨á°ááľá ááľá¨á á áá áľáĄ-
- á SYN á SYNACK á áŠáŞ ááá˝ ááľáĄ;
- á 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
ᣠá áľááááášá áľááááá˝ áá° áŽáą áá
áłáľ áá á¨áĽáá˘
á á¨ááá ááľáĽ áŤáá eBPF á á¨ááá áá° áá áááá á¨áá¨ááá á ááá áááŁáĽ á C ááľáĽ á¨á°áááľ ááá á°ááŁáŤáľ áĽáŞá á áá°á¨áá áľ áŚáł áá ááá á ááŁá¸áá˘
#define INTERNAL static __attribute__((always_inline))
ááᎠLOG()
á á°áááá áááŁáł ááľáĽ áá°áá áŤá°áááá.
áááááĽáŠ á¨á°ááŁá áááᣠáá. áĽáŤááłááłá¸á á¨áááá°á á°á¨á áŤáľá á¨á°ááá áľ ááŹáľ ááá ááᣠáááłáᣠprocess_ether()
áĽáá˛áá áá áĽááᢠether
. á ááľá áľáá°á áá¤áśá˝ áá á áááľá¨áľ, á°ááŁáŠ ááŹáá áá° á¨áá°á á°á¨á ááá áá˝áá. á¨á°ááŁáŠ áá¤áľ ᨠXDP áĽááá áá. áá ááᣠá¨SYN áĽá ACK á°ááŁáŁáŞáá˝ áááá áĽá˝áá˝ áŤáááá˘
struct Packet {
struct xdp_md* ctx;
struct ethhdr* ether;
struct iphdr* ip;
struct tcphdr* tcp;
};
INTERNAL int process_tcp_syn(struct Packet* packet) { return XDP_PASS; }
INTERNAL int process_tcp_ack(struct Packet* packet) { return XDP_PASS; }
INTERNAL int process_tcp(struct Packet* packet) { ... }
INTERNAL int process_ip(struct Packet* packet) { ... }
INTERNAL int
process_ether(struct Packet* packet) {
struct ethhdr* ether = packet->ether;
LOG("Ether(proto=0x%x)", bpf_ntohs(ether->h_proto));
if (ether->h_proto != bpf_ntohs(ETH_P_IP)) {
return XDP_PASS;
}
// B
struct iphdr* ip = (struct iphdr*)(ether + 1);
if ((void*)(ip + 1) > (void*)packet->ctx->data_end) {
return XDP_DROP; /* malformed packet */
}
packet->ip = ip;
return process_ip(packet);
}
SEC("prog")
int xdp_main(struct xdp_md* ctx) {
struct Packet packet;
packet.ctx = ctx;
// A
struct ethhdr* ether = (struct ethhdr*)(void*)ctx->data;
if ((void*)(ether + 1) > (void*)ctx->data_end) {
return XDP_PASS;
}
packet.ether = ether;
return process_ether(&packet);
}
áľáŠá¨áľáá A áĽá B ááááľ áá°á°á°á¨ááŁá¸á áźáŽá˝ áĽáłáá. á áľá°áŤá¨áľ á¨á°áĄ, ááŽááŤá ááááŁá, ááá áá á ááŤáá áľ áá á¨áá¨áá፠áľá á°áľ áááŤá:
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 áá°áŚá˝áᣠá¨á áá á áľáŤáťáá˝á áĽá á¨áá á áľáŤáťáá˝á ááááŠá˘ áá°á áá á¤á°-áá˝ááᾠᨠXDP ááŽááŤá á°á°áŤá˝ á áá°áá, áľááá
memcpy()
- Clang intrinsics á¨áá°áĽá
áááŽ.
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 ááľááłá, ááááľ á RST ááŹáľ ááá˝ á°á , á¨ááľááá ááá SYN áľááá°áá á - áá° SYNACK á°ááᎠá°áááś á¨á°áᨠ- áĽá á¨áľááá° áááá áĽááł, á¨ááááľ áá áŤáá°ááá ááŹáľ á°á¨á°. áááááśá˝.
$ 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 áŠáŞ
á¨á¤ááľá˛á áĽááł á ááťá áá¨áááŤá áŤáą ááá ááᢠá¨áľááą á áááŞáá ááłá áĽá ááááŁáľá áá°áŤáá á áĽá á¨á°ááá ááᢠá¨ááááľ á¨áááᣠáááłáᣠááŞááśááŤáá SipHash áá áááᣠááá áá áXDP á°ááŁáŤáááą á¨áá á˝áá áá°á á áá áĽáá°áá ááá˝ ááá˘
á¨áá áááááľ áá áá°áŤáŤá á áłá˛áľ TODOáá˝ á áľá°ááááĄ-
-
á¨XDP ááŽááŤá áá¨áá¸áľ á áá˝ááá˘
cookie_seed
(á¨á¨á ááľáĽáŤá ááá) á á ááá áá á°áááá, á á¨ááá ááľáĽ áá¨ááť áŤáľáááááłá, áĽá´áą á á¨ááá á¨á áľá°ááá áááŹá°á ááťáťáá. -
á¨SYN áŠáŞá á á¤á˛áŹ ááŹáľ ááľáĽ á¨ááááľ á¨áá áááĽááľ áá°á á áŤáľáááááľáᣠááá áá á¨áą ááŹáśá˝á ááá áááá á á¨á°á¨ááá áá á°áá á á áá áŤáľáłááąá˘
á áá á¨á°áá á áá¨áááŤáĄ-
$ 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
á¨á°á¨ááᥠá áááá˝ áááá áŁááááᣠᨠSYN ááá á áŤáą ááá áĽá á á ááááᣠááá áá á áá¨á°áá áľáĽáá áá¤á˛áŹ ááá á¨á°á°á á ááá˝ áĽáá á ááĄ-
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 á áἠáľáá á áá˛áĄ á¨áááľ áá° eBPF á áá ááá áá
ááá: hab.com