pf на macos: Пытался заставить pf блокировать пакеты между локальными процессами, но не смог.

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

На macOS Sonoma 14.6.1 (с ядром Darwin 23.6.0) я запускаю пять узлов Hazelcast 3.12 на localhost, чтобы смоделировать сценарий «разделенного мозга». Каждый из этих узлов слушает на определенном порту для связи с другими узлами и общается с другими узлами с настроенных портов:

| слушает на |  5701 |  5702 |  5703 |  5704 |  5705 |
|------------|-------|-------|-------|-------|-------|
| отправляет с | 33712 | 33721 | 33731 | 33741 | 33751 |
|            | 33713 | 33723 | 33732 | 33742 | 33752 |
|            | 33714 | 33724 | 33734 | 33743 | 33753 |
|            | 33715 | 33725 | 33735 | 33745 | 33754 |

Я хотел смоделировать сценарий «разделенного мозга», отключив все tcp-пакеты между узлами-1,2,3 и узлами-4,5. Для этой цели я создал правила pf (Фильтр пакетов) в /etc/pf.anchors/hazelcast:

block out quick on lo0 proto tcp from 127.0.0.1 port 33711:33715 to 127.0.0.1 port 5704
block out quick on lo0 proto tcp from 127.0.0.1 port 33721:33725 to 127.0.0.1 port 5704
block out quick on lo0 proto tcp from 127.0.0.1 port 33731:33735 to 127.0.0.1 port 5704

block in  quick on lo0 proto tcp from 127.0.0.1 port 33711:33715 to 127.0.0.1 port 5704
block in  quick on lo0 proto tcp from 127.0.0.1 port 33721:33725 to 127.0.0.1 port 5704
block in  quick on lo0 proto tcp from 127.0.0.1 port 33731:33735 to 127.0.0.1 port 5704

block out quick on lo0 proto tcp from 127.0.0.1 port 33711:33715 to 127.0.0.1 port 5705
block out quick on lo0 proto tcp from 127.0.0.1 port 33721:33725 to 127.0.0.1 port 5705
block out quick on lo0 proto tcp from 127.0.0.1 port 33731:33735 to 127.0.0.1 port 5705

block in  quick on lo0 proto tcp from 127.0.0.1 port 33711:33715 to 127.0.0.1 port 5705
block in  quick on lo0 proto tcp from 127.0.0.1 port 33721:33725 to 127.0.0.1 port 5705
block in  quick on lo0 proto tcp from 127.0.0.1 port 33731:33735 to 127.0.0.1 port 5705

block out quick on lo0 proto tcp from 127.0.0.1 port 33741:33745 to 127.0.0.1 port 5701
block out quick on lo0 proto tcp from 127.0.0.1 port 33741:33745 to 127.0.0.1 port 5702
block out quick on lo0 proto tcp from 127.0.0.1 port 33741:33745 to 127.0.0.1 port 5703

block in  quick on lo0 proto tcp from 127.0.0.1 port 33741:33745 to 127.0.0.1 port 5701
block in  quick on lo0 proto tcp from 127.0.0.1 port 33741:33745 to 127.0.0.1 port 5702
block in  quick on lo0 proto tcp from 127.0.0.1 port 33741:33745 to 127.0.0.1 port 5703

block out quick on lo0 proto tcp from 127.0.0.1 port 33751:33755 to 127.0.0.1 port 5701
block out quick on lo0 proto tcp from 127.0.0.1 port 33751:33755 to 127.0.0.1 port 5702
block out quick on lo0 proto tcp from 127.0.0.1 port 33751:33755 to 127.0.0.1 port 5703

block in  quick on lo0 proto tcp from 127.0.0.1 port 33751:33755 to 127.0.0.1 port 5701
block in  quick on lo0 proto tcp from 127.0.0.1 port 33751:33755 to 127.0.0.1 port 5702
block in  quick on lo0 proto tcp from 127.0.0.1 port 33751:33755 to 127.0.0.1 port 5703

В конце /etc/pf.conf я добавил:

anchor "hazelcast/*"
load anchor "hazelcast" from "/etc/pf.anchors/hazelcast"

Затем я запустил команду:

sudo pfctl -Evf /etc/pf.conf

Она вывела:

