Вопрос или проблема
На macOS Sonoma 14.6.1 (с ядром Darwin 23.6.0) я запускаю пять узлов Hazelcast 3.12 на локальном хосте, чтобы смоделировать сценарий разделённого мозга. Каждый из этих узлов прослушивает конкретный порт для связи с другими узлами и общается с другими узлами с настроенных портов:
| слушает на | 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
Что я делаю не так?
Ответ или решение
К сожалению, ваши текущие правила фильтрации пакетов в pf не достигают желаемого эффекта по блокировке TCP-пакетов между процессами на одном хосте. Давайте разберемся с ошибками и уточним, как правильно настроить pf на MacOS для достижения вашей цели.
1. Понимание контекста
Вы нацелены на моделирование сценария "разделенного мозга" (split-brain) на локальном хосте, где у вас имеются пять узлов Hazelcast, работающих на одном IP-адресе (127.0.0.1
). Вы хотите заблокировать связь между узлами 1, 2 и 3 (порты 5701
, 5702
, 5703
, 33711–33715
, 33721–33725
, 33731–33735
) и узлами 4 и 5 (порты 5704
, 5705
, 33741–33745
, 33751–33755
).
2. Ошибки в правилах pf
2.1. Неправильные порты
В ваших правилах фильтрации используются не все нужные диапазоны. Например, вы указали порты 33711–33715
и 33741–33745
как отправные порты, но при этом используете 33711
, 33721
, и 33731
для ограничения, не охватывая все порты, с которых узлы будут отправлять данные.
2.2. Блокировка пакетов
Для достижения нужной блокировки используйте более строгие правила, учитывающие конкретные соединения между процессами. Важно обратить внимание на конфигурацию параметров. Вы можете добавить более детальные правила для блокировки трафика.
3. Изменение конфигурации правил
Попробуйте изменить правила вашей конфигурации pf следующим образом:
# Блокировка пакетов от узлов 1, 2, 3 к узлам 4, 5
block in on lo0 proto tcp from 127.0.0.1 port 5701:5703 to 127.0.0.1 port 5704
block out on lo0 proto tcp from 127.0.0.1 port 5704 to 127.0.0.1 port 5701:5703
block in on lo0 proto tcp from 127.0.0.1 port 5701:5703 to 127.0.0.1 port 5705
block out on lo0 proto tcp from 127.0.0.1 port 5705 to 127.0.0.1 port 5701:5703
# Блокировка узлов 4, 5 к узлам 1, 2, 3
block in on lo0 proto tcp from 127.0.0.1 port 5704:5705 to 127.0.0.1 port 5701:5703
block out on lo0 proto tcp from 127.0.0.1 port 5701:5703 to 127.0.0.1 port 5704:5705
4. Применение конфигурации
Не забудьте обновить конфигурацию pf
, следуя вашей последовательности:
sudo pfctl -Evf /etc/pf.conf
Проверьте журналы для диагностики:
sudo tcpdump -n -i lo0
5. Заключение
Ваша цель по блокировке пакетов между процессами на локальном хосте является вполне достижимой, однако для этого требуется более детальное и точное определение правил и порций. Конфигурация Packet Filter может быть сложной, но с правильным подходом, учетом всех нюансов и подробным тестированием вы сможете успешно эмулировать желаемый сценарий "разделенного мозга".