👋 Привет, сетевой друг!
Сегодня разберём eBPF vs iptables/nftables. По факту это два подхода к фильтрации трафика, которые сейчас активно конкурируют в Kubernetes и просто в Linux-окружениях.
🟣Классический стек iptables/nftables: правила обрабатываются последовательно через цепочки netfilter в ядре. Каждый пакет проходит через все правила пока не найдёт совпадение. При тысячах правил (типичная ситуация в Kubernetes) это становится узким местом - каждое новое правило добавляет линейную сложность O(n).
Посмотреть текущие правила и статистику:
iptables -L -n -v --line-numbers
nft list ruleset
iptables -t filter -L -n -v | grep -v "0 0"
🟣Что меняет eBPF: вместо обхода цепочек правил программа на eBPF выполняется прямо в ядре при каждом пакете - без копирования в userspace, без обхода длинных цепочек. Решение принимается за O(1) через hash-таблицы вместо O(n) через правила:
# Простой XDP-дроппер через eBPF
cat > drop_icmp.c data;
void *data_end = (void *)(long)ctx->data_end;
struct ethhdr *eth = data;
if ((void *)(eth + 1) > data_end) return XDP_PASS;
struct iphdr *ip = (void *)(eth + 1);
if ((void *)(ip + 1) > data_end) return XDP_PASS;
if (ip->protocol == 1) return XDP_DROP;
return XDP_PASS;
}
EOF
clang -O2 -target bpf -c drop_icmp.c -o drop_icmp.o
ip link set dev eth0 xdp obj drop_icmp.o sec xdp
🟣Почему Kubernetes переходит на eBPF через Cilium: kube-proxy генерирует тысячи iptables-правил для service routing - по несколько правил на каждый сервис и эндпоинт. При 10000 сервисов это десятки тысяч правил, обновление которых занимает секунды и блокирует пакетную обработку. Cilium заменяет всё это на eBPF-программы с hash-таблицами:
# Проверяем что Cilium использует eBPF вместо iptables
cilium status | grep -i datapath
cilium bpf lb list # вся load balancing таблица
cilium bpf policy get --all # политики как eBPF программы
🟣Эмулируем разницу под нагрузкой - добавляем 10000 iptables-правил и меряем деградацию:
# Генерируем 10000 правил
for i in $(seq 1 10000); do
iptables -A INPUT -s 10.$((i/256)).$((i%256)).0/24 -j ACCEPT
done
# Меряем пропускную способность
iperf3 -c target -t 30
# Чистим и меряем без правил для сравнения
iptables -F INPUT
iperf3 -c target -t 30
🟣Когда iptables/nftables всё ещё правильный выбор: небольшие сети с сотнями правил, классические серверы без Kubernetes, когда команда не готова к eBPF-отладке. eBPF побеждает при тысячах правил, высоком pps и динамически меняющейся конфигурации как в Kubernetes.
Серверная Админа | Zeroday | #eBPF #iptables
Сегодня разберём eBPF vs iptables/nftables. По факту это два подхода к фильтрации трафика, которые сейчас активно конкурируют в Kubernetes и просто в Linux-окружениях.
🟣Классический стек iptables/nftables: правила обрабатываются последовательно через цепочки netfilter в ядре. Каждый пакет проходит через все правила пока не найдёт совпадение. При тысячах правил (типичная ситуация в Kubernetes) это становится узким местом - каждое новое правило добавляет линейную сложность O(n).
Посмотреть текущие правила и статистику:
iptables -L -n -v --line-numbers
nft list ruleset
iptables -t filter -L -n -v | grep -v "0 0"
🟣Что меняет eBPF: вместо обхода цепочек правил программа на eBPF выполняется прямо в ядре при каждом пакете - без копирования в userspace, без обхода длинных цепочек. Решение принимается за O(1) через hash-таблицы вместо O(n) через правила:
# Простой XDP-дроппер через eBPF
cat > drop_icmp.c data;
void *data_end = (void *)(long)ctx->data_end;
struct ethhdr *eth = data;
if ((void *)(eth + 1) > data_end) return XDP_PASS;
struct iphdr *ip = (void *)(eth + 1);
if ((void *)(ip + 1) > data_end) return XDP_PASS;
if (ip->protocol == 1) return XDP_DROP;
return XDP_PASS;
}
EOF
clang -O2 -target bpf -c drop_icmp.c -o drop_icmp.o
ip link set dev eth0 xdp obj drop_icmp.o sec xdp
🟣Почему Kubernetes переходит на eBPF через Cilium: kube-proxy генерирует тысячи iptables-правил для service routing - по несколько правил на каждый сервис и эндпоинт. При 10000 сервисов это десятки тысяч правил, обновление которых занимает секунды и блокирует пакетную обработку. Cilium заменяет всё это на eBPF-программы с hash-таблицами:
# Проверяем что Cilium использует eBPF вместо iptables
cilium status | grep -i datapath
cilium bpf lb list # вся load balancing таблица
cilium bpf policy get --all # политики как eBPF программы
🟣Эмулируем разницу под нагрузкой - добавляем 10000 iptables-правил и меряем деградацию:
# Генерируем 10000 правил
for i in $(seq 1 10000); do
iptables -A INPUT -s 10.$((i/256)).$((i%256)).0/24 -j ACCEPT
done
# Меряем пропускную способность
iperf3 -c target -t 30
# Чистим и меряем без правил для сравнения
iptables -F INPUT
iperf3 -c target -t 30
🟣Когда iptables/nftables всё ещё правильный выбор: небольшие сети с сотнями правил, классические серверы без Kubernetes, когда команда не готова к eBPF-отладке. eBPF побеждает при тысячах правил, высоком pps и динамически меняющейся конфигурации как в Kubernetes.
Серверная Админа | Zeroday | #eBPF #iptables