iptables не работает на macvlan трафик в контейнере


У меня есть хост с одним интерфейсом eth0, IP 10.0.10.10/24. Я запускаю докер, добавляю контейнер, никакой сети. Затем я создаю устройство macvlan на eth0, даю ему IP 10.0.10.20/24 и помещаю его в контейнер.

И хост, и контейнер теперь имеют полный доступ к сети.

Затем я создаю правило iptables на хосте, чтобы отбросить весь трафик К или от IP контейнера 10.0.10.20. Правила не работают,и трафик проходит.

Конечно, если я делаю это из контейнера (либо ip netns exec $PID iptables ... или предоставляя контейнеру NET_ADMIN возможности), он работает.

Должны ли правила iptables базового хоста не фильтровать трафик?

1 3

1 ответ:

Ответ на этот вопрос таков: вы не можете этого сделать. При использовании моста трафик входит в хост и выходит из него, поэтому он попадает в стек ip-адресов хоста. При использовании macvlan единственный IP-стек находится в контейнере, поэтому правила iptables на хосте никогда не вызываются.

Единственный способ сделать это-изменить правила iptables внутри контейнера.

Если вы не хотите предоставлять контейнеру доступ, например, если вы хотите управлять контейнером, то используйте ip netns exec ... от хоста сам, который будет контролировать правила iptables в контейнере, не давая контейнеру самому управлять.

Я написал сценарий, который делает это. Он доступен по адресу https://github.com/deitch/ctables и лицензированный MIT.