Как настроить фильтрацию iptables на сетевом интерфейсе с подсетью на основе изоляции по приложениям с использованием cgroups v2 в Linux?

Вопрос или проблема

Я пытался настроить фильтрацию по приложениям на сетевом интерфейсе с использованием cgroups v2, но не смог.

Вот пример с использованием сетевых пространств имен и пар veth:

ip netns add somenetns
ip link add foo type veth peer name bar netns somenetns
ip link set foo up
ip -4 addr add 10.0.0.1/24 dev foo
ip -6 addr add fd00::1/64 dev foo
ip netns exec somenetns ip link set bar up
ip netns exec somenetns ip -4 addr add 10.0.0.2/24 dev bar
ip netns exec somenetns ip -6 addr add fd00::2/64 dev bar
ip netns exec somenetns ip -4 route add default via 10.0.0.1 dev bar
ip netns exec somenetns ip -6 route add default via fd00::1 dev bar
ip netns exec somenetns ip link set lo up

Что я хочу, так это сделать так, чтобы только приложения, работающие внутри определенной cgroup, имели свои точки слушания доступными для подсети сетевого интерфейса (в случае сетевого пространства имен, чтобы 10.0.0.1 было доступно внутри сетевого пространства имен).

Я запустил базовый TCP сервер, слушающий на IP адресе сетевого интерфейса:

# sudo bash -c "echo \$\$ >> /sys/fs/cgroup/blah/cgroup.procs; nc -k -l 10.0.0.1 1234"

# sudo ip netns exec nsx nc -z 10.0.0.1 1234
Подключение к 10.0.0.1 1234 порт [tcp/*] выполнено успешно!

Подключение выполнено.

Но когда я пытаюсь применить некоторые правила iptables, это не срабатывает:

iptables -A INPUT -i foo -m cgroup --path blah -j ACCEPT
iptables -A INPUT -i foo -j DROP
iptables -A OUTPUT -o foo -m cgroup --path blah -j ACCEPT
iptables -A OUTPUT -o foo -j DROP

# time sudo ip netns exec nsx nc -z 10.0.0.1 1234
^C
real    0m37.504s
user    0m0.000s
sys 0m0.003s

Есть ли способ сделать так, чтобы точка прослушивания по IP адреса сетевого интерфейса была доступна для его подсети, при этом программа, которая слушает, находится в cgroup и фильтрует все остальное?

Если это возможно, какие будут правильные правила iptables, которые я должен применить?

Ответ или решение

Настройка фильтрации iptables с изоляцией по приложениям с использованием cgroups v2 в Linux

В данной статье мы разберем, как настроить фильтрацию сети с использованием iptables и cgroups v2 для достижения изоляции на уровне приложений на сетевом интерфейсе. Мы будем использовать механизмы пространств имен (namespaces) и виртуальных Ethernet устройств (veth) для реализации этой задачи и рассмотрим подходы к конфигурации правил iptables.

Сценарий

Вы начали с создания сетевого пространства имен и виртуальной пары veth, настроив их, как указано в вашем примере. Затем запустили приложение на базовом TCP сервере, которое успешно отвечало на соединения. Однако, когда вы попытались применить правила iptables для фильтрации на основе cgroups, соединения не работали. Это показывает, что необходимо правильно настраивать фильтры для изоляции приложений.

Шаги для реализации

  1. Создание сетевого пространства имен и виртуальной пары veth:

    ip netns add somenetns
    ip link add foo type veth peer name bar netns somenetns
    ip link set foo up
    ip -4 addr add 10.0.0.1/24 dev foo
    ip -6 addr add fd00::1/64 dev foo
    ip netns exec somenetns ip link set bar up
    ip netns exec somenetns ip -4 addr add 10.0.0.2/24 dev bar
    ip netns exec somenetns ip -6 addr add fd00::2/64 dev bar
    ip netns exec somenetns ip -4 route add default via 10.0.0.1 dev bar
    ip netns exec somenetns ip -6 route add default via fd00::1 dev bar
    ip netns exec somenetns ip link set lo up
  2. Настройка cgroup для приложения:

    Создайте cgroup и добавьте процесс вашего приложения в него:

    mkdir /sys/fs/cgroup/blah
    echo $$ > /sys/fs/cgroup/blah/cgroup.procs  # добавление PID вашего приложения
  3. Запуск TCP сервера:

    sudo bash -c "echo \$\$ > /sys/fs/cgroup/blah/cgroup.procs; nc -k -l 10.0.0.1 1234"
  4. Настройка правил iptables:

    Проблема, с которой вы столкнулись, может быть связана с тем, что iptables не обрабатывает фильтрацию трафика в сетевых пространствах имен, как ожидалось. Правила iptables должны быть настроены для фильтрации соединений на уровне локального сетевого интерфейса в соблюдении с правилами cgroups.

    Для применения правил iptables с учетом cgroups:

    sudo iptables -A INPUT -i foo -m cgroup --path /sys/fs/cgroup/blah -j ACCEPT
    sudo iptables -A INPUT -i foo -j DROP
    sudo iptables -A OUTPUT -o foo -m cgroup --path /sys/fs/cgroup/blah -j ACCEPT
    sudo iptables -A OUTPUT -o foo -j DROP
  5. Проверка соединения:

    После применения правил iptables убедитесь, что приложение работает корректно:

    time sudo ip netns exec somenetns nc -z 10.0.0.1 1234

    Вы должны увидеть успешное подключение.

Заключение

С помощью вышеописанных шагов вы сможете настроить фильтрацию по cgroups, что обеспечит изоляцию приложений на уровне сетевых интерфейсов. Убедитесь, что iptables настроены правильно для работы с cgroups, и ошибки в конфигурации сводятся к минимуму. Помните, что настройки сетевой безопасности критически важны для защиты ваших приложений и данных.

Если у вас возникнут дополнительные вопросы по настройке или фильтрации, не стесняйтесь их задавать для получения дальнейших разъяснений.

Оцените материал
Добавить комментарий

Капча загружается...