skbОбычно сетевой пакет проходит довольно длинный путь внутри Linux:
NIC → driver → skb → network stack → socket → application
Но
skb создаётся не в самом начале.XDP может выполнить программу прямо на раннем этапе обработки пакета, когда драйвер уже получил его из NIC, но обычный
sk_buff ещё не создан.Поэтому решение можно принять буквально на входе:
NIC
↓
driver
↓
XDP
├── DROP
├── PASS → обычный network stack
├── TX
└── REDIRECT
Например, простой XDP-программе достаточно проверить destination IP и сразу отбросить пакет:
SEC("xdp")
int drop_packet(struct xdp_md *ctx)
{
return XDP_DROP;
}При
XDP_DROP пакет вообще не доходит до обычного kernel networking stack.Это важно под большой нагрузкой: если отбросить ненужный трафик после создания
skb, часть работы ядро уже успело выполнить. XDP позволяет перенести фильтрацию значительно раньше.Проверить, загружена ли XDP-программа:
ip -details link show dev eth0
И посмотреть статистику:
ip -s link show dev eth0
Поэтому «firewall на сервере» - не всегда означает, что пакет сначала проходит весь сетевой стек, а потом его фильтруют. В Linux точка принятия решения может находиться практически сразу после получения кадра сетевой картой.
N.A.