...
Загрузка якоря hazelcast из /etc/pf.anchors/hazelcast
block drop out quick on lo0 inet proto tcp from 127.0.0.1 port 33741:33745 to 127.0.0.1 port = 5701
block drop out quick on lo0 inet proto tcp from 127.0.0.1 port 33741:33745 to 127.0.0.1 port = 5702
block drop out quick on lo0 inet proto tcp from 127.0.0.1 port 33741:33745 to 127.0.0.1 port = 5703
block drop out quick on lo0 inet proto tcp from 127.0.0.1 port 33751:33755 to 127.0.0.1 port = 5701
block drop out quick on lo0 inet proto tcp from 127.0.0.1 port 33751:33755 to 127.0.0.1 port = 5702
block drop out quick on lo0 inet proto tcp from 127.0.0.1 port 33751:33755 to 127.0.0.1 port = 5703
block drop out quick on lo0 inet proto tcp from 127.0.0.1 port 33711:33715 to 127.0.0.1 port = 5704
block drop out quick on lo0 inet proto tcp from 127.0.0.1 port 33721:33725 to 127.0.0.1 port = 5704
block drop out quick on lo0 inet proto tcp from 127.0.0.1 port 33731:33735 to 127.0.0.1 port = 5704
block drop out quick on lo0 inet proto tcp from 127.0.0.1 port 33711:33715 to 127.0.0.1 port = 5705
block drop out quick on lo0 inet proto tcp from 127.0.0.1 port 33721:33725 to 127.0.0.1 port = 5705
block drop out quick on lo0 inet proto tcp from 127.0.0.1 port 33731:33735 to 127.0.0.1 port = 5705
block drop in quick on lo0 inet proto tcp from 127.0.0.1 port 33741:33745 to 127.0.0.1 port = 5701
block drop in quick on lo0 inet proto tcp from 127.0.0.1 port 33741:33745 to 127.0.0.1 port = 5702
block drop in quick on lo0 inet proto tcp from 127.0.0.1 port 33741:33745 to 127.0.0.1 port = 5703
block drop in quick on lo0 inet proto tcp from 127.0.0.1 port 33751:33755 to 127.0.0.1 port = 5701
block drop in quick on lo0 inet proto tcp from 127.0.0.1 port 33751:33755 to 127.0.0.1 port = 5702
block drop in quick on lo0 inet proto tcp from 127.0.0.1 port 33751:33755 to 127.0.0.1 port = 5703
block drop in quick on lo0 inet proto tcp from 127.0.0.1 port 33711:33715 to 127.0.0.1 port = 5704
block drop in quick on lo0 inet proto tcp from 127.0.0.1 port 33721:33725 to 127.0.0.1 port = 5704
block drop in quick on lo0 inet proto tcp from 127.0.0.1 port 33731:33735 to 127.0.0.1 port = 5704
block drop in quick on lo0 inet proto tcp from 127.0.0.1 port 33711:33715 to 127.0.0.1 port = 5705
block drop in quick on lo0 inet proto tcp from 127.0.0.1 port 33721:33725 to 127.0.0.1 port = 5705
block drop in quick on lo0 inet proto tcp from 127.0.0.1 port 33731:33735 to 127.0.0.1 port = 5705
pf включен
Token : 14399845021355597821

Затем я запустил узлы 1 и 4. В журнале узла-1 я увидел:

Инициализировано новое подключение к кластеру между /127.0.0.1:33715 и /127.0.0.1:5704

Что я делаю не так?

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

Для выполнения вашей задачи по блокировке TCP-пакетов между процессами Hazelcast на macOS через Packet Filter (pf), давайте рассмотрим несколько важных моментов, которые могут повлиять на ваше решение.

Проблема с Блокировкой TCP Пакетов

На основе предоставленной информации видно, что вы пытаетесь создать правила для блокировки общения между узлами 1, 2 и 3 с узлами 4 и 5. Несмотря на это, вы всё ещё наблюдаете, что связь между узлом 1 и портом 5704 не блокируется, и это вызывает проблемы в моделировании сценария "split-brain".

Разъяснение Правил pf

  1. Правила вpf: Правила, которые вы создали, нацелены на блокировку определённых диапазонов портов. Однако вы используете диапазоны портов неправильно:

    • Для узлов 1, 2 и 3, которые отправляют пакеты из диапазона 33711–33715 на порты 5704 и 5705, вы должны также включать соответствующие порты, с которых они отправляют пакеты, в качестве источников.
    • Аналогично для узлов 4 и 5, которые используют порты 33741–33755 и 33751–33755.
  2. Использование диапазонов портов: Убедитесь, что диапазоны портов, указанные вами, охватывают все возможные комбинации отправляющих и принимающих портов для каждого узла. Это включает в себя, например, блокировку всех портов, которые используются для отправки и получения данных.

  3. Правила для всех узлов: Добавьте дополнительные правила, чтобы убедиться, что все порты для каждого узла изолированы от соответствующих групп.

Пример Исправленных Правил

Для достижения вашей цели, исправим некоторые правила для блокировки трафика между узлами:

block out quick on lo0 proto tcp from 127.0.0.1 port 33711:33715 to 127.0.0.1 port 5704
block in quick on lo0 proto tcp from 127.0.0.1 port 5704 to 127.0.0.1 port 33711:33715

block out quick on lo0 proto tcp from 127.0.0.1 port 33741:33745 to 127.0.0.1 port 5701
block in quick on lo0 proto tcp from 127.0.0.1 port 5701 to 127.0.0.1 port 33741:33745

block out quick on lo0 proto tcp from 127.0.0.1 port 33751:33755 to 127.0.0.1 port 5702
block in quick on lo0 proto tcp from 127.0.0.1 port 5702 to 127.0.0.1 port 33751:33755

# Добавьте правила для остальных узлов аналогично

Проверка и Активация Правил

После внесения изменений в файл правил hazelcast, вам необходимо снова запустить pf:

sudo pfctl -Evf /etc/pf.conf

Убедитесь, что правила загружены, и используйте pfctl -sr для проверки активных правил и ожидания их выполнения.

Логирование и Отладка

Также полезно включить логирование для ваших правил, чтобы в последствии отследить, блокируются ли пакеты должным образом:

block out quick log on lo0 proto tcp from 127.0.0.1 port 33711:33715 to 127.0.0.1 port 5704

Заключение

Если после внесения этих изменений проблема не исчезнет, возможно, стоит проверить вашу конфигурацию Hazelcast и убедиться, что процессы корректно используют указанные TCP-порты. Также стоит проверить системные логи, чтобы исключить другие потенциальные проблемы.

Используя предложенные выше рекомендации, вы сможете успешно блокировать пакеты между выбранными узлами и эмулировать необходимый сценарий.

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

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